Commit c635d8e8 authored by Vincent Untz's avatar Vincent Untz
Browse files

shell: Port to new gnome-menus API

https://bugzilla.gnome.org/show_bug.cgi?id=655110
parent 8c0a2279
......@@ -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
......
......@@ -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);
......
......@@ -61,7 +61,7 @@ enum
COL_PIXBUF,
COL_CATEGORY,
COL_SEARCH_TARGET,
COL_ICON_NAME,
COL_GICON,
COL_KEYWORDS,
N_COLS
......
......@@ -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)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment