summaryrefslogtreecommitdiff
path: root/mate-panel/panel-menu-items.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-panel/panel-menu-items.c')
-rw-r--r--mate-panel/panel-menu-items.c273
1 files changed, 120 insertions, 153 deletions
diff --git a/mate-panel/panel-menu-items.c b/mate-panel/panel-menu-items.c
index a196b0be..14b58701 100644
--- a/mate-panel/panel-menu-items.c
+++ b/mate-panel/panel-menu-items.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2005 Vincent Untz
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -40,6 +41,7 @@
#include <glib/gi18n.h>
#include <gio/gio.h>
#include <libmate-desktop/mate-gsettings.h>
+#include <libmate-desktop/mate-image-menu-item.h>
#include <libpanel-util/panel-error.h>
#include <libpanel-util/panel-glib.h>
@@ -58,6 +60,7 @@
#include "panel-schemas.h"
#define MAX_BOOKMARK_ITEMS 100
+#define N_MENU_ITEM_SIGNALS 9
struct _PanelPlaceMenuItemPrivate {
GtkWidget *menu;
@@ -72,15 +75,7 @@ struct _PanelPlaceMenuItemPrivate {
GFileMonitor *bookmarks_monitor;
GVolumeMonitor *volume_monitor;
- gulong drive_changed_id;
- gulong drive_connected_id;
- gulong drive_disconnected_id;
- gulong volume_added_id;
- gulong volume_changed_id;
- gulong volume_removed_id;
- gulong mount_added_id;
- gulong mount_changed_id;
- gulong mount_removed_id;
+ gulong signal_id [N_MENU_ITEM_SIGNALS];
guint use_image : 1;
};
@@ -93,8 +88,8 @@ struct _PanelDesktopMenuItemPrivate {
guint append_lock_logout : 1;
};
-G_DEFINE_TYPE_WITH_PRIVATE (PanelPlaceMenuItem, panel_place_menu_item, GTK_TYPE_IMAGE_MENU_ITEM)
-G_DEFINE_TYPE_WITH_PRIVATE (PanelDesktopMenuItem, panel_desktop_menu_item, GTK_TYPE_IMAGE_MENU_ITEM)
+G_DEFINE_TYPE_WITH_PRIVATE (PanelPlaceMenuItem, panel_place_menu_item, MATE_TYPE_IMAGE_MENU_ITEM)
+G_DEFINE_TYPE_WITH_PRIVATE (PanelDesktopMenuItem, panel_desktop_menu_item, MATE_TYPE_IMAGE_MENU_ITEM)
static void activate_uri_on_screen(const char* uri, GdkScreen* screen)
{
@@ -148,7 +143,6 @@ panel_menu_items_append_from_desktop (GtkWidget *menu,
char *uri;
char *type;
gboolean is_application;
- char *tryexec;
char *icon;
char *name;
char *comment;
@@ -203,7 +197,7 @@ panel_menu_items_append_from_desktop (GtkWidget *menu,
g_free (type);
if (is_application) {
- tryexec = panel_key_file_get_string (key_file, "TryExec");
+ char *tryexec = panel_key_file_get_string (key_file, "TryExec");
if (tryexec) {
char *prog;
@@ -237,7 +231,7 @@ panel_menu_items_append_from_desktop (GtkWidget *menu,
if (use_icon) {
item = panel_image_menu_item_new ();
} else {
- item = gtk_image_menu_item_new ();
+ item = mate_image_menu_item_new ();
}
setup_menuitem_with_icon (item, panel_menu_icon_get_size (),
@@ -250,8 +244,9 @@ panel_menu_items_append_from_desktop (GtkWidget *menu,
G_CALLBACK (panel_menu_item_activate_desktop_file),
g_strdup (full_path),
(GClosureNotify) G_CALLBACK (g_free), 0);
- g_signal_connect (G_OBJECT (item), "button_press_event",
- G_CALLBACK (menu_dummy_button_press_event), NULL);
+ g_signal_connect (item, "button-press-event",
+ G_CALLBACK (menu_dummy_button_press_event),
+ NULL);
uri = g_filename_to_uri (full_path, NULL, NULL);
@@ -299,8 +294,9 @@ panel_menu_items_append_place_item (const char *icon_name,
g_signal_connect_data (item, "activate", callback, user_data,
(GClosureNotify) G_CALLBACK (g_free), 0);
- g_signal_connect (G_OBJECT (item), "button_press_event",
- G_CALLBACK (menu_dummy_button_press_event), NULL);
+ g_signal_connect (item, "button-press-event",
+ G_CALLBACK (menu_dummy_button_press_event),
+ NULL);
if (g_str_has_prefix (uri, "file:")) /*Links only work for local files*/
setup_uri_drag (item, uri, icon_name, GDK_ACTION_LINK);
@@ -316,7 +312,7 @@ panel_menu_items_create_action_item_full (PanelActionButtonType action_type,
if (panel_action_get_is_disabled (action_type))
return NULL;
- item = gtk_image_menu_item_new ();
+ item = mate_image_menu_item_new ();
setup_menuitem_with_icon (item,
panel_menu_icon_get_size (),
NULL,
@@ -329,9 +325,11 @@ panel_menu_items_create_action_item_full (PanelActionButtonType action_type,
panel_action_get_tooltip (action_type));
g_signal_connect (item, "activate",
- panel_action_get_invoke (action_type), NULL);
- g_signal_connect (G_OBJECT (item), "button_press_event",
- G_CALLBACK (menu_dummy_button_press_event), NULL);
+ panel_action_get_invoke (action_type),
+ NULL);
+ g_signal_connect (item, "button-press-event",
+ G_CALLBACK (menu_dummy_button_press_event),
+ NULL);
setup_internal_applet_drag (item, action_type);
return item;
@@ -410,7 +408,6 @@ panel_place_menu_item_append_gtk_bookmarks (GtkWidget *menu, guint max_items_or_
char *line = (char*) l->data;
if (line[0] && !g_hash_table_lookup (table, line)) {
- GFile *file;
char *space;
char *label;
gboolean keep;
@@ -431,7 +428,7 @@ panel_place_menu_item_append_gtk_bookmarks (GtkWidget *menu, guint max_items_or_
keep = TRUE;
if (!keep) {
- file = g_file_new_for_uri (line);
+ GFile *file = g_file_new_for_uri (line);
keep = !g_file_is_native (file) ||
g_file_query_exists (file, NULL);
g_object_unref (file);
@@ -460,7 +457,7 @@ panel_place_menu_item_append_gtk_bookmarks (GtkWidget *menu, guint max_items_or_
} else {
GtkWidget *item;
- item = gtk_image_menu_item_new ();
+ item = mate_image_menu_item_new ();
setup_menuitem_with_icon (item, panel_menu_icon_get_size (),
NULL, PANEL_ICON_BOOKMARKS,
_("Bookmarks"));
@@ -545,15 +542,16 @@ drive_poll_for_media_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GdkScreen *screen;
- GError *error;
- char *primary;
- char *name;
+ GError *error;
error = NULL;
if (!g_drive_poll_for_media_finish (G_DRIVE (source_object),
res, &error)) {
if (error->code != G_IO_ERROR_FAILED_HANDLED) {
+ GdkScreen *screen;
+ char *primary;
+ char *name;
+
screen = GDK_SCREEN (user_data);
name = g_drive_get_name (G_DRIVE (source_object));
@@ -614,8 +612,9 @@ panel_menu_item_append_drive (GtkWidget *menu,
g_object_ref (drive),
(GClosureNotify) G_CALLBACK (g_object_unref), 0);
- g_signal_connect (G_OBJECT (item), "button_press_event",
- G_CALLBACK (menu_dummy_button_press_event), NULL);
+ g_signal_connect (item, "button-press-event",
+ G_CALLBACK (menu_dummy_button_press_event),
+ NULL);
}
typedef struct {
@@ -633,10 +632,10 @@ volume_mount_cb (GObject *source_object,
error = NULL;
if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) {
- char *primary;
- char *name;
-
if (error->code != G_IO_ERROR_FAILED_HANDLED) {
+ char *primary;
+ char *name;
+
name = g_volume_get_name (G_VOLUME (source_object));
primary = g_strdup_printf (_("Unable to mount %s"),
name);
@@ -714,8 +713,9 @@ panel_menu_item_append_volume (GtkWidget *menu,
g_object_ref (volume),
(GClosureNotify) G_CALLBACK (g_object_unref), 0);
- g_signal_connect (G_OBJECT (item), "button_press_event",
- G_CALLBACK (menu_dummy_button_press_event), NULL);
+ g_signal_connect (item, "button-press-event",
+ G_CALLBACK (menu_dummy_button_press_event),
+ NULL);
}
static void
@@ -903,19 +903,19 @@ panel_place_menu_item_append_local_gio (PanelPlaceMenuItem *place_item,
if (g_slist_length (items) <= g_settings_get_uint (place_item->priv->menubar_settings, PANEL_MENU_BAR_MAX_ITEMS_OR_SUBMENU)) {
add_menu = menu;
} else {
- GtkWidget *item;
+ GtkWidget *menu_item;
- item = gtk_image_menu_item_new ();
- setup_menuitem_with_icon (item, panel_menu_icon_get_size (),
- NULL,
- PANEL_ICON_REMOVABLE_MEDIA,
- _("Removable Media"));
+ menu_item = mate_image_menu_item_new ();
+ setup_menuitem_with_icon (menu_item, panel_menu_icon_get_size (),
+ NULL,
+ PANEL_ICON_REMOVABLE_MEDIA,
+ _("Removable Media"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ gtk_widget_show (menu_item);
add_menu = create_empty_menu ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), add_menu);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), add_menu);
}
for (sl = items; sl; sl = sl->next) {
@@ -982,7 +982,6 @@ panel_place_menu_item_append_remote_gio (PanelPlaceMenuItem *place_item,
}
g_object_unref (root);
-
add_mounts = g_slist_prepend (add_mounts, mount);
}
add_mounts = g_slist_reverse (add_mounts);
@@ -1015,16 +1014,15 @@ panel_place_menu_item_append_remote_gio (PanelPlaceMenuItem *place_item,
g_list_free (mounts);
}
-
static GtkWidget *
panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item)
{
GtkWidget *places_menu;
- GtkWidget *item;
char *gsettings_name = NULL;
char *name;
char *uri;
GFile *file;
+ int recent_items_limit;
places_menu = panel_create_menu ();
@@ -1101,7 +1099,7 @@ panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item)
if (panel_is_program_in_path ("caja-connect-server") ||
panel_is_program_in_path ("nautilus-connect-server") ||
panel_is_program_in_path ("nemo-connect-server")) {
- item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER);
+ GtkWidget *item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER);
if (item != NULL)
gtk_menu_shell_append (GTK_MENU_SHELL (places_menu),
item);
@@ -1120,8 +1118,12 @@ panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item)
NULL,
FALSE);
+ recent_items_limit = g_settings_get_int (place_item->priv->menubar_settings,
+ PANEL_MENU_BAR_MAX_RECENT_ITEMS);
+
panel_recent_append_documents_menu (places_menu,
- place_item->priv->recent_manager);
+ place_item->priv->recent_manager,
+ recent_items_limit);
/* Fix any failures of compiz/other wm's to communicate with gtk for transparency */
GtkWidget *toplevel = gtk_widget_get_toplevel (places_menu);
GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(toplevel));
@@ -1260,73 +1262,31 @@ static void
panel_place_menu_item_finalize (GObject *object)
{
PanelPlaceMenuItem *menuitem = (PanelPlaceMenuItem *) object;
+ guint i;
- if (menuitem->priv->caja_desktop_settings) {
- g_object_unref (menuitem->priv->caja_desktop_settings);
- menuitem->priv->caja_desktop_settings = NULL;
- }
- if (menuitem->priv->caja_prefs_settings) {
- g_object_unref (menuitem->priv->caja_prefs_settings);
- menuitem->priv->caja_prefs_settings = NULL;
- }
-
- g_object_unref (menuitem->priv->menubar_settings);
- menuitem->priv->menubar_settings = NULL;
+ g_clear_object (&menuitem->priv->caja_desktop_settings);
+ g_clear_object (&menuitem->priv->caja_prefs_settings);
+ g_clear_object (&menuitem->priv->menubar_settings);
if (menuitem->priv->bookmarks_monitor != NULL) {
g_file_monitor_cancel (menuitem->priv->bookmarks_monitor);
- g_object_unref (menuitem->priv->bookmarks_monitor);
+ g_clear_object (&menuitem->priv->bookmarks_monitor);
}
- menuitem->priv->bookmarks_monitor = NULL;
-
- if (menuitem->priv->drive_changed_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->drive_changed_id);
- menuitem->priv->drive_changed_id = 0;
-
- if (menuitem->priv->drive_connected_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->drive_connected_id);
- menuitem->priv->drive_connected_id = 0;
-
- if (menuitem->priv->drive_disconnected_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->drive_disconnected_id);
- menuitem->priv->drive_disconnected_id = 0;
-
- if (menuitem->priv->volume_added_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->volume_added_id);
- menuitem->priv->volume_added_id = 0;
-
- if (menuitem->priv->volume_changed_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->volume_changed_id);
- menuitem->priv->volume_changed_id = 0;
-
- if (menuitem->priv->volume_removed_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->volume_removed_id);
- menuitem->priv->volume_removed_id = 0;
-
- if (menuitem->priv->mount_added_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->mount_added_id);
- menuitem->priv->mount_added_id = 0;
-
- if (menuitem->priv->mount_changed_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->mount_changed_id);
- menuitem->priv->mount_changed_id = 0;
-
- if (menuitem->priv->mount_removed_id)
- g_signal_handler_disconnect (menuitem->priv->volume_monitor,
- menuitem->priv->mount_removed_id);
- menuitem->priv->mount_removed_id = 0;
-
- if (menuitem->priv->volume_monitor != NULL)
- g_object_unref (menuitem->priv->volume_monitor);
- menuitem->priv->volume_monitor = NULL;
+
+ for (i = 0; i < N_MENU_ITEM_SIGNALS; i++) {
+#if GLIB_CHECK_VERSION(2,62,0)
+ g_clear_signal_handler (&menuitem->priv->signal_id [i],
+ menuitem->priv->volume_monitor);
+#else
+ if (menuitem->priv->signal_id [i] != 0) {
+ g_signal_handler_disconnect (menuitem->priv->volume_monitor,
+ menuitem->priv->signal_id [i]);
+ menuitem->priv->signal_id [i] = 0;
+ }
+#endif
+ }
+
+ g_clear_object (&menuitem->priv->volume_monitor);
G_OBJECT_CLASS (panel_place_menu_item_parent_class)->finalize (object);
}
@@ -1348,6 +1308,7 @@ panel_place_menu_item_init (PanelPlaceMenuItem *menuitem)
GFile *bookmark;
char *bookmarks_filename;
GError *error;
+ guint i;
menuitem->priv = panel_place_menu_item_get_instance_private (menuitem);
@@ -1380,6 +1341,10 @@ panel_place_menu_item_init (PanelPlaceMenuItem *menuitem)
"changed::" PANEL_MENU_BAR_MAX_ITEMS_OR_SUBMENU,
G_CALLBACK (panel_place_menu_item_key_changed),
G_OBJECT (menuitem));
+ g_signal_connect (menuitem->priv->menubar_settings,
+ "changed::" PANEL_MENU_BAR_MAX_RECENT_ITEMS,
+ G_CALLBACK (panel_place_menu_item_key_changed),
+ G_OBJECT (menuitem));
menuitem->priv->recent_manager = gtk_recent_manager_get_default ();
@@ -1398,8 +1363,7 @@ panel_place_menu_item_init (PanelPlaceMenuItem *menuitem)
bookmarks_filename, error->message);
g_error_free (error);
} else {
- g_signal_connect (G_OBJECT (menuitem->priv->bookmarks_monitor),
- "changed",
+ g_signal_connect (menuitem->priv->bookmarks_monitor, "changed",
(GCallback) panel_place_menu_item_gtk_bookmarks_changed,
menuitem);
}
@@ -1409,42 +1373,45 @@ panel_place_menu_item_init (PanelPlaceMenuItem *menuitem)
menuitem->priv->volume_monitor = g_volume_monitor_get ();
- menuitem->priv->drive_changed_id = g_signal_connect (menuitem->priv->volume_monitor,
- "drive-changed",
- G_CALLBACK (panel_place_menu_item_drives_changed),
- menuitem);
- menuitem->priv->drive_connected_id = g_signal_connect (menuitem->priv->volume_monitor,
- "drive-connected",
- G_CALLBACK (panel_place_menu_item_drives_changed),
- menuitem);
- menuitem->priv->drive_disconnected_id = g_signal_connect (menuitem->priv->volume_monitor,
- "drive-disconnected",
- G_CALLBACK (panel_place_menu_item_drives_changed),
- menuitem);
- menuitem->priv->volume_added_id = g_signal_connect (menuitem->priv->volume_monitor,
- "volume-added",
- G_CALLBACK (panel_place_menu_item_volumes_changed),
- menuitem);
- menuitem->priv->volume_changed_id = g_signal_connect (menuitem->priv->volume_monitor,
- "volume-changed",
- G_CALLBACK (panel_place_menu_item_volumes_changed),
- menuitem);
- menuitem->priv->volume_removed_id = g_signal_connect (menuitem->priv->volume_monitor,
- "volume-removed",
- G_CALLBACK (panel_place_menu_item_volumes_changed),
- menuitem);
- menuitem->priv->mount_added_id = g_signal_connect (menuitem->priv->volume_monitor,
- "mount-added",
- G_CALLBACK (panel_place_menu_item_mounts_changed),
- menuitem);
- menuitem->priv->mount_changed_id = g_signal_connect (menuitem->priv->volume_monitor,
- "mount-changed",
- G_CALLBACK (panel_place_menu_item_mounts_changed),
- menuitem);
- menuitem->priv->mount_removed_id = g_signal_connect (menuitem->priv->volume_monitor,
- "mount-removed",
- G_CALLBACK (panel_place_menu_item_mounts_changed),
- menuitem);
+ i = 0;
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "drive-changed",
+ G_CALLBACK (panel_place_menu_item_drives_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "drive-connected",
+ G_CALLBACK (panel_place_menu_item_drives_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "drive-disconnected",
+ G_CALLBACK (panel_place_menu_item_drives_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "volume-added",
+ G_CALLBACK (panel_place_menu_item_volumes_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "volume-changed",
+ G_CALLBACK (panel_place_menu_item_volumes_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "volume-removed",
+ G_CALLBACK (panel_place_menu_item_volumes_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "mount-added",
+ G_CALLBACK (panel_place_menu_item_mounts_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "mount-changed",
+ G_CALLBACK (panel_place_menu_item_mounts_changed),
+ menuitem);
+ menuitem->priv->signal_id [i++] =
+ g_signal_connect (menuitem->priv->volume_monitor, "mount-removed",
+ G_CALLBACK (panel_place_menu_item_mounts_changed),
+ menuitem);
+
+ g_assert (i == N_MENU_ITEM_SIGNALS);
}
@@ -1488,7 +1455,7 @@ GtkWidget* panel_place_menu_item_new(gboolean use_image)
setup_menuitem(GTK_WIDGET(menuitem), image ? panel_menu_icon_get_size() : GTK_ICON_SIZE_INVALID, image, _("Places"));
- menuitem->priv->use_image = use_image;
+ menuitem->priv->use_image = (use_image != FALSE);
menuitem->priv->menu = panel_place_menu_item_create_menu(menuitem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menuitem->priv->menu);
@@ -1516,9 +1483,9 @@ panel_desktop_menu_item_new (gboolean use_image,
image,
_("System"));
- menuitem->priv->use_image = use_image;
+ menuitem->priv->use_image = (use_image != FALSE);
- menuitem->priv->append_lock_logout = append_lock_logout;
+ menuitem->priv->append_lock_logout = (append_lock_logout != FALSE);
if (append_lock_logout)
panel_lockdown_notify_add (G_CALLBACK (panel_desktop_menu_item_recreate_menu),
menuitem);