diff options
Diffstat (limited to 'gtk/deprecated/gtkstatusicon-quartz.c')
-rw-r--r-- | gtk/deprecated/gtkstatusicon-quartz.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/gtk/deprecated/gtkstatusicon-quartz.c b/gtk/deprecated/gtkstatusicon-quartz.c new file mode 100644 index 0000000000..f67c4ac30b --- /dev/null +++ b/gtk/deprecated/gtkstatusicon-quartz.c @@ -0,0 +1,146 @@ +/* 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, see <http://www.gnu.org/licenses/>. + * + * 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 + + + |