[Xfce4-commits] [xfce/garcon] 01/01: Support for freedesktop Keyword item (#10683)

noreply at xfce.org noreply at xfce.org
Mon Oct 23 14:10:19 CEST 2017


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

e   r   i   c       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/garcon.

commit a38922c0892262294c88813c4bf0c72e2f438d54
Author: Gregor Santner <gsantner at mailbox.org>
Date:   Fri Oct 13 11:45:38 2017 +0200

    Support for freedesktop Keyword item (#10683)
    
    Signed-off-by: Eric Koegel <eric.koegel at gmail.com>
---
 garcon/garcon-menu-item.c | 134 ++++++++++++++++++++++++++++++++++++++++++----
 garcon/garcon-menu-item.h |   8 +++
 2 files changed, 133 insertions(+), 9 deletions(-)

diff --git a/garcon/garcon-menu-item.c b/garcon/garcon-menu-item.c
index e5af887..fc569bf 100644
--- a/garcon/garcon-menu-item.c
+++ b/garcon/garcon-menu-item.c
@@ -3,6 +3,7 @@
  * Copyright (c) 2006-2010 Jannis Pohlmann <jannis at xfce.org>
  * Copyright (c) 2009-2010 Nick Schermer <nick at xfce.org>
  * Copyright (c) 2015      Danila Poyarkov <dannotemail at gmail.com>
+ * Copyright (c) 2017      Gregor Santner <gsantner at mailbox.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -81,8 +82,8 @@ static gboolean     garcon_menu_item_get_element_show_in_environment (GarconMenu
 static gboolean     garcon_menu_item_get_element_no_display          (GarconMenuElement      *element);
 static gboolean     garcon_menu_item_get_element_equal               (GarconMenuElement      *element,
                                                                       GarconMenuElement      *other);
-static gboolean     garcon_menu_item_category_lists_equal            (GList                  *categories1,
-                                                                      GList                  *categories2);
+static gboolean     garcon_menu_item_lists_equal                     (GList                  *list1,
+                                                                      GList                  *list2);
 
 
 
@@ -101,6 +102,9 @@ struct _GarconMenuItemPrivate
   /* List of categories */
   GList      *categories;
 
+  /* List of keywords */
+  GList      *keywords;
+
   /* Whether this application requires a terminal to be started in */
   guint       requires_terminal : 1;
 
@@ -418,6 +422,7 @@ garcon_menu_item_finalize (GObject *object)
   g_strfreev (item->priv->not_show_in);
 
   _garcon_g_list_free_full (item->priv->categories, g_free);
+  _garcon_g_list_free_full (item->priv->keywords, g_free);
 
   if (item->priv->file != NULL)
     g_object_unref (G_OBJECT (item->priv->file));
@@ -670,18 +675,18 @@ garcon_menu_item_get_element_icon_name (GarconMenuElement *element)
 
 
 static gboolean
-garcon_menu_item_category_lists_equal (GList *categories1,
-                                       GList *categories2)
+garcon_menu_item_lists_equal (GList *list1,
+                              GList *list2)
 {
   gboolean  element_missing = FALSE;
   GList    *lp;
 
-  if (g_list_length (categories1) != g_list_length (categories2))
+  if (g_list_length (list1) != g_list_length (list2))
     return FALSE;
 
-  for (lp = categories1; !element_missing && lp != NULL; lp = lp->next)
+  for (lp = list1; !element_missing && lp != NULL; lp = lp->next)
     {
-      if (g_list_find_custom (categories2, lp->data, (GCompareFunc) g_strcmp0) == NULL)
+      if (g_list_find_custom (list2, lp->data, (GCompareFunc) g_strcmp0) == NULL)
         element_missing = TRUE;
     }
 
@@ -713,6 +718,7 @@ garcon_menu_item_new (GFile *file)
   GarconMenuItemAction *action = NULL;
   XfceRc               *rc;
   GList                *categories = NULL;
+  GList                *keywords = NULL;
   gchar                *filename;
   gboolean              terminal;
   gboolean              no_display;
@@ -801,6 +807,26 @@ garcon_menu_item_new (GFile *file)
           garcon_menu_item_set_categories (item, categories);
         }
 
+      /* Determine the keywords this application should be shown in */
+      str_list = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_KEYWORDS, ";");
+      if (G_LIKELY (str_list != NULL))
+        {
+          for (mt = str_list; *mt != NULL; ++mt)
+            {
+              /* Try to steal the values */
+              if (**mt != '\0')
+                keywords = g_list_prepend (keywords, *mt);
+              else
+                g_free (*mt);
+            }
+
+          /* Cleanup */
+          g_free (str_list);
+
+          /* Assign keywords list to the menu item */
+          garcon_menu_item_set_keywords (item, keywords);
+        }
+
       /* Set the rest of the private data directly */
       item->priv->only_show_in = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN, ";");
       item->priv->not_show_in = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN, ";");
@@ -950,8 +976,10 @@ garcon_menu_item_reload_from_file (GarconMenuItem  *item,
   GarconMenuItemAction *action = NULL;
   gboolean              boolean;
   GList                *categories = NULL;
-  GList                *lp;
   GList                *old_categories = NULL;
+  GList                *keywords = NULL;
+  GList                *old_keywords = NULL;
+  GList                *lp;
   gchar               **mt;
   gchar               **str_list;
   const gchar          *string;
@@ -1075,13 +1103,54 @@ garcon_menu_item_reload_from_file (GarconMenuItem  *item,
 
   if (affects_the_outside != NULL)
     {
-      if (!garcon_menu_item_category_lists_equal (old_categories, categories))
+      if (!garcon_menu_item_lists_equal (old_categories, categories))
         *affects_the_outside = TRUE;
 
       _garcon_g_list_free_full (old_categories, g_free);
     }
 
 
+  if (affects_the_outside != NULL)
+    {
+      /* create a deep copy the old keywords list */
+      old_keywords = g_list_copy (item->priv->keywords);
+      for (lp = old_keywords; lp != NULL; lp = lp->next)
+        lp->data = g_strdup (lp->data);
+    }
+
+  /* Determine the keywords this application should be shown in */
+  str_list = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_KEYWORDS, ";");
+  if (G_LIKELY (str_list != NULL))
+    {
+      for (mt = str_list; *mt != NULL; ++mt)
+        {
+          /* Try to steal the values */
+          if (**mt != '\0')
+            keywords = g_list_prepend (keywords, *mt);
+          else
+            g_free (*mt);
+        }
+
+      /* Cleanup */
+      g_free (str_list);
+
+      /* Assign keywords list to the menu item */
+      garcon_menu_item_set_keywords (item, keywords);
+    }
+  else
+    {
+      /* Assign empty keywords list to the menu item */
+      garcon_menu_item_set_keywords (item, NULL);
+    }
+
+  if (affects_the_outside != NULL)
+    {
+      if (!garcon_menu_item_lists_equal (old_keywords, keywords))
+        *affects_the_outside = TRUE;
+
+      _garcon_g_list_free_full (old_keywords, g_free);
+    }
+
   /* Set the rest of the private data directly */
   item->priv->only_show_in = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN, ";");
   item->priv->not_show_in = xfce_rc_read_list_entry (rc, G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN, ";");
@@ -1261,6 +1330,34 @@ garcon_menu_item_set_categories (GarconMenuItem *item,
 
 
 
+GList*
+garcon_menu_item_get_keywords (GarconMenuItem *item)
+{
+  g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), NULL);
+  return item->priv->keywords;
+}
+
+
+
+void
+garcon_menu_item_set_keywords (GarconMenuItem *item,
+                               GList          *keywords)
+{
+  g_return_if_fail (GARCON_IS_MENU_ITEM (item));
+
+  /* Abort if lists are equal */
+  if (G_UNLIKELY (item->priv->keywords == keywords))
+    return;
+
+  /* Free old list */
+  _garcon_g_list_free_full (item->priv->keywords, g_free);
+
+  /* Assign new list */
+  item->priv->keywords = keywords;
+}
+
+
+
 const gchar*
 garcon_menu_item_get_command (GarconMenuItem *item)
 {
@@ -1599,6 +1696,25 @@ garcon_menu_item_has_category (GarconMenuItem *item,
 
 
 
+gboolean
+garcon_menu_item_has_keyword (GarconMenuItem *item,
+                              const gchar    *keyword)
+{
+  GList   *iter;
+  gboolean found = FALSE;
+
+  g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), FALSE);
+  g_return_val_if_fail (keyword != NULL, FALSE);
+
+  for (iter = item->priv->keywords; !found && iter != NULL; iter = g_list_next (iter))
+    if (g_strcmp0 (iter->data, keyword) == 0)
+      found = TRUE;
+
+  return found;
+}
+
+
+
 GList *
 garcon_menu_item_get_actions (GarconMenuItem *item)
 {
diff --git a/garcon/garcon-menu-item.h b/garcon/garcon-menu-item.h
index 9b6b7b3..65ecd0f 100644
--- a/garcon/garcon-menu-item.h
+++ b/garcon/garcon-menu-item.h
@@ -3,6 +3,7 @@
  * Copyright (c) 2006-2010 Jannis Pohlmann <jannis at xfce.org>
  * Copyright (c) 2009      Nick Schermer <nick at xfce.org>
  * Copyright (c) 2015      Danila Poyarkov <dannotemail at gmail.com>
+ * Copyright (c) 2017      Gregor Santner <gsantner at mailbox.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -44,6 +45,8 @@ typedef struct _GarconMenuItem        GarconMenuItem;
 #define GARCON_IS_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GARCON_TYPE_MENU_ITEM))
 #define GARCON_MENU_ITEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GARCON_TYPE_MENU_ITEM, GarconMenuItemClass))
 
+#define  G_KEY_FILE_DESKTOP_KEY_KEYWORDS "Keywords"
+
 struct _GarconMenuItemClass
 {
   GObjectClass __parent__;
@@ -123,6 +126,11 @@ void                  garcon_menu_item_set_categories                    (Garcon
                                                                           GList           *categories);
 gboolean              garcon_menu_item_has_category                      (GarconMenuItem  *item,
                                                                           const gchar     *category);
+GList                *garcon_menu_item_get_keywords                      (GarconMenuItem  *item);
+void                  garcon_menu_item_set_keywords                      (GarconMenuItem  *item,
+                                                                          GList           *keywords);
+gboolean              garcon_menu_item_has_keyword                       (GarconMenuItem  *item,
+                                                                          const gchar     *keyword);
 GList                *garcon_menu_item_get_actions                       (GarconMenuItem  *item);
 GarconMenuItemAction *garcon_menu_item_get_action                        (GarconMenuItem  *item,
                                                                           const gchar     *action_name);

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


More information about the Xfce4-commits mailing list