Author: vuntz
Date: Fri Sep 2 16:36:41 2011
New Revision: 65525
URL: http://svn.opensuse.org/viewcvs/yast?rev=65525&view=rev
Log:
2011-09-02 Vincent Untz
Release 2.21.2
Update to gnome-control-center code as of today. This includes a port
to new gnome-menus API.
* VERSION: bump version.
* configure.in.in: look for libgnome-menu-3.0 instead of libgnome-menu.
* etc/YaST-gnome.menu: add Layout node to force the layout we want,
instead of relying on alphabetical order.
* src/cut-n-paste/: update code from gnome-control-center.
* src/{control-center.c,gnome-control-center.c}: rebase on updated code.
* src/shell-search-renderer.c: tweak this source file to avoid a crash
caused by the fact that yast .desktop files have no Comment key.
* src/patch/: update patch to current changes.
Added:
trunk/control-center-gnome/src/shell-search-renderer.c
Modified:
trunk/control-center-gnome/ (props changed)
trunk/control-center-gnome/ChangeLog
trunk/control-center-gnome/VERSION
trunk/control-center-gnome/configure.in.in
trunk/control-center-gnome/etc/YaST-gnome.menu
trunk/control-center-gnome/src/Makefile.am
trunk/control-center-gnome/src/control-center.c
trunk/control-center-gnome/src/cut-n-paste/shell/Makefile.am
trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.c
trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.h
trunk/control-center-gnome/src/cut-n-paste/shell/control-center.c
trunk/control-center-gnome/src/cut-n-paste/shell/gnome-control-center.c
trunk/control-center-gnome/src/gnome-control-center.c
trunk/control-center-gnome/src/patch/gnome-control-center.patch
trunk/control-center-gnome/src/patch/update-patch.sh
Modified: trunk/control-center-gnome/ChangeLog
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/ChangeLog?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/ChangeLog (original)
+++ trunk/control-center-gnome/ChangeLog Fri Sep 2 16:36:41 2011
@@ -1,3 +1,20 @@
+2011-09-02 Vincent Untz
+
+ Release 2.21.2
+
+ Update to gnome-control-center code as of today. This includes a port
+ to new gnome-menus API.
+
+ * VERSION: bump version.
+ * configure.in.in: look for libgnome-menu-3.0 instead of libgnome-menu.
+ * etc/YaST-gnome.menu: add Layout node to force the layout we want,
+ instead of relying on alphabetical order.
+ * src/cut-n-paste/: update code from gnome-control-center.
+ * src/{control-center.c,gnome-control-center.c}: rebase on updated code.
+ * src/shell-search-renderer.c: tweak this source file to avoid a crash
+ caused by the fact that yast .desktop files have no Comment key.
+ * src/patch/: update patch to current changes.
+
2011-07-28 Vincent Untz
Release 2.21.1
Modified: trunk/control-center-gnome/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/VERSION?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/VERSION (original)
+++ trunk/control-center-gnome/VERSION Fri Sep 2 16:36:41 2011
@@ -1 +1 @@
-2.21.1
+2.21.2
Modified: trunk/control-center-gnome/configure.in.in
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/configure.in.in?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/configure.in.in (original)
+++ trunk/control-center-gnome/configure.in.in Fri Sep 2 16:36:41 2011
@@ -19,7 +19,7 @@
AC_SUBST(GLIB_GENMARSHAL)
-PKG_CHECK_MODULES(CONTROL, gtk+-3.0 libgnome-menu gio-unix-2.0)
+PKG_CHECK_MODULES(CONTROL, gtk+-3.0 libgnome-menu-3.0 gio-unix-2.0)
AC_SUBST(CONTROL_CFLAGS)
AC_SUBST(CONTROL_LIBS)
Modified: trunk/control-center-gnome/etc/YaST-gnome.menu
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/etc/YaST-gnome.menu?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/etc/YaST-gnome.menu (original)
+++ trunk/control-center-gnome/etc/YaST-gnome.menu Fri Sep 2 16:36:41 2011
@@ -84,4 +84,18 @@
</Include>
</Menu>
<DefaultMergeDirs/>
+
+ <Layout>
+ <Menuname>Software</Menuname>
+ <Menuname>Hardware</Menuname>
+ <Menuname>System</Menuname>
+ <Menuname>Network Devices</Menuname>
+ <Menuname>Network Services</Menuname>
+ <Menuname>AppArmor</Menuname>
+ <Menuname>Security</Menuname>
+ <Menuname>Virtualization</Menuname>
+ <Menuname>High Availability</Menuname>
+ <Menuname>Misc</Menuname>
+ <Merge type="all" />
+ </Layout>
</Menu>
Modified: trunk/control-center-gnome/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/Makefile.am?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/Makefile.am (original)
+++ trunk/control-center-gnome/src/Makefile.am Fri Sep 2 16:36:41 2011
@@ -18,7 +18,8 @@
y2controlcenter_gnome_SOURCES = \
control-center.c \
- gnome-control-center.c
+ gnome-control-center.c \
+ shell-search-renderer.c
y2controlcenter_gnome_LDADD = \
$(top_builddir)/src/cut-n-paste/libgnome-control-center/libgnome-control-center.la \
Modified: trunk/control-center-gnome/src/control-center.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/control-center.c?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/control-center.c (original)
+++ trunk/control-center-gnome/src/control-center.c Fri Sep 2 16:36:41 2011
@@ -28,6 +28,9 @@
#include
#include
+#if 0
+#include
+#endif
#include "cc-shell-log.h"
@@ -201,6 +204,10 @@
/* register a symbolic icon size for use in sidebar lists */
gtk_icon_size_register ("cc-sidebar-list", 24, 24);
+#if 0
+ notify_init ("gnome-control-center");
+#endif
+
shell = gnome_control_center_new ();
/* enforce single instance of this application */
Modified: trunk/control-center-gnome/src/cut-n-paste/shell/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/cut-n-paste/shell/Makefile.am?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/cut-n-paste/shell/Makefile.am (original)
+++ trunk/control-center-gnome/src/cut-n-paste/shell/Makefile.am Fri Sep 2 16:36:41 2011
@@ -18,7 +18,6 @@
cc-shell-log.c \
cc-shell-log.h \
gnome-control-center.h \
- shell-search-renderer.c \
shell-search-renderer.h \
cc-shell-category-view.c \
cc-shell-category-view.h \
Modified: trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.c?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.c (original)
+++ trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.c Fri Sep 2 16:36:41 2011
@@ -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 @@
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 @@
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,13 +154,13 @@
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;
GKeyFile *key_file;
gchar **keywords;
@@ -202,9 +196,7 @@
g_key_file_free (key_file);
key_file = NULL;
- pixbuf = load_pixbuf_for_string (icon);
-
- search_target = g_strconcat (name, " - ", comment, NULL);
+ pixbuf = load_pixbuf_for_gicon (icon);
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, 0,
COL_NAME, name,
@@ -212,12 +204,11 @@
COL_ID, id,
COL_PIXBUF, pixbuf,
COL_CATEGORY, category_name,
- COL_SEARCH_TARGET, search_target,
- COL_ICON_NAME, icon,
+ COL_DESCRIPTION, comment,
+ COL_GICON, icon,
COL_KEYWORDS, keywords,
-1);
g_free (id);
- g_free (search_target);
g_strfreev (keywords);
}
Modified: trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.h?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.h (original)
+++ trunk/control-center-gnome/src/cut-n-paste/shell/cc-shell-model.h Fri Sep 2 16:36:41 2011
@@ -60,8 +60,8 @@
COL_ID,
COL_PIXBUF,
COL_CATEGORY,
- COL_SEARCH_TARGET,
- COL_ICON_NAME,
+ COL_DESCRIPTION,
+ COL_GICON,
COL_KEYWORDS,
N_COLS
Modified: trunk/control-center-gnome/src/cut-n-paste/shell/control-center.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/cut-n-paste/shell/control-center.c?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/cut-n-paste/shell/control-center.c (original)
+++ trunk/control-center-gnome/src/cut-n-paste/shell/control-center.c Fri Sep 2 16:36:41 2011
@@ -28,6 +28,7 @@
#include
#include
+#include
#include "cc-shell-log.h"
@@ -181,6 +182,8 @@
/* register a symbolic icon size for use in sidebar lists */
gtk_icon_size_register ("cc-sidebar-list", 24, 24);
+ notify_init ("gnome-control-center");
+
shell = gnome_control_center_new ();
/* enforce single instance of this application */
Modified: trunk/control-center-gnome/src/cut-n-paste/shell/gnome-control-center.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/cut-n-paste/shell/gnome-control-center.c?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/cut-n-paste/shell/gnome-control-center.c (original)
+++ trunk/control-center-gnome/src/cut-n-paste/shell/gnome-control-center.c Fri Sep 2 16:36:41 2011
@@ -84,12 +84,34 @@
#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 @@
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 @@
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);
@@ -374,29 +398,39 @@
GtkTreeIter *iter,
GnomeControlCenterPrivate *priv)
{
- gchar *name, *target;
+ gchar *name, *description;
gchar *needle, *haystack;
gboolean result;
gchar **keywords;
- gtk_tree_model_get (model, iter, COL_NAME, &name,
- COL_SEARCH_TARGET, &target,
+ gtk_tree_model_get (model, iter,
+ COL_NAME, &name,
+ COL_DESCRIPTION, &description,
COL_KEYWORDS, &keywords,
-1);
- if (!priv->filter_string || !name || !target)
+ if (!priv->filter_string || !name)
{
g_free (name);
- g_free (target);
+ g_free (description);
g_strfreev (keywords);
return FALSE;
}
needle = g_utf8_casefold (priv->filter_string, -1);
- haystack = g_utf8_casefold (target, -1);
+ haystack = g_utf8_casefold (name, -1);
result = (strstr (haystack, needle) != NULL);
+ if (!result && description)
+ {
+ gchar *folded;
+
+ folded = g_utf8_casefold (description, -1);
+ result = (strstr (folded, needle) != NULL);
+ g_free (folded);
+ }
+
if (!result && keywords)
{
gint i;
@@ -411,7 +445,6 @@
}
g_free (name);
- g_free (target);
g_free (haystack);
g_free (needle);
g_strfreev (keywords);
@@ -557,7 +590,7 @@
"title", COL_NAME);
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (search_view),
priv->search_renderer,
- "search-target", COL_SEARCH_TARGET);
+ "search-target", COL_DESCRIPTION);
/* connect the activated signal */
g_signal_connect (search_view, "desktop-item-activated",
@@ -627,43 +660,57 @@
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 +732,11 @@
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 +800,8 @@
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 +816,7 @@
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 +830,8 @@
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 +851,12 @@
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 +959,9 @@
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)
@@ -1040,6 +1085,11 @@
gtk_widget_grab_focus (self->priv->search_entry);
retval = TRUE;
break;
+ case GDK_KEY_Q:
+ case GDK_KEY_q:
+ g_object_unref (self);
+ retval = TRUE;
+ break;
}
}
return retval;
Modified: trunk/control-center-gnome/src/gnome-control-center.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/gnome-control-center.c?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/gnome-control-center.c (original)
+++ trunk/control-center-gnome/src/gnome-control-center.c Fri Sep 2 16:36:41 2011
@@ -84,12 +84,36 @@
#define FIXED_WIDTH 675
+#if 0
+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;
+}
+#endif
+
static void
activate_panel (GnomeControlCenter *shell,
const gchar *id,
const gchar *desktop_file,
const gchar *name,
- const gchar *icon_name)
+ GIcon *gicon)
{
GDesktopAppInfo *appinfo;
GdkAppLaunchContext *context;
@@ -153,6 +177,7 @@
GtkWidget *box;
gint i;
int nat_height;
+ const gchar *icon_name;
/* create the panel plugin */
panel = g_object_new (panel_type, "shell", shell, NULL);
@@ -173,6 +198,7 @@
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);
@@ -402,29 +428,39 @@
GtkTreeIter *iter,
GnomeControlCenterPrivate *priv)
{
- gchar *name, *target;
+ gchar *name, *description;
gchar *needle, *haystack;
gboolean result;
gchar **keywords;
- gtk_tree_model_get (model, iter, COL_NAME, &name,
- COL_SEARCH_TARGET, &target,
+ gtk_tree_model_get (model, iter,
+ COL_NAME, &name,
+ COL_DESCRIPTION, &description,
COL_KEYWORDS, &keywords,
-1);
- if (!priv->filter_string || !name || !target)
+ if (!priv->filter_string || !name)
{
g_free (name);
- g_free (target);
+ g_free (description);
g_strfreev (keywords);
return FALSE;
}
needle = g_utf8_casefold (priv->filter_string, -1);
- haystack = g_utf8_casefold (target, -1);
+ haystack = g_utf8_casefold (name, -1);
result = (strstr (haystack, needle) != NULL);
+ if (!result && description)
+ {
+ gchar *folded;
+
+ folded = g_utf8_casefold (description, -1);
+ result = (strstr (folded, needle) != NULL);
+ g_free (folded);
+ }
+
if (!result && keywords)
{
gint i;
@@ -439,7 +475,6 @@
}
g_free (name);
- g_free (target);
g_free (haystack);
g_free (needle);
g_strfreev (keywords);
@@ -585,7 +620,7 @@
"title", COL_NAME);
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (search_view),
priv->search_renderer,
- "search-target", COL_SEARCH_TARGET);
+ "search-target", COL_DESCRIPTION);
/* connect the activated signal */
g_signal_connect (search_view, "desktop-item-activated",
@@ -655,43 +690,57 @@
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
@@ -713,17 +762,11 @@
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 ("YaST-gnome.menu", 0);
-
- if (priv->menu_tree == NULL)
- {
- g_warning ("Could not find control center menu");
- return;
- }
+ priv->menu_tree = gmenu_tree_new ("YaST-gnome.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
@@ -789,7 +832,8 @@
GtkTreeIter iter;
gboolean iter_valid;
gchar *name = NULL;
- gchar *desktop, *icon_name;
+ gchar *desktop;
+ GIcon *gicon;
GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
@@ -804,7 +848,7 @@
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);
@@ -818,7 +862,8 @@
g_free (id);
g_free (name);
g_free (desktop);
- g_free (icon_name);
+ if (gicon)
+ g_object_unref (gicon);
name = NULL;
id = NULL;
@@ -838,11 +883,12 @@
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;
}
@@ -945,8 +991,9 @@
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)
@@ -1079,6 +1126,11 @@
gtk_widget_grab_focus (self->priv->search_entry);
retval = TRUE;
break;
+ case GDK_KEY_Q:
+ case GDK_KEY_q:
+ g_object_unref (self);
+ retval = TRUE;
+ break;
}
}
return retval;
Modified: trunk/control-center-gnome/src/patch/gnome-control-center.patch
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/patch/gnome-control-center.patch?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/patch/gnome-control-center.patch (original)
+++ trunk/control-center-gnome/src/patch/gnome-control-center.patch Fri Sep 2 16:36:41 2011
@@ -1,6 +1,16 @@
---- ./patch/../cut-n-paste/shell/control-center.c 2011-07-25 12:13:00.915871481 +0200
-+++ ./patch/../control-center.c 2011-07-25 11:36:40.873059970 +0200
-@@ -41,8 +41,10 @@
+--- ./patch/../cut-n-paste/shell/control-center.c 2011-09-02 15:37:12.959904219 +0200
++++ ./patch/../control-center.c 2011-09-02 15:37:53.787529299 +0200
+@@ -28,7 +28,9 @@
+
+ #include
+ #include
++#if 0
+ #include
++#endif
+
+ #include "cc-shell-log.h"
+
+@@ -42,8 +44,10 @@
exit (0);
}
@@ -11,7 +21,7 @@
static gboolean verbose = FALSE;
static gboolean show_help = FALSE;
static gboolean show_help_gtk = FALSE;
-@@ -51,11 +53,15 @@
+@@ -52,11 +56,15 @@
const GOptionEntry all_options[] = {
{ "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL },
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, N_("Enable verbose mode"), NULL },
@@ -27,7 +37,7 @@
{ NULL } /* end the list */
};
-@@ -71,13 +77,17 @@
+@@ -72,13 +80,17 @@
GError *error = NULL;
verbose = FALSE;
@@ -46,7 +56,7 @@
g_option_context_add_main_entries (context, all_options, GETTEXT_PACKAGE);
g_option_context_set_translation_domain(context, GETTEXT_PACKAGE);
g_option_context_add_group (context, gtk_get_option_group (TRUE));
-@@ -115,6 +125,7 @@
+@@ -116,6 +128,7 @@
gnome_control_center_show (shell, GTK_APPLICATION (application));
@@ -54,7 +64,7 @@
if (show_overview)
{
gnome_control_center_set_overview_page (shell);
-@@ -138,17 +149,20 @@
+@@ -139,17 +152,20 @@
}
}
}
@@ -75,7 +85,7 @@
return retval;
}
-@@ -169,6 +183,8 @@
+@@ -170,6 +186,8 @@
GtkApplication *application;
int status;
@@ -84,7 +94,7 @@
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
-@@ -178,13 +194,17 @@
+@@ -179,15 +197,21 @@
gtk_init (&argc, &argv);
cc_shell_log_init ();
@@ -95,6 +105,10 @@
/* register a symbolic icon size for use in sidebar lists */
gtk_icon_size_register ("cc-sidebar-list", 24, 24);
++#if 0
+ notify_init ("gnome-control-center");
++#endif
+
shell = gnome_control_center_new ();
/* enforce single instance of this application */
@@ -103,11 +117,27 @@
g_signal_connect (application, "startup",
G_CALLBACK (application_startup_cb), shell);
g_signal_connect (application, "command-line",
---- ./patch/../cut-n-paste/shell/gnome-control-center.c 2011-07-28 11:50:46.369276534 +0200
-+++ ./patch/../gnome-control-center.c 2011-07-28 12:07:12.977644709 +0200
-@@ -91,6 +91,33 @@
+--- ./patch/../cut-n-paste/shell/gnome-control-center.c 2011-09-02 15:53:29.624723757 +0200
++++ ./patch/../gnome-control-center.c 2011-09-02 16:02:55.176284577 +0200
+@@ -84,6 +84,7 @@
+ #define FIXED_WIDTH 675
+
+
++#if 0
+ static const gchar *
+ get_icon_name_from_g_icon (GIcon *gicon)
+ {
+@@ -105,6 +106,7 @@
+
+ return NULL;
+ }
++#endif
+
+ static void
+ activate_panel (GnomeControlCenter *shell,
+@@ -113,6 +115,33 @@
const gchar *name,
- const gchar *icon_name)
+ GIcon *gicon)
{
+ GDesktopAppInfo *appinfo;
+ GdkAppLaunchContext *context;
@@ -139,7 +169,7 @@
GnomeControlCenterPrivate *priv = shell->priv;
GType panel_type = G_TYPE_INVALID;
GList *panels, *l;
-@@ -170,6 +197,7 @@
+@@ -194,6 +223,7 @@
g_warning ("Could not find the loadable module for panel '%s'", id);
}
}
@@ -147,16 +177,16 @@
}
static void
-@@ -685,7 +713,7 @@
+@@ -732,7 +762,7 @@
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);
-+ priv->menu_tree = gmenu_tree_lookup ("YaST-gnome.menu", 0);
+- priv->menu_tree = gmenu_tree_new_for_path (MENUDIR "/gnomecc.menu", 0);
++ priv->menu_tree = gmenu_tree_new ("YaST-gnome.menu", 0);
- if (priv->menu_tree == NULL)
- {
-@@ -701,6 +729,7 @@
+ reload_menu (shell);
+
+@@ -742,6 +772,7 @@
static void
load_panel_plugins (GnomeControlCenter *shell)
{
@@ -164,7 +194,7 @@
GList *modules;
/* only allow this function to be run once to prevent modules being loaded
-@@ -719,6 +748,7 @@
+@@ -760,6 +791,7 @@
modules = g_io_modules_load_all_in_directory (PANELS_DIR);
g_list_free (modules);
@@ -172,7 +202,7 @@
}
-@@ -978,7 +1008,16 @@
+@@ -1023,7 +1055,16 @@
screen = gtk_widget_get_screen (widget);
monitor = gdk_screen_get_monitor_at_window (screen, window);
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
@@ -190,6 +220,21 @@
}
}
else
+--- ./patch/../cut-n-paste/shell/shell-search-renderer.c 2011-09-02 16:14:13.066818949 +0200
++++ ./patch/../shell-search-renderer.c 2011-09-02 16:16:56.262269091 +0200
+@@ -154,7 +154,11 @@
+ needle = g_utf8_casefold (priv->search_string, -1);
+ else
+ needle = NULL;
+- haystack = g_utf8_casefold (full_string, -1);
++ /* Fix crash caused by empty comments in yast .desktop files */
++ if (full_string)
++ haystack = g_utf8_casefold (full_string, -1);
++ else
++ haystack = g_strdup ("");
+
+ /* clear any previous attributes */
+ pango_layout_set_attributes (priv->layout, NULL);
--- ./patch/../cut-n-paste/shell/shell.ui 2011-07-25 12:13:00.915871481 +0200
+++ ./patch/../shell.ui 2011-07-25 10:04:29.790594605 +0200
@@ -3,9 +3,9 @@
Modified: trunk/control-center-gnome/src/patch/update-patch.sh
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/patch/update-patch.sh?rev=65525&r1=65524&r2=65525&view=diff
==============================================================================
--- trunk/control-center-gnome/src/patch/update-patch.sh (original)
+++ trunk/control-center-gnome/src/patch/update-patch.sh Fri Sep 2 16:36:41 2011
@@ -1,7 +1,7 @@
#!/bin/sh
DIRNAME=`dirname $0`
(
-for file in control-center.c gnome-control-center.c shell.ui; do
+for file in control-center.c gnome-control-center.c shell-search-renderer.c shell.ui; do
diff -u "${DIRNAME}/../cut-n-paste/shell/$file" "${DIRNAME}/../$file"
done
) > "${DIRNAME}/gnome-control-center.patch"
Added: trunk/control-center-gnome/src/shell-search-renderer.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/control-center-gnome/src/shell-search-renderer.c?rev=65525&view=auto
==============================================================================
--- trunk/control-center-gnome/src/shell-search-renderer.c (added)
+++ trunk/control-center-gnome/src/shell-search-renderer.c Fri Sep 2 16:36:41 2011
@@ -0,0 +1,355 @@
+/*
+ * Copyright (c) 2010 Intel, Inc.
+ *
+ * The Control Center is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * The Control Center 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 General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with the Control Center; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Thomas Wood
+ */
+
+#include "shell-search-renderer.h"
+#include
+
+G_DEFINE_TYPE (ShellSearchRenderer, shell_search_renderer, GTK_TYPE_CELL_RENDERER_TEXT)
+
+#define SEARCH_RENDERER_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), SHELL_TYPE_SEARCH_RENDERER, ShellSearchRendererPrivate))
+
+struct _ShellSearchRendererPrivate
+{
+ gchar *title;
+ gchar *search_target;
+ gchar *search_string;
+
+ PangoLayout *layout;
+};
+
+enum
+{
+ PROP_TITLE = 1,
+ PROP_SEARCH_TARGET,
+ PROP_SEARCH_STRING
+};
+
+
+static void
+shell_search_renderer_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id)
+ {
+ case PROP_TITLE:
+ case PROP_SEARCH_TARGET:
+ case PROP_SEARCH_STRING:
+ break;
+
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+shell_search_renderer_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ShellSearchRendererPrivate *priv = SHELL_SEARCH_RENDERER (object)->priv;
+
+ switch (property_id)
+ {
+ case PROP_TITLE:
+ g_free (priv->title);
+ priv->title = g_value_dup_string (value);
+ /* set GtkCellRendererText::text for a11y */
+ g_object_set (object, "text", priv->title, NULL);
+ break;
+
+ case PROP_SEARCH_TARGET:
+ g_free (priv->search_target);
+ priv->search_target = g_value_dup_string (value);
+ break;
+
+ case PROP_SEARCH_STRING:
+ g_free (priv->search_string);
+ priv->search_string = g_value_dup_string (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+shell_search_renderer_dispose (GObject *object)
+{
+ ShellSearchRendererPrivate *priv = SHELL_SEARCH_RENDERER (object)->priv;
+
+ if (priv->layout)
+ {
+ g_object_unref (priv->layout);
+ priv->layout = NULL;
+ }
+
+ G_OBJECT_CLASS (shell_search_renderer_parent_class)->dispose (object);
+}
+
+static void
+shell_search_renderer_finalize (GObject *object)
+{
+ ShellSearchRendererPrivate *priv = SHELL_SEARCH_RENDERER (object)->priv;
+
+ if (priv->title)
+ {
+ g_free (priv->title);
+ priv->title = NULL;
+ }
+
+ if (priv->search_target)
+ {
+ g_free (priv->search_target);
+ priv->search_target = NULL;
+ }
+
+ if (priv->search_string)
+ {
+ g_free (priv->search_string);
+ priv->search_string = NULL;
+ }
+
+ G_OBJECT_CLASS (shell_search_renderer_parent_class)->finalize (object);
+}
+
+static void
+shell_search_renderer_set_layout (ShellSearchRenderer *cell, GtkWidget *widget)
+{
+ gchar *display_string;
+ ShellSearchRendererPrivate *priv = cell->priv;
+ gchar *needle, *haystack;
+ gchar *full_string;
+
+ if (!priv->layout)
+ {
+ priv->layout = pango_layout_new (gtk_widget_get_pango_context (widget));
+ pango_layout_set_ellipsize (priv->layout, PANGO_ELLIPSIZE_END);
+ }
+
+ full_string = priv->search_target;
+
+ if (priv->search_string != NULL)
+ needle = g_utf8_casefold (priv->search_string, -1);
+ else
+ needle = NULL;
+ /* Fix crash caused by empty comments in yast .desktop files */
+ if (full_string)
+ haystack = g_utf8_casefold (full_string, -1);
+ else
+ haystack = g_strdup ("");
+
+ /* clear any previous attributes */
+ pango_layout_set_attributes (priv->layout, NULL);
+
+ if (priv->search_string && priv->title
+ && (strstr (haystack, needle)))
+ {
+ gchar *start;
+ gchar *lead, *trail, *leaddot;
+ gchar *match;
+ gint count;
+
+#define CONTEXT 10
+
+ count = strlen (needle);
+ start = full_string + (strstr (haystack, needle) - haystack);
+
+ lead = MAX (start - CONTEXT, full_string);
+ trail = start + count;
+
+ if (lead == full_string)
+ leaddot = "";
+ else
+ leaddot = "â¦";
+
+ match = g_strndup (start, count);
+ lead = g_strndup (lead, start - lead);
+
+ display_string = g_markup_printf_escaped ("%s\n"
+ "<small>%s%s<b>%s</b>%s</small>",
+ priv->title, leaddot, lead,
+ match, trail);
+
+ g_free (match);
+ g_free (lead);
+ }
+ else
+ display_string = g_markup_escape_text (priv->title, -1);
+
+
+ pango_layout_set_markup (priv->layout, display_string, -1);
+ g_free (display_string);
+ g_free (needle);
+ g_free (haystack);
+}
+
+static void
+get_size (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint *width,
+ gint *height)
+{
+ ShellSearchRendererPrivate *priv = SHELL_SEARCH_RENDERER (cell)->priv;
+ PangoRectangle rect;
+
+ shell_search_renderer_set_layout (SHELL_SEARCH_RENDERER (cell), widget);
+
+ pango_layout_set_width (priv->layout, PANGO_SCALE * 180);
+ pango_layout_get_pixel_extents (priv->layout, NULL, &rect);
+
+ if (width) *width = rect.width;
+ if (height) *height = rect.height;
+}
+
+static void
+shell_search_renderer_get_preferred_width (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gint width;
+
+ get_size (cell, widget, &width, NULL);
+ if (minimum_size) *minimum_size = width;
+ if (natural_size) *natural_size = width;
+}
+
+static void
+shell_search_renderer_get_preferred_height (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gint height;
+
+ get_size (cell, widget, NULL, &height);
+ if (minimum_size) *minimum_size = height;
+ if (natural_size) *natural_size = height;
+}
+
+static void
+shell_search_renderer_get_preferred_height_for_width (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint width,
+ gint *minimum_height,
+ gint *natural_height)
+{
+ shell_search_renderer_get_preferred_height (cell, widget, minimum_height, natural_height);
+}
+
+static void
+shell_search_renderer_get_aligned_area (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ GtkCellRendererState flags,
+ const GdkRectangle *cell_area,
+ GdkRectangle *aligned_area)
+{
+ get_size (cell, widget, &aligned_area->width, &aligned_area->height);
+ aligned_area->x = cell_area->x;
+ aligned_area->y = cell_area->y;
+}
+
+static void
+shell_search_renderer_render (GtkCellRenderer *cell,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
+{
+ ShellSearchRendererPrivate *priv = SHELL_SEARCH_RENDERER (cell)->priv;
+ PangoRectangle rect;
+ GtkStyleContext *context;
+
+ context = gtk_widget_get_style_context (widget);
+
+ shell_search_renderer_set_layout (SHELL_SEARCH_RENDERER (cell), widget);
+
+ pango_layout_get_pixel_extents (priv->layout, NULL, &rect);
+
+ cairo_save (cr);
+
+ gtk_render_layout (context, cr,
+ cell_area->x,
+ cell_area->y,
+ priv->layout);
+
+ cairo_restore (cr);
+}
+
+static void
+shell_search_renderer_class_init (ShellSearchRendererClass *klass)
+{
+ GParamSpec *pspec;
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkCellRendererClass *cell_renderer = GTK_CELL_RENDERER_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (ShellSearchRendererPrivate));
+
+ object_class->get_property = shell_search_renderer_get_property;
+ object_class->set_property = shell_search_renderer_set_property;
+ object_class->dispose = shell_search_renderer_dispose;
+ object_class->finalize = shell_search_renderer_finalize;
+
+ cell_renderer->get_preferred_width = shell_search_renderer_get_preferred_width;
+ cell_renderer->get_preferred_height = shell_search_renderer_get_preferred_height;
+ cell_renderer->get_preferred_height_for_width = shell_search_renderer_get_preferred_height_for_width;
+ cell_renderer->get_aligned_area = shell_search_renderer_get_aligned_area;
+
+ cell_renderer->render = shell_search_renderer_render;
+
+ pspec = g_param_spec_string ("title",
+ "Title",
+ "Item title",
+ "",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_TITLE, pspec);
+
+ pspec = g_param_spec_string ("search-target",
+ "Search Target",
+ "The string that will be searched",
+ "",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_SEARCH_TARGET, pspec);
+
+ pspec = g_param_spec_string ("search-string",
+ "Search String",
+ "Current search string",
+ "",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_SEARCH_STRING, pspec);
+}
+
+static void
+shell_search_renderer_init (ShellSearchRenderer *self)
+{
+ self->priv = SEARCH_RENDERER_PRIVATE (self);
+}
+
+ShellSearchRenderer *
+shell_search_renderer_new (void)
+{
+ return g_object_new (SHELL_TYPE_SEARCH_RENDERER, NULL);
+}
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org