Second attempt for tray code.

-- 
Alexander Nest
--- amsn/utils/linux/traydock/blibtray.c	2009-12-06 21:43:09.985847493 +0100
+++ libtray.c	2009-12-06 22:08:44.477870950 +0100
@@ -14,6 +14,9 @@
 #define SYSTEM_TRAY_BEGIN_MESSAGE   1
 #define SYSTEM_TRAY_CANCEL_MESSAGE  2
 
+#define SYSTEM_TRAY_ORIENTATION_HORZ 0
+#define SYSTEM_TRAY_ORIENTATION_VERT 1
+
 #define IL_LAST(il)				\
 {						\
 	if (il != NULL){			\
@@ -56,6 +59,17 @@
 	}					\
 }
 
+static int Tk_TrayIconNew (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);     
+static int Tk_RemoveIcon (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);                
+
+struct {
+    int managed; //1 is for managed, 0 is when no tray-manager
+    int destroyed; //1 is when tray is deleted because of tray crash, 0 is when tray is managed and visible.
+    ClientData clientData;
+    Tcl_Interp *interp;
+    int objc;
+    Tcl_Obj *objv;
+} trayinfo;
 
 typedef struct TrayIcon *TrayIcon_;
 typedef struct {
@@ -252,8 +266,22 @@
 static int
 MessageEvent (Tk_Window tkwin, XEvent *eventPtr)
 {
-//	printf("Message\n");
-	return 0;
+    if (_GetSystemTray () == 0) {
+        if (trayinfo.managed == 1 && trayinfo.destroyed == 0){
+            trayinfo.managed = 0;
+            trayinfo.destroyed = 1;              
+            //printf("Tray manager is gone! Delete trayicon!\n");
+            Tk_RemoveIcon(trayinfo.clientData, trayinfo.interp, trayinfo.objc, trayinfo.objv);
+        }
+    } else {
+        if (trayinfo.managed == 0 && trayinfo.destroyed == 1){
+            trayinfo.managed = 1;
+            trayinfo.destroyed = 0;              
+            //printf("Tray manager is back! Recreate trayicon!\n");
+            Tk_TrayIconNew(trayinfo.clientData, trayinfo.interp, trayinfo.objc, trayinfo.objv);
+        }          
+    }
+    return 0;
 }
 
 
@@ -327,8 +355,20 @@
 	XSizeHints *hint;
 	char cmdBuffer[1024];
 
+        //set trayinfo
+        trayinfo.managed = 1;
+        trayinfo.destroyed = 0;
+        trayinfo.clientData = clientData;
+        trayinfo.interp = interp;
+        trayinfo.objc = objc;
+
+        trayinfo.objv = (Tcl_Obj *) calloc (objc, sizeof(Tcl_Obj));
+        memcpy(trayinfo.objv, objv, sizeof(Tcl_Obj)*objc);
+        
 	/* systemtray was not available in Init */
 	if (_GetSystemTray () == 0) {
+                trayinfo.managed = 0;
+                trayinfo.destroyed = 1;
 		Tcl_AppendResult (interp, "cannot create a tray icon without a system tray", (char *) NULL);
 		return TCL_ERROR;
 	}
@@ -415,9 +455,10 @@
 		icon->pixmap=Tk_GetImage(interp,icon->win,pixmap,ImageChangedProc, (ClientData)icon);
 		
 		/* Create callback function for event handling */
-		mask = StructureNotifyMask | ExposureMask | EnterWindowMask | LeaveWindowMask  | PropertyChangeMask;
+		mask = StructureNotifyMask | ExposureMask | EnterWindowMask | LeaveWindowMask  | PropertyChangeMask | DestroyNotify;
 		Tk_CreateEventHandler(icon->win, mask, IconEvent, (ClientData) icon);
 		Tk_CreateClientMessageHandler(MessageEvent);
+                Tk_CreateGenericHandler(MessageEvent, (ClientData)icon);
 		
 		/* Set default icon size hint */
 		hint = XAllocSizeHints();
------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Amsn-devel mailing list
Amsn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amsn-devel

Reply via email to