preps for tray access
authorClaus Gittinger <cg@exept.de>
Tue, 30 Oct 2007 16:44:09 +0100
changeset 4809 27b6b61daa24
parent 4808 ba94c76b6684
child 4810 b4be19d40fa8
preps for tray access
WinWorkstation.st
--- a/WinWorkstation.st	Tue Oct 30 16:41:52 2007 +0100
+++ b/WinWorkstation.st	Tue Oct 30 16:44:09 2007 +0100
@@ -6428,19 +6428,157 @@
 
     |rgb|
 
-    rgb := self primGetSystemColor:aKey.
-    rgb notNil ifTrue:[
-	^ Color
-	    redByte:((rgb bitShift:-16) bitAnd:16rFF)
-	    greenByte:((rgb bitShift:-8) bitAnd:16rFF)
-	    blueByte:(rgb bitAnd:16rFF)
-    ].
-    ^ nil
+%{  
+    int p;
+    int __rgb, r, g, b;
+
+    if (aKey == @symbol(COLOR_WINDOW)) {
+      p = COLOR_WINDOW;
+    } else if (aKey == @symbol(COLOR_WINDOWTEXT)) {
+      p = COLOR_WINDOWTEXT;
+    } else if (aKey == @symbol(COLOR_MENU)) {
+      p = COLOR_MENU;
+    } else if (aKey == @symbol(COLOR_MENUTEXT)) {
+      p = COLOR_MENUTEXT;
+    } else if (aKey == @symbol(COLOR_BTNFACE)) {
+      p = COLOR_BTNFACE;
+    } else if (aKey == @symbol(COLOR_BTNSHADOW)) {
+      p = COLOR_BTNSHADOW;
+    } else if (aKey == @symbol(COLOR_BTNTEXT)) {
+      p = COLOR_BTNTEXT;
+    } else if (aKey == @symbol(COLOR_GRAYTEXT)) {
+      p = COLOR_GRAYTEXT;
+    } else if (aKey == @symbol(COLOR_HIGHLIGHT)) {
+      p = COLOR_HIGHLIGHT;
+    } else if (aKey == @symbol(COLOR_HIGHLIGHTTEXT)) {
+      p = COLOR_HIGHLIGHTTEXT;
+    } else if (aKey == @symbol(COLOR_MENU)) {
+      p = COLOR_MENU;
+    } else if (aKey == @symbol(COLOR_MENUTEXT)) {
+      p = COLOR_MENUTEXT;
+    } else if (aKey == @symbol(COLOR_SCROLLBAR)) {
+      p = COLOR_SCROLLBAR;
+#ifdef COLOR_SHADOW
+    } else if (aKey == @symbol(COLOR_SHADOW)) {
+      p = COLOR_SHADOW;
+#endif
+#ifdef COLOR_BACKGROUND
+    } else if (aKey == @symbol(COLOR_BACKGROUND)) {
+      p = COLOR_BACKGROUND;
+#endif
+#ifdef COLOR_ACTIVECAPTION
+    } else if (aKey == @symbol(COLOR_ACTIVECAPTION)) {
+      p = COLOR_ACTIVECAPTION;
+#endif
+#ifdef COLOR_INACTIVECAPTION
+    } else if (aKey == @symbol(COLOR_INACTIVECAPTION)) {
+      p = COLOR_INACTIVECAPTION;
+#endif
+#ifdef COLOR_WINDOWFRAME
+    } else if (aKey == @symbol(COLOR_WINDOWFRAME)) {
+      p = COLOR_WINDOWFRAME;
+#endif
+#ifdef COLOR_CAPTIONTEXT
+    } else if (aKey == @symbol(COLOR_CAPTIONTEXT)) {
+      p = COLOR_CAPTIONTEXT;
+#endif
+#ifdef COLOR_ACTIVEBORDER
+    } else if (aKey == @symbol(COLOR_ACTIVEBORDER)) {
+      p = COLOR_ACTIVEBORDER;
+#endif
+#ifdef COLOR_INACTIVEBORDER
+    } else if (aKey == @symbol(COLOR_INACTIVEBORDER)) {
+      p = COLOR_INACTIVEBORDER;
+#endif
+#ifdef COLOR_APPWORKSPACE
+    } else if (aKey == @symbol(COLOR_APPWORKSPACE)) {
+      p = COLOR_APPWORKSPACE;
+#endif
+#ifdef COLOR_INACTIVECAPTIONTEXT
+    } else if (aKey == @symbol(COLOR_INACTIVECAPTIONTEXT)) {
+      p = COLOR_INACTIVECAPTIONTEXT;
+#endif
+#ifdef COLOR_BTNHIGHLIGHT
+    } else if (aKey == @symbol(COLOR_BTNHIGHLIGHT)) {
+      p = COLOR_BTNHIGHLIGHT;
+#endif
+#ifdef COLOR_3DDKSHADOW
+    } else if (aKey == @symbol(COLOR_3DDKSHADOW)) {
+      p = COLOR_3DDKSHADOW;
+#endif
+#ifdef COLOR_3DLIGHT
+    } else if (aKey == @symbol(COLOR_3DLIGHT)) {
+      p = COLOR_3DLIGHT;
+#endif
+#ifdef COLOR_INFOTEXT
+    } else if (aKey == @symbol(COLOR_INFOTEXT)) {
+      p = COLOR_INFOTEXT;
+#endif
+#ifdef COLOR_INFOBK
+    } else if (aKey == @symbol(COLOR_INFOBK)) {
+      p = COLOR_INFOBK;
+#endif
+#ifdef COLOR_HOTLIGHT
+    } else if (aKey == @symbol(COLOR_HOTLIGHT)) {
+      p = COLOR_HOTLIGHT;
+#endif
+#ifdef COLOR_GRADIENTACTIVECAPTION
+    } else if (aKey == @symbol(COLOR_GRADIENTACTIVECAPTION)) {
+      p = COLOR_GRADIENTACTIVECAPTION;
+#endif
+#ifdef COLOR_GRADIENTINACTIVECAPTION
+    } else if (aKey == @symbol(COLOR_GRADIENTINACTIVECAPTION)) {
+      p = COLOR_GRADIENTINACTIVECAPTION;
+#endif
+#ifdef COLOR_DESKTOP
+    } else if (aKey == @symbol(COLOR_DESKTOP)) {
+      p = COLOR_DESKTOP;
+#endif
+#ifdef COLOR_3DFACE
+    } else if (aKey == @symbol(COLOR_3DFACE)) {
+      p = COLOR_3DFACE;
+#endif
+#ifdef COLOR_3DSHADOW
+    } else if (aKey == @symbol(COLOR_3DSHADOW)) {
+      p = COLOR_3DSHADOW;
+#endif
+#ifdef COLOR_3DHIGHLIGHT
+    } else if (aKey == @symbol(COLOR_3DHIGHLIGHT)) {
+      p = COLOR_3DHIGHLIGHT;
+#endif
+#ifdef COLOR_3DHILIGHT
+    } else if (aKey == @symbol(COLOR_3DHILIGHT)) {
+      p = COLOR_3DHILIGHT;
+#endif
+#ifdef COLOR_BTNHILIGHT
+    } else if (aKey == @symbol(COLOR_BTNHILIGHT)) {
+      p = COLOR_BTNHILIGHT;
+#endif
+    } else {
+      goto getOutOfHere;
+    }
+    __rgb = GetSysColor(p);
+    /* win uses BGR order */
+    r = __rgb & 0xFF;
+    g = (__rgb >> 8) & 0xFF;
+    b = (__rgb >> 16) & 0xFF;
+    __rgb = (((r << 8) | g) << 8) | b;
+    rgb = __MKSMALLINT(__rgb);
+getOutOfHere: ;
+%}.
+    rgb isNil ifTrue:[ ^ nil ].
+
+    ^ Color
+        redByte:((rgb bitShift:-16) bitAnd:16rFF)
+        greenByte:((rgb bitShift:-8) bitAnd:16rFF)
+        blueByte:(rgb bitAnd:16rFF)
 
     "
      Display getSystemColor:#COLOR_WINDOW
      Display getSystemColor:#COLOR_HIGHLIGHT
     "
+
+    "Modified: / 30-10-2007 / 15:06:02 / cg"
 !
 
 getSystemMetrics:aNumberOrSymbol
@@ -6799,151 +6937,6 @@
     "
 !
 
-primGetSystemColor:aKey
-%{  /* NOCONTEXT */
-    int p;
-    int rgb, r, g, b;
-
-    if (aKey == @symbol(COLOR_WINDOW)) {
-      p = COLOR_WINDOW;
-    } else if (aKey == @symbol(COLOR_WINDOWTEXT)) {
-      p = COLOR_WINDOWTEXT;
-    } else if (aKey == @symbol(COLOR_MENU)) {
-      p = COLOR_MENU;
-    } else if (aKey == @symbol(COLOR_MENUTEXT)) {
-      p = COLOR_MENUTEXT;
-    } else if (aKey == @symbol(COLOR_BTNFACE)) {
-      p = COLOR_BTNFACE;
-    } else if (aKey == @symbol(COLOR_BTNSHADOW)) {
-      p = COLOR_BTNSHADOW;
-    } else if (aKey == @symbol(COLOR_BTNTEXT)) {
-      p = COLOR_BTNTEXT;
-    } else if (aKey == @symbol(COLOR_GRAYTEXT)) {
-      p = COLOR_GRAYTEXT;
-    } else if (aKey == @symbol(COLOR_HIGHLIGHT)) {
-      p = COLOR_HIGHLIGHT;
-    } else if (aKey == @symbol(COLOR_HIGHLIGHTTEXT)) {
-      p = COLOR_HIGHLIGHTTEXT;
-    } else if (aKey == @symbol(COLOR_MENU)) {
-      p = COLOR_MENU;
-    } else if (aKey == @symbol(COLOR_MENUTEXT)) {
-      p = COLOR_MENUTEXT;
-    } else if (aKey == @symbol(COLOR_SCROLLBAR)) {
-      p = COLOR_SCROLLBAR;
-#ifdef COLOR_SHADOW
-    } else if (aKey == @symbol(COLOR_SHADOW)) {
-      p = COLOR_SHADOW;
-#endif
-#ifdef COLOR_BACKGROUND
-    } else if (aKey == @symbol(COLOR_BACKGROUND)) {
-      p = COLOR_BACKGROUND;
-#endif
-#ifdef COLOR_ACTIVECAPTION
-    } else if (aKey == @symbol(COLOR_ACTIVECAPTION)) {
-      p = COLOR_ACTIVECAPTION;
-#endif
-#ifdef COLOR_INACTIVECAPTION
-    } else if (aKey == @symbol(COLOR_INACTIVECAPTION)) {
-      p = COLOR_INACTIVECAPTION;
-#endif
-#ifdef COLOR_WINDOWFRAME
-    } else if (aKey == @symbol(COLOR_WINDOWFRAME)) {
-      p = COLOR_WINDOWFRAME;
-#endif
-#ifdef COLOR_CAPTIONTEXT
-    } else if (aKey == @symbol(COLOR_CAPTIONTEXT)) {
-      p = COLOR_CAPTIONTEXT;
-#endif
-#ifdef COLOR_ACTIVEBORDER
-    } else if (aKey == @symbol(COLOR_ACTIVEBORDER)) {
-      p = COLOR_ACTIVEBORDER;
-#endif
-#ifdef COLOR_INACTIVEBORDER
-    } else if (aKey == @symbol(COLOR_INACTIVEBORDER)) {
-      p = COLOR_INACTIVEBORDER;
-#endif
-#ifdef COLOR_APPWORKSPACE
-    } else if (aKey == @symbol(COLOR_APPWORKSPACE)) {
-      p = COLOR_APPWORKSPACE;
-#endif
-#ifdef COLOR_INACTIVECAPTIONTEXT
-    } else if (aKey == @symbol(COLOR_INACTIVECAPTIONTEXT)) {
-      p = COLOR_INACTIVECAPTIONTEXT;
-#endif
-#ifdef COLOR_BTNHIGHLIGHT
-    } else if (aKey == @symbol(COLOR_BTNHIGHLIGHT)) {
-      p = COLOR_BTNHIGHLIGHT;
-#endif
-#ifdef COLOR_3DDKSHADOW
-    } else if (aKey == @symbol(COLOR_3DDKSHADOW)) {
-      p = COLOR_3DDKSHADOW;
-#endif
-#ifdef COLOR_3DLIGHT
-    } else if (aKey == @symbol(COLOR_3DLIGHT)) {
-      p = COLOR_3DLIGHT;
-#endif
-#ifdef COLOR_INFOTEXT
-    } else if (aKey == @symbol(COLOR_INFOTEXT)) {
-      p = COLOR_INFOTEXT;
-#endif
-#ifdef COLOR_INFOBK
-    } else if (aKey == @symbol(COLOR_INFOBK)) {
-      p = COLOR_INFOBK;
-#endif
-#ifdef COLOR_HOTLIGHT
-    } else if (aKey == @symbol(COLOR_HOTLIGHT)) {
-      p = COLOR_HOTLIGHT;
-#endif
-#ifdef COLOR_GRADIENTACTIVECAPTION
-    } else if (aKey == @symbol(COLOR_GRADIENTACTIVECAPTION)) {
-      p = COLOR_GRADIENTACTIVECAPTION;
-#endif
-#ifdef COLOR_GRADIENTINACTIVECAPTION
-    } else if (aKey == @symbol(COLOR_GRADIENTINACTIVECAPTION)) {
-      p = COLOR_GRADIENTINACTIVECAPTION;
-#endif
-#ifdef COLOR_DESKTOP
-    } else if (aKey == @symbol(COLOR_DESKTOP)) {
-      p = COLOR_DESKTOP;
-#endif
-#ifdef COLOR_3DFACE
-    } else if (aKey == @symbol(COLOR_3DFACE)) {
-      p = COLOR_3DFACE;
-#endif
-#ifdef COLOR_3DSHADOW
-    } else if (aKey == @symbol(COLOR_3DSHADOW)) {
-      p = COLOR_3DSHADOW;
-#endif
-#ifdef COLOR_3DHIGHLIGHT
-    } else if (aKey == @symbol(COLOR_3DHIGHLIGHT)) {
-      p = COLOR_3DHIGHLIGHT;
-#endif
-#ifdef COLOR_3DHILIGHT
-    } else if (aKey == @symbol(COLOR_3DHILIGHT)) {
-      p = COLOR_3DHILIGHT;
-#endif
-#ifdef COLOR_BTNHILIGHT
-    } else if (aKey == @symbol(COLOR_BTNHILIGHT)) {
-      p = COLOR_BTNHILIGHT;
-#endif
-    } else {
-      RETURN (nil);
-    }
-    rgb = GetSysColor(p);
-    /* win uses BGR order */
-    r = rgb & 0xFF;
-    g = (rgb >> 8) & 0xFF;
-    b = (rgb >> 16) & 0xFF;
-    rgb = (((r << 8) | g) << 8) | b;
-    RETURN (__MKSMALLINT(rgb));
-%}.
-
-    "
-     Screen current getSystemColor:#COLOR_HOTLIGHT
-     Screen current getSystemColor:#COLOR_HIGHLIGHT
-    "
-!
-
 primViewIdFromPoint:aPoint in:windowId
     "given a point in rootWindow, return the viewId of the subview of windowId
      hit by this coordinate. Return nil if no view was hit.
@@ -7443,6 +7436,157 @@
 %}
 !
 
+createTrayWindowFor:aView
+        icon:wicon iconMask:wiconMaskArg
+        toolTipMessage:toolTipMessageArg
+
+    |windowId wiconId wiconMask invertedWiconMask wiconMaskId 
+     wiconWidth wiconHeight toolTipMessage|
+
+    "/ the toolTop string cannot be longer than 64 characters including the NULL terminator 
+    toolTipMessageArg size > 63 ifTrue:[
+        toolTipMessage := toolTipMessageArg copyTo:63
+    ] ifFalse:[
+        toolTipMessage := toolTipMessageArg.
+    ].
+
+    windowId := aView id.
+
+    wicon notNil ifTrue:[
+        wiconId := wicon id.
+        wiconHeight := wicon height.
+        wiconWidth  := wicon width.
+        wiconMask := wiconMaskArg.
+        wiconMask isNil ifTrue:[
+            wiconMask := wicon mask.
+        ].
+        wiconMask notNil ifTrue:[
+            "/ WIN32's mask has zeros for opaque pixels
+            invertedWiconMask := wiconMask copy.
+            invertedWiconMask bits invert.
+            invertedWiconMask := invertedWiconMask onDevice:self.
+            wiconMaskId := invertedWiconMask id
+        ].
+    ].
+
+%{  /* STACK: 16000 */
+#ifndef WM_TRAY_MESSAGE 
+# define WM_TRAY_MESSAGE (WM_USER+0x0200)
+#endif
+    HBITMAP        xBitMap, maskBitmap;
+    HICON          xIcon = (HICON)0;
+    ICONINFO       iconInfo;
+    NOTIFYICONDATA nid;
+    unsigned char fastBits[10000];
+
+    /* get bitmap for icon */
+    if ( __isExternalAddress(wiconId) ) {
+        xBitMap = _HBITMAPVAL( wiconId );
+        if ( xBitMap != 0 ) {
+            BITMAP bm;
+
+            if (GetObject(xBitMap, sizeof(bm), (LPSTR)&bm)) {
+                int d = bm.bmPlanes * bm.bmBitsPixel;
+                BYTE *ep;
+                int height, width;
+                int nBytes;
+                unsigned char *allocatedBits = 0;
+                int privateMask = 0;
+
+                if ( __isExternalAddress(wiconMaskId) ) {
+                    maskBitmap = _HBITMAPVAL( wiconMaskId );
+                } else {
+                    if (wiconMaskId != nil) {
+                        PRINTF(("WinWorkstat [warning]: wiconMaskId is not an external address\n"));
+                    }
+                    maskBitmap = 0;
+                }
+
+                /*
+                 * if there is no mask, generate one
+                 */
+                if (maskBitmap == 0) {
+                    DPRINTF(("Bitmap w:%d h:%d p:%d d:%d\n",bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel));
+                    height = __intVal( wiconHeight );
+                    width  = __intVal( wiconWidth  );
+                    nBytes = ( width + 15 ) / 8;
+                    nBytes = height * nBytes;
+                    if (nBytes < sizeof(fastBits)) {
+                        ep = fastBits;
+                    } else {
+                        ep = allocatedBits = (unsigned char *) malloc(nBytes);
+                    }
+                    if ( ep == 0 ) {
+                        PRINTF(( "WinWorkstat [warning]: malloc failed\n" ));
+                    } else {
+                        memset(ep, 0, nBytes);
+                        maskBitmap = CreateBitmap(width, height, 1, 1, ep );
+                        if ( maskBitmap == NULL ) {
+                            PRINTF(( "WinWorkstat [warning]: mask CREATION failed\n" ));
+                        } else {
+                            privateMask = 1;
+                        }
+                    }
+                }
+                if ( maskBitmap != NULL ) {
+                    DPRINTF(( "BITMAP mask CREATED!!!\n" ));
+                    iconInfo.fIcon = TRUE;
+                    iconInfo.hbmMask  = maskBitmap;
+                    iconInfo.hbmColor = xBitMap;
+                    xIcon = CreateIconIndirect( &iconInfo );
+                    if (privateMask) {
+                        DeleteObject( maskBitmap );
+                    }
+                } else {
+                    PRINTF(( "WinWorkstat [warning]: no mask for icon !\n" ));
+                }
+
+                if (allocatedBits) {
+                    free(allocatedBits);
+                }
+            }
+        } else {
+            DPRINTF(("WinWorkstat [warning]: xBitMap is zero \n" ));
+        }
+    } else {
+        if (wiconId != nil) {
+            PRINTF(("WinWorkstat [warning]: wiconId is not an external address\n"));
+        }
+    }
+
+    ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
+    nid.cbSize = sizeof(NOTIFYICONDATA);
+
+    if (__isExternalAddress(windowId)) {
+        HWND hwnd = _HWNDVal(windowId);
+
+
+        if (hwnd && IsWindow(hwnd)) {
+            nid.hWnd = hwnd; //the hWnd and uID members allow the OS to uniquely identify your icon. 
+                             // One window (the hWnd) can have more than one icon, as long as they have unique uIDs.
+            nid.uFlags = 
+                NIF_ICON        //we're adding an icon
+                | NIF_MESSAGE   //we want the tray to send a message to the window identified by hWnd when something happens to our icon (see uCallbackMesage member below).
+                | NIF_TIP;      //our icon has a tooltip.
+
+            nid.uCallbackMessage = WM_TRAY_MESSAGE; //this message must be handled in hwnd's window procedure. more info below.
+            if (xIcon) {
+                nid.hIcon   = xIcon;
+                /* wc.hIconSm = wiconId; In 4.x there are large and small icons */
+            } else {
+                nid.hIcon = NULL;        /* THIS MUST BE NULL TO DELETE ICONS */
+            }
+            if (__isString(toolTipMessage)) {
+                strcpy(nid.szTip, __stringVal(toolTipMessage));
+            }
+            Shell_NotifyIcon(NIM_ADD, &nid); 
+        }
+    }
+%}
+
+    "Created: / 30-10-2007 / 16:28:30 / cg"
+!
+
 createWindowFor:aView type:typeSymbol
 		 origin:origin
 		 extent:extent
@@ -17228,7 +17372,7 @@
 !WinWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.345 2007-10-22 08:40:07 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.346 2007-10-30 15:44:09 cg Exp $'
 ! !
 
 WinWorkstation initialize!