gnome-panel r10831 - trunk/gnome-panel
- From: vuntz svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-panel r10831 - trunk/gnome-panel
- Date: Tue, 12 Feb 2008 23:03:23 +0000 (GMT)
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]