#BUGFIX by ab
authorab
Tue, 12 Jun 2018 17:24:05 +0200
changeset 8380 168a8aba6df3
parent 8379 ec75c3a5c562
child 8381 d3f8906eb993
#BUGFIX by ab class: WinWorkstation changed: #registerHotKeyForWindow:withId:modifiers:virtualKeyCode: #unregisterHotKeyForWindow:withId: Change back to post event. Otherwise notSameThread error is caused. But fix the problem with registration of multible hot keys. Change from static structure to dynamic allocated structures for each hot key. Allocated memory will (have to) be deleted in the event handler of the thread.
WinWorkstation.st
--- a/WinWorkstation.st	Tue Jun 12 16:26:49 2018 +0200
+++ b/WinWorkstation.st	Tue Jun 12 17:24:05 2018 +0200
@@ -12936,7 +12936,7 @@
     "Defines a system-wide hot key."
 
 %{  /* NOCONTEXT */
-    static registerHotKeyInfo rhki;
+    registerHotKeyInfo * rhki = NULL;
     HWND hWnd = NULL;
 
     if (__isExternalAddress(aDrawableId)) {
@@ -12949,21 +12949,18 @@
         RETURN (false);
     }
 
-    if (!RegisterHotKey(hWnd,__intVal(anId),__intVal(aModifier),__intVal(aVirtualKeyCode))){
-        console_fprintf(stderr, "WinWorkstation [error]: RegisterHotKey failed: err=%d\n", GetLastError() );
+    rhki = (registerHotKeyInfo *) malloc(sizeof(registerHotKeyInfo));
+
+    rhki->hwnd       = hWnd;
+    rhki->hotKeyId   = __intVal(anId);
+    rhki->modifier   = __intVal(aModifier);
+    rhki->virtualKey = __intVal(aVirtualKeyCode);
+
+    if (PostThreadMessage(_dispatchThreadId, WM_THREAD_REGISTERHOTKEY, 0, (INT)rhki) == FALSE) {
+        console_fprintf(stderr, "WinWorkstation [error]: oops - PostThreadMessage(%x) failed in registerHotKeyForWindow: err=%d\n",
+                                        _dispatchThreadId, GetLastError() );
         RETURN (false);
     }
-
-    //rhki.hwnd       = hWnd;
-    //rhki.hotKeyId   = __intVal(anId);
-    //rhki.modifier   = __intVal(aModifier);
-    //rhki.virtualKey = __intVal(aVirtualKeyCode);
-
-    //if (PostThreadMessage(_dispatchThreadId, WM_THREAD_REGISTERHOTKEY, 0, (INT)(&rhki)) == FALSE) {
-    //    console_fprintf(stderr, "WinWorkstation [error]: oops - PostThreadMessage(%x) failed in registerHotKeyForWindow: err=%d\n",
-    //                                    _dispatchThreadId, GetLastError() );
-    //    RETURN (false);
-    //}
 %}.
     ^ true
 !
@@ -12998,7 +12995,7 @@
     "Defines a system-wide hot key."
 
 %{  /* NOCONTEXT */
-    static registerHotKeyInfo rhki;
+    registerHotKeyInfo * rhki = NULL;
     HWND hWnd = NULL;
 
     if (__isExternalAddress(aDrawableId)) {
@@ -13011,20 +13008,18 @@
         RETURN (false);
     }
 
-    if (!UnregisterHotKey(hWnd,__intVal(anId))){
-        console_fprintf(stderr, "WinWorkstation [error]: UnegisterHotKey failed: err=%d\n", GetLastError() );
+    rhki = (registerHotKeyInfo *) malloc(sizeof(registerHotKeyInfo));
+
+    rhki->hwnd       = hWnd;
+    rhki->hotKeyId   = __intVal(anId);
+    rhki->modifier   = 0;
+    rhki->virtualKey = 0;
+
+    if (PostThreadMessage(_dispatchThreadId, WM_THREAD_UNREGISTERHOTKEY, 0, (INT)rhki) == FALSE) {
+        console_fprintf(stderr, "WinWorkstation [error]: oops - PostThreadMessage(%x) failed in unregisterHotKeyForWindow: err=%d\n",
+                                        _dispatchThreadId, GetLastError() );
         RETURN (false);
     }
-    //rhki.hwnd       = hWnd;
-    //rhki.hotKeyId   = __intVal(anId);
-    //rhki.modifier   = 0;
-    //rhki.virtualKey = 0;
-
-    //if (PostThreadMessage(_dispatchThreadId, WM_THREAD_UNREGISTERHOTKEY, 0, (INT)(&rhki)) == FALSE) {
-    //    console_fprintf(stderr, "WinWorkstation [error]: oops - PostThreadMessage(%x) failed in unregisterHotKeyForWindow: err=%d\n",
-    //                                    _dispatchThreadId, GetLastError() );
-    //    RETURN (false);
-    //}
 %}.
     ^ true
 ! !