summaryrefslogtreecommitdiff
path: root/gtk/gtkstatusicon-quartz.c
diff options
context:
space:
mode:
authorMikael Hallendal <micke@imendio.com>2006-12-20 13:24:05 +0000
committerMikael Hallendal <hallski@src.gnome.org>2006-12-20 13:24:05 +0000
commitf18b0d4b7a5fadb6a321d0e7e7989d0a9e18fbdc (patch)
tree512d161db213746b41baf0e6119c02fe0a31a0b2 /gtk/gtkstatusicon-quartz.c
parentce503485cb983a0e49220d8b92f23aca2d0b9132 (diff)
downloadgtk+-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-quartz.c')
-rw-r--r--gtk/gtkstatusicon-quartz.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/gtk/gtkstatusicon-quartz.c b/gtk/gtkstatusicon-quartz.c
new file mode 100644
index 0000000000..8f8bb024c8
--- /dev/null
+++ b/gtk/gtkstatusicon-quartz.c
@@ -0,0 +1,148 @@
+/* gtkstatusicon-quartz.c:
+ *
+ * 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
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * GCC on Mac OS X handles inlined objective C in C-files.
+ *
+ * Authors:
+ * Mikael Hallendal <micke@imendio.com>
+ */
+
+#import <Cocoa/Cocoa.h>
+#include <quartz/gdkquartz.h>
+
+#define QUARTZ_POOL_ALLOC NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
+#define QUARTZ_POOL_RELEASE [pool release]
+
+@interface GtkQuartzStatusIcon : NSObject
+{
+ GtkStatusIcon *status_icon;
+ NSStatusBar *ns_bar;
+ NSStatusItem *ns_item;
+ NSImage *current_image;
+ NSString *ns_tooltip;
+}
+- (id) initWithStatusIcon:(GtkStatusIcon *)status_icon;
+- (void) ensureItem;
+- (void) actionCb:(NSObject *)button;
+- (void) setImage:(GdkPixbuf *)pixbuf;
+- (void) setVisible:(gboolean)visible;
+- (void) setToolTip:(const gchar *)tooltip_text;
+- (float) getWidth;
+- (float) getHeight;
+@end
+
+@implementation GtkQuartzStatusIcon : NSObject
+- (id) initWithStatusIcon:(GtkStatusIcon *)icon
+{
+ [super init];
+ status_icon = icon;
+ ns_bar = [NSStatusBar systemStatusBar];
+
+ return self;
+}
+
+- (void) ensureItem
+{
+ if (ns_item != nil)
+ return;
+
+ ns_item = [ns_bar statusItemWithLength:NSVariableStatusItemLength];
+ [ns_item setAction:@selector(actionCb:)];
+ [ns_item setTarget:self];
+ [ns_item retain];
+}
+
+- (void) dealloc
+{
+ g_print ("Deallocating GtkQuartzStatusIcon\n");
+ [current_image release];
+ [ns_item release];
+ [ns_bar release];
+
+ [super dealloc];
+}
+
+- (void) actionCb:(NSObject *)button
+{
+ NSEvent *event = [NSApp currentEvent];
+ double time = [event timestamp];
+
+ g_signal_emit (status_icon,
+ status_icon_signals [POPUP_MENU_SIGNAL], 0,
+ 1,
+ time * 1000.0);
+}
+
+- (void) setImage:(GdkPixbuf *)pixbuf
+{
+ /* Support NULL */
+ [self ensureItem];
+
+ if (current_image != nil) {
+ [current_image release];
+ current_image = nil;
+ }
+
+ if (!pixbuf) {
+ [ns_item release];
+ ns_item = nil;
+ return;
+ }
+
+ current_image = gdk_quartz_pixbuf_to_ns_image_libgtk_only (pixbuf);
+ [current_image retain];
+
+ [ns_item setImage:current_image];
+}
+
+- (void) setVisible:(gboolean)visible
+{
+ if (visible) {
+ [self ensureItem];
+ if (ns_item != nil)
+ [ns_item setImage:current_image];
+ if (ns_tooltip != nil)
+ [ns_item setToolTip:ns_tooltip];
+ } else {
+ [ns_item release];
+ ns_item = nil;
+ }
+}
+
+- (void) setToolTip:(const gchar *)tooltip_text
+{
+ [ns_tooltip release];
+ ns_tooltip = [[NSString stringWithUTF8String:tooltip_text] retain];
+
+ [ns_item setToolTip:ns_tooltip];
+}
+
+- (float) getWidth
+{
+ return [ns_bar thickness];
+}
+
+- (float) getHeight
+{
+ return [ns_bar thickness];
+}
+@end
+
+
+