diff options
Diffstat (limited to 'mate-panel/launcher.c')
-rw-r--r-- | mate-panel/launcher.c | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/mate-panel/launcher.c b/mate-panel/launcher.c index ad2c147b..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; @@ -819,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", @@ -845,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, @@ -872,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); @@ -976,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))); |