diff options
Diffstat (limited to 'mate-panel/launcher.c')
-rw-r--r-- | mate-panel/launcher.c | 107 |
1 files changed, 67 insertions, 40 deletions
diff --git a/mate-panel/launcher.c b/mate-panel/launcher.c index d7d36556..0385ccea 100644 --- a/mate-panel/launcher.c +++ b/mate-panel/launcher.c @@ -2,6 +2,7 @@ * MATE panel launcher module. * (C) 1997,1998,1999,2000 The Free Software Foundation * (C) 2000 Eazel, Inc. + * Copyright (C) 2012-2021 MATE Developers * * Authors: Miguel de Icaza * Federico Mena @@ -250,11 +251,11 @@ free_launcher (gpointer data) if (launcher->key_file) g_key_file_free (launcher->key_file); - launcher->key_file = NULL; - if (launcher->location != NULL) - g_free (launcher->location); - launcher->location = NULL; + g_free (launcher->location); + + if (launcher->monitor != NULL) + g_object_unref (launcher->monitor); g_free (launcher); } @@ -323,7 +324,6 @@ drag_leave_cb(GtkWidget *widget, button_widget_set_dnd_highlight(BUTTON_WIDGET(widget), FALSE); } - static gboolean drag_motion_cb(GtkWidget *widget, GdkDragContext *context, @@ -368,7 +368,6 @@ enum { TARGET_URI_LIST }; - static void drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, @@ -442,6 +441,7 @@ static Launcher * create_launcher (const char *location) { GKeyFile *key_file; + g_autoptr(GFile) file = NULL; gboolean loaded = FALSE; Launcher *launcher; GError *error = NULL; @@ -501,6 +501,7 @@ create_launcher (const char *location) if (!new_location) new_location = g_strdup (location); + file = g_file_new_for_path (new_location); launcher = g_new0 (Launcher, 1); @@ -516,6 +517,10 @@ create_launcher (const char *location) FALSE, PANEL_ORIENTATION_TOP); + launcher->monitor = g_file_monitor_file (file, + G_FILE_MONITOR_NONE, + NULL, + NULL); gtk_widget_show (launcher->button); /*gtk_drag_dest_set (GTK_WIDGET (launcher->button), @@ -525,15 +530,15 @@ create_launcher (const char *location) gtk_drag_dest_set (GTK_WIDGET (launcher->button), 0, NULL, 0, 0); - g_signal_connect (launcher->button, "drag_data_get", + g_signal_connect (launcher->button, "drag-data-get", G_CALLBACK (drag_data_get_cb), launcher); - g_signal_connect (launcher->button, "drag_data_received", + g_signal_connect (launcher->button, "drag-data-received", G_CALLBACK (drag_data_received_cb), launcher); - g_signal_connect (launcher->button, "drag_motion", + g_signal_connect (launcher->button, "drag-motion", G_CALLBACK (drag_motion_cb), launcher); - g_signal_connect (launcher->button, "drag_drop", + g_signal_connect (launcher->button, "drag-drop", G_CALLBACK (drag_drop_cb), launcher); - g_signal_connect (launcher->button, "drag_leave", + g_signal_connect (launcher->button, "drag-leave", G_CALLBACK (drag_leave_cb), launcher); g_signal_connect_swapped (launcher->button, "clicked", G_CALLBACK (clicked_cb), launcher); @@ -614,7 +619,6 @@ setup_button (Launcher *launcher) else str = g_strdup (comment); - /* If we can unescape the string, then we probably have an escaped * string (a location e.g.). If we can't, then it most probably means * we have a % that is not here to encode a character, and we don't @@ -634,10 +638,8 @@ setup_button (Launcher *launcher) /* Setup icon */ icon = panel_key_file_get_locale_string (launcher->key_file, "Icon"); - if (icon && icon[0] == '\0') { - g_free (icon); - icon = NULL; - } + if (icon && icon[0] == '\0') + g_clear_pointer (&icon, g_free); if (!icon) { gchar *exec; @@ -663,15 +665,12 @@ static char * panel_launcher_find_writable_uri (const char *launcher_location, const char *source) { - char *path; - char *uri; - if (!launcher_location) return panel_make_unique_desktop_uri (NULL, source); if (!strchr (launcher_location, G_DIR_SEPARATOR)) { - path = panel_make_full_path (NULL, launcher_location); - uri = g_filename_to_uri (path, NULL, NULL); + char *path = panel_make_full_path (NULL, launcher_location); + char *uri = g_filename_to_uri (path, NULL, NULL); g_free (path); return uri; } @@ -701,18 +700,13 @@ launcher_changed (PanelDItemEditor *dialog, static void launcher_command_changed (PanelDItemEditor *dialog, - const char *command, - Launcher *launcher) + const char *command, + Launcher *launcher) { - char *exec; - char *old_exec; - GKeyFile *revert_key_file; - - revert_key_file = panel_ditem_editor_get_revert_key_file (dialog); - + GKeyFile *revert_key_file = panel_ditem_editor_get_revert_key_file (dialog); if (revert_key_file) { - exec = panel_key_file_get_string (launcher->key_file, "Exec"); - old_exec = panel_key_file_get_string (revert_key_file, "Exec"); + char *exec = panel_key_file_get_string (launcher->key_file, "Exec"); + char *old_exec = panel_key_file_get_string (revert_key_file, "Exec"); if (!old_exec || !exec || strcmp (old_exec, exec)) panel_key_file_remove_key (launcher->key_file, @@ -827,13 +821,13 @@ launcher_properties (Launcher *launcher) g_signal_connect (launcher->prop_dialog, "changed", G_CALLBACK (launcher_changed), launcher); - g_signal_connect (launcher->prop_dialog, "command_changed", + g_signal_connect (launcher->prop_dialog, "command-changed", G_CALLBACK (launcher_command_changed), launcher); g_signal_connect (launcher->prop_dialog, "saved", G_CALLBACK (launcher_saved), launcher); - g_signal_connect (launcher->prop_dialog, "error_reported", + g_signal_connect (launcher->prop_dialog, "error-reported", G_CALLBACK (launcher_error_reported), NULL); g_signal_connect (launcher->prop_dialog, "destroy", @@ -853,6 +847,34 @@ launcher_properties_enabled (void) return TRUE; } +static void +app_desktop_file_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + Launcher *launcher) +{ + if (event_type != G_FILE_MONITOR_EVENT_CHANGED && + event_type != G_FILE_MONITOR_EVENT_CREATED) + { + return; + } + + if (!strchr (launcher->location, G_DIR_SEPARATOR)) + { + g_key_file_load_from_file (launcher->key_file, launcher->location, + G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, + NULL); + } + else + { + panel_key_file_load_from_uri (launcher->key_file, launcher->location, + G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, + NULL); + } + setup_button (launcher); +} + static Launcher * load_launcher_applet (const char *location, PanelWidget *panel, @@ -880,6 +902,11 @@ load_launcher_applet (const char *location, panel_widget_set_applet_expandable (panel, GTK_WIDGET (launcher->button), FALSE, TRUE); panel_widget_set_applet_size_constrained (panel, GTK_WIDGET (launcher->button), TRUE); + g_signal_connect (launcher->monitor, + "changed", + G_CALLBACK (app_desktop_file_changed), + launcher); + /* setup button according to ditem */ setup_button (launcher); @@ -984,11 +1011,13 @@ ask_about_launcher (const char *file, launcher_save_uri, NULL); - g_signal_connect (G_OBJECT (dialog), "saved", - G_CALLBACK (launcher_new_saved), NULL); + g_signal_connect (dialog, "saved", + G_CALLBACK (launcher_new_saved), + NULL); - g_signal_connect (G_OBJECT (dialog), "error_reported", - G_CALLBACK (launcher_error_reported), NULL); + g_signal_connect (dialog, "error-reported", + G_CALLBACK (launcher_error_reported), + NULL); gtk_window_set_screen (GTK_WINDOW (dialog), gtk_widget_get_screen (GTK_WIDGET (panel))); @@ -1167,8 +1196,6 @@ void panel_launcher_set_dnd_enabled (Launcher *launcher, gboolean dnd_enabled) { - cairo_surface_t *surface; - if (dnd_enabled) { static GtkTargetEntry dnd_targets[] = { { "application/x-panel-icon-internal", 0, TARGET_ICON_INTERNAL }, @@ -1180,7 +1207,7 @@ panel_launcher_set_dnd_enabled (Launcher *launcher, GDK_BUTTON1_MASK, dnd_targets, 2, GDK_ACTION_COPY | GDK_ACTION_MOVE); - surface = button_widget_get_surface (BUTTON_WIDGET (launcher->button)); + cairo_surface_t *surface = button_widget_get_surface (BUTTON_WIDGET (launcher->button)); if (surface) { GdkPixbuf *pixbuf; pixbuf = gdk_pixbuf_get_from_surface (surface, |