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