#REFACTORING by stefan
authorStefan Vogel <sv@exept.de>
Wed, 21 Mar 2018 16:03:02 +0100
changeset 8318 a3745ee87e94
parent 8317 ee6ae4605fd9
child 8319 bdc89880bdd8
#REFACTORING by stefan class: WinWorkstation changed: #dispatchLastEvent
WinWorkstation.st
--- a/WinWorkstation.st	Wed Mar 21 16:01:01 2018 +0100
+++ b/WinWorkstation.st	Wed Mar 21 16:03:02 2018 +0100
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
 COPYRIGHT (c) 1996 by Claus Gittinger
 	      All Rights Reserved
@@ -2056,7 +2054,7 @@
 		    }
 		    goto again;
 		}
-		/* fail evtl. später ändern und in st verzögert aufrufen
+		/* fail evtl. später ändern und in st verzögert aufrufen
 		*/
 		console_fprintf(stderr, "WinWorkstation [info]: UnregisterClass %s failed.\n",(char*)ev->ev_arg1);
 	    }
@@ -11672,14 +11670,14 @@
      If the argument aMask is nonNil, only events for this eventMask are
      handled.
      WARNING: this may block to wait for an event - you better check for a
-	      pending event before calling this."
+              pending event before calling this."
 
     (self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
-	AbortSignal handle:[:ex |
-	    ex return
-	] do:[
-	    self dispatchLastEvent.
-	]
+        AbortOperationRequest handle:[:ex |
+            ex return
+        ] do:[
+            self dispatchLastEvent.
+        ]
     ].
 
     "Modified: 19.8.1997 / 17:10:42 / cg"
@@ -11755,975 +11753,968 @@
     eB = __INST(eventBuffer);
 
     if (__isByteArray(eB)) {
-	ev = (struct queuedEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+        ev = (struct queuedEvent *)(__ByteArrayInstPtr(eB)->ba_element);
     } else {
-	console_fprintf(stderr, "WinWorkstation [error]: no eventBuffer\n");
-	RETURN (false);
+        console_fprintf(stderr, "WinWorkstation [error]: no eventBuffer\n");
+        RETURN (false);
     }
     if (ev) {
-	_ev_buf = *ev;
-	ev = &_ev_buf;
+        _ev_buf = *ev;
+        ev = &_ev_buf;
     }
     hWnd = ev->ev_hWnd;
     if (!(hWnd /*&& IsWindow(hWnd)*/)) {
-	DPRINTF(("wrong hWnd in event in dispatchLastEvent\n"));
-	RETURN (false);
+        DPRINTF(("wrong hWnd in event in dispatchLastEvent\n"));
+        RETURN (false);
     }
     {
-	OBJ t;
-
-	/*
-	 * very often, its another event for the same view ...
-	 * avoid creation & lookup then.
-	 */
-#if 1
-	if ((t = __INST(lastId)) != nil) {
-	    if (__isExternalAddress(t)) {
-		if (_HWNDVal(t) == hWnd) {
-		    theView = __INST(lastView);
-		    if (__isNonNilObject(theView)) {
-			if (__qClass(theView) == nil) {
-			    theView = nil;
-			}
-		    }
-		}
-	    }
-	}
-#endif
-	if (theView == nil) {
-	    windowID = __MKOBJ(ev->ev_hWnd);
-	    theView = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, windowID);
-	}
+        OBJ t = __INST(lastId);
+
+        /*
+         * very often, its another event for the same view ...
+         * avoid creation & lookup then.
+         */
+        if (__isExternalAddress(t) && _HWNDVal(t) == hWnd) {
+            theView = __INST(lastView);
+            if (__isNonNilObject(theView) && __qClass(theView) == nil) {
+                theView = nil;
+            }
+        }
+
+        if (theView == nil) {
+            windowID = __MKOBJ(ev->ev_hWnd);
+            theView = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, windowID);
+        }
     }
 
     if (theView == nil) {
-	DPRINTF(("nil view [hWnd=%x msg=0x%x] in dispatchEvent\n",
-		 ev->ev_hWnd, ev->ev_message));
-
-	RETURN (false);
+        DPRINTF(("nil view [hWnd=%x msg=0x%x] in dispatchEvent\n",
+                 ev->ev_hWnd, ev->ev_message));
+
+        RETURN (false);
     }
 
     switch (ev->ev_message) {
-	    DPRINTFIF((__debug_WM_ALL__) , ("message=%d 0x%x wparam=%"_lx_" hwnd=%"_lx_" arg1=%"_lx_")\n",
-			ev->ev_message, ev->ev_message, (INT)(ev->ev_wParam), (INT)(ev->ev_hWnd), (INT)(ev->ev_arg1)));
-	    case WM_WINDOWPOSCHANGED:
-		{
-		    RECT rct;
-
-		    x = ev->ev_x;
-		    y = ev->ev_y;
-		    w = ev->ev_w;
-		    h = ev->ev_h;
-
-		    DPRINTF((">>> WM_WINDOWPOSCHANGED -> configure %d/%d , %d/%d\n", x,y,w,h));
-
-		    (*conf.ilc_func)(self,
-				     @symbol(configureX:y:width:height:view:),
-				     nil, &conf,
-				     __MKSMALLINT(x),
-				     __MKSMALLINT(y),
-				     __MKSMALLINT(w),
-				     __MKSMALLINT(h),
-				     theView);
-		}
-		break;
-
-	    case WM_DROPFILES:
-		{
-		    HDROP hDrop = (HDROP) ev->ev_wParam;
-		    int   count = DragQueryFile( hDrop,0xffffffff,0,0 );
-
-		    DPRINTFIF((__debug_WM_DROPFILES__ | __debug_WM_ALL__) , ("count=%d hDrop=%x\n", count, hDrop));
-		    if (count > 0) {
-			OBJ  dropHandle, files, position;
-			char buf[MAXPATH];
-			int  i;
-
-			dropHandle = __MKOBJ(hDrop);
-			__PROTECT__(dropHandle);
-			files = __ARRAY_NEW_INT( count );
-			__UNPROTECT__(dropHandle);
-
-			for (i = 0;i < count;i++) {
-			    OBJ s;
-
-			    DragQueryFile(hDrop,i,buf,sizeof(buf));
-			    __PROTECT__(dropHandle);
-			    __PROTECT__(files);
-			    s = __MKSTRING(buf);
-			    __UNPROTECT__(files);
-			    __UNPROTECT__(dropHandle);
-			    __ArrayInstPtr(files)->a_element[i] = s; __STORE(files, s);
-			}
-
-			{
-			    POINT pos;
-
-			    DragQueryPoint(hDrop, &pos);
-
-			    __PROTECT__(dropHandle);
-			    __PROTECT__(files);
-			    position = __MKPOINT_INT(pos.x, pos.y);
-			    __UNPROTECT__(files);
-			    __UNPROTECT__(dropHandle);
-			}
-
-			(*dropFiles.ilc_func)
-			    ( self
-			      , @symbol(dropFiles:view:position:handle:)
-			      , nil, &dropFiles,
-			      files, theView, position, dropHandle
-			    );
-		    }
-		}
-		break;
-
-	    case WM_SHOWWINDOW:
-		if (ev->ev_wParam == TRUE) {
-		    DPRINTF((">>> WM_SHOWWINDOW -> mappedView:\n"));
-		    arg = @symbol(unobscured);
-		    (*vis.ilc_func)(theView,
-				    @symbol(visibilityChange:),
-				    nil, &vis, arg);
-		    (*map.ilc_func)(self,
-				    @symbol(mappedView:),
-				    nil, &map, theView);
-		} else {
-		    DPRINTF((">>> WM_SHOWWINDOW -> unMappedView:\n"));
-#if 0
-		    arg = @symbol(fullyObscured);
-		    (*vis.ilc_func)(theView,
-				    @symbol(visibilityChange:),
-				    nil, &vis, arg);
-#endif
-		    (*unmap.ilc_func)(self,
-				      @symbol(unmappedView:),
-				      nil, &unmap, theView);
-		}
-		break;
-
-	    case __WM_ICONIFIED:
-		if (ev->ev_wParam) {
-		    DPRINTF((">>> __WM_ICONIFIED -> unMappedView:\n"));
-#if 0
-		    arg = @symbol(fullyObscured);
-		    (*vis.ilc_func)(theView,
-				    @symbol(visibilityChange:),
-				    nil, &vis, arg);
-#endif
-		    (*unmap.ilc_func)(self,
-				      @symbol(unmappedView:),
-				      nil, &unmap, theView);
-		} else {
-		    DPRINTF((">>> __WM_DEICONIFIED -> mappedView:\n"));
-		    arg = @symbol(unobscured);
-		    (*vis.ilc_func)(theView,
-				    @symbol(visibilityChange:),
-				    nil, &vis, arg);
-		    (*map.ilc_func)(self,
-				    @symbol(mappedView:),
-				    nil, &map, theView);
-		}
-		break;
-
-	    case WM_CLOSE:
-		DPRINTF((">>> WM_CLOSE -> terminateView:\n"));
-		(*termS.ilc_func)(self,
-				  @symbol(terminateView:),
-				  nil, &termS, theView);
-		break;
-
-	    case WM_DESTROY:
-		DPRINTF((">>> WM_DESTROY -> destroyedView\n"));
-		(*destr.ilc_func)(self,
-				  @symbol(destroyedView:),
-				  nil, &destr, theView);
-		break;
-
-	    case WM_ACTIVATE:
-
-		switch (LOWORD(ev->ev_wParam)) {
-		    case WA_INACTIVE:
-			DPRINTF((">>> WM_ACTIVATE inactive h=%x\n", ev->ev_hWnd));
-			(*act.ilc_func)(self,
-					@symbol(activate:view:),
-					nil, &act,
-					false, theView);
-			break;
-
-		    case WA_ACTIVE:
-		    case WA_CLICKACTIVE:
-			DPRINTF((">>> WM_ACTIVATE active h=%x\n", ev->ev_hWnd));
-			(*act.ilc_func)(self,
-					@symbol(activate:view:),
-					nil, &act,
-					true, theView);
-			break;
-
-		    default:
-			break;
-		}
-		break;
-
-	    case WM_MOUSEACTIVATE:
-		if (__debug_WM_MOUSEACTIVATE__ | __debug_WM_ALL__) {
-		    PRINTF((">>> WM_MOUSEACTIVATE h=%x -> focusInView:\n", ev->ev_hWnd));
-		}
-
-		(*focIn.ilc_func)(self,
-				  @symbol(focusInView:),
-				  nil, &focIn, theView);
-		break;
-
-	    case WM_SETFOCUS:
-		DPRINTFIF(__debug_WM_FOCUS__ , (">>> WM_SETFOCUS h=%x -> focusInView:\n", ev->ev_hWnd));
-		(*focIn.ilc_func)(self,
-				  @symbol(focusInView:),
-				  nil, &focIn, theView);
-		break;
-
-	    case WM_KILLFOCUS:
-		DPRINTFIF(__debug_WM_FOCUS__ , (">>> WM_KILLFOCUS h=%x -> focusOutOfView\n", ev->ev_hWnd));
-		(*focOut.ilc_func)(self,
-				   @symbol(focusOutView:),
-				   nil, &focOut, theView);
-		break;
-
-	    case __WM_GEXPOSE:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		w = ev->ev_w;
-		h = ev->ev_h;
-		DPRINTF((">>> __WM_GEXPOSE -> gExpose %d/%d -> %d/%d\n", x, y, w, h));
-#if 0
-		if (GetWindow_unmapping(hWnd)) {
-		    console_fprintf(stderr, "oops - __WM_GEXPOSE for unmapping\n");
-		}
-#endif
-		(*gexpS.ilc_func)(self,
-				  @symbol(graphicsExposeX:y:width:height:final:view:),
-				  nil, &gexpS,
-				  __MKSMALLINT(x),
-				  __MKSMALLINT(y),
-				  __MKSMALLINT(w),
-				  __MKSMALLINT(h),
-				  ev->ev_wParam ? true : false,
-				  theView);
-		break;
-
-	    case __WM_NOGEXPOSE:
-		DPRINTFIF((__debug_WM_EXPOSE__ | __debug_WM_ALL__), (">>> __WM_NOGEXPOSE -> noExpose\n"));
-#if 0
-		if (GetWindow_unmapping(hWnd)) {
-		    console_fprintf(stderr, "oops - __WM_NOGEXPOSE for unmapping\n");
-		}
-#endif
-		 (*nexpS.ilc_func)(self,
-				   @symbol(noExposeView:), nil, &nexpS,
-				   theView);
-		break;
+            DPRINTFIF((__debug_WM_ALL__) , ("message=%d 0x%x wparam=%"_lx_" hwnd=%"_lx_" arg1=%"_lx_")\n",
+                        ev->ev_message, ev->ev_message, (INT)(ev->ev_wParam), (INT)(ev->ev_hWnd), (INT)(ev->ev_arg1)));
+            case WM_WINDOWPOSCHANGED:
+                {
+                    RECT rct;
+
+                    x = ev->ev_x;
+                    y = ev->ev_y;
+                    w = ev->ev_w;
+                    h = ev->ev_h;
+
+                    DPRINTF((">>> WM_WINDOWPOSCHANGED -> configure %d/%d , %d/%d\n", x,y,w,h));
+
+                    (*conf.ilc_func)(self,
+                                     @symbol(configureX:y:width:height:view:),
+                                     nil, &conf,
+                                     __MKSMALLINT(x),
+                                     __MKSMALLINT(y),
+                                     __MKSMALLINT(w),
+                                     __MKSMALLINT(h),
+                                     theView);
+                }
+                break;
+
+            case WM_DROPFILES:
+                {
+                    HDROP hDrop = (HDROP) ev->ev_wParam;
+                    int   count = DragQueryFile( hDrop,0xffffffff,0,0 );
+
+                    DPRINTFIF((__debug_WM_DROPFILES__ | __debug_WM_ALL__) , ("count=%d hDrop=%x\n", count, hDrop));
+                    if (count > 0) {
+                        OBJ  dropHandle, files, position;
+                        char buf[MAXPATH];
+                        int  i;
+
+                        dropHandle = __MKOBJ(hDrop);
+                        __PROTECT__(dropHandle);
+                        files = __ARRAY_NEW_INT( count );
+                        __UNPROTECT__(dropHandle);
+
+                        for (i = 0;i < count;i++) {
+                            OBJ s;
+
+                            DragQueryFile(hDrop,i,buf,sizeof(buf));
+                            __PROTECT__(dropHandle);
+                            __PROTECT__(files);
+                            s = __MKSTRING(buf);
+                            __UNPROTECT__(files);
+                            __UNPROTECT__(dropHandle);
+                            __ArrayInstPtr(files)->a_element[i] = s; __STORE(files, s);
+                        }
+
+                        {
+                            POINT pos;
+
+                            DragQueryPoint(hDrop, &pos);
+
+                            __PROTECT__(dropHandle);
+                            __PROTECT__(files);
+                            position = __MKPOINT_INT(pos.x, pos.y);
+                            __UNPROTECT__(files);
+                            __UNPROTECT__(dropHandle);
+                        }
+
+                        (*dropFiles.ilc_func)
+                            ( self
+                              , @symbol(dropFiles:view:position:handle:)
+                              , nil, &dropFiles,
+                              files, theView, position, dropHandle
+                            );
+                    }
+                }
+                break;
+
+            case WM_SHOWWINDOW:
+                if (ev->ev_wParam == TRUE) {
+                    DPRINTF((">>> WM_SHOWWINDOW -> mappedView:\n"));
+                    arg = @symbol(unobscured);
+                    (*vis.ilc_func)(theView,
+                                    @symbol(visibilityChange:),
+                                    nil, &vis, arg);
+                    (*map.ilc_func)(self,
+                                    @symbol(mappedView:),
+                                    nil, &map, theView);
+                } else {
+                    DPRINTF((">>> WM_SHOWWINDOW -> unMappedView:\n"));
+#if 0
+                    arg = @symbol(fullyObscured);
+                    (*vis.ilc_func)(theView,
+                                    @symbol(visibilityChange:),
+                                    nil, &vis, arg);
+#endif
+                    (*unmap.ilc_func)(self,
+                                      @symbol(unmappedView:),
+                                      nil, &unmap, theView);
+                }
+                break;
+
+            case __WM_ICONIFIED:
+                if (ev->ev_wParam) {
+                    DPRINTF((">>> __WM_ICONIFIED -> unMappedView:\n"));
+#if 0
+                    arg = @symbol(fullyObscured);
+                    (*vis.ilc_func)(theView,
+                                    @symbol(visibilityChange:),
+                                    nil, &vis, arg);
+#endif
+                    (*unmap.ilc_func)(self,
+                                      @symbol(unmappedView:),
+                                      nil, &unmap, theView);
+                } else {
+                    DPRINTF((">>> __WM_DEICONIFIED -> mappedView:\n"));
+                    arg = @symbol(unobscured);
+                    (*vis.ilc_func)(theView,
+                                    @symbol(visibilityChange:),
+                                    nil, &vis, arg);
+                    (*map.ilc_func)(self,
+                                    @symbol(mappedView:),
+                                    nil, &map, theView);
+                }
+                break;
+
+            case WM_CLOSE:
+                DPRINTF((">>> WM_CLOSE -> terminateView:\n"));
+                (*termS.ilc_func)(self,
+                                  @symbol(terminateView:),
+                                  nil, &termS, theView);
+                break;
+
+            case WM_DESTROY:
+                DPRINTF((">>> WM_DESTROY -> destroyedView\n"));
+                (*destr.ilc_func)(self,
+                                  @symbol(destroyedView:),
+                                  nil, &destr, theView);
+                break;
+
+            case WM_ACTIVATE:
+
+                switch (LOWORD(ev->ev_wParam)) {
+                    case WA_INACTIVE:
+                        DPRINTF((">>> WM_ACTIVATE inactive h=%x\n", ev->ev_hWnd));
+                        (*act.ilc_func)(self,
+                                        @symbol(activate:view:),
+                                        nil, &act,
+                                        false, theView);
+                        break;
+
+                    case WA_ACTIVE:
+                    case WA_CLICKACTIVE:
+                        DPRINTF((">>> WM_ACTIVATE active h=%x\n", ev->ev_hWnd));
+                        (*act.ilc_func)(self,
+                                        @symbol(activate:view:),
+                                        nil, &act,
+                                        true, theView);
+                        break;
+
+                    default:
+                        break;
+                }
+                break;
+
+            case WM_MOUSEACTIVATE:
+                if (__debug_WM_MOUSEACTIVATE__ | __debug_WM_ALL__) {
+                    PRINTF((">>> WM_MOUSEACTIVATE h=%x -> focusInView:\n", ev->ev_hWnd));
+                }
+
+                (*focIn.ilc_func)(self,
+                                  @symbol(focusInView:),
+                                  nil, &focIn, theView);
+                break;
+
+            case WM_SETFOCUS:
+                DPRINTFIF(__debug_WM_FOCUS__ , (">>> WM_SETFOCUS h=%x -> focusInView:\n", ev->ev_hWnd));
+                (*focIn.ilc_func)(self,
+                                  @symbol(focusInView:),
+                                  nil, &focIn, theView);
+                break;
+
+            case WM_KILLFOCUS:
+                DPRINTFIF(__debug_WM_FOCUS__ , (">>> WM_KILLFOCUS h=%x -> focusOutOfView\n", ev->ev_hWnd));
+                (*focOut.ilc_func)(self,
+                                   @symbol(focusOutView:),
+                                   nil, &focOut, theView);
+                break;
+
+            case __WM_GEXPOSE:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                w = ev->ev_w;
+                h = ev->ev_h;
+                DPRINTF((">>> __WM_GEXPOSE -> gExpose %d/%d -> %d/%d\n", x, y, w, h));
+#if 0
+                if (GetWindow_unmapping(hWnd)) {
+                    console_fprintf(stderr, "oops - __WM_GEXPOSE for unmapping\n");
+                }
+#endif
+                (*gexpS.ilc_func)(self,
+                                  @symbol(graphicsExposeX:y:width:height:final:view:),
+                                  nil, &gexpS,
+                                  __MKSMALLINT(x),
+                                  __MKSMALLINT(y),
+                                  __MKSMALLINT(w),
+                                  __MKSMALLINT(h),
+                                  ev->ev_wParam ? true : false,
+                                  theView);
+                break;
+
+            case __WM_NOGEXPOSE:
+                DPRINTFIF((__debug_WM_EXPOSE__ | __debug_WM_ALL__), (">>> __WM_NOGEXPOSE -> noExpose\n"));
+#if 0
+                if (GetWindow_unmapping(hWnd)) {
+                    console_fprintf(stderr, "oops - __WM_NOGEXPOSE for unmapping\n");
+                }
+#endif
+                 (*nexpS.ilc_func)(self,
+                                   @symbol(noExposeView:), nil, &nexpS,
+                                   theView);
+                break;
 
 # ifdef LATE_GENERATE_EXPOSE
-	    case __WM_PAINT:
-		{
-		    PAINTSTRUCT ps;
-
-		    AQUIRE_DRAW_MUTEX
-		    __generateExposes(hWnd, NULL, WM_PAINT, 0);
-		    RELEASE_DRAW_MUTEX
+            case __WM_PAINT:
+                {
+                    PAINTSTRUCT ps;
+
+                    AQUIRE_DRAW_MUTEX
+                    __generateExposes(hWnd, NULL, WM_PAINT, 0);
+                    RELEASE_DRAW_MUTEX
 
 # if 0
-		    BeginPaint(hWnd, &ps);
-		    EndPaint(hWnd, &ps);
-# endif
-		}
-		break;
-# endif
-
-	    case WM_PAINT:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		w = ev->ev_w;
-		h = ev->ev_h;
-
-#if 0
-		if (GetWindow_unmapping(hWnd)) {
-		    console_fprintf(stderr, "oops - WM_PAINT for unmapping\n");
-		}
+                    BeginPaint(hWnd, &ps);
+                    EndPaint(hWnd, &ps);
+# endif
+                }
+                break;
+# endif
+
+            case WM_PAINT:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                w = ev->ev_w;
+                h = ev->ev_h;
+
+#if 0
+                if (GetWindow_unmapping(hWnd)) {
+                    console_fprintf(stderr, "oops - WM_PAINT for unmapping\n");
+                }
 #endif
 
 #ifndef PRE_21_NOV
-		__clearWindow(hWnd, x, y, w, h);
+                __clearWindow(hWnd, x, y, w, h);
 #else
 # if WM_PAINT_CLEAR_LATE
-		__clearWindow(hWnd, x, y, w, h);
+                __clearWindow(hWnd, x, y, w, h);
 # endif
 
 #endif
 
 #ifdef DEBUG_COLORIZE_WM_PAINT_RECTS2
-		{
-		    HDC hDC;
-		    HBRUSH hBrush;
-		    RECT rect;
-
-		    hBrush = CreateSolidBrush(BlackPixel);
-		    hDC = GetWindowDC(hWnd);
-		    SelectClipRgn(hDC, NULL);
-		    rect.left = x;
-		    rect.top = y;
-		    rect.right = x+w;
-		    rect.bottom = y+h;
-
-		    FillRect(hDC, &rect, hBrush);
-		    _DeleteBrush(hBrush, __LINE__);
-		    ReleaseDC(hWnd, hDC);
-		}
-#endif
-		if (__debug_WM_PAINT__ | __debug_WM_ALL__) {
-		    PRINTF((">>> WM_PAINT -> expose %d/%d -> %d/%d\n", x, y, w, h));
-		}
-		(*exp.ilc_func)(self,
-			 @symbol(exposeX:y:width:height:view:),
-			 nil, &exp,
-			 __MKSMALLINT(x),
-			 __MKSMALLINT(y),
-			 __MKSMALLINT(w),
-			 __MKSMALLINT(h),
-			 theView);
-		break;
-
-	    case WM_LBUTTONDBLCLK:
-		isDoubleClick = 1;
-		butt = __MKSMALLINT(Button1);
-		goto commonButton;
-
-	    case WM_LBUTTONUP:
-		isDown = 0;
-		butt = __MKSMALLINT(Button1);
-		goto commonButton;
-
-	    case WM_LBUTTONDOWN:
-		butt = __MKSMALLINT(Button1);
-		goto commonButton;
-
-	    case WM_MBUTTONDBLCLK:
-		isDoubleClick = 1;
-		butt = __MKSMALLINT(Button2);
-		goto commonButton;
-
-	    case WM_MBUTTONUP:
-		isDown = 0;
-		butt = __MKSMALLINT(Button2);
-		goto commonButton;
-
-	    case WM_MBUTTONDOWN:
-		butt = __MKSMALLINT(Button2);
-		goto commonButton;
-
-	    case WM_RBUTTONDBLCLK:
-		isDoubleClick = 1;
-		butt = __MKSMALLINT(Button3);
-		goto commonButton;
-
-	    case WM_RBUTTONUP:
-		isDown = 0;
-		butt = __MKSMALLINT(Button3);
-		goto commonButton;
-
-	    case WM_RBUTTONDOWN:
-		butt = __MKSMALLINT(Button3);
-		goto commonButton;
-
-	    commonButton:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		modifiers = ev->ev_modifiers;
-
-		if (__INST(buttonTranslation) != nil) {
-		    butt = __AT_(__INST(buttonTranslation), butt);
-		}
-		arg = butt;
-
-		__INST(altDown) = (modifiers & AltMask) ? true : false;
-		__INST(metaDown) = (modifiers & MetaMask) ? true : false;
-		__INST(shiftDown) = (modifiers & ShiftMask) ? true : false;
-		__INST(ctrlDown) = (modifiers & ControlMask) ? true : false;
-
-		if (deltaDoubleClickX == -999) {
-		    deltaDoubleClickX = GetSystemMetrics(SM_CXDOUBLECLK);
-		    deltaDoubleClickY = GetSystemMetrics(SM_CYDOUBLECLK);
-		}
-
-		if (isDoubleClick) {
-		    multiClickCount = 2;
-		    ipS = &bmp;
-		    symS = @symbol(buttonMultiPress:x:y:view:);
-		    nextMultiClickTime = ev->ev_time + __intVal(__INST(multiClickTimeDelta));
-		} else {
-		    if (isDown) {
-			if (multiClickCount
-			 && (ev->ev_time < nextMultiClickTime)
-			 && (butt == lastButton)
-			 && (x >= (lastClickX - (deltaDoubleClickX / 2)))
-			 && (x <= (lastClickX + (deltaDoubleClickX / 2)))
-			 && (y >= (lastClickY - (deltaDoubleClickY / 2)))
-			 && (y <= (lastClickY + (deltaDoubleClickY / 2)))
-			) {
-			    ipS = &bmp;
-			    symS = @symbol(buttonMultiPress:x:y:view:);
-			} else {
-			    ipS = &bp;
-			    symS = @symbol(buttonPress:x:y:view:);
-			    multiClickCount = 0;
-			}
-			multiClickCount = multiClickCount + 1;
-			nextMultiClickTime = ev->ev_time + __intVal(__INST(multiClickTimeDelta));
-		    } else {
-			ipS = &br;
-			symS = @symbol(buttonRelease:x:y:view:);
-		    }
-		}
-
-		if (isDown || isDoubleClick) {
-		    lastClickX = x;
-		    lastClickY = y;
-		    lastButton = butt;
-		}
-
-		if (__debug_WM_BUTTONUP__ | __debug_WM_BUTTONDOWN__ | __debug_WM_ALL__) {
-		    if (__isSymbol(arg)) {
-			PRINTF(("buttonPress/buttonRelease: %s %d/%d\n",
-				    __stringVal(arg), x, y));
-		    } else {
-			PRINTF(("buttonPress/buttonRelease: %d %d/%d\n",
-				    __intVal(arg), x, y));
-		    }
-		}
-
-		(*(*ipS).ilc_func)(self, symS, nil, ipS,
-				   arg,
-				   __MKSMALLINT(x),
-				   __MKSMALLINT(y),
-				   theView);
-		break;
-
-	    case __WM_MOUSEENTER:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		state = ev->ev_modifiers;
-
-		if (__debug_WM_MOUSEENTER__ | __debug_WM_ALL__) {
-		    PRINTF((">>> WM_MOUSEENTER: %x %d/%d state:%x\n", ev->ev_hWnd, x, y, state));
-		}
-#if 0
-		if (GetWindow_unmapping(hWnd)) {
-		    console_fprintf(stderr, "oops - WM_MOUSEENTER for unmapping\n");
-		}
-#endif
-		(*pe.ilc_func)(self, @symbol(pointerEnter:x:y:view:),
-				    nil, &pe,
-				    __MKSMALLINT(state),
-				    __MKSMALLINT(x),
-				    __MKSMALLINT(y),
-				    theView);
-		break;
-
-	    case __WM_MOUSELEAVE:
-		state = ev->ev_modifiers;
-		if (__debug_WM_MOUSELEAVE__ | __debug_WM_ALL__) {
-		    PRINTF((">>> WM_MOUSELEAVE: %x state:%x\n", ev->ev_hWnd, state));
-		}
-#if 0
-		if (GetWindow_unmapping(hWnd)) {
-		    console_fprintf(stderr, "oops - WM_MOUSELEAVE for unmapping\n");
-		}
-#endif
-		(*pl.ilc_func)(self, @symbol(pointerLeave:view:),
-				    nil, &pl,
-				    __MKSMALLINT(state),
-				    theView);
-		break;
-
-	    case WM_MOUSEMOVE:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		state = ev->ev_modifiers;
-		if (__debug_WM_MOUSEMOVE__ | __debug_WM_ALL__) {
-		    PRINTF((">>> WM_MOUSEMOVE: %d/%d %x\n", x, y, state));
-		}
-		(*mot.ilc_func)(self, @symbol(buttonMotion:x:y:view:),
-				    nil, &mot,
-				    __MKSMALLINT(state),
-				    __MKSMALLINT(x),
-				    __MKSMALLINT(y),
-				    theView);
-		break;
+                {
+                    HDC hDC;
+                    HBRUSH hBrush;
+                    RECT rect;
+
+                    hBrush = CreateSolidBrush(BlackPixel);
+                    hDC = GetWindowDC(hWnd);
+                    SelectClipRgn(hDC, NULL);
+                    rect.left = x;
+                    rect.top = y;
+                    rect.right = x+w;
+                    rect.bottom = y+h;
+
+                    FillRect(hDC, &rect, hBrush);
+                    _DeleteBrush(hBrush, __LINE__);
+                    ReleaseDC(hWnd, hDC);
+                }
+#endif
+                if (__debug_WM_PAINT__ | __debug_WM_ALL__) {
+                    PRINTF((">>> WM_PAINT -> expose %d/%d -> %d/%d\n", x, y, w, h));
+                }
+                (*exp.ilc_func)(self,
+                         @symbol(exposeX:y:width:height:view:),
+                         nil, &exp,
+                         __MKSMALLINT(x),
+                         __MKSMALLINT(y),
+                         __MKSMALLINT(w),
+                         __MKSMALLINT(h),
+                         theView);
+                break;
+
+            case WM_LBUTTONDBLCLK:
+                isDoubleClick = 1;
+                butt = __MKSMALLINT(Button1);
+                goto commonButton;
+
+            case WM_LBUTTONUP:
+                isDown = 0;
+                butt = __MKSMALLINT(Button1);
+                goto commonButton;
+
+            case WM_LBUTTONDOWN:
+                butt = __MKSMALLINT(Button1);
+                goto commonButton;
+
+            case WM_MBUTTONDBLCLK:
+                isDoubleClick = 1;
+                butt = __MKSMALLINT(Button2);
+                goto commonButton;
+
+            case WM_MBUTTONUP:
+                isDown = 0;
+                butt = __MKSMALLINT(Button2);
+                goto commonButton;
+
+            case WM_MBUTTONDOWN:
+                butt = __MKSMALLINT(Button2);
+                goto commonButton;
+
+            case WM_RBUTTONDBLCLK:
+                isDoubleClick = 1;
+                butt = __MKSMALLINT(Button3);
+                goto commonButton;
+
+            case WM_RBUTTONUP:
+                isDown = 0;
+                butt = __MKSMALLINT(Button3);
+                goto commonButton;
+
+            case WM_RBUTTONDOWN:
+                butt = __MKSMALLINT(Button3);
+                goto commonButton;
+
+            commonButton:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                modifiers = ev->ev_modifiers;
+
+                if (__INST(buttonTranslation) != nil) {
+                    butt = __AT_(__INST(buttonTranslation), butt);
+                }
+                arg = butt;
+
+                __INST(altDown) = (modifiers & AltMask) ? true : false;
+                __INST(metaDown) = (modifiers & MetaMask) ? true : false;
+                __INST(shiftDown) = (modifiers & ShiftMask) ? true : false;
+                __INST(ctrlDown) = (modifiers & ControlMask) ? true : false;
+
+                if (deltaDoubleClickX == -999) {
+                    deltaDoubleClickX = GetSystemMetrics(SM_CXDOUBLECLK);
+                    deltaDoubleClickY = GetSystemMetrics(SM_CYDOUBLECLK);
+                }
+
+                if (isDoubleClick) {
+                    multiClickCount = 2;
+                    ipS = &bmp;
+                    symS = @symbol(buttonMultiPress:x:y:view:);
+                    nextMultiClickTime = ev->ev_time + __intVal(__INST(multiClickTimeDelta));
+                } else {
+                    if (isDown) {
+                        if (multiClickCount
+                         && (ev->ev_time < nextMultiClickTime)
+                         && (butt == lastButton)
+                         && (x >= (lastClickX - (deltaDoubleClickX / 2)))
+                         && (x <= (lastClickX + (deltaDoubleClickX / 2)))
+                         && (y >= (lastClickY - (deltaDoubleClickY / 2)))
+                         && (y <= (lastClickY + (deltaDoubleClickY / 2)))
+                        ) {
+                            ipS = &bmp;
+                            symS = @symbol(buttonMultiPress:x:y:view:);
+                        } else {
+                            ipS = &bp;
+                            symS = @symbol(buttonPress:x:y:view:);
+                            multiClickCount = 0;
+                        }
+                        multiClickCount = multiClickCount + 1;
+                        nextMultiClickTime = ev->ev_time + __intVal(__INST(multiClickTimeDelta));
+                    } else {
+                        ipS = &br;
+                        symS = @symbol(buttonRelease:x:y:view:);
+                    }
+                }
+
+                if (isDown || isDoubleClick) {
+                    lastClickX = x;
+                    lastClickY = y;
+                    lastButton = butt;
+                }
+
+                if (__debug_WM_BUTTONUP__ | __debug_WM_BUTTONDOWN__ | __debug_WM_ALL__) {
+                    if (__isSymbol(arg)) {
+                        PRINTF(("buttonPress/buttonRelease: %s %d/%d\n",
+                                    __stringVal(arg), x, y));
+                    } else {
+                        PRINTF(("buttonPress/buttonRelease: %d %d/%d\n",
+                                    __intVal(arg), x, y));
+                    }
+                }
+
+                (*(*ipS).ilc_func)(self, symS, nil, ipS,
+                                   arg,
+                                   __MKSMALLINT(x),
+                                   __MKSMALLINT(y),
+                                   theView);
+                break;
+
+            case __WM_MOUSEENTER:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                state = ev->ev_modifiers;
+
+                if (__debug_WM_MOUSEENTER__ | __debug_WM_ALL__) {
+                    PRINTF((">>> WM_MOUSEENTER: %x %d/%d state:%x\n", ev->ev_hWnd, x, y, state));
+                }
+#if 0
+                if (GetWindow_unmapping(hWnd)) {
+                    console_fprintf(stderr, "oops - WM_MOUSEENTER for unmapping\n");
+                }
+#endif
+                (*pe.ilc_func)(self, @symbol(pointerEnter:x:y:view:),
+                                    nil, &pe,
+                                    __MKSMALLINT(state),
+                                    __MKSMALLINT(x),
+                                    __MKSMALLINT(y),
+                                    theView);
+                break;
+
+            case __WM_MOUSELEAVE:
+                state = ev->ev_modifiers;
+                if (__debug_WM_MOUSELEAVE__ | __debug_WM_ALL__) {
+                    PRINTF((">>> WM_MOUSELEAVE: %x state:%x\n", ev->ev_hWnd, state));
+                }
+#if 0
+                if (GetWindow_unmapping(hWnd)) {
+                    console_fprintf(stderr, "oops - WM_MOUSELEAVE for unmapping\n");
+                }
+#endif
+                (*pl.ilc_func)(self, @symbol(pointerLeave:view:),
+                                    nil, &pl,
+                                    __MKSMALLINT(state),
+                                    theView);
+                break;
+
+            case WM_MOUSEMOVE:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                state = ev->ev_modifiers;
+                if (__debug_WM_MOUSEMOVE__ | __debug_WM_ALL__) {
+                    PRINTF((">>> WM_MOUSEMOVE: %d/%d %x\n", x, y, state));
+                }
+                (*mot.ilc_func)(self, @symbol(buttonMotion:x:y:view:),
+                                    nil, &mot,
+                                    __MKSMALLINT(state),
+                                    __MKSMALLINT(x),
+                                    __MKSMALLINT(y),
+                                    theView);
+                break;
 
 #ifdef WM_MOUSEWHEEL
-	    case WM_MOUSEWHEEL:
-		x = ev->ev_x;
-		y = ev->ev_y;
-		state = ev->ev_modifiers;
-		dir = GET_WHEEL_DELTA_WPARAM(ev->ev_wParam);
-		// dir = ev->ev_wParam & 0xFFFF;
-		DPRINTF((">>> WM_MOUSEWHEEL: %d %x\n", dir, state));
-		{
-		    OBJ tim;
-
-		    __PROTECT__(theView);
-		    tim = __MKUINT(ev->ev_time);
-		    __UNPROTECT__(theView);
-		    (*mwh.ilc_func)(self, @symbol(mouseWheelMotion:x:y:amount:deltaTime:view:),
-				    nil, &mwh,
-				    __MKSMALLINT(state),
-				    __MKSMALLINT(x),
-				    __MKSMALLINT(y),
-				    __MKSMALLINT(dir),
-				    tim,
-				    theView);
-		}
-		break;
-#endif
-
-	    case WM_CHAR:
-		DPRINTFIF((__debug_WM_CHAR__ | __debug_WM_ALL__)  , ("WM_CHAR %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
-		DPRINTF((">>> WM_CHAR: %d/%d\n", x, y));
-		symS = @symbol(keyPress:x:y:view:);
-		ipS = &skp;
-		upDown = true;
-		goto keyPressAndRelease;
-
-	    case WM_HOTKEY:
-		{
-		(*hkp.ilc_func)(self, @symbol(hotkeyWithId:key:view:),
-				    nil, &hkp,
-				    __MKSMALLINT(ev->ev_wParam),
-				    __MKSMALLINT(ev->ev_arg1),
-				    theView);
-		}
-		break;
-
-	    case WM_SYSKEYUP:
-	    case WM_KEYUP:
-		DPRINTFIF((__debug_WM_KEYUP__ | __debug_WM_ALL__)  , (">>> WM_KEYUP / SYSKEYUP: %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
-		symS = @symbol(keyRelease:x:y:view:);
-		ipS = &skr;
-		upDown = false;
-		goto keyPressAndRelease;
-
-	    case WM_SYSKEYDOWN:
-	    case WM_KEYDOWN:
-		DPRINTFIF((__debug_WM_KEYUP__ | __debug_WM_ALL__)  , (">>> WM_KEYDOWN / SYSKEYDOWN: %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
-		symS = @symbol(keyPress:x:y:view:);
-		ipS = &skp;
-		upDown = true;
-		/* FALL INTO */
-
-	    keyPressAndRelease: ;
-
-		x = ev->ev_x;
-		y = ev->ev_y;
+            case WM_MOUSEWHEEL:
+                x = ev->ev_x;
+                y = ev->ev_y;
+                state = ev->ev_modifiers;
+                dir = GET_WHEEL_DELTA_WPARAM(ev->ev_wParam);
+                // dir = ev->ev_wParam & 0xFFFF;
+                DPRINTF((">>> WM_MOUSEWHEEL: %d %x\n", dir, state));
+                {
+                    OBJ tim;
+
+                    __PROTECT__(theView);
+                    tim = __MKUINT(ev->ev_time);
+                    __UNPROTECT__(theView);
+                    (*mwh.ilc_func)(self, @symbol(mouseWheelMotion:x:y:amount:deltaTime:view:),
+                                    nil, &mwh,
+                                    __MKSMALLINT(state),
+                                    __MKSMALLINT(x),
+                                    __MKSMALLINT(y),
+                                    __MKSMALLINT(dir),
+                                    tim,
+                                    theView);
+                }
+                break;
+#endif
+
+            case WM_CHAR:
+                DPRINTFIF((__debug_WM_CHAR__ | __debug_WM_ALL__)  , ("WM_CHAR %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
+                DPRINTF((">>> WM_CHAR: %d/%d\n", x, y));
+                symS = @symbol(keyPress:x:y:view:);
+                ipS = &skp;
+                upDown = true;
+                goto keyPressAndRelease;
+
+            case WM_HOTKEY:
+                {
+                (*hkp.ilc_func)(self, @symbol(hotkeyWithId:key:view:),
+                                    nil, &hkp,
+                                    __MKSMALLINT(ev->ev_wParam),
+                                    __MKSMALLINT(ev->ev_arg1),
+                                    theView);
+                }
+                break;
+
+            case WM_SYSKEYUP:
+            case WM_KEYUP:
+                DPRINTFIF((__debug_WM_KEYUP__ | __debug_WM_ALL__)  , (">>> WM_KEYUP / SYSKEYUP: %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
+                symS = @symbol(keyRelease:x:y:view:);
+                ipS = &skr;
+                upDown = false;
+                goto keyPressAndRelease;
+
+            case WM_SYSKEYDOWN:
+            case WM_KEYDOWN:
+                DPRINTFIF((__debug_WM_KEYUP__ | __debug_WM_ALL__)  , (">>> WM_KEYDOWN / SYSKEYDOWN: %x %d/%d\n", ev->ev_keyCode, ev->ev_x, ev->ev_y));
+                symS = @symbol(keyPress:x:y:view:);
+                ipS = &skp;
+                upDown = true;
+                /* FALL INTO */
+
+            keyPressAndRelease: ;
+
+                x = ev->ev_x;
+                y = ev->ev_y;
 
 #ifdef NOTDEF
-		{
-		    BYTE vKeyState[256];
-		    char buff[5];
-
-		    GetKeyboardState(vKeyState);
-		    ToAscii(ev->ev_keyCode, ev->ev_scanCode, vKeyState, &buff; 0);
-		}
-#endif
-
-		keyCode = ev->ev_keyCode;
-		modifiers = ev->ev_modifiers;
-
-		if (modifiers & TRANSLATED_KEY) {
+                {
+                    BYTE vKeyState[256];
+                    char buff[5];
+
+                    GetKeyboardState(vKeyState);
+                    ToAscii(ev->ev_keyCode, ev->ev_scanCode, vKeyState, &buff; 0);
+                }
+#endif
+
+                keyCode = ev->ev_keyCode;
+                modifiers = ev->ev_modifiers;
+
+                if (modifiers & TRANSLATED_KEY) {
 #if 1
-		    if (modifiers & ControlMask) {
-			if (keyCode < 0x20) {
-			    keyCode = keyCode + 'a' - 1;
-			    if (modifiers & ShiftMask) {
-				keyCode = keyCode - 'a' + 'A';
-			    }
-			}
-		    } else if (modifiers & (MetaMask | AltMask)) {
-			if (! (modifiers & ShiftMask)) {
-			    if ((keyCode >= 'A') && (keyCode <= 'Z')) {
-				keyCode = keyCode - 'A' + 'a';
-			    }
-			}
-		    }
-#endif
-		    arg = __MKSMALLINT(keyCode & 0xFFFF);
-		} else {
-		    switch (keyCode) {
-			case VK_F1:
-			    arg = @symbol(F1);
-			    break;
-			case VK_F2:
-			    arg = @symbol(F2);
-			    break;
-			case VK_F3:
-			    arg = @symbol(F3);
-			    break;
-			case VK_F4:
-			    arg = @symbol(F4);
-			    break;
-			case VK_F5:
-			    arg = @symbol(F5);
-			    break;
-			case VK_F6:
-			    arg = @symbol(F6);
-			    break;
-			case VK_F7:
-			    arg = @symbol(F7);
-			    break;
-			case VK_F8:
-			    arg = @symbol(F8);
-			    break;
-			case VK_F9:
-			    arg = @symbol(F9);
-			    break;
-			case VK_F10:
-			    arg = @symbol(F10);
-			    break;
-			case VK_F11:
-			    arg = @symbol(F11);
-			    break;
-			case VK_F12:
-			    arg = @symbol(F12);
-			    break;
-			case VK_PRIOR:
-			    arg = @symbol(Prior);
-			    break;
-			case VK_NEXT:
-			    arg = @symbol(Next);
-			    break;
-			case VK_END:
-			    arg = @symbol(End);
-			    break;
-			case VK_HOME:
-			    arg = @symbol(Home);
-			    break;
-			case VK_LEFT:
-			    arg = @symbol(CursorLeft);
-			    break;
-			case VK_RIGHT:
-			    arg = @symbol(CursorRight);
-			    break;
-			case VK_UP:
-			    arg = @symbol(CursorUp);
-			    break;
-			case VK_DOWN:
-			    arg = @symbol(CursorDown);
-			    break;
-			case VK_MENU:  /*alt key with w95 ???*/
-			    arg = @symbol(Menu);
-			    break;
-			case VK_LMENU:
-			    arg = @symbol(Menu_L);
-			    break;
-			case VK_RMENU:
-			    arg = @symbol(Menu_R);
-			    break;
-			case VK_PAUSE:
-			    arg = @symbol(Pause);
-			    break;
-			case VK_HELP:
-			    arg = @symbol(Help);
-			    break;
-			case VK_EXECUTE:
-			    arg = @symbol(Execute);
-			    break;
-			case VK_CANCEL:
-			    arg = @symbol(Cancel);
-			    break;
-			case VK_SELECT:
-			    arg = @symbol(Select);
-			    break;
-			case VK_PRINT:
-			    arg = @symbol(Print);
-			    break;
-			case VK_SNAPSHOT:
-			    arg = @symbol(Snapshot);
-			    break;
-			case VK_INSERT:
-			    arg = @symbol(Insert);
-			    break;
-			case VK_DELETE:
-			    arg = @symbol(Delete);
-			    break;
-			case VK_BACK:
-			    arg = @symbol(BackSpace);
-			    break;
-			case VK_LWIN:
-			    arg = @symbol(Win_L);
-			    break;
-			case VK_RWIN:
-			    arg = @symbol(Win_R);
-			    break;
-			case VK_APPS:
-			    arg = @symbol(Appl);
-			    break;
-			case VK_NUMPAD0:
-			    arg = @symbol(KeyPad0);
-			    break;
-			case VK_NUMPAD1:
-			    arg = @symbol(KeyPad1);
-			    break;
-			case VK_NUMPAD2:
-			    arg = @symbol(KeyPad2);
-			    break;
-			case VK_NUMPAD3:
-			    arg = @symbol(KeyPad3);
-			    break;
-			case VK_NUMPAD4:
-			    arg = @symbol(KeyPad4);
-			    break;
-			case VK_NUMPAD5:
-			    arg = @symbol(KeyPad5);
-			    break;
-			case VK_NUMPAD6:
-			    arg = @symbol(KeyPad6);
-			    break;
-			case VK_NUMPAD7:
-			    arg = @symbol(KeyPad7);
-			    break;
-			case VK_NUMPAD8:
-			    arg = @symbol(KeyPad8);
-			    break;
-			case VK_NUMPAD9:
-			    arg = @symbol(KeyPad9);
-			    break;
-			case VK_LSHIFT:
-			    arg = @symbol(Shift_L);
-			    break;
-			case VK_RSHIFT:
-			    arg = @symbol(Shift_R);
-			    break;
-			case VK_LCONTROL:
-			    arg = @symbol(Ctrl_L);
-			    break;
-			case VK_RCONTROL:
-			    arg = @symbol(Ctrl_R);
-			    break;
-			case VK_CONTROL:
-			    arg = @symbol(Ctrl);
-			    break;
-			case VK_SHIFT:
-			    arg = @symbol(Shift);
-			    break;
-			case VK_TAB:
-			    arg = @symbol(Tab);
-			    break;
-			case VK_ESCAPE:
-			    arg = @symbol(Escape);
-			    break;
-			case VK_NUMLOCK:
-			    arg = @symbol(NumLock);
-			    break;
-			case VK_SCROLL:
-			    arg = @symbol(ScrollLock);
-			    break;
-			case VK_RETURN:
-			    arg = @symbol(Return);
-			    break;
-
-			default:
-#if 0
-			    nameBuffer[0] = 0;
-			    GetKeyNameText(ev->ev_scanCode, nameBuffer, sizeof(nameBuffer));
-			    if (__debug_WM_KEYUP__ | __debug_WM_KEYDOWN__ | __debug_WM_CHAR__ | __debug_WM_ALL__) {
-				PRINTF(("char is <%d>\n", keyCode));
-			    }
-#endif
-			    arg = __MKSMALLINT(keyCode & 0xFFFF);
-			    break;
-		    }
-		}
-		__INST(altDown) = (modifiers & AltMask) ? true : false;
-		__INST(metaDown) = (modifiers & MetaMask) ? true : false;
-		__INST(shiftDown) = (modifiers & ShiftMask) ? true : false;
-		__INST(ctrlDown) = (modifiers & ControlMask) ? true : false;
-
-		if (__debug_WM_CHAR__ | __debug_WM_KEYUP__ | __debug_WM_KEYDOWN__ | __debug_WM_ALL__) {
-		    PRINTF(("%s: code=%x mod=%x ", __stringVal(symS), keyCode, modifiers));
-		    PRINTF((" alt=%d meta=%d ", __INST(altDown) == true , __INST(metaDown) == true));
-		    PRINTF((" sh=%d ctrl=%d", __INST(shiftDown) == true , __INST(ctrlDown) == true));
-		    PRINTF((" arg=%x\n", arg));
-		}
-
-		(*(*ipS).ilc_func)(self, symS, nil, ipS,
-				   arg,
-				   __MKSMALLINT(x),
-				   __MKSMALLINT(y),
-				   theView);
-		break;
-
-	   case WM_SYSCOLORCHANGE:
-		DPRINTF((">>> WM_SYSCOLORCHANGE\n"));
-		(*sysClrChg.ilc_func)(self, @symbol(systemColorChange:), nil, &sysClrChg, theView);
-		break;
-
-	   case WM_FONTCHANGE:
-		DPRINTF((">>> WM_FONTCHANGE\n"));
-		(*fontChg.ilc_func)(self, @symbol(fontChange), nil, &fontChg);
-		break;
-
-	   case WM_WININICHANGE:
-		DPRINTF((">>> WM_WININICHANGE\n"));
-		(*settingChg.ilc_func)(self, @symbol(settingsChange), nil, &settingChg);
-		break;
-
-	   case WM_DISPLAYCHANGE:
-		DPRINTF((">>> WM_DISPLAYCHANGE\n"));
-		(*fontChg.ilc_func)(self, @symbol(displayChange), nil, &fontChg);
-		break;
-
-	   case WM_QUERYENDSESSION:
-		DPRINTF((">>> WM_QUERYENDSESSION\n"));
-		(*qEndSess.ilc_func)(self, @symbol(queryEndSession), nil, &qEndSess);
-		break;
+                    if (modifiers & ControlMask) {
+                        if (keyCode < 0x20) {
+                            keyCode = keyCode + 'a' - 1;
+                            if (modifiers & ShiftMask) {
+                                keyCode = keyCode - 'a' + 'A';
+                            }
+                        }
+                    } else if (modifiers & (MetaMask | AltMask)) {
+                        if (! (modifiers & ShiftMask)) {
+                            if ((keyCode >= 'A') && (keyCode <= 'Z')) {
+                                keyCode = keyCode - 'A' + 'a';
+                            }
+                        }
+                    }
+#endif
+                    arg = __MKSMALLINT(keyCode & 0xFFFF);
+                } else {
+                    switch (keyCode) {
+                        case VK_F1:
+                            arg = @symbol(F1);
+                            break;
+                        case VK_F2:
+                            arg = @symbol(F2);
+                            break;
+                        case VK_F3:
+                            arg = @symbol(F3);
+                            break;
+                        case VK_F4:
+                            arg = @symbol(F4);
+                            break;
+                        case VK_F5:
+                            arg = @symbol(F5);
+                            break;
+                        case VK_F6:
+                            arg = @symbol(F6);
+                            break;
+                        case VK_F7:
+                            arg = @symbol(F7);
+                            break;
+                        case VK_F8:
+                            arg = @symbol(F8);
+                            break;
+                        case VK_F9:
+                            arg = @symbol(F9);
+                            break;
+                        case VK_F10:
+                            arg = @symbol(F10);
+                            break;
+                        case VK_F11:
+                            arg = @symbol(F11);
+                            break;
+                        case VK_F12:
+                            arg = @symbol(F12);
+                            break;
+                        case VK_PRIOR:
+                            arg = @symbol(Prior);
+                            break;
+                        case VK_NEXT:
+                            arg = @symbol(Next);
+                            break;
+                        case VK_END:
+                            arg = @symbol(End);
+                            break;
+                        case VK_HOME:
+                            arg = @symbol(Home);
+                            break;
+                        case VK_LEFT:
+                            arg = @symbol(CursorLeft);
+                            break;
+                        case VK_RIGHT:
+                            arg = @symbol(CursorRight);
+                            break;
+                        case VK_UP:
+                            arg = @symbol(CursorUp);
+                            break;
+                        case VK_DOWN:
+                            arg = @symbol(CursorDown);
+                            break;
+                        case VK_MENU:  /*alt key with w95 ???*/
+                            arg = @symbol(Menu);
+                            break;
+                        case VK_LMENU:
+                            arg = @symbol(Menu_L);
+                            break;
+                        case VK_RMENU:
+                            arg = @symbol(Menu_R);
+                            break;
+                        case VK_PAUSE:
+                            arg = @symbol(Pause);
+                            break;
+                        case VK_HELP:
+                            arg = @symbol(Help);
+                            break;
+                        case VK_EXECUTE:
+                            arg = @symbol(Execute);
+                            break;
+                        case VK_CANCEL:
+                            arg = @symbol(Cancel);
+                            break;
+                        case VK_SELECT:
+                            arg = @symbol(Select);
+                            break;
+                        case VK_PRINT:
+                            arg = @symbol(Print);
+                            break;
+                        case VK_SNAPSHOT:
+                            arg = @symbol(Snapshot);
+                            break;
+                        case VK_INSERT:
+                            arg = @symbol(Insert);
+                            break;
+                        case VK_DELETE:
+                            arg = @symbol(Delete);
+                            break;
+                        case VK_BACK:
+                            arg = @symbol(BackSpace);
+                            break;
+                        case VK_LWIN:
+                            arg = @symbol(Win_L);
+                            break;
+                        case VK_RWIN:
+                            arg = @symbol(Win_R);
+                            break;
+                        case VK_APPS:
+                            arg = @symbol(Appl);
+                            break;
+                        case VK_NUMPAD0:
+                            arg = @symbol(KeyPad0);
+                            break;
+                        case VK_NUMPAD1:
+                            arg = @symbol(KeyPad1);
+                            break;
+                        case VK_NUMPAD2:
+                            arg = @symbol(KeyPad2);
+                            break;
+                        case VK_NUMPAD3:
+                            arg = @symbol(KeyPad3);
+                            break;
+                        case VK_NUMPAD4:
+                            arg = @symbol(KeyPad4);
+                            break;
+                        case VK_NUMPAD5:
+                            arg = @symbol(KeyPad5);
+                            break;
+                        case VK_NUMPAD6:
+                            arg = @symbol(KeyPad6);
+                            break;
+                        case VK_NUMPAD7:
+                            arg = @symbol(KeyPad7);
+                            break;
+                        case VK_NUMPAD8:
+                            arg = @symbol(KeyPad8);
+                            break;
+                        case VK_NUMPAD9:
+                            arg = @symbol(KeyPad9);
+                            break;
+                        case VK_LSHIFT:
+                            arg = @symbol(Shift_L);
+                            break;
+                        case VK_RSHIFT:
+                            arg = @symbol(Shift_R);
+                            break;
+                        case VK_LCONTROL:
+                            arg = @symbol(Ctrl_L);
+                            break;
+                        case VK_RCONTROL:
+                            arg = @symbol(Ctrl_R);
+                            break;
+                        case VK_CONTROL:
+                            arg = @symbol(Ctrl);
+                            break;
+                        case VK_SHIFT:
+                            arg = @symbol(Shift);
+                            break;
+                        case VK_TAB:
+                            arg = @symbol(Tab);
+                            break;
+                        case VK_ESCAPE:
+                            arg = @symbol(Escape);
+                            break;
+                        case VK_NUMLOCK:
+                            arg = @symbol(NumLock);
+                            break;
+                        case VK_SCROLL:
+                            arg = @symbol(ScrollLock);
+                            break;
+                        case VK_RETURN:
+                            arg = @symbol(Return);
+                            break;
+
+                        default:
+#if 0
+                            nameBuffer[0] = 0;
+                            GetKeyNameText(ev->ev_scanCode, nameBuffer, sizeof(nameBuffer));
+                            if (__debug_WM_KEYUP__ | __debug_WM_KEYDOWN__ | __debug_WM_CHAR__ | __debug_WM_ALL__) {
+                                PRINTF(("char is <%d>\n", keyCode));
+                            }
+#endif
+                            arg = __MKSMALLINT(keyCode & 0xFFFF);
+                            break;
+                    }
+                }
+                __INST(altDown) = (modifiers & AltMask) ? true : false;
+                __INST(metaDown) = (modifiers & MetaMask) ? true : false;
+                __INST(shiftDown) = (modifiers & ShiftMask) ? true : false;
+                __INST(ctrlDown) = (modifiers & ControlMask) ? true : false;
+
+                if (__debug_WM_CHAR__ | __debug_WM_KEYUP__ | __debug_WM_KEYDOWN__ | __debug_WM_ALL__) {
+                    PRINTF(("%s: code=%x mod=%x ", __stringVal(symS), keyCode, modifiers));
+                    PRINTF((" alt=%d meta=%d ", __INST(altDown) == true , __INST(metaDown) == true));
+                    PRINTF((" sh=%d ctrl=%d", __INST(shiftDown) == true , __INST(ctrlDown) == true));
+                    PRINTF((" arg=%x\n", arg));
+                }
+
+                (*(*ipS).ilc_func)(self, symS, nil, ipS,
+                                   arg,
+                                   __MKSMALLINT(x),
+                                   __MKSMALLINT(y),
+                                   theView);
+                break;
+
+           case WM_SYSCOLORCHANGE:
+                DPRINTF((">>> WM_SYSCOLORCHANGE\n"));
+                (*sysClrChg.ilc_func)(self, @symbol(systemColorChange:), nil, &sysClrChg, theView);
+                break;
+
+           case WM_FONTCHANGE:
+                DPRINTF((">>> WM_FONTCHANGE\n"));
+                (*fontChg.ilc_func)(self, @symbol(fontChange), nil, &fontChg);
+                break;
+
+           case WM_WININICHANGE:
+                DPRINTF((">>> WM_WININICHANGE\n"));
+                (*settingChg.ilc_func)(self, @symbol(settingsChange), nil, &settingChg);
+                break;
+
+           case WM_DISPLAYCHANGE:
+                DPRINTF((">>> WM_DISPLAYCHANGE\n"));
+                (*fontChg.ilc_func)(self, @symbol(displayChange), nil, &fontChg);
+                break;
+
+           case WM_QUERYENDSESSION:
+                DPRINTF((">>> WM_QUERYENDSESSION\n"));
+                (*qEndSess.ilc_func)(self, @symbol(queryEndSession), nil, &qEndSess);
+                break;
 
 #ifdef LATER
-	   case WM_POWER:
-		DPRINTF((">>> WM_POWER\n"));
-		(*power.ilc_func)(self, @symbol(powerDown), nil, &power);
-	       break;
-#endif
-	    /* native widget actions */
-	    case WM_COMMAND:
-		DPRINTF((">>> WM_COMMAND\n"));
-		(*command.ilc_func)(self, @symbol(nativeWidgetCommand:view:), nil, &command,
-				__MKSMALLINT(ev->ev_wParam), theView);
-	       break;
-
-	    /* tray action */
-	    case WM_TRAY_MESSAGE:
-		DPRINTF((">>> WM_TRAY_MESSAGE\n"));
-		(*trayMessage.ilc_func)(self, @symbol(trayAction:view:), nil, &trayMessage,
-				__MKSMALLINT(ev->ev_arg1), theView);
-		break;
-
-	    /* message from another process */
-	    case WM_COPYDATA:
-		DPRINTF((">>> WM_COPYDATA"));
-		{
-		    OBJ eventData;
-		    void *data = (void *)(ev->ev_arg1);
-		    DPRINTFIF((__debug_WM_COPYDATA__) , (">>> WM_COPYDATA %s (%d)\n", data, ev->ev_arg2));
-
-		    if (data) {
-			eventData = __MKBYTEARRAY(data, (int)ev->ev_arg2);
-			free(data);     // see winEventProcessing()
-		    } else {
-			eventData = nil;
-		    }
-		    (*copyData.ilc_func)(self, @symbol(copyDataEvent:eventData:view:), nil, &copyData,
-				__MKSMALLINT(ev->ev_wParam), eventData, theView);
-		}
-		break;
+           case WM_POWER:
+                DPRINTF((">>> WM_POWER\n"));
+                (*power.ilc_func)(self, @symbol(powerDown), nil, &power);
+               break;
+#endif
+            /* native widget actions */
+            case WM_COMMAND:
+                DPRINTF((">>> WM_COMMAND\n"));
+                (*command.ilc_func)(self, @symbol(nativeWidgetCommand:view:), nil, &command,
+                                __MKSMALLINT(ev->ev_wParam), theView);
+               break;
+
+            /* tray action */
+            case WM_TRAY_MESSAGE:
+                DPRINTF((">>> WM_TRAY_MESSAGE\n"));
+                (*trayMessage.ilc_func)(self, @symbol(trayAction:view:), nil, &trayMessage,
+                                __MKSMALLINT(ev->ev_arg1), theView);
+                break;
+
+            /* message from another process */
+            case WM_COPYDATA:
+                DPRINTF((">>> WM_COPYDATA"));
+                {
+                    OBJ eventData;
+                    void *data = (void *)(ev->ev_arg1);
+                    DPRINTFIF((__debug_WM_COPYDATA__) , (">>> WM_COPYDATA %s (%d)\n", data, ev->ev_arg2));
+
+                    if (data) {
+                        eventData = __MKBYTEARRAY(data, (int)ev->ev_arg2);
+                        free(data);     // see winEventProcessing()
+                    } else {
+                        eventData = nil;
+                    }
+                    (*copyData.ilc_func)(self, @symbol(copyDataEvent:eventData:view:), nil, &copyData,
+                                __MKSMALLINT(ev->ev_wParam), eventData, theView);
+                }
+                break;
 
 #ifdef LATER
-	    case WM_QUIT:
-		DPRINTF((">>> WM_QUIT_MESSAGE\n"));
-		(*quit.ilc_func)(self, @symbol(quitCommand:), nil, &quit);
-		break;
-#endif
-	    case WM_HSCROLL:
-	    case WM_VSCROLL:
-		{
-		    int scrollCode = 0;
-		    OBJ scrollCodeOrScrollCodeSymbol = nil, positionOrNil = nil;
-		    int pos = 0;
-
-		    scrollCode = LOWORD(ev->ev_wParam);
-		    scrollCodeOrScrollCodeSymbol = __MKSMALLINT(scrollCode);
-		    positionOrNil = nil;
-		    switch (scrollCode) {
-			case SB_BOTTOM:
-			    scrollCodeOrScrollCodeSymbol = @symbol(SB_BOTTOM);
-			    break;
-			case SB_TOP:
-			    scrollCodeOrScrollCodeSymbol = @symbol(SB_TOP);
-			    break;
-			case SB_ENDSCROLL:
-			    scrollCodeOrScrollCodeSymbol = @symbol(SB_ENDSCROLL);
-			    break;
-			case SB_LINEDOWN:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_LINERIGHT);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_LINEDOWN);
-			    }
-			    break;
-			case SB_LINEUP:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_LINELEFT);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_LINEUP);
-			    }
-			    break;
-			case SB_PAGEDOWN:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGERIGHT);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGEDOWN);
-			    }
-			    break;
-			case SB_PAGEUP:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGELEFT);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGEUP);
-			    }
-			    break;
-			case SB_THUMBPOSITION:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBPOSITIONHORIZONTAL);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBPOSITIONVERTICAL);
-			    }
-			    pos = HIWORD(ev->ev_wParam);
-			    positionOrNil = __MKSMALLINT(pos);
-			    break;
-			case SB_THUMBTRACK:
-			    if (ev->ev_message == WM_HSCROLL) {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBTRACKHORIZONTAL);
-			    } else {
-				scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBTRACKVERTICAL);
-			    }
-			    pos = HIWORD(ev->ev_wParam);
-			    positionOrNil = __MKSMALLINT(pos);
-			    break;
-			default:
-			    DPRINTF((">>> WM_SCROLL: unhandled scrollCode:%d %d\n", scrollCode));
-			    break;
-		    }
-		    NDPRINTF((">>> WM_SCROLL: %d %d\n", scrollCode, pos));
-
-		    (*win32NativeScroll.ilc_func)(self, @symbol(win32NativeScroll:position:view:),
-					nil, &win32NativeScroll,
-					scrollCodeOrScrollCodeSymbol,
-					positionOrNil,
-					theView);
-		}
-		break;
-
-	    case WM_DRAWITEM:
-		{
-		    NDPRINTF((">>> WM_DRAWITEM: wParam: %x\n", ev->ev_wParam));
-		    (*win32DrawItem.ilc_func)(self, @symbol(win32DrawItem:view:),
-					nil, &win32DrawItem,
-					__MKSMALLINT(ev->ev_wParam),
-					theView);
-		}
-		break;
-
-	    default:
-		UNHANDLED_EVENT_PRINTF(("WinWorkstat [info]: >>> unhandled event: %x\n", ev->ev_message));
-		break;
+            case WM_QUIT:
+                DPRINTF((">>> WM_QUIT_MESSAGE\n"));
+                (*quit.ilc_func)(self, @symbol(quitCommand:), nil, &quit);
+                break;
+#endif
+            case WM_HSCROLL:
+            case WM_VSCROLL:
+                {
+                    int scrollCode = 0;
+                    OBJ scrollCodeOrScrollCodeSymbol = nil, positionOrNil = nil;
+                    int pos = 0;
+
+                    scrollCode = LOWORD(ev->ev_wParam);
+                    scrollCodeOrScrollCodeSymbol = __MKSMALLINT(scrollCode);
+                    positionOrNil = nil;
+                    switch (scrollCode) {
+                        case SB_BOTTOM:
+                            scrollCodeOrScrollCodeSymbol = @symbol(SB_BOTTOM);
+                            break;
+                        case SB_TOP:
+                            scrollCodeOrScrollCodeSymbol = @symbol(SB_TOP);
+                            break;
+                        case SB_ENDSCROLL:
+                            scrollCodeOrScrollCodeSymbol = @symbol(SB_ENDSCROLL);
+                            break;
+                        case SB_LINEDOWN:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_LINERIGHT);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_LINEDOWN);
+                            }
+                            break;
+                        case SB_LINEUP:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_LINELEFT);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_LINEUP);
+                            }
+                            break;
+                        case SB_PAGEDOWN:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGERIGHT);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGEDOWN);
+                            }
+                            break;
+                        case SB_PAGEUP:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGELEFT);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_PAGEUP);
+                            }
+                            break;
+                        case SB_THUMBPOSITION:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBPOSITIONHORIZONTAL);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBPOSITIONVERTICAL);
+                            }
+                            pos = HIWORD(ev->ev_wParam);
+                            positionOrNil = __MKSMALLINT(pos);
+                            break;
+                        case SB_THUMBTRACK:
+                            if (ev->ev_message == WM_HSCROLL) {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBTRACKHORIZONTAL);
+                            } else {
+                                scrollCodeOrScrollCodeSymbol = @symbol(SB_THUMBTRACKVERTICAL);
+                            }
+                            pos = HIWORD(ev->ev_wParam);
+                            positionOrNil = __MKSMALLINT(pos);
+                            break;
+                        default:
+                            DPRINTF((">>> WM_SCROLL: unhandled scrollCode:%d %d\n", scrollCode));
+                            break;
+                    }
+                    NDPRINTF((">>> WM_SCROLL: %d %d\n", scrollCode, pos));
+
+                    (*win32NativeScroll.ilc_func)(self, @symbol(win32NativeScroll:position:view:),
+                                        nil, &win32NativeScroll,
+                                        scrollCodeOrScrollCodeSymbol,
+                                        positionOrNil,
+                                        theView);
+                }
+                break;
+
+            case WM_DRAWITEM:
+                {
+                    NDPRINTF((">>> WM_DRAWITEM: wParam: %x\n", ev->ev_wParam));
+                    (*win32DrawItem.ilc_func)(self, @symbol(win32DrawItem:view:),
+                                        nil, &win32DrawItem,
+                                        __MKSMALLINT(ev->ev_wParam),
+                                        theView);
+                }
+                break;
+
+            default:
+                UNHANDLED_EVENT_PRINTF(("WinWorkstat [info]: >>> unhandled event: %x\n", ev->ev_message));
+                break;
     }
 %}.
     ^ true
@@ -19134,7 +19125,7 @@
     }
 %}
     "
-     (StandardSystemView new label:'äöü') open
+     (StandardSystemView new label:'äöü') open
     "
 !