Author: jannis
Date: 2006-09-28 11:50:37 +0000 (Thu, 28 Sep 2006)
New Revision: 23226

Added:
   libfrap/trunk/libfrap/menu/tests/test-display-root-menu.c
   libfrap/trunk/libfrap/menu/tests/test-or-rules.c
Modified:
   libfrap/trunk/libfrap/menu/ChangeLog
   libfrap/trunk/libfrap/menu/frap-menu-item.c
   libfrap/trunk/libfrap/menu/frap-menu-or-rules.c
   libfrap/trunk/libfrap/menu/frap-menu-or-rules.h
   libfrap/trunk/libfrap/menu/frap-menu-rules.c
   libfrap/trunk/libfrap/menu/frap-menu-rules.h
   libfrap/trunk/libfrap/menu/frap-menu-standard-rules.c
   libfrap/trunk/libfrap/menu/frap-menu-standard-rules.h
   libfrap/trunk/libfrap/menu/frap-menu.c
   libfrap/trunk/libfrap/menu/tests/Makefile.am
Log:
        * tests/Makefile.am, tests/test-or-rules.c,
          tests/test-display-root-menu.c: Added two additional test programs,
          one for testing <Or> rules and one for displaying the root menu.
        * frap-menu-rules.{c,h}: Make methods for adding rules to a
          FrapMenuRules object public. Add G_TYPE_OBJECT prerequisite to the 
          FrapMenuRules interface.
        * frap-menu-standard-rules.{c,h}: Add "include" property. This will
          probably be moved to the FrapMenuRules interface later. Fix abstract
          ->match method.
        * frap-menu-or-rules.{c,h}: Add frap_menu_or_rules_new method. Make
          FrapMenuOrRules a FRAP_TYPE_MENU_STANDARD_RULES type. Implement match
          method (does not yet check the desktop file id, because it's not clear
          how that is going to be handled).
        * frap-menu-item.c: Implement frap_menu_item_add_categories method.
        * frap-menu.c: Implement parsing of <Include>, <Exclude>, <Or>,
          <Filename> and <Category> elements. <And> and <Not> are still missing.

Modified: libfrap/trunk/libfrap/menu/ChangeLog
===================================================================
--- libfrap/trunk/libfrap/menu/ChangeLog        2006-09-28 11:26:25 UTC (rev 
23225)
+++ libfrap/trunk/libfrap/menu/ChangeLog        2006-09-28 11:50:37 UTC (rev 
23226)
@@ -1,5 +1,24 @@
 2006-09-28     Jannis Pohlmann <[EMAIL PROTECTED]>
 
+       * tests/Makefile.am, tests/test-or-rules.c,
+         tests/test-display-root-menu.c: Added two additional test programs,
+         one for testing <Or> rules and one for displaying the root menu.
+       * frap-menu-rules.{c,h}: Make methods for adding rules to a
+         FrapMenuRules object public. Add G_TYPE_OBJECT prerequisite to the 
+         FrapMenuRules interface.
+       * frap-menu-standard-rules.{c,h}: Add "include" property. This will
+         probably be moved to the FrapMenuRules interface later. Fix abstract
+         ->match method.
+       * frap-menu-or-rules.{c,h}: Add frap_menu_or_rules_new method. Make
+         FrapMenuOrRules a FRAP_TYPE_MENU_STANDARD_RULES type. Implement match
+         method (does not yet check the desktop file id, because it's not clear
+         how that is going to be handled).
+       * frap-menu-item.c: Implement frap_menu_item_add_categories method.
+       * frap-menu.c: Implement parsing of <Include>, <Exclude>, <Or>,
+         <Filename> and <Category> elements. <And> and <Not> are still missing.
+
+2006-09-28     Jannis Pohlmann <[EMAIL PROTECTED]>
+
        * tests/data/Makefile.am: Update desktop entry filename. I'm using 
          xfmedia.desktop as it provides everything I need to test (positively).
 

Modified: libfrap/trunk/libfrap/menu/frap-menu-item.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-item.c 2006-09-28 11:26:25 UTC (rev 
23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-item.c 2006-09-28 11:50:37 UTC (rev 
23226)
@@ -438,7 +438,7 @@
           for (mt = str_list; *mt != NULL; ++mt)
             {
               if (**mt != '\0')
-                categories = g_list_append (categories, g_strdup (*mt));
+                categories = g_list_prepend (categories, g_strdup (*mt));
             }
 
           /* Free list */          
@@ -528,6 +528,21 @@
 frap_menu_item_set_categories (FrapMenuItem *item,
                                GList        *categories)
 {
+  g_return_if_fail (FRAP_IS_MENU_ITEM (item));
+
+  if (G_UNLIKELY (item->priv->categories != NULL))
+    {
+      /* Abort if lists are equal */
+      if (G_UNLIKELY (item->priv->categories == categories))
+        return;
+
+      /* Free old list */
+      g_list_foreach (item->priv->categories, (GFunc) g_free, NULL);
+      g_list_free (item->priv->categories);
+    }
+
+  /* Assign new list */
+  item->priv->categories = categories;
 }
 
 

Modified: libfrap/trunk/libfrap/menu/frap-menu-or-rules.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-or-rules.c     2006-09-28 11:26:25 UTC 
(rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-or-rules.c     2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -23,8 +23,10 @@
 #include <config.h>
 #endif
 
+#include <frap-menu-rules.h>
 #include <frap-menu-standard-rules.h>
 #include <frap-menu-or-rules.h>
+#include <frap-menu-item.h>
 
 
 
@@ -73,7 +75,7 @@
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "FrapMenuOrRules", &info, 
0);
+      type = g_type_register_static (FRAP_TYPE_MENU_STANDARD_RULES, 
"FrapMenuOrRules", &info, 0);
     }
 
   return type;
@@ -87,6 +89,7 @@
   GObjectClass *gobject_class;
   FrapMenuStandardRulesClass *std_rules_class;
 
+  /* Determine the parent type class */
   frap_menu_or_rules_parent_class = g_type_class_peek_parent (klass);
 
   gobject_class = G_OBJECT_CLASS (klass);
@@ -115,10 +118,47 @@
 
 
 
+FrapMenuOrRules*
+frap_menu_or_rules_new (void)
+{
+  return g_object_new (FRAP_TYPE_MENU_OR_RULES, NULL);
+}
+
+
+
 static gboolean
 frap_menu_or_rules_match (FrapMenuStandardRules *rules,
                           const gchar           *item)
 {
-  /* TODO */
-  return TRUE;
+  GList *category;
+  GList *rule;
+
+  g_return_val_if_fail (FRAP_IS_MENU_STANDARD_RULES (rules), FALSE);
+  g_return_val_if_fail (FRAP_IS_MENU_ITEM (item), FALSE);
+
+  /* Compare item filename against filename rules */
+  /* TODO This should be a match against the Desktop-File Id. It's not yet sure
+   * how this will be modelled in FrapMenu! */
+
+  /* Determine categories the item belongs to */
+  category = g_list_first (frap_menu_item_get_categories (item));
+  while (category != NULL)
+    {
+      if (g_list_find_custom (rules->categories, category->data, 
g_utf8_collate))
+        return TRUE;
+      
+      category = g_list_next (category);
+    }
+
+  /* Match item against nested rules */
+  rule = g_list_first (rules->rules);
+  while (rule != NULL)
+    {
+      if (frap_menu_rules_match (FRAP_MENU_RULES (rule), item))
+        return TRUE;
+
+      category = g_list_next (category);
+    }
+
+  return FALSE;
 }

Modified: libfrap/trunk/libfrap/menu/frap-menu-or-rules.h
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-or-rules.h     2006-09-28 11:26:25 UTC 
(rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-or-rules.h     2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -38,8 +38,10 @@
 #define FRAP_IS_MENU_OR_RULES_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((obj), 
FRAP_TYPE_MENU_OR_RULES))
 #define FRAP_MENU_OR_RULES_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
FRAP_TYPE_MENU_OR_RULES, FrapMenuOrRulesClass))
 
-GType frap_menu_or_rules_get_type      (void) G_GNUC_CONST;
+GType            frap_menu_or_rules_get_type (void) G_GNUC_CONST;
 
+FrapMenuOrRules *frap_menu_or_rules_new      (void);
+
 G_END_DECLS;
 
 #endif /* !__FRAP_MENU_OR_RULES_H__ */

Modified: libfrap/trunk/libfrap/menu/frap-menu-rules.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-rules.c        2006-09-28 11:26:25 UTC 
(rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-rules.c        2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -52,6 +52,7 @@
       };
 
       type = g_type_register_static (G_TYPE_INTERFACE, "FrapMenuRules", &info, 
0);
+      g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
     }
   
   return type;

Modified: libfrap/trunk/libfrap/menu/frap-menu-rules.h
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-rules.h        2006-09-28 11:26:25 UTC 
(rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-rules.h        2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -55,8 +55,14 @@
 
 GType    frap_menu_rules_get_type    (void) G_GNUC_CONST;
 
-gboolean frap_menu__rules_match_item (FrapMenuRules *rules,
-                                      const gchar   *name);
+gboolean frap_menu_rules_match        (FrapMenuRules *rules,
+                                       const gchar   *name);
+void     frap_menu_rules_add_rules    (FrapMenuRules *rules,
+                                       FrapMenuRules *additional_rules);
+void     frap_menu_rules_add_filename (FrapMenuRules *rules,
+                                       const gchar   *filename);
+void     frap_menu_rules_add_category (FrapMenuRules *rules,
+                                       const gchar   *category);
 
 G_END_DECLS;
 

Modified: libfrap/trunk/libfrap/menu/frap-menu-standard-rules.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-standard-rules.c       2006-09-28 
11:26:25 UTC (rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-standard-rules.c       2006-09-28 
11:50:37 UTC (rev 23226)
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#include <libxfce4util/libxfce4util.h>
+
 #include <frap-menu-rules.h>
 #include <frap-menu-standard-rules.h>
 
@@ -41,10 +43,18 @@
 static void     frap_menu_standard_rules_rules_init     (FrapMenuRulesIface    
     *iface);
 static void     frap_menu_standard_rules_init           (FrapMenuStandardRules 
     *rules);
 static void     frap_menu_standard_rules_finalize       (GObject               
     *object);
-/* TODO Implement get_property and set_property for the boolean "include"
- * property */
+static void     frap_menu_standard_rules_get_property   (GObject               
     *object,
+                                                         guint                 
      prop_id,
+                                                         GValue                
     *value,
+                                                         GParamSpec            
     *pspec);
+static void     frap_menu_standard_rules_set_property   (GObject               
     *object,
+                                                         guint                 
      prop_id,
+                                                         const GValue          
     *value,
+                                                         GParamSpec            
     *pspec);
 static gboolean frap_menu_standard_rules_match          (FrapMenuRules         
     *rules,
                                                          const gchar           
     *item);
+static gboolean frap_menu_standard_rules_match_item     (FrapMenuStandardRules 
     *rules,
+                                                         const gchar           
     *item);
 static void     frap_menu_standard_rules_add_rules      (FrapMenuRules         
     *rules,
                                                          FrapMenuRules         
     *additional_rules);
 static void     frap_menu_standard_rules_add_filename   (FrapMenuRules         
     *rules,
@@ -103,6 +113,28 @@
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = frap_menu_standard_rules_finalize;
+  gobject_class->get_property = frap_menu_standard_rules_get_property;
+  gobject_class->set_property = frap_menu_standard_rules_set_property;
+
+  klass->match = frap_menu_standard_rules_match_item;
+
+  /**
+   * FrapMenuStandardRules:include:
+   *
+   * Whether this rule set shall be treated as an include or exclude element.
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_INCLUDE,
+                                   g_param_spec_boolean ("include",
+                                                         _("Include"),
+                                                         _("Treat element as 
include or exclude element"),
+                                                         TRUE,
+                                                         G_PARAM_READWRITE));
+
+  /* Overwrite FrapMenuRules's properties */
+#if 0
+  g_object_class_override_property (gobject_class, PROP_INCLUDE, "include");
+#endif
 }
 
 
@@ -124,6 +156,7 @@
   rules->rules = NULL;
   rules->filenames = NULL;
   rules->categories = NULL; 
+  rules->include = TRUE;
 }
 
 
@@ -148,6 +181,50 @@
 
 
 static void
+frap_menu_standard_rules_get_property (GObject    *object,
+                                       guint       prop_id,
+                                       GValue     *value,
+                                       GParamSpec *pspec)
+{
+  FrapMenuStandardRules *rules = FRAP_MENU_STANDARD_RULES (object);
+
+  switch (prop_id)
+    {
+    case PROP_INCLUDE:
+      g_value_set_boolean (value, frap_menu_standard_rules_get_include 
(rules));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
+frap_menu_standard_rules_set_property (GObject      *object,
+                                       guint         prop_id,
+                                       const GValue *value,
+                                       GParamSpec   *pspec)
+{
+  FrapMenuStandardRules *rules = FRAP_MENU_STANDARD_RULES (object);
+
+  switch (prop_id)
+    {
+    case PROP_INCLUDE:
+      frap_menu_standard_rules_set_include (rules, g_value_get_boolean 
(value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
 frap_menu_standard_rules_add_rules (FrapMenuRules *rules,
                                     FrapMenuRules *additional_rules)
 {
@@ -198,9 +275,46 @@
 frap_menu_standard_rules_match (FrapMenuRules *rules,
                                 const gchar   *item)
 {
-  g_return_val_if_fail (FRAP_IS_MENU_RULES (rules), FALSE);
-
   FrapMenuStandardRules *std_rules = FRAP_MENU_STANDARD_RULES (rules);
 
+  g_return_val_if_fail (FRAP_IS_MENU_STANDARD_RULES (std_rules), FALSE);
+
   return (*FRAP_MENU_STANDARD_RULES_GET_CLASS (std_rules)->match) (std_rules, 
item);
 }
+
+
+
+static gboolean
+frap_menu_standard_rules_match_item (FrapMenuStandardRules *rules,
+                                     const gchar           *item)
+{
+  g_return_val_if_fail (FRAP_IS_MENU_STANDARD_RULES (rules), FALSE);
+  return FALSE;
+}
+
+
+
+gboolean 
+frap_menu_standard_rules_get_include (FrapMenuStandardRules *rules)
+{
+  g_return_val_if_fail (FRAP_IS_MENU_STANDARD_RULES (rules), TRUE);
+  return rules->include;
+}
+
+
+
+void frap_menu_standard_rules_set_include (FrapMenuStandardRules *rules,
+                                           gboolean               include)
+{
+  g_return_if_fail (FRAP_IS_MENU_STANDARD_RULES (rules));
+
+  /* Do nothing if values are equal */
+  if (rules->include == include)
+    return;
+
+  /* Assign new value */
+  rules->include = include;
+
+  /* Notify listeners */
+  g_object_notify (G_OBJECT (rules), "include");
+}

Modified: libfrap/trunk/libfrap/menu/frap-menu-standard-rules.h
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-standard-rules.h       2006-09-28 
11:26:25 UTC (rev 23225)
+++ libfrap/trunk/libfrap/menu/frap-menu-standard-rules.h       2006-09-28 
11:50:37 UTC (rev 23226)
@@ -31,7 +31,7 @@
 typedef struct _FrapMenuStandardRules        FrapMenuStandardRules;
 typedef struct _FrapMenuStandardRulesClass   FrapMenuStandardRulesClass;
 
-#define FRAP_TYPE_MENU_STANDARD_RULES             (frap_menu_or_rules_get_type 
())
+#define FRAP_TYPE_MENU_STANDARD_RULES             
(frap_menu_standard_rules_get_type ())
 #define FRAP_MENU_STANDARD_RULES(obj)             (G_TYPE_CHECK_INSTANCE_CAST 
((obj), FRAP_TYPE_MENU_STANDARD_RULES, FrapMenuStandardRules))
 #define FRAP_MENU_STANDARD_RULES_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST 
((klass), FRAP_TYPE_MENU_STANDARD_RULES, FrapMenuStandardRulesClass))
 #define FRAP_IS_MENU_STANDARD_RULES(obj)          (G_TYPE_CHECK_INSTANCE_TYPE 
((obj), FRAP_TYPE_MENU_STANDARD_RULES))
@@ -50,13 +50,25 @@
 {
   GObject __parent__;
 
-  GList *rules;
-  GList *filenames;
-  GList *categories;
+  /* Nested rules */
+  GList   *rules;
+
+  /* Filename rules */
+  GList   *filenames;
+
+  /* Category rules */
+  GList   *categories;
+
+  /* Whether this rules object is treated as an include or exclude element */
+  gboolean include;
 };
 
-GType frap_menu_standard_rules_get_type      (void) G_GNUC_CONST;
+GType    frap_menu_standard_rules_get_type      (void) G_GNUC_CONST;
 
+gboolean frap_menu_standard_rules_get_include   (FrapMenuStandardRules *rules);
+void     frap_menu_standard_rules_set_include   (FrapMenuStandardRules *rules,
+                                                 gboolean               
include);
+
 G_END_DECLS;
 
 #endif /* !__FRAP_MENU_STANDARD_RULES_H__ */

Modified: libfrap/trunk/libfrap/menu/frap-menu.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu.c      2006-09-28 11:26:25 UTC (rev 
23225)
+++ libfrap/trunk/libfrap/menu/frap-menu.c      2006-09-28 11:50:37 UTC (rev 
23226)
@@ -28,6 +28,7 @@
 #include <libxfce4util/libxfce4util.h>
 
 #include <frap-menu-rules.h>
+#include <frap-menu-standard-rules.h>
 #include <frap-menu-or-rules.h>
 #include <frap-menu-directory.h>
 #include <frap-menu.h>
@@ -916,8 +917,11 @@
       else if (g_utf8_collate (element_name, "Include") == 0)
         {
           /* Create include rule */
-          FrapMenu *rule = g_object_new (FRAP_TYPE_MENU_OR_RULES, "include", 
TRUE);   
+          FrapMenuStandardRules *rule = frap_menu_or_rules_new ();
 
+          /* Set include property */
+          frap_menu_standard_rules_set_include (rule, FALSE);
+
           /* Add rule to the menu */
           frap_menu_add_rule (current_menu, FRAP_MENU_RULES (rule));
 
@@ -930,8 +934,11 @@
       else if (g_utf8_collate (element_name, "Exclude") == 0)
         {
           /* Create exclude rule */
-          FrapMenu *rule = g_object_new (FRAP_TYPE_MENU_OR_RULES, "include", 
FALSE);
+          FrapMenuStandardRules *rule = frap_menu_or_rules_new ();
 
+          /* Set include property */
+          frap_menu_standard_rules_set_include (rule, FALSE);
+
           /* Add rule to the menu */
           frap_menu_add_rule (current_menu, FRAP_MENU_RULES (rule));
 
@@ -967,14 +974,26 @@
       current_rule = g_list_first (menu_context->rule_stack)->data;
 
       if (g_utf8_collate (element_name, "Filename") == 0)
-        menu_context->node_type = FRAP_MENU_PARSE_NODE_TYPE_FILENAME;
+        {
+          menu_context->node_type = FRAP_MENU_PARSE_NODE_TYPE_FILENAME;
+        }
       else if (g_utf8_collate (element_name, "Category") == 0)
-        menu_context->node_type = FRAP_MENU_PARSE_NODE_TYPE_CATEGORY;
+        {
+          menu_context->node_type = FRAP_MENU_PARSE_NODE_TYPE_CATEGORY;
+        }
       else if (g_utf8_collate (element_name, "And") == 0)
         {
         }
       else if (g_utf8_collate (element_name, "Or") == 0)
         {
+          /* Create include rule */
+          FrapMenuStandardRules *rule = frap_menu_or_rules_new ();
+
+          /* Add rule to the current rule */
+          frap_menu_rules_add_rules (FRAP_MENU_RULES (current_rule), 
FRAP_MENU_RULES (rule));
+
+          /* Put rule to the stack */
+          menu_context->rule_stack = g_list_prepend (menu_context->rule_stack, 
rule);
         }
       else if (g_utf8_collate (element_name, "Not") == 0)
         {
@@ -1019,7 +1038,7 @@
       break;
 
     case FRAP_MENU_PARSE_STATE_RULE:
-      if (g_utf8_collate (element_name, "Include") == 0 || g_utf8_collate 
(element_name, "Exclude") == 0)
+      if (g_utf8_collate (element_name, "Include") == 0 || g_utf8_collate 
(element_name, "Exclude") == 0 || g_utf8_collate (element_name, "Or") == 0)
         {
           /* Remove current rule from stack */
           menu_context->rule_stack = g_list_delete_link 
(menu_context->rule_stack, g_list_first (menu_context->rule_stack));
@@ -1304,11 +1323,11 @@
           
           /* Expand PATH to include KDEDIR/bin - if necessary */
           gchar *occurence = g_strrstr (path, kde_bin_dir);
-          if (G_UNLIKELY (occurence == NULL))
+          if (G_LIKELY (occurence == NULL))
             {
               /* PATH = $PATH:$KDEDIR/bin */
               kde_path = g_strjoin (G_SEARCHPATH_SEPARATOR_S, path, 
kde_bin_dir);
-    
+
               /* Set new $PATH value */
               g_setenv ("PATH", kde_path, TRUE);
 
@@ -1517,7 +1536,7 @@
   g_return_val_if_fail (FRAP_IS_MENU (menu), NULL);
   g_return_val_if_fail (filename != NULL, NULL);
 
-  /* Iterate through all (parent) menus from the bottom up */
+  /* Iterate through all (including parent) menus from the bottom up */
   for (current = menu; current != NULL; current = frap_menu_get_parent 
(current))
     {
       /* Allocate a reverse copy of the menu's directory dirs */

Modified: libfrap/trunk/libfrap/menu/tests/Makefile.am
===================================================================
--- libfrap/trunk/libfrap/menu/tests/Makefile.am        2006-09-28 11:26:25 UTC 
(rev 23225)
+++ libfrap/trunk/libfrap/menu/tests/Makefile.am        2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -7,6 +7,7 @@
        $(GLIB_CFLAGS)                                                  \
        $(GTHREAD_CFLAGS)                                               \
        $(LIBXFCE4UTIL_CFLAGS)                                          \
+       $(GTK_CFLAGS)                                                   \
        -I$(top_builddir)/libfrap/menu/                                 \
        -DG_LOG_DOMAIN=\"tests\"
        
@@ -14,15 +15,20 @@
        $(GLIB_LIBS)                                                    \
        $(GTHREAD_LIBS)                                                 \
        $(LIBXFCE4UTIL_LIBS)                                            \
+       $(GTK_LIBS)                                                     \
        $(top_builddir)/libfrap/menu/libfrapmenu.la                     
 
 TESTS =                                                                        
\
-       test-menu-item                                                  
-#      test-root-menu
+       test-menu-item                                                  \
+       test-or-rules                                                   \
+       test-root-menu                                                  \
+       test-display-root-menu                                          
 
 check_PROGRAMS =                                                       \
-       test-menu-item                                                  
-#      test-root-menu
+       test-menu-item                                                  \       
                        
+       test-or-rules                                                   \
+       test-root-menu                                                  \
+       test-display-root-menu                                          
 
 test_menu_item_SOURCES =                                               \
        test-menu-item.c
@@ -30,12 +36,24 @@
 test_menu_item_DEPENDENCIES =                                          \
        $(top_builddir)/libfrap/menu/libfrapmenu.la
 
+test_or_rules_SOURCES =                                                        
\
+       test-or-rules.c
+
+test_or_rules_DEPENDENCIES =                                           \
+       $(top_builddir)/libfrap/menu/libfrapmenu.la
+
 test_root_menu_SOURCES =                                               \
        test-root-menu.c
 
 test_root_menu_DEPENDENCIES =                                          \
        $(top_builddir)/libfrap/menu/libfrapmenu.la
 
+test_display_root_menu_SOURCES =                                       \
+       test-display-root-menu.c
+
+test_display_root_menu_DEPENDENCIES =                                  \
+       $(top_builddir)/libfrap/menu/libfrapmenu.la
+
 EXTRA_DIST =                                                           \
        README                                                          \
        STATUS

Added: libfrap/trunk/libfrap/menu/tests/test-display-root-menu.c
===================================================================
--- libfrap/trunk/libfrap/menu/tests/test-display-root-menu.c                   
        (rev 0)
+++ libfrap/trunk/libfrap/menu/tests/test-display-root-menu.c   2006-09-28 
11:50:37 UTC (rev 23226)
@@ -0,0 +1,190 @@
+/* $Id$ */
+/* vi:set expandtab sw=2 sts=2: */
+/*-
+ * Copyright (c) 2006 Jannis Pohlmann <[EMAIL PROTECTED]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <gtk/gtk.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include <libfrapmenu.h>
+
+
+
+static FrapMenu  *root = NULL;
+static GtkWidget *window = NULL;
+
+
+
+void
+main_window_destroy (GtkWidget *window, gpointer user_data)
+{
+  gtk_main_quit ();
+}
+
+
+
+gint
+compare_menus (FrapMenu *menu1, FrapMenu *menu2)
+{
+  FrapMenuDirectory *dir1 = frap_menu_get_directory (FRAP_MENU (menu1));
+  FrapMenuDirectory *dir2 = frap_menu_get_directory (FRAP_MENU (menu2));
+
+  if (G_UNLIKELY (dir1 == NULL || dir2 == NULL))
+    return 0;
+
+  return g_utf8_collate (frap_menu_directory_get_name (dir1), 
frap_menu_directory_get_name (dir2));
+}
+
+
+
+void
+create_widgets_for_menu (GtkWidget *widget, FrapMenu *menu)
+{
+  FrapMenuDirectory *directory;
+  GtkWidget         *menu_item;
+  GtkWidget         *submenu;
+  GtkWidget         *image;
+  GSList            *iter;
+  GSList            *menus;
+
+  /* Create sorted copy of the submenu list */
+  menus = g_slist_sort (g_slist_copy (frap_menu_get_menus (menu)), 
(GCompareFunc) compare_menus);
+
+  for (iter = menus; iter != NULL; iter = g_slist_next (iter))
+    {
+      /* Get menu directory */
+      directory = frap_menu_get_directory (FRAP_MENU (iter->data));
+
+      if (G_UNLIKELY (directory == NULL))
+        continue;
+
+      /* Create menu icon */
+      image = gtk_image_new_from_icon_name (frap_menu_directory_get_icon 
(directory), GTK_ICON_SIZE_MENU);
+
+      /* Create menu item */
+      menu_item = gtk_image_menu_item_new_with_label 
(frap_menu_directory_get_name (directory));
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
+      gtk_menu_shell_append (GTK_MENU_SHELL (widget), menu_item);
+      gtk_widget_show (menu_item);
+
+      /* Create submenu */
+      submenu = gtk_menu_new ();
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), submenu);
+
+      /* Create widgets for submenu */
+      create_widgets_for_menu (submenu, FRAP_MENU (iter->data));
+    }
+
+  /* Free submenu list */
+  g_slist_free (menus);
+}
+
+
+
+void
+show_menu (GtkButton *button, GtkWidget *menu)
+{
+  /* Create menu widgets if not already done */
+  if (g_list_length (gtk_container_get_children (GTK_CONTAINER (menu))) == 0)
+    create_widgets_for_menu (menu, root);
+
+  /* Display the menu */
+  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, 
gtk_get_current_event_time ());
+}
+
+
+
+void
+create_main_window (void)
+{
+  GtkWidget *vbox;
+  GtkWidget *label;
+  GtkWidget *button;
+  GtkWidget *menu;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+  /* Basic window setup */
+  gtk_window_set_title (GTK_WINDOW (window), _("XDG Menu"));
+  gtk_container_set_border_width (GTK_CONTAINER (window), 12);
+
+  /* Connect signal handlers */
+  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK 
(main_window_destroy), NULL);
+
+  /* Display window */
+  gtk_widget_show (window);
+
+  /* Create vbox */
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_container_add (GTK_CONTAINER (window), vbox);
+  gtk_widget_show (vbox);
+
+  /* Create label */
+  label = gtk_label_new (NULL);
+  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+  gtk_label_set_markup (GTK_LABEL (label), "<b><big>XDG Menu:</big></b>");
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+  gtk_widget_show (label);
+
+  /* Create button */
+  button = gtk_button_new_with_mnemonic (_("_Show"));
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  gtk_widget_show (button);
+
+  /* Create menu */
+  menu = gtk_menu_new ();
+
+  /* Connect button to the menu */
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_menu), 
menu);
+}
+
+
+
+int main(int    argc,
+         char **argv)
+{
+  /* Initialize GTK */
+  gtk_init (&argc, &argv);
+
+  /* Initialize the menu library */
+  frap_menu_init ();
+
+  /* Get a reference to the root menu */
+  root = frap_menu_get_root ();
+
+  /* Create the main window */
+  create_main_window ();
+
+  /* Enter main loop */
+  gtk_main ();
+
+  /* Destroy the root menu */
+  g_object_unref (root);
+
+  /* Shut down the menu library */
+  frap_menu_shutdown ();
+
+  return EXIT_SUCCESS;
+}


Property changes on: libfrap/trunk/libfrap/menu/tests/test-display-root-menu.c
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision

Added: libfrap/trunk/libfrap/menu/tests/test-or-rules.c
===================================================================
--- libfrap/trunk/libfrap/menu/tests/test-or-rules.c                            
(rev 0)
+++ libfrap/trunk/libfrap/menu/tests/test-or-rules.c    2006-09-28 11:50:37 UTC 
(rev 23226)
@@ -0,0 +1,68 @@
+/* $Id$ */
+/* vi:set expandtab sw=2 sts=2: */
+/*-
+ * Copyright (c) 2006 Jannis Pohlmann <[EMAIL PROTECTED]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <libfrapmenu.h>
+
+int main (int    argc,
+          char **argv)
+{
+  FrapMenuItem          *item;
+  FrapMenuStandardRules *rules;
+  gchar                 *desktop_file_path;
+
+  /* Initialize FrapMenu */
+  frap_menu_init ();
+
+  /* Build desktop file path */
+  desktop_file_path = g_build_filename (g_getenv ("PWD"), G_DIR_SEPARATOR_S, 
"data", G_DIR_SEPARATOR_S, "xfmedia.desktop", NULL);
+
+  /* Load desktop file */
+  item = frap_menu_item_new (desktop_file_path);
+
+  /* Create or rules */
+  rules = frap_menu_or_rules_new ();
+
+  /* Match against empty or rules */
+  g_assert (frap_menu_rules_match (FRAP_MENU_RULES (rules), item) == FALSE);
+
+  /* Match against category rules */
+  frap_menu_rules_add_category (FRAP_MENU_RULES (rules), "TextEditor");
+  g_assert (frap_menu_rules_match (FRAP_MENU_RULES (rules), item) == FALSE);
+  frap_menu_rules_add_category (FRAP_MENU_RULES (rules), "VideoPlayer");
+  g_assert (frap_menu_rules_match (FRAP_MENU_RULES (rules), item) == TRUE);
+
+  /* Free desktop file */
+  g_object_unref (G_OBJECT (item));
+
+  /* Free path */
+  g_free (desktop_file_path);
+
+  /* Shutdown FrapMenu */
+  frap_menu_shutdown ();
+
+  return EXIT_SUCCESS;
+}


Property changes on: libfrap/trunk/libfrap/menu/tests/test-or-rules.c
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to