summaryrefslogtreecommitdiff
path: root/mate-panel/launcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-panel/launcher.c')
-rw-r--r--mate-panel/launcher.c107
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,