shell: Port to new gnome-menus API
https://bugzilla.gnome.org/show_bug.cgi?id=655110
This commit is contained in:
parent
8c0a2279c1
commit
c635d8e875
4 changed files with 95 additions and 64 deletions
|
@ -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);
|
||||
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);
|
||||
}
|
||||
|
||||
gtk_icon_info_free (icon_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_str_has_suffix (icon, ".png"))
|
||||
icon2 = g_strndup (icon, strlen (icon) - strlen (".png"));
|
||||
|
||||
pixbuf = gtk_icon_theme_load_icon (theme,
|
||||
icon2 ? icon2 : icon, 32,
|
||||
GTK_ICON_LOOKUP_FORCE_SIZE,
|
||||
&err);
|
||||
g_warning ("Could not find icon");
|
||||
}
|
||||
|
||||
if (err)
|
||||
{
|
||||
g_warning ("Could not load icon '%s': %s", icon2 ? icon2 : icon,
|
||||
err->message);
|
||||
g_error_free (err);
|
||||
}
|
||||
|
||||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue