diff options
author | Mikael Hallendal <micke@imendio.com> | 2006-12-20 13:24:05 +0000 |
---|---|---|
committer | Mikael Hallendal <hallski@src.gnome.org> | 2006-12-20 13:24:05 +0000 |
commit | f18b0d4b7a5fadb6a321d0e7e7989d0a9e18fbdc (patch) | |
tree | 512d161db213746b41baf0e6119c02fe0a31a0b2 /gtk/gtkstatusicon.c | |
parent | ce503485cb983a0e49220d8b92f23aca2d0b9132 (diff) | |
download | gtk+-f18b0d4b7a5fadb6a321d0e7e7989d0a9e18fbdc.tar.gz |
Added gtkstatusicon-quartz.c Implements the quartz backend for the status
2006-12-20 Mikael Hallendal <micke@imendio.com>
* gtk/Makefile.am: Added gtkstatusicon-quartz.c
* gtk/gtkstatusicon-quartz.c: Implements the quartz backend for the
status icon.
* gtk/gtkstatusicon.c: Hooked in the new quartz backend. Bug #387874.
Diffstat (limited to 'gtk/gtkstatusicon.c')
-rwxr-xr-x | gtk/gtkstatusicon.c | 104 |
1 files changed, 102 insertions, 2 deletions
diff --git a/gtk/gtkstatusicon.c b/gtk/gtkstatusicon.c index 7ed3cb754a..047fd48df1 100755 --- a/gtk/gtkstatusicon.c +++ b/gtk/gtkstatusicon.c @@ -3,6 +3,7 @@ * Copyright (C) 2003 Sun Microsystems, Inc. * Copyright (C) 2005 Hans Breuer <hans@breuer.org> * Copyright (C) 2005 Novell, Inc. + * Copyright (C) 2006 Imendio AB * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -23,6 +24,7 @@ * Mark McLoughlin <mark@skynet.ie> * Hans Breuer <hans@breuer.org> * Tor Lillqvist <tml@novell.com> + * Mikael Hallendal <micke@imendio.com> */ #include <config.h> @@ -47,6 +49,11 @@ #define WM_GTK_TRAY_NOTIFICATION (WM_USER+1) #endif +#ifdef GDK_WINDOWING_QUARTZ +#include "gtkicontheme.h" +#include "gtklabel.h" +#endif + #include "gtkalias.h" #define BLINK_TIMEOUT 500 @@ -73,6 +80,12 @@ enum LAST_SIGNAL }; +static guint status_icon_signals [LAST_SIGNAL] = { 0 }; + +#ifdef GDK_WINDOWING_QUARTZ +#include "gtkstatusicon-quartz.c" +#endif + struct _GtkStatusIconPrivate { #ifdef GDK_WINDOWING_X11 @@ -85,6 +98,11 @@ struct _GtkStatusIconPrivate GtkWidget *dummy_widget; NOTIFYICONDATAW nid; #endif + +#ifdef GDK_WINDOWING_QUARTZ + GtkWidget *dummy_widget; + GtkQuartzStatusIcon *status_item; +#endif gint size; @@ -130,8 +148,6 @@ static void gtk_status_icon_disable_blinking (GtkStatusIcon *status_icon); static void gtk_status_icon_reset_image_data (GtkStatusIcon *status_icon); -static guint status_icon_signals [LAST_SIGNAL] = { 0 }; - G_DEFINE_TYPE (GtkStatusIcon, gtk_status_icon, G_TYPE_OBJECT) static void @@ -466,6 +482,20 @@ gtk_status_icon_init (GtkStatusIcon *status_icon) priv->nid.hWnd = NULL; } #endif + +#ifdef GDK_WINDOWING_QUARTZ + priv->dummy_widget = gtk_label_new (""); + + QUARTZ_POOL_ALLOC; + + priv->status_item = [[GtkQuartzStatusIcon alloc] initWithStatusIcon:status_icon]; + + priv->image_height = [priv->status_item getHeight]; + priv->image_width = [priv->status_item getWidth]; + + QUARTZ_POOL_RELEASE; + +#endif } static void @@ -496,6 +526,12 @@ gtk_status_icon_finalize (GObject *object) gtk_widget_destroy (priv->dummy_widget); #endif + +#ifdef GDK_WINDOWING_QUARTZ + QUARTZ_POOL_ALLOC; + [priv->status_item release]; + QUARTZ_POOL_RELEASE; +#endif G_OBJECT_CLASS (gtk_status_icon_parent_class)->finalize (object); } @@ -816,6 +852,11 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid)) g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1); #endif +#ifdef GDK_WINDOWING_QUARTZ + QUARTZ_POOL_ALLOC; + [priv->status_item setImage:gtk_status_icon_blank_icon (status_icon)]; + QUARTZ_POOL_RELEASE; +#endif return; } @@ -857,6 +898,12 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid)) g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1); #endif +#ifdef GDK_WINDOWING_QUARTZ + QUARTZ_POOL_ALLOC; + [priv->status_item setImage:scaled]; + QUARTZ_POOL_RELEASE; +#endif + g_object_unref (scaled); } else @@ -870,6 +917,9 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid)) g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1); #endif +#ifdef GDK_WINDOWING_QUARTZ + [priv->status_item setImage:NULL]; +#endif } } break; @@ -897,6 +947,20 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) g_object_unref (pixbuf); } #endif +#ifdef GDK_WINDOWING_QUARTZ + { + GdkPixbuf *pixbuf; + + pixbuf = gtk_widget_render_icon (priv->dummy_widget, + priv->image_data.stock_id, + GTK_ICON_SIZE_SMALL_TOOLBAR, + NULL); + QUARTZ_POOL_ALLOC; + [priv->status_item setImage:pixbuf]; + QUARTZ_POOL_RELEASE; + g_object_unref (pixbuf); + } +#endif } break; @@ -924,6 +988,22 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) g_object_unref (pixbuf); } #endif +#ifdef GDK_WINDOWING_QUARTZ + { + GdkPixbuf *pixbuf; + + pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + priv->image_data.icon_name, + priv->size, + 0, NULL); + + QUARTZ_POOL_ALLOC; + [priv->status_item setImage:pixbuf]; + QUARTZ_POOL_RELEASE; + g_object_unref (pixbuf); + } +#endif + } break; @@ -937,6 +1017,13 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon) if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid)) g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1); #endif +#ifdef GDK_WINDOWING_QUARTZ + { + QUARTZ_POOL_ALLOC; + [priv->status_item setImage:NULL]; + QUARTZ_POOL_RELEASE; + } +#endif break; default: g_assert_not_reached (); @@ -1398,6 +1485,11 @@ gtk_status_icon_set_tooltip (GtkStatusIcon *status_icon, if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid)) g_warning ("%s:%d:Shell_NotifyIconW(NIM_MODIFY) failed", __FILE__, __LINE__-1); #endif +#ifdef GDK_WINDOWING_QUARTZ + QUARTZ_POOL_ALLOC; + [priv->status_item setToolTip:tooltip_text]; + QUARTZ_POOL_RELEASE; +#endif } static gboolean @@ -1483,6 +1575,11 @@ gtk_status_icon_set_visible (GtkStatusIcon *status_icon, Shell_NotifyIconW (NIM_DELETE, &priv->nid); } #endif +#ifdef GDK_WINDOWING_QUARTZ + QUARTZ_POOL_ALLOC; + [priv->status_item setVisible:visible]; + QUARTZ_POOL_RELEASE; +#endif g_object_notify (G_OBJECT (status_icon), "visible"); } } @@ -1596,6 +1693,9 @@ gtk_status_icon_is_embedded (GtkStatusIcon *status_icon) #ifdef GDK_WINDOWING_WIN32 return TRUE; #endif +#ifdef GDK_WINDOWING_QUARTZ + return TRUE; +#endif } /** |