--- 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!