[Xfce4-commits] [xfce/garcon] 01/01: garcon-gtk: Add an option to edit launchers

noreply at xfce.org noreply at xfce.org
Mon Jun 20 16:41:25 CEST 2016


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/garcon.

commit fad07797c37ff9a4c26699ad3619c51cdc72271d
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Mon Jun 20 17:39:25 2016 +0300

    garcon-gtk: Add an option to edit launchers
    
    xfdesktop has the ability to edit menu items on right click (or
    shift + left click). Add this functionality into garcon-gtk so
    other consumers of the library can use it if desired. It defaults
    to off.
---
 garcon-gtk/garcon-gtk-menu.c | 132 ++++++++++++++++++++++++++++++++++++++++++-
 garcon-gtk/garcon-gtk-menu.h |   4 ++
 tests/test-display-menu.c    |  18 +++++-
 3 files changed, 152 insertions(+), 2 deletions(-)

diff --git a/garcon-gtk/garcon-gtk-menu.c b/garcon-gtk/garcon-gtk-menu.c
index 32b1887..6dcc5cd 100644
--- a/garcon-gtk/garcon-gtk-menu.c
+++ b/garcon-gtk/garcon-gtk-menu.c
@@ -50,6 +50,7 @@ enum
   PROP_SHOW_MENU_ICONS,
   PROP_SHOW_TOOLTIPS,
   PROP_SHOW_DESKTOP_ACTIONS,
+  PROP_RIGHT_CLICK_EDITS,
   N_PROPERTIES
 };
 
@@ -83,6 +84,7 @@ struct _GarconGtkMenuPrivate
   guint show_menu_icons : 1;
   guint show_tooltips : 1;
   guint show_desktop_actions : 1;
+  guint right_click_edits : 1;
 };
 
 
@@ -182,6 +184,19 @@ garcon_gtk_menu_class_init (GarconGtkMenuClass *klass)
                           G_PARAM_READWRITE
                           | G_PARAM_STATIC_STRINGS);
 
+  /**
+   * GarconMenu:right-click-edits:
+   *
+   *
+   **/
+  menu_props[PROP_RIGHT_CLICK_EDITS] =
+    g_param_spec_boolean ("right-click-edits",
+                          "right-click-edits",
+                          "right click to edit menu items",
+                          FALSE,
+                          G_PARAM_READWRITE
+                          | G_PARAM_STATIC_STRINGS);
+
   /* install all properties */
   g_object_class_install_properties (gobject_class, N_PROPERTIES, menu_props);
 }
@@ -197,6 +212,7 @@ garcon_gtk_menu_init (GarconGtkMenu *menu)
   menu->priv->show_menu_icons = TRUE;
   menu->priv->show_tooltips = FALSE;
   menu->priv->show_desktop_actions = FALSE;
+  menu->priv->right_click_edits = FALSE;
 
   gtk_menu_set_reserve_toggle_size (GTK_MENU (menu), FALSE);
 }
@@ -251,6 +267,9 @@ garcon_gtk_menu_get_property (GObject    *object,
       g_value_set_boolean (value, menu->priv->show_desktop_actions);
       break;
 
+    case PROP_RIGHT_CLICK_EDITS:
+      g_value_set_boolean (value, menu->priv->right_click_edits);
+      break;
 
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -290,6 +309,10 @@ garcon_gtk_menu_set_property (GObject      *object,
       garcon_gtk_menu_set_show_desktop_actions (menu, g_value_get_boolean (value));
       break;
 
+    case PROP_RIGHT_CLICK_EDITS:
+      garcon_gtk_menu_set_right_click_edits (menu, g_value_get_boolean (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -430,10 +453,73 @@ garcon_gtk_menu_item_activate_real (GtkWidget            *mi,
 
 
 static void
+garcon_gtk_menu_item_edit_launcher (GarconMenuItem *item)
+{
+  GFile   *file;
+  gchar   *uri, *cmd;
+  GError  *error = NULL;
+
+  file = garcon_menu_item_get_file (item);
+
+  if (file)
+    {
+      uri = g_file_get_uri (file);
+      cmd = g_strdup_printf ("exo-desktop-item-edit \"%s\"", uri);
+
+      if (!xfce_spawn_command_line_on_screen (NULL, cmd, FALSE, FALSE, &error))
+        {
+          xfce_message_dialog (NULL,
+                               _("Launch Error"),
+                               "dialog-error",
+                              _("Unable to launch \"exo-desktop-item-edit\", which is required to create and edit menu items."),
+                              error->message,
+                              XFCE_BUTTON_TYPE_MIXED, "window-close", _("_Close"), GTK_RESPONSE_ACCEPT,
+                              NULL);
+
+          g_clear_error (&error);
+        }
+
+      g_free(uri);
+      g_free(cmd);
+      g_object_unref(file);
+    }
+}
+
+
+static void
 garcon_gtk_menu_item_activate (GtkWidget      *mi,
                                GarconMenuItem *item)
 {
-  garcon_gtk_menu_item_activate_real (mi, item, NULL);
+  GarconGtkMenu  *menu = g_object_get_data (G_OBJECT (mi), "GarconGtkMenu");
+  GdkEventButton *evt;
+  guint           button;
+  gboolean        right_click = FALSE;
+
+  evt = (GdkEventButton *)gtk_get_current_event();
+
+  /* See if we're trying to edit the launcher */
+   if(menu->priv->right_click_edits && evt && GDK_BUTTON_RELEASE == evt->type)
+    {
+      button = evt->button;
+
+      /* right click or Shift + left can optionally edit launchers */
+      if (button == 3 || (button == 1 && (evt->state & GDK_SHIFT_MASK)))
+        {
+          garcon_gtk_menu_item_edit_launcher (item);
+          right_click = TRUE;
+        }
+    }
+
+  if (!right_click)
+    {
+      /* normal action, launch the application */
+      garcon_gtk_menu_item_activate_real (mi, item, NULL);
+    }
+
+  if (evt)
+    {
+      gdk_event_free((GdkEvent*)evt);
+    }
 }
 
 
@@ -678,6 +764,9 @@ garcon_gtk_menu_add_actions (GarconGtkMenu  *menu,
   /* Add the parent item again, this time something the user can click to execute */
   mi = garcon_gtk_menu_create_menu_item (menu, garcon_menu_item_get_name (menu_item), parent_icon_name);
   gtk_menu_shell_append (GTK_MENU_SHELL (submenu), mi);
+  /* we need to store the GarconGtkMenu with this item so we can
+   * use it if the user wants to edit a menu item */
+  g_object_set_data (G_OBJECT (mi), "GarconGtkMenu", menu);
   g_signal_connect (G_OBJECT (mi), "activate",
                     G_CALLBACK (garcon_gtk_menu_item_activate), menu_item);
   gtk_widget_show (mi);
@@ -788,6 +877,9 @@ garcon_gtk_menu_add (GarconGtkMenu *menu,
             {
               g_signal_connect (G_OBJECT (mi), "activate",
                                 G_CALLBACK (garcon_gtk_menu_item_activate), li->data);
+              /* we need to store the GarconGtkMenu with this item so we can
+               * use it if the user wants to edit a menu item */
+              g_object_set_data (G_OBJECT (mi), "GarconGtkMenu", menu);
             }
 
           gtk_widget_show (mi);
@@ -1132,3 +1224,41 @@ garcon_gtk_menu_get_show_desktop_actions (GarconGtkMenu *menu)
   g_return_val_if_fail (GARCON_GTK_IS_MENU (menu), FALSE);
   return menu->priv->show_desktop_actions;
 }
+
+
+/**
+ * garcon_gtk_menu_set_right_click_edits:
+ * @menu  : A #GarconGtkMenu
+ * @enable_right_click_edits : Toggle showing wether to launch an editor
+ * when the menu is clicked with the secondary mouse button.
+ *
+ **/
+void
+garcon_gtk_menu_set_right_click_edits (GarconGtkMenu *menu,
+                                       gboolean       enable_right_click_edits)
+{
+  g_return_if_fail (GARCON_GTK_IS_MENU (menu));
+
+  if (menu->priv->right_click_edits == enable_right_click_edits)
+    return;
+
+  menu->priv->right_click_edits = !!enable_right_click_edits;
+  g_object_notify_by_pspec (G_OBJECT (menu), menu_props[PROP_RIGHT_CLICK_EDITS]);
+
+  garcon_gtk_menu_reload (menu);
+}
+
+
+
+/**
+ * garcon_gtk_menu_get_right_click_edits:
+ * @menu  : A #GarconGtkMenu
+ *
+ * Return value: if an editor will be launched on secondary mouse clicks.
+ **/
+gboolean
+garcon_gtk_menu_get_right_click_edits (GarconGtkMenu *menu)
+{
+  g_return_val_if_fail (GARCON_GTK_IS_MENU (menu), FALSE);
+  return menu->priv->right_click_edits;
+}
diff --git a/garcon-gtk/garcon-gtk-menu.h b/garcon-gtk/garcon-gtk-menu.h
index 1eaea1b..2e1f84a 100644
--- a/garcon-gtk/garcon-gtk-menu.h
+++ b/garcon-gtk/garcon-gtk-menu.h
@@ -79,6 +79,10 @@ void                 garcon_gtk_menu_set_show_desktop_actions (GarconGtkMenu *me
                                                                gboolean       show_desktop_actions);
 gboolean             garcon_gtk_menu_get_show_desktop_actions (GarconGtkMenu *menu);
 
+void                 garcon_gtk_menu_set_right_click_edits    (GarconGtkMenu *menu,
+                                                               gboolean       enable_right_click_edits);
+gboolean             garcon_gtk_menu_get_right_click_edits    (GarconGtkMenu *menu);
+
 G_END_DECLS
 
 #endif /* !__GARCON_GTK_MENU_H__ */
diff --git a/tests/test-display-menu.c b/tests/test-display-menu.c
index fcfb094..b354693 100644
--- a/tests/test-display-menu.c
+++ b/tests/test-display-menu.c
@@ -94,6 +94,13 @@ desktop_actions_toggled (GtkToggleButton *togglebutton,
                                             gtk_toggle_button_get_active (togglebutton));
 }
 
+static void
+edit_launchers_toggled (GtkToggleButton *togglebutton,
+                        gpointer         user_data)
+{
+  garcon_gtk_menu_set_right_click_edits (GARCON_GTK_MENU (gtk_root),
+                                         gtk_toggle_button_get_active (togglebutton));
+}
 
 
 
@@ -103,7 +110,9 @@ create_main_window (void)
   GtkWidget *window;
   GtkWidget *box;
   GtkWidget *button;
-  GtkWidget *chk_generic_names, *chk_menu_icons, *chk_tooltips, *chk_desktop_actions;
+  GtkWidget *chk_generic_names, *chk_menu_icons;
+  GtkWidget *chk_tooltips, *chk_desktop_actions;
+  GtkWidget *chk_edit_launchers;
 
   /* Create main window */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -170,6 +179,13 @@ create_main_window (void)
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chk_desktop_actions), FALSE);
   g_signal_connect (G_OBJECT (chk_desktop_actions), "toggled", G_CALLBACK (desktop_actions_toggled), NULL);
 
+  /* edit launchers */
+  chk_edit_launchers = gtk_check_button_new_with_mnemonic ("Right click edit launchers");
+  gtk_container_add (GTK_CONTAINER (box), chk_edit_launchers);
+  gtk_widget_show (chk_edit_launchers);
+  /* have check button match garcon-gtk's default */
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chk_edit_launchers), FALSE);
+  g_signal_connect (G_OBJECT (chk_edit_launchers), "toggled", G_CALLBACK (edit_launchers_toggled), NULL);
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list