 cab7dcde1b
			
		
	
	cab7dcde1b
	
	
	
		
			
			GtkStatusIcon is using a problematic, XEmbed-based protocol under X, and we want to get rid of it eventually. Document our intentions by marking GtkStatusIcon as deprecated. https://bugzilla.gnome.org/show_bug.cgi?id=734826
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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
 | |
| 
 | |
| 
 | |
| 
 |