diff options
-rw-r--r-- | desktop-directories/Makefile.am | 1 | ||||
-rw-r--r-- | desktop-directories/mate-collection.directory.in | 5 | ||||
-rw-r--r-- | layout/mate-applications.menu | 11 | ||||
-rw-r--r-- | libmenu/matemenu-tree.c | 134 |
4 files changed, 147 insertions, 4 deletions
diff --git a/desktop-directories/Makefile.am b/desktop-directories/Makefile.am index 4e166bf..d3f8cb4 100644 --- a/desktop-directories/Makefile.am +++ b/desktop-directories/Makefile.am @@ -24,6 +24,7 @@ directory_in_files = \ mate-other.directory.in \ mate-menu-applications.directory.in \ mate-menu-system.directory.in \ + mate-collection.directory.in \ $(directory_in_controlcenterfiles) directory_DATA = $(directory_in_files:.directory.in=.directory) diff --git a/desktop-directories/mate-collection.directory.in b/desktop-directories/mate-collection.directory.in new file mode 100644 index 0000000..be657e0 --- /dev/null +++ b/desktop-directories/mate-collection.directory.in @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Collection +Comment=Common shortcut +Icon=starred +Type=Directory diff --git a/layout/mate-applications.menu b/layout/mate-applications.menu index 258494b..9037852 100644 --- a/layout/mate-applications.menu +++ b/layout/mate-applications.menu @@ -138,6 +138,17 @@ </Include> </Menu> <!-- End System Tools --> + <!-- Collection--> + <Menu> + <Name>Collection</Name> + <Directory>mate-collection.directory</Directory> + <Include> + <And> + <Category>Collection</Category> + <Not><Category>Settings</Category></Not> + </And> + </Include> + </Menu> <!-- End Collection Tools --> <!-- Other --> <Menu> <Name>Other</Name> diff --git a/libmenu/matemenu-tree.c b/libmenu/matemenu-tree.c index 9a74bf6..e799a07 100644 --- a/libmenu/matemenu-tree.c +++ b/libmenu/matemenu-tree.c @@ -46,7 +46,16 @@ enum { PROP_MENU_PATH, PROP_FLAGS }; - +typedef enum +{ + OBJECT_DRAWER, + OBJECT_MENU, + OBJECT_LAUNCHER, + OBJECT_APPLET, + OBJECT_ACTION, + OBJECT_MENU_BAR, + OBJECT_SEPARATOR, +} ObjectType; /* Signals */ enum { @@ -64,7 +73,7 @@ struct _MateMenuTree char *non_prefixed_basename; char *path; char *canonical_path; - + GPtrArray *collection_applet; MateMenuTreeFlags flags; GSList *menu_file_monitors; @@ -594,6 +603,11 @@ matemenu_tree_get_property (GObject *object, break; } } +static void +collection_applet_free (char *desktop_name) +{ + g_free (desktop_name); +} static void matemenu_tree_finalize (GObject *object) @@ -619,14 +633,98 @@ matemenu_tree_finalize (GObject *object) g_hash_table_destroy (tree->entries_by_id); tree->entries_by_id = NULL; - + if (tree->collection_applet != NULL) + { + g_ptr_array_foreach (tree->collection_applet,(GFunc) collection_applet_free, NULL); + g_ptr_array_free (tree->collection_applet, TRUE); + tree->collection_applet = NULL; + } G_OBJECT_CLASS (matemenu_tree_parent_class)->finalize (object); } +static void load_object (char *id,MateMenuTree *self) +{ + ObjectType object_type; + char *object_path; + GSettings *settings; + char *location; + char **str; + char *desktop_name; + + object_path = g_strdup_printf ("/org/mate/panel/objects/%s/", id); + settings = g_settings_new_with_path ("org.mate.panel.object", object_path); + + object_type = g_settings_get_enum (settings, "object-type"); + location = g_settings_get_string (settings, "launcher-location"); + if (object_type == OBJECT_LAUNCHER) + { + const char *basename = g_path_get_basename (location); + if (strstr (basename,"-1.") != NULL ) + { + str = g_strsplit (basename, "-1.", -1); + desktop_name = g_strdup_printf ("%s.%s", str[0], str[1]); + g_ptr_array_add (self->collection_applet, desktop_name); + g_strfreev (str); + } + else + { + g_ptr_array_add (self->collection_applet, g_strdup(basename)); + } + } + g_free (object_path); + g_object_unref (settings); +} +static gboolean emit_changed_signal (gpointer data) +{ + MateMenuTree *self = data; + matemenu_tree_force_rebuild (self); + matemenu_tree_invoke_monitors (self); + + return FALSE; +} +static void +collection_applet_changed (GSettings *settings, + gchar *key, + MateMenuTree *self) +{ + gchar **list; + gint i; + + list = g_settings_get_strv (settings, key); + self->collection_applet = NULL; + self->collection_applet = g_ptr_array_new (); + for (i = 0; list[i]; i++) + { + load_object (list[i], self); + } + if (list) + g_strfreev (list); + if(self->loaded) + g_idle_add (emit_changed_signal, (gpointer)self); +} +static void get_panel_collection_applet (MateMenuTree *self) +{ + GSettings *settings; + gchar **list; + gint i; + + settings = g_settings_new ("org.mate.panel"); + list = g_settings_get_strv (settings, "object-id-list"); + g_signal_connect (settings, "changed::object-id-list", G_CALLBACK (collection_applet_changed), self); + for (i = 0; list[i]; i++) + { + load_object (list[i], self); + } + + if (list) + g_strfreev (list); +} static void matemenu_tree_init (MateMenuTree *self) { self->entries_by_id = g_hash_table_new (g_str_hash, g_str_equal); + self->collection_applet = g_ptr_array_new (); + get_panel_collection_applet (self); } static void @@ -3133,7 +3231,14 @@ get_by_category_foreach (const char *file_id, if (desktop_entry_has_category (entry, data->category)) desktop_entry_set_add_entry (data->set, entry, file_id); } - +static void +get_by_desktop_foreach (const char *file_id, + DesktopEntry *entry, + GetByCategoryForeachData *data) +{ + if (g_strcmp0 (file_id, data->category) == 0) + desktop_entry_set_add_entry (data->set, entry, file_id); +} static void get_by_category (DesktopEntrySet *entry_pool, DesktopEntrySet *set, @@ -3148,7 +3253,20 @@ get_by_category (DesktopEntrySet *entry_pool, (DesktopEntrySetForeachFunc) get_by_category_foreach, &data); } +static void +get_by_desktop (DesktopEntrySet *entry_pool, + DesktopEntrySet *set, + const char *desktop_name) +{ + GetByCategoryForeachData data; + data.set = set; + data.category = desktop_name; + + desktop_entry_set_foreach (entry_pool, + (DesktopEntrySetForeachFunc) get_by_desktop_foreach, + &data); +} static DesktopEntrySet * process_include_rules (MenuLayoutNode *layout, DesktopEntrySet *entry_pool) @@ -3657,6 +3775,14 @@ process_layout (MateMenuTree *tree, matemenu_tree_item_unref (directory); return NULL; } + if (g_strcmp0 (directory->name, "Collection") == 0) + { + for (int i = 0; i < tree->collection_applet->len; i++) + { + const char *desktop_name = g_ptr_array_index (tree->collection_applet, i); + get_by_desktop (entry_pool, entries, desktop_name); + } + } desktop_entry_set_foreach (entries, (DesktopEntrySetForeachFunc) entries_listify_foreach, |