Author: jannis
Date: 2007-02-07 23:29:34 +0000 (Wed, 07 Feb 2007)
New Revision: 24874

Modified:
   libfrap/trunk/libfrap/menu/ChangeLog
   libfrap/trunk/libfrap/menu/frap-menu-item-pool.c
   libfrap/trunk/libfrap/menu/frap-menu-item-pool.h
   libfrap/trunk/libfrap/menu/frap-menu.c
Log:
        * frap-menu-item-pool.{c,h}: Remove frap_menu_item_cache_apply_rules()
          and frap_menu_item_cache_remove_allocated() as include/exclude rules
          are handled differently now. Instead, add 
          frap_menu_item_cache_apply_exclude_rule().
        * frap-menu.c: Remove frap_menu_resolve_items_from_path in favour of
          frap_menu_resolve_items_by_rule() and
          frap_menu_resolve_items_from_path_by_rule(), so items are only added
          to the pool if they match one of the include rules (instead of
          removing them later if they match no include rule). Update
          frap_menu_resolve_items() according to this. Call
          frap_menu_resolve_deleted() after resolving the items to preserve the
          allocation state of items allocated by the menu. 

Modified: libfrap/trunk/libfrap/menu/ChangeLog
===================================================================
--- libfrap/trunk/libfrap/menu/ChangeLog        2007-02-07 15:23:02 UTC (rev 
24873)
+++ libfrap/trunk/libfrap/menu/ChangeLog        2007-02-07 23:29:34 UTC (rev 
24874)
@@ -1,3 +1,18 @@
+2007-02-08     Jannis Pohlmann <[EMAIL PROTECTED]>
+
+       * frap-menu-item-pool.{c,h}: Remove frap_menu_item_cache_apply_rules()
+         and frap_menu_item_cache_remove_allocated() as include/exclude rules
+         are handled differently now. Instead, add 
+         frap_menu_item_cache_apply_exclude_rule().
+       * frap-menu.c: Remove frap_menu_resolve_items_from_path in favour of
+         frap_menu_resolve_items_by_rule() and
+         frap_menu_resolve_items_from_path_by_rule(), so items are only added
+         to the pool if they match one of the include rules (instead of
+         removing them later if they match no include rule). Update
+         frap_menu_resolve_items() according to this. Call
+         frap_menu_resolve_deleted() after resolving the items to preserve the
+         allocation state of items allocated by the menu. 
+
 2007-02-06     Jannis Pohlmann <[EMAIL PROTECTED]>
 
        * frap-menu-directory.{c,h}: Add support for NoDisplay, Hidden and

Modified: libfrap/trunk/libfrap/menu/frap-menu-item-pool.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-item-pool.c    2007-02-07 15:23:02 UTC 
(rev 24873)
+++ libfrap/trunk/libfrap/menu/frap-menu-item-pool.c    2007-02-07 23:29:34 UTC 
(rev 24874)
@@ -37,14 +37,11 @@
 static void     frap_menu_item_pool_class_init       (FrapMenuItemPoolClass 
*klass);
 static void     frap_menu_item_pool_init             (FrapMenuItemPool      
*pool);
 static void     frap_menu_item_pool_finalize         (GObject               
*object);
-static gboolean frap_menu_item_pool_filter_item      (const gchar           
*desktop_id,
+static gboolean frap_menu_item_pool_filter_exclude   (const gchar           
*desktop_id,
                                                       FrapMenuItem          
*item,
-                                                      GSList                
*rules);
+                                                      FrapMenuStandardRules 
*rules);
 static gboolean frap_menu_item_pool_remove           (const gchar           
*desktop_id,
                                                       FrapMenuItem          
*item);
-static gboolean frap_menu_item_pool_filter_allocated (const gchar           
*desktop_id,
-                                                      FrapMenuItem          
*item,
-                                                      gpointer               
data);
 
 
 
@@ -192,97 +189,34 @@
 
 
 void
-frap_menu_item_pool_apply_rules (FrapMenuItemPool *pool,
-                                 GSList           *rules)
+frap_menu_item_pool_apply_exclude_rule (FrapMenuItemPool      *pool,
+                                        FrapMenuStandardRules *rule)
 {
-  GSList *iter;
-
   g_return_if_fail (FRAP_IS_MENU_ITEM_POOL (pool));
+  g_return_if_fail (FRAP_IS_MENU_STANDARD_RULES (rule));
 
-  /* If rules are empty, remove all items */
-  if (G_UNLIKELY (g_slist_length (rules) == 0))
-    {
-#if GLIB_CHECK_VERSION(2,12,0)    
-      g_hash_table_remove_all (pool->priv->items);
-#else
-      g_hash_table_foreach_remove (pool->priv->items, (GHRFunc) 
frap_menu_item_pool_remove, NULL);
-#endif
-    }
-  else 
-   g_hash_table_foreach_remove (pool->priv->items, (GHRFunc) 
frap_menu_item_pool_filter_item, rules);
+  /* Remove all items which match this exclude rule */
+  g_hash_table_foreach_remove (pool->priv->items, (GHRFunc) 
frap_menu_item_pool_filter_exclude, rule);
 }
 
 
 
 static gboolean
-frap_menu_item_pool_filter_item (const gchar   *desktop_id,
-                                 FrapMenuItem  *item,
-                                 GSList        *rules)
+frap_menu_item_pool_filter_exclude (const gchar           *desktop_id,
+                                    FrapMenuItem          *item,
+                                    FrapMenuStandardRules *rule)
 {
-  FrapMenuStandardRules *rule;
-  GSList                *iter;
-  gboolean               remove = TRUE;
-  gboolean               matches;
-
+  g_return_val_if_fail (FRAP_IS_MENU_STANDARD_RULES (rule), FALSE);
   g_return_val_if_fail (FRAP_IS_MENU_ITEM (item), FALSE);
 
-  /* Iterate over all rules */
-  for (iter = rules; iter != NULL; iter = g_slist_next (iter))
-    {
-      rule = FRAP_MENU_STANDARD_RULES (iter->data);
-
-      if (frap_menu_standard_rules_get_include (rule))
-        {
-          matches = frap_menu_rules_match (FRAP_MENU_RULES (rule), item);
-
-          if (matches)
-            remove = FALSE;
-        }
-      else
-        {
-          matches = frap_menu_rules_match (FRAP_MENU_RULES (rule), item);
-
-          if (matches)
-            remove = TRUE;
-        }
-    }
-
-  return remove;
+  return frap_menu_rules_match (FRAP_MENU_RULES (rule), item);
 }
 
 
 
-void
-frap_menu_item_pool_remove_allocated (FrapMenuItemPool *pool)
-{
-  g_return_if_fail (FRAP_IS_MENU_ITEM_POOL (pool));
-  g_hash_table_foreach_remove (pool->priv->items, (GHRFunc) 
frap_menu_item_pool_filter_allocated, NULL);
-}
-
-
-
 gboolean
 frap_menu_item_pool_get_empty (FrapMenuItemPool *pool)
 {
   g_return_val_if_fail (FRAP_IS_MENU_ITEM_POOL (pool), TRUE);
   return (g_hash_table_size (pool->priv->items) == 0);
 }
-
-
-
-static gboolean
-frap_menu_item_pool_remove (const gchar  *desktop_id,
-                            FrapMenuItem *item)
-{
-  return TRUE;
-}
-
-
-
-static gboolean 
-frap_menu_item_pool_filter_allocated (const gchar  *desktop_id,
-                                      FrapMenuItem *item,
-                                      gpointer      data)
-{
-  return frap_menu_item_get_allocated (item) > 1;
-}

Modified: libfrap/trunk/libfrap/menu/frap-menu-item-pool.h
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-item-pool.h    2007-02-07 15:23:02 UTC 
(rev 24873)
+++ libfrap/trunk/libfrap/menu/frap-menu-item-pool.h    2007-02-07 23:29:34 UTC 
(rev 24874)
@@ -27,6 +27,7 @@
 #define __FRAP_MENU_ITEM_POOL_H__
 
 #include <glib-object.h>
+#include <frap-menu-standard-rules.h>
 
 G_BEGIN_DECLS;
 
@@ -41,21 +42,20 @@
 #define FRAP_IS_MENU_ITEM_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
FRAP_TYPE_MENU_ITEM_POOL))
 #define FRAP_MENU_ITEM_POOL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), 
FRAP_TYPE_MENU_ITEM_POOL, FrapMenuItemPoolClass))
 
-GType             frap_menu_item_pool_get_type         (void) G_GNUC_CONST;
+GType             frap_menu_item_pool_get_type           (void) G_GNUC_CONST;
 
-FrapMenuItemPool *frap_menu_item_pool_new              (void);
+FrapMenuItemPool *frap_menu_item_pool_new                (void);
 
-void              frap_menu_item_pool_insert           (FrapMenuItemPool *pool,
-                                                        FrapMenuItem     
*item);
-FrapMenuItem     *frap_menu_item_pool_lookup           (FrapMenuItemPool *pool,
-                                                        const gchar      
*desktop_id);
-void              frap_menu_item_pool_foreach          (FrapMenuItemPool *pool,
-                                                        GHFunc            
func, 
-                                                        gpointer          
user_data);
-void              frap_menu_item_pool_apply_rules      (FrapMenuItemPool *pool,
-                                                        GSList           
*rules);
-void              frap_menu_item_pool_remove_allocated (FrapMenuItemPool 
*pool);
-gboolean          frap_menu_item_pool_get_empty        (FrapMenuItemPool 
*pool);
+void              frap_menu_item_pool_insert             (FrapMenuItemPool     
 *pool,
+                                                          FrapMenuItem         
 *item);
+FrapMenuItem     *frap_menu_item_pool_lookup             (FrapMenuItemPool     
 *pool,
+                                                          const gchar          
 *desktop_id);
+void              frap_menu_item_pool_foreach            (FrapMenuItemPool     
 *pool,
+                                                          GHFunc               
  func, 
+                                                          gpointer             
  user_data);
+void              frap_menu_item_pool_apply_exclude_rule (FrapMenuItemPool     
 *pool,
+                                                          
FrapMenuStandardRules *rule);
+gboolean          frap_menu_item_pool_get_empty          (FrapMenuItemPool     
 *pool);
 
 G_END_DECLS;
 

Modified: libfrap/trunk/libfrap/menu/frap-menu.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu.c      2007-02-07 15:23:02 UTC (rev 
24873)
+++ libfrap/trunk/libfrap/menu/frap-menu.c      2007-02-07 23:29:34 UTC (rev 
24874)
@@ -276,7 +276,10 @@
                                                                             
FrapMenuMove          *move);
 static void               frap_menu_resolve_items                          
(FrapMenu              *menu,
                                                                             
gboolean               only_unallocated);
-static void               frap_menu_resolve_items_from_path                
(FrapMenu              *menu,
+static void               frap_menu_resolve_items_by_rule                  
(FrapMenu              *menu,
+                                                                            
FrapMenuStandardRules *rule);
+static void               frap_menu_resolve_items_from_path_by_rule        
(FrapMenu              *menu,
+                                                                            
FrapMenuStandardRules *rule,
                                                                             
const gchar           *path,
                                                                             
const gchar           *id_prefix);
 static void               frap_menu_resolve_deleted                        
(FrapMenu              *menu);
@@ -1074,11 +1077,12 @@
   frap_menu_remove_duplicates (menu);
   frap_menu_resolve_directory (menu);
   frap_menu_resolve_moves (menu);
-  frap_menu_resolve_deleted (menu);
 
   frap_menu_resolve_items (menu, FALSE);
   frap_menu_resolve_items (menu, TRUE);
   
+  frap_menu_resolve_deleted (menu);
+
   return TRUE;
 }
 
@@ -2222,33 +2226,35 @@
 frap_menu_resolve_items (FrapMenu *menu,
                          gboolean  only_unallocated)
 {
-  GSList      *iter;
-  GDir        *dir;
-  const gchar *app_dir;
+  FrapMenuStandardRules *rule;
+  GSList                *iter;
+  GDir                  *dir;
+  const gchar           *app_dir;
 
   g_return_if_fail (menu != NULL && FRAP_IS_MENU (menu));
 
-  /* TODO Remove all items from the pool if there are no include rules! */
-
   /* Resolve items in this menu (if it matches the only_unallocated argument.
    * This means that in the first pass, all items of menus without 
    * <OnlyUnallocated /> are resolved and in the second pass, only items of 
    * menus with <OnlyUnallocated /> are resolved */
   if (menu->priv->only_unallocated == only_unallocated)
     {
-      /* Iterate over all application directories */
-      for (iter = frap_menu_get_app_dirs (menu); iter != NULL; iter = 
g_slist_next (iter))
+      /* Iterate over all rules */
+      for (iter = menu->priv->rules; iter != NULL; iter = g_slist_next (iter))
         {
-          /* Resolve items in the current directory */
-          frap_menu_resolve_items_from_path (menu, iter->data, NULL);
+          rule = FRAP_MENU_STANDARD_RULES (iter->data);
+
+          if (G_LIKELY (frap_menu_standard_rules_get_include (rule)))
+            {
+              /* Resolve available items and match them against this rule */
+              frap_menu_resolve_items_by_rule (menu, rule);
+            }
+          else
+            {
+              /* Remove all items matching this exclude rule from the item 
pool */
+              frap_menu_item_pool_apply_exclude_rule (menu->priv->pool, rule);
+            }
         }
-
-      /* Filter already allocated items if the menu has <OnlyUnallocated/> */
-      if (G_UNLIKELY (menu->priv->only_unallocated)) 
-        frap_menu_item_pool_remove_allocated (menu->priv->pool);
-
-      /* Filter items according to the include/exclude rules */
-      frap_menu_item_pool_apply_rules (menu->priv->pool, menu->priv->rules);
     }
 
   /* Iterate over all submenus */
@@ -2261,10 +2267,30 @@
 
 
 
+static void
+frap_menu_resolve_items_by_rule (FrapMenu              *menu,
+                                 FrapMenuStandardRules *rule)
+{
+  GSList *iter;
+
+  g_return_if_fail (FRAP_IS_MENU (menu));
+  g_return_if_fail (FRAP_IS_MENU_STANDARD_RULES (rule));
+
+  /* Iterate over all application directories */
+  for (iter = frap_menu_get_app_dirs (menu); iter != NULL; iter = g_slist_next 
(iter))
+    {
+      /* Resolve items in the current directory */
+      frap_menu_resolve_items_from_path_by_rule (menu, rule, iter->data, NULL);
+    }
+}
+
+
+
 static void 
-frap_menu_resolve_items_from_path (FrapMenu    *menu,
-                                   const gchar *path,
-                                   const gchar *id_prefix)
+frap_menu_resolve_items_from_path_by_rule (FrapMenu              *menu,
+                                           FrapMenuStandardRules *rule,
+                                           const gchar           *path,
+                                           const gchar           *id_prefix)
 {
   FrapMenuItem *item;
   GDir         *dir;
@@ -2304,7 +2330,7 @@
             new_id_prefix = g_strjoin ("-", id_prefix, filename, NULL);
 
           /* Resolve items in that directory */
-          frap_menu_resolve_items_from_path (menu, absolute_path, 
new_id_prefix);
+          frap_menu_resolve_items_from_path_by_rule (menu, rule, 
absolute_path, new_id_prefix);
 
           /* Free the prefix */
           g_free (new_id_prefix);
@@ -2329,8 +2355,12 @@
                    * or if the item is not allocated yet */
                   if (!menu->priv->only_unallocated || 
(frap_menu_item_get_allocated (item) < 1))
                     {
-                      /* Add the new item to the pool (replace the old one if 
needed) */
-                      frap_menu_item_pool_insert (menu->priv->pool, item);
+                      /* Add item to the pool if it matches the include rule */
+                      if (G_LIKELY (frap_menu_standard_rules_get_include 
(rule) 
+                                    && frap_menu_rules_match (FRAP_MENU_RULES 
(rule), item)))
+                        {
+                          frap_menu_item_pool_insert (menu->priv->pool, item);
+                        }
                     }
                 }
 

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to