gnome-panel r10831 - trunk/gnome-panel



Author: vuntz
Date: Tue Feb 12 23:03:23 2008
New Revision: 10831
URL: http://svn.gnome.org/viewvc/gnome-panel?rev=10831&view=rev

Log:
2008-02-12  Vincent Untz  <vuntz gnome org>

	Use the customized CD icons when there's one.
	Fix bug #516032

	* menu.[ch]: make IconToLoad handle GIcon
	(icon_to_load_free): updated
	(icon_to_load_copy): ditto
	(load_icons_handler): load from GIcon when there's one
	(create_submenu_entry): updated for panel_load_menu_image_deferred()
	change
	(create_menuitem): ditto
	(setup_menu_item_with_icon): take a GIcon parameter
	(panel_load_menu_image_deferred): ditto, and use it
	* panel-menu-items.c: (panel_menu_items_append_from_desktop): updated
	for setup_menu_item_with_icon() change
	(panel_menu_items_append_place_item): add a GIcon parameter and use it
	(panel_menu_items_create_action_item_full): updated
	for setup_menu_item_with_icon() change
	(panel_place_menu_item_append_gtk_bookmarks): updated
	for setup_menu_item_with_icon() change
	(panel_menu_item_append_drive): directly use the GIcon
	(panel_menu_item_append_volume): ditto
	(panel_menu_item_append_mount): ditto
	(panel_place_menu_item_append_local_gio): updated
	for setup_menu_item_with_icon() change
	(panel_place_menu_item_append_remote_gio): updated
	for setup_menu_item_with_icon() change
	(panel_place_menu_item_create_menu): updated for
	panel_menu_items_append_place_item() change
	* panel-recent.c: (panel_recent_append_documents_menu): updated for
	setup_menu_item_with_icon() change
	* panel-util.[ch]: (panel_util_gdk_pixbuf_load_from_stream): new,
	stolen from eel
	(panel_util_get_pixbuf_from_g_loadable_icon): new, load a
	GLoadableIcon in a pixbuf


Modified:
   trunk/gnome-panel/ChangeLog
   trunk/gnome-panel/menu.c
   trunk/gnome-panel/menu.h
   trunk/gnome-panel/panel-menu-items.c
   trunk/gnome-panel/panel-recent.c
   trunk/gnome-panel/panel-util.c
   trunk/gnome-panel/panel-util.h

Modified: trunk/gnome-panel/menu.c
==============================================================================
--- trunk/gnome-panel/menu.c	(original)
+++ trunk/gnome-panel/menu.c	Tue Feb 12 23:03:23 2008
@@ -49,6 +49,7 @@
 typedef struct {
 	GtkWidget    *pixmap;
 	const char   *stock_id;
+	GIcon        *gicon;
 	char         *image;
 	char         *fallback_image;
 	GtkIconTheme *icon_theme;
@@ -75,6 +76,7 @@
 static void panel_load_menu_image_deferred (GtkWidget   *image_menu_item,
 					    GtkIconSize  icon_size,
 					    const char  *stock_id,
+					    GIcon       *gicon,
 					    const char  *image_filename,
 					    const char  *fallback_image_filename);
 
@@ -308,7 +310,14 @@
 	if (!icon)
 		return;
 
-	g_object_unref (icon->pixmap); icon->pixmap = NULL;
+	if (icon->pixmap)
+		g_object_unref (icon->pixmap);
+	icon->pixmap = NULL;
+
+	if (icon->gicon)
+		g_object_unref (icon->gicon);
+	icon->gicon = NULL;
+
 	g_free (icon->image);          icon->image = NULL;
 	g_free (icon->fallback_image); icon->fallback_image = NULL;
 	g_free (icon);
@@ -325,6 +334,10 @@
 	retval = g_new0 (IconToLoad, 1);
 
 	retval->pixmap         = g_object_ref (icon->pixmap);
+	if (icon->gicon)
+		retval->gicon  = g_object_ref (icon->gicon);
+	else
+		retval->gicon  = NULL;
 	retval->image          = g_strdup (icon->image);
 	retval->fallback_image = g_strdup (icon->fallback_image);
 	retval->stock_id       = icon->stock_id;
@@ -565,6 +578,54 @@
 		icon_to_add->icon_size = icon->icon_size;
 
 		icons_to_add = g_list_prepend (icons_to_add, icon_to_add);
+	} else if (icon->gicon) {
+		IconToAdd *icon_to_add;
+		char      *icon_name;
+		GdkPixbuf *pb;
+		int        icon_height = PANEL_DEFAULT_MENU_ICON_SIZE;
+
+		gtk_icon_size_lookup (icon->icon_size, NULL, &icon_height);
+
+		icon_name = panel_util_get_icon_name_from_g_icon (icon->gicon);
+
+		if (icon_name) {
+			pb = panel_make_menu_icon (icon->icon_theme,
+						   icon_name,
+						   icon->fallback_image,
+						   icon_height,
+						   &long_operation);
+			g_free (icon_name);
+		} else {
+			pb = panel_util_get_pixbuf_from_g_loadable_icon (icon->gicon, icon_height);
+			if (!pb && icon->fallback_image) {
+				pb = panel_make_menu_icon (icon->icon_theme,
+							   NULL,
+							   icon->fallback_image,
+							   icon_height,
+							   &long_operation);
+			}
+		}
+
+		if (!pb) {
+			icon_to_load_free (icon);
+			if (long_operation)
+				/* this may have been a long operation so jump
+				 * back to the main loop for a while */
+				return TRUE;
+			else
+				/* we didn't do anything long/hard, so just do
+				 * this again, this is fun, don't go back to
+				 * main loop */
+				goto load_icons_handler_again;
+		}
+
+		icon_to_add            = g_new (IconToAdd, 1);
+		icon_to_add->image     = g_object_ref (icon->pixmap);
+		icon_to_add->stock_id  = NULL;
+		icon_to_add->pixbuf    = pb;
+		icon_to_add->icon_size = icon->icon_size;
+
+		icons_to_add = g_list_prepend (icons_to_add, icon_to_add);
 	} else {
 		IconToAdd *icon_to_add;
 		GdkPixbuf *pb;
@@ -1413,7 +1474,7 @@
 
 	panel_load_menu_image_deferred (menuitem,
 					panel_menu_icon_get_size (),
-					NULL,
+					NULL, NULL,
 					gmenu_tree_directory_get_icon (directory),
 					PANEL_ICON_FOLDER);
 
@@ -1491,7 +1552,7 @@
 
 	panel_load_menu_image_deferred (menuitem,
 					panel_menu_icon_get_size (),
-					NULL,
+					NULL, NULL,
 					alias_directory ? gmenu_tree_directory_get_icon (alias_directory) :
 							  gmenu_tree_entry_get_icon (entry),
 					NULL);
@@ -1728,11 +1789,13 @@
 			   GtkIconSize  icon_size,
 			   const char  *icon_name,
 			   const char  *stock_id,
+			   GIcon       *gicon,
 			   const char  *title)
 {
-	if (icon_name || stock_id)
+	if (icon_name || gicon || stock_id)
 		panel_load_menu_image_deferred (item, icon_size,
-						stock_id, icon_name, NULL);
+						stock_id, gicon,
+						icon_name, NULL);
 
 	setup_menuitem (item, icon_size, NULL, title);
 }
@@ -1835,6 +1898,7 @@
 panel_load_menu_image_deferred (GtkWidget   *image_menu_item,
 				GtkIconSize  icon_size,
 				const char  *stock_id,
+				GIcon       *gicon,
 				const char  *image_filename,
 				const char  *fallback_image_filename)
 {
@@ -1855,6 +1919,10 @@
 	gtk_object_sink (GTK_OBJECT (image));
 
 	icon->stock_id       = stock_id;
+	if (gicon)
+		icon->gicon  = g_object_ref (gicon);
+	else
+		icon->gicon  = NULL;
 	icon->image          = g_strdup (image_filename);
 	icon->fallback_image = g_strdup (fallback_image_filename);
 	icon->icon_size      = icon_size;

Modified: trunk/gnome-panel/menu.h
==============================================================================
--- trunk/gnome-panel/menu.h	(original)
+++ trunk/gnome-panel/menu.h	Tue Feb 12 23:03:23 2008
@@ -26,6 +26,7 @@
 #include "panel-widget.h"
 #include "applet.h"
 #include <gmenu-tree.h>
+#include <gio/gio.h>
 
 G_BEGIN_DECLS
 
@@ -37,6 +38,7 @@
 					   GtkIconSize       icon_size,
 					   const char       *icon_name,
 					   const char       *stock_id,
+					   GIcon            *gicon,
 					   const char       *title);
 
 GtkWidget      *create_empty_menu         (void);

Modified: trunk/gnome-panel/panel-menu-items.c
==============================================================================
--- trunk/gnome-panel/panel-menu-items.c	(original)
+++ trunk/gnome-panel/panel-menu-items.c	Tue Feb 12 23:03:23 2008
@@ -223,7 +223,7 @@
 
 	item = gtk_image_menu_item_new ();
 	setup_menu_item_with_icon (item, panel_menu_icon_get_size (),
-				   icon, NULL, name);
+				   icon, NULL, NULL, name);
 
 	panel_util_set_tooltip_text (item, comment);
 
@@ -257,6 +257,7 @@
 
 static void
 panel_menu_items_append_place_item (const char *icon_name,
+				    GIcon      *gicon,
 				    const char *title,
 				    const char *tooltip,
 				    GtkWidget  *menu,
@@ -269,8 +270,7 @@
 	item = gtk_image_menu_item_new ();
 	setup_menu_item_with_icon (item,
 				   panel_menu_icon_get_size (),
-				   icon_name,
-				   NULL,
+				   icon_name, NULL, gicon,
 				   title);
 
 	panel_util_set_tooltip_text (item, tooltip);
@@ -301,7 +301,7 @@
         setup_menu_item_with_icon (item,
 				   panel_menu_icon_get_size (),
 				   panel_action_get_icon_name (action_type),
-				   NULL,
+				   NULL, NULL,
 				   label ? label : panel_action_get_text (action_type));
 
 	panel_util_set_tooltip_text (item,
@@ -412,7 +412,7 @@
 
 		item = gtk_image_menu_item_new ();
 		setup_menu_item_with_icon (item, panel_menu_icon_get_size (),
-					   PANEL_ICON_BOOKMARKS, NULL,
+					   PANEL_ICON_BOOKMARKS, NULL, NULL,
 					   _("Bookmarks"));
 
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -465,7 +465,7 @@
 			icon = g_strdup (PANEL_ICON_FOLDER);
 
 		//FIXME: drag and drop will be broken for x-nautilus-search uris
-		panel_menu_items_append_place_item (icon,
+		panel_menu_items_append_place_item (icon, NULL,
 						    label,
 						    tooltip,
 						    add_menu,
@@ -531,28 +531,23 @@
 {
 	GtkWidget *item;
 	GIcon     *icon;
-	char      *icon_name;
 	char      *title;
 	char      *tooltip;
 
 	icon = g_drive_get_icon (drive);
-	icon_name = panel_util_get_icon_name_from_g_icon (icon);
-	g_object_unref (icon);
-
 	title = g_drive_get_name (drive);
 
 	item = gtk_image_menu_item_new ();
 	setup_menu_item_with_icon (item,
 				   panel_menu_icon_get_size (),
-				   icon_name,
-				   NULL,
+				   NULL, NULL, icon,
 				   title);
+	g_object_unref (icon);
 
 	tooltip = g_strdup_printf (_("Rescan %s"), title);
 	panel_util_set_tooltip_text (item, tooltip);
 	g_free (tooltip);
 
-	g_free (icon_name);
 	g_free (title);
 
 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -625,28 +620,23 @@
 {
 	GtkWidget *item;
 	GIcon     *icon;
-	char      *icon_name;
 	char      *title;
 	char      *tooltip;
 
 	icon = g_volume_get_icon (volume);
-	icon_name = panel_util_get_icon_name_from_g_icon (icon);
-	g_object_unref (icon);
-
 	title = g_volume_get_name (volume);
 
 	item = gtk_image_menu_item_new ();
 	setup_menu_item_with_icon (item,
 				   panel_menu_icon_get_size (),
-				   icon_name,
-				   NULL,
+				   NULL, NULL, icon,
 				   title);
+	g_object_unref (icon);
 
 	tooltip = g_strdup_printf (_("Mount %s"), title);
 	panel_util_set_tooltip_text (item, tooltip);
 	g_free (tooltip);
 
-	g_free (icon_name);
 	g_free (title);
 
 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -666,28 +656,24 @@
 {
 	GFile  *root;
 	GIcon  *icon;
-	char   *icon_name;
 	char   *display_name;
 	char   *activation_uri;
 
 	icon = g_mount_get_icon (mount);
-	icon_name = panel_util_get_icon_name_from_g_icon (icon);
-	g_object_unref (icon);
-
 	display_name = g_mount_get_name (mount);
 
 	root = g_mount_get_root (mount);
 	activation_uri = g_file_get_uri (root);
 	g_object_unref (root);
 
-	panel_menu_items_append_place_item (icon_name,
+	panel_menu_items_append_place_item (NULL, icon,
 					    display_name,
 					    display_name, //FIXME tooltip
 					    menu,
 					    G_CALLBACK (activate_uri),
 					    activation_uri);
 
-	g_free (icon_name);
+	g_object_unref (icon);
 	g_free (display_name);
 	g_free (activation_uri);
 }
@@ -848,7 +834,8 @@
 
 		item = gtk_image_menu_item_new ();
 		setup_menu_item_with_icon (item, panel_menu_icon_get_size (),
-					   PANEL_ICON_REMOVABLE_MEDIA, NULL,
+					   PANEL_ICON_REMOVABLE_MEDIA,
+					   NULL, NULL,
 					   _("Removable Media"));
 
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -928,7 +915,8 @@
 
 		item = gtk_image_menu_item_new ();
 		setup_menu_item_with_icon (item, panel_menu_icon_get_size (),
-					   PANEL_ICON_NETWORK_SERVER, NULL,
+					   PANEL_ICON_NETWORK_SERVER,
+					   NULL, NULL,
 					   _("Network Places"));
 
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -966,7 +954,7 @@
 	name = panel_util_get_label_for_uri (uri);
 	g_object_unref (file);
 	
-	panel_menu_items_append_place_item (PANEL_ICON_HOME,
+	panel_menu_items_append_place_item (PANEL_ICON_HOME, NULL,
 					    name,
 					    _("Open your personal folder"),
 					    places_menu,
@@ -983,7 +971,7 @@
 		g_object_unref (file);
 		
 		panel_menu_items_append_place_item (
-				PANEL_ICON_DESKTOP,
+				PANEL_ICON_DESKTOP, NULL,
 				/* Translators: Desktop is used here as in
 				 * "Desktop Folder" (this is not the Desktop
 				 * environment). Do not keep "Desktop Folder|"

Modified: trunk/gnome-panel/panel-recent.c
==============================================================================
--- trunk/gnome-panel/panel-recent.c	(original)
+++ trunk/gnome-panel/panel-recent.c	Tue Feb 12 23:03:23 2008
@@ -208,7 +208,7 @@
 	setup_menu_item_with_icon (menu_item,
 				   panel_menu_icon_get_size (),
 				   PANEL_ICON_RECENT,
-				   NULL,
+				   NULL, NULL,
 				   _("Recent Documents"));
 	recent_menu = gtk_recent_chooser_menu_new_for_manager (manager);
 	gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), recent_menu);
@@ -247,7 +247,7 @@
 	setup_menu_item_with_icon (menu_item,
 				   panel_menu_icon_get_size (),
 				   NULL,
-				   GTK_STOCK_CLEAR,
+				   GTK_STOCK_CLEAR, NULL,
 				   _("Clear Recent Documents"));
 	panel_util_set_tooltip_text (menu_item,
 				     _("Clear all items from the recent documents list"));

Modified: trunk/gnome-panel/panel-util.c
==============================================================================
--- trunk/gnome-panel/panel-util.c	(original)
+++ trunk/gnome-panel/panel-util.c	Tue Feb 12 23:03:23 2008
@@ -1348,6 +1348,97 @@
 	return NULL;
 }
 
+/* TODO: kill this when we can depend on GTK+ 2.14 */
+static GdkPixbuf *
+panel_util_gdk_pixbuf_load_from_stream (GInputStream  *stream)
+{
+#define LOAD_BUFFER_SIZE 65536
+	unsigned char buffer[LOAD_BUFFER_SIZE];
+	gssize bytes_read;
+	GdkPixbufLoader *loader;
+	GdkPixbuf *pixbuf;
+	gboolean got_eos;
+	
+
+	g_return_val_if_fail (stream != NULL, NULL);
+
+	got_eos = FALSE;
+	loader = gdk_pixbuf_loader_new ();
+	while (1) {
+		bytes_read = g_input_stream_read (stream, buffer, sizeof (buffer),
+						  NULL, NULL);
+		
+		if (bytes_read < 0) {
+			break;
+		}
+		if (bytes_read == 0) {
+			got_eos = TRUE;
+			break;
+		}
+		if (!gdk_pixbuf_loader_write (loader,
+					      buffer,
+					      bytes_read,
+					      NULL)) {
+			break;
+		}
+	}
+
+	g_input_stream_close (stream, NULL, NULL);
+	gdk_pixbuf_loader_close (loader, NULL);
+
+	pixbuf = NULL;
+	if (got_eos) {
+		pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+		if (pixbuf != NULL) {
+			g_object_ref (pixbuf);
+		}
+	}
+
+	g_object_unref (loader);
+
+	return pixbuf;
+}
+
+GdkPixbuf *
+panel_util_get_pixbuf_from_g_loadable_icon (GIcon *gicon,
+					    int    size)
+{
+	GdkPixbuf    *pixbuf;
+	GInputStream *stream;
+
+	if (!G_IS_LOADABLE_ICON (gicon))
+		return NULL;
+
+	pixbuf = NULL;
+
+	stream = g_loadable_icon_load (G_LOADABLE_ICON (gicon),
+				       size,
+				       NULL, NULL, NULL);
+	if (stream) {
+		pixbuf = panel_util_gdk_pixbuf_load_from_stream (stream);
+		g_object_unref (stream);
+	}
+
+	if (pixbuf) {
+		gint width, height;
+
+		width = gdk_pixbuf_get_width (pixbuf);
+		height = gdk_pixbuf_get_height (pixbuf);
+
+		if (width > size || height > size) {
+			GdkPixbuf *tmp;
+
+			tmp = gdk_pixbuf_scale_simple (pixbuf, size, size,
+						       GDK_INTERP_BILINEAR);
+
+			g_object_unref (pixbuf);
+			pixbuf = tmp;
+		}
+	}
+
+	return pixbuf;
+}
+
 static char *
 panel_util_get_file_display_name_if_mount (GFile *file)
 {

Modified: trunk/gnome-panel/panel-util.h
==============================================================================
--- trunk/gnome-panel/panel-util.h	(original)
+++ trunk/gnome-panel/panel-util.h	Tue Feb 12 23:03:23 2008
@@ -136,6 +136,8 @@
 				  const char *text);
 
 char *panel_util_get_icon_name_from_g_icon (GIcon *gicon);
+GdkPixbuf *panel_util_get_pixbuf_from_g_loadable_icon (GIcon *gicon,
+						       int    size);
 GFile *panel_util_get_file_optional_homedir (const char *location);
 
 G_END_DECLS



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]