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