diff --git a/configure.ac b/configure.ac index 5bb94b1..48fd12c 100644 --- a/configure.ac +++ b/configure.ac @@ -89,7 +89,7 @@ COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION PKG_CHECK_MODULES(LIBGNOME_CONTROL_CENTER, $COMMON_MODULES gconf-2.0) PKG_CHECK_MODULES(LIBLANGUAGE, $COMMON_MODULES gnome-desktop-3.0) PKG_CHECK_MODULES(LIBSHORTCUTS, $COMMON_MODULES x11) -PKG_CHECK_MODULES(SHELL, $COMMON_MODULES libgnome-menu gio-unix-2.0) +PKG_CHECK_MODULES(SHELL, $COMMON_MODULES libgnome-menu-3.0 gio-unix-2.0) PKG_CHECK_MODULES(BACKGROUND_PANEL, $COMMON_MODULES libxml-2.0 gnome-desktop-3.0 gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION) PKG_CHECK_MODULES(DATETIME_PANEL, $COMMON_MODULES dbus-glib-1 diff --git a/shell/cc-shell-model.c b/shell/cc-shell-model.c index 8f63801..c4ae28f 100644 --- a/shell/cc-shell-model.c +++ b/shell/cc-shell-model.c @@ -30,43 +30,37 @@ G_DEFINE_TYPE (CcShellModel, cc_shell_model, GTK_TYPE_LIST_STORE) static GdkPixbuf * -load_pixbuf_for_string (const char *icon) +load_pixbuf_for_gicon (GIcon *icon) { GtkIconTheme *theme; + GtkIconInfo *icon_info; GdkPixbuf *pixbuf; GError *err = NULL; - char *icon2 = NULL; if (icon == NULL) return NULL; theme = gtk_icon_theme_get_default (); - /* find the icon */ - if (*icon == '/') + icon_info = gtk_icon_theme_lookup_by_gicon (theme, icon, + 32, GTK_ICON_LOOKUP_FORCE_SIZE); + if (icon_info) { - pixbuf = gdk_pixbuf_new_from_file_at_scale (icon, 32, 32, TRUE, &err); - } - else - { - if (g_str_has_suffix (icon, ".png")) - icon2 = g_strndup (icon, strlen (icon) - strlen (".png")); + pixbuf = gtk_icon_info_load_icon (icon_info, &err); + if (err) + { + g_warning ("Could not load icon '%s': %s", + gtk_icon_info_get_filename (icon_info), err->message); + g_error_free (err); + } - pixbuf = gtk_icon_theme_load_icon (theme, - icon2 ? icon2 : icon, 32, - GTK_ICON_LOOKUP_FORCE_SIZE, - &err); + gtk_icon_info_free (icon_info); } - - if (err) + else { - g_warning ("Could not load icon '%s': %s", icon2 ? icon2 : icon, - err->message); - g_error_free (err); + g_warning ("Could not find icon"); } - g_free (icon2); - return pixbuf; } @@ -83,13 +77,13 @@ icon_theme_changed (GtkIconTheme *theme, while (cont) { GdkPixbuf *pixbuf; - char *icon; + GIcon *icon; gtk_tree_model_get (model, &iter, - COL_ICON_NAME, &icon, + COL_GICON, &icon, -1); - pixbuf = load_pixbuf_for_string (icon); - g_free (icon); + pixbuf = load_pixbuf_for_gicon (icon); + g_object_unref (icon); gtk_list_store_set (GTK_LIST_STORE (model), &iter, COL_PIXBUF, pixbuf, -1); @@ -107,7 +101,7 @@ static void cc_shell_model_init (CcShellModel *self) { GType types[] = {G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRV}; + GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ICON, G_TYPE_STRV}; gtk_list_store_set_column_types (GTK_LIST_STORE (self), N_COLS, types); @@ -160,10 +154,11 @@ cc_shell_model_add_item (CcShellModel *model, const gchar *category_name, GMenuTreeEntry *item) { - const gchar *icon = gmenu_tree_entry_get_icon (item); - const gchar *name = gmenu_tree_entry_get_name (item); + GAppInfo *appinfo = G_APP_INFO (gmenu_tree_entry_get_app_info (item)); + GIcon *icon = g_app_info_get_icon (appinfo); + const gchar *name = g_app_info_get_name (appinfo); const gchar *desktop = gmenu_tree_entry_get_desktop_file_path (item); - const gchar *comment = gmenu_tree_entry_get_comment (item); + const gchar *comment = g_app_info_get_description (appinfo); gchar *id; GdkPixbuf *pixbuf = NULL; gchar *search_target; @@ -202,7 +197,7 @@ cc_shell_model_add_item (CcShellModel *model, g_key_file_free (key_file); key_file = NULL; - pixbuf = load_pixbuf_for_string (icon); + pixbuf = load_pixbuf_for_gicon (icon); search_target = g_strconcat (name, " - ", comment, NULL); @@ -213,7 +208,7 @@ cc_shell_model_add_item (CcShellModel *model, COL_PIXBUF, pixbuf, COL_CATEGORY, category_name, COL_SEARCH_TARGET, search_target, - COL_ICON_NAME, icon, + COL_GICON, icon, COL_KEYWORDS, keywords, -1); diff --git a/shell/cc-shell-model.h b/shell/cc-shell-model.h index 6208e43..97ac160 100644 --- a/shell/cc-shell-model.h +++ b/shell/cc-shell-model.h @@ -61,7 +61,7 @@ enum COL_PIXBUF, COL_CATEGORY, COL_SEARCH_TARGET, - COL_ICON_NAME, + COL_GICON, COL_KEYWORDS, N_COLS diff --git a/shell/gnome-control-center.c b/shell/gnome-control-center.c index a771282..3725a63 100644 --- a/shell/gnome-control-center.c +++ b/shell/gnome-control-center.c @@ -84,12 +84,34 @@ struct _GnomeControlCenterPrivate #define FIXED_WIDTH 675 +static const gchar * +get_icon_name_from_g_icon (GIcon *gicon) +{ + const gchar * const *names; + GtkIconTheme *icon_theme; + int i; + + if (!G_IS_THEMED_ICON (gicon)) + return NULL; + + names = g_themed_icon_get_names (G_THEMED_ICON (gicon)); + icon_theme = gtk_icon_theme_get_default (); + + for (i = 0; names[i] != NULL; i++) + { + if (gtk_icon_theme_has_icon (icon_theme, names[i])) + return names[i]; + } + + return NULL; +} + static void activate_panel (GnomeControlCenter *shell, const gchar *id, const gchar *desktop_file, const gchar *name, - const gchar *icon_name) + GIcon *gicon) { GnomeControlCenterPrivate *priv = shell->priv; GType panel_type = G_TYPE_INVALID; @@ -126,6 +148,7 @@ activate_panel (GnomeControlCenter *shell, GtkWidget *box; gint i; int nat_height; + const gchar *icon_name; /* create the panel plugin */ panel = g_object_new (panel_type, "shell", shell, NULL); @@ -146,6 +169,7 @@ activate_panel (GnomeControlCenter *shell, gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), i); /* set the title of the window */ + icon_name = get_icon_name_from_g_icon (gicon); gtk_window_set_title (GTK_WINDOW (priv->window), name); gtk_window_set_default_icon_name (icon_name); gtk_window_set_icon_name (GTK_WINDOW (priv->window), icon_name); @@ -627,43 +651,57 @@ maybe_add_category_view (GnomeControlCenter *shell, static void reload_menu (GnomeControlCenter *shell) { - GSList *list, *l; + GError *error; GMenuTreeDirectory *d; + GMenuTreeIter *iter; + GMenuTreeItemType next_type; + + error = NULL; + if (!gmenu_tree_load_sync (shell->priv->menu_tree, &error)) + { + g_warning ("Could not load control center menu: %s", error->message); + g_clear_error (&error); + return; + } + d = gmenu_tree_get_root_directory (shell->priv->menu_tree); - list = gmenu_tree_directory_get_contents (d); + iter = gmenu_tree_directory_iter (d); - for (l = list; l; l = l->next) + while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID) { - GMenuTreeItemType type; - type = gmenu_tree_item_get_type (l->data); - - if (type == GMENU_TREE_ITEM_DIRECTORY) + if (next_type == GMENU_TREE_ITEM_DIRECTORY) { - GSList *contents, *f; + GMenuTreeDirectory *subdir; const gchar *dir_name; + GMenuTreeIter *sub_iter; + GMenuTreeItemType sub_next_type; - contents = gmenu_tree_directory_get_contents (l->data); - dir_name = gmenu_tree_directory_get_name (l->data); + subdir = gmenu_tree_iter_get_directory (iter); + dir_name = gmenu_tree_directory_get_name (subdir); maybe_add_category_view (shell, dir_name); /* add the items from this category to the model */ - for (f = contents; f; f = f->next) + sub_iter = gmenu_tree_directory_iter (subdir); + while ((sub_next_type = gmenu_tree_iter_next (sub_iter)) != GMENU_TREE_ITEM_INVALID) { - if (gmenu_tree_item_get_type (f->data) == GMENU_TREE_ITEM_ENTRY) + if (sub_next_type == GMENU_TREE_ITEM_ENTRY) { + GMenuTreeEntry *item = gmenu_tree_iter_get_entry (sub_iter); cc_shell_model_add_item (CC_SHELL_MODEL (shell->priv->store), dir_name, - f->data); + item); + gmenu_tree_item_unref (item); } } - g_slist_free (contents); + gmenu_tree_iter_unref (sub_iter); + gmenu_tree_item_unref (subdir); } } - g_slist_free (list); + gmenu_tree_iter_unref (iter); } static void @@ -685,17 +723,11 @@ setup_model (GnomeControlCenter *shell) priv->store = (GtkListStore *) cc_shell_model_new (); priv->category_views = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - priv->menu_tree = gmenu_tree_lookup (MENUDIR "/gnomecc.menu", 0); - - if (priv->menu_tree == NULL) - { - g_warning ("Could not find control center menu"); - return; - } + priv->menu_tree = gmenu_tree_new_for_path (MENUDIR "/gnomecc.menu", 0); reload_menu (shell); - gmenu_tree_add_monitor (priv->menu_tree, (GMenuTreeChangedFunc)on_menu_changed, shell); + g_signal_connect (priv->menu_tree, "changed", G_CALLBACK (on_menu_changed), shell); } static void @@ -759,7 +791,8 @@ _shell_set_active_panel_from_id (CcShell *shell, GtkTreeIter iter; gboolean iter_valid; gchar *name = NULL; - gchar *desktop, *icon_name; + gchar *desktop; + GIcon *gicon; GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv; @@ -774,7 +807,7 @@ _shell_set_active_panel_from_id (CcShell *shell, gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter, COL_NAME, &name, COL_DESKTOP_FILE, &desktop, - COL_ICON_NAME, &icon_name, + COL_GICON, &gicon, COL_ID, &id, -1); @@ -788,7 +821,8 @@ _shell_set_active_panel_from_id (CcShell *shell, g_free (id); g_free (name); g_free (desktop); - g_free (icon_name); + if (gicon) + g_object_unref (gicon); name = NULL; id = NULL; @@ -808,11 +842,12 @@ _shell_set_active_panel_from_id (CcShell *shell, gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), CAPPLET_PAGE); activate_panel (GNOME_CONTROL_CENTER (shell), start_id, desktop, name, - icon_name); + gicon); g_free (name); g_free (desktop); - g_free (icon_name); + if (gicon) + g_object_unref (gicon); return TRUE; } @@ -915,8 +950,9 @@ gnome_control_center_finalize (GObject *object) if (priv->menu_tree) { - gmenu_tree_remove_monitor (priv->menu_tree, (GMenuTreeChangedFunc)on_menu_changed, object); - gmenu_tree_unref (priv->menu_tree); + g_signal_handlers_disconnect_by_func (priv->menu_tree, + G_CALLBACK (on_menu_changed), object); + g_object_unref (priv->menu_tree); } if (priv->category_views) diff --git a/shell/cc-shell-model.c b/shell/cc-shell-model.c index c4ae28f..dd916f8 100644 --- a/shell/cc-shell-model.c +++ b/shell/cc-shell-model.c @@ -199,7 +199,10 @@ cc_shell_model_add_item (CcShellModel *model, pixbuf = load_pixbuf_for_gicon (icon); - search_target = g_strconcat (name, " - ", comment, NULL); + if (comment && comment[0]) + search_target = g_strconcat (name, " - ", comment, NULL); + else + search_target = g_strdup (name); gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, 0, COL_NAME, name,