public inbox for cygwin-xfree@sourceware.org
help / color / mirror / Atom feed
* Excess MotionNotify events to a minimized window in multiwindow mode
@ 2012-12-10 19:01 Heiko Bihr
  2012-12-17 18:38 ` Jon TURNEY
  0 siblings, 1 reply; 4+ messages in thread
From: Heiko Bihr @ 2012-12-10 19:01 UTC (permalink / raw)
  To: cygwin-xfree

[-- Attachment #1: Type: text/plain, Size: 1187 bytes --]

Hi,

I think, there is a problem with mouse polling in multiwindow mode
(XWin.exe :0 -multiwindow) in Cygwin/X 1.13.
If a window gets maximized and then minimized, it will receive motion
notify events, whenever the user moves the mouse cursor over the screen.

To reproduce the problem, please follow these steps:

1) start XWin.exe in -multiwindow mode
2) start xev
3) maximize xev window
4) minimize xev window
5) move mouse cursor around and watch xev output

You will see lots of MotionNotify events from all over the screen.
X.org does not show this behaviour and I think, Cygwin/X should not either.

The problem is caused by the WIN_POLLING_MOUSE_TIMER_ID, which doesn't
get stopped, when the user minimizes a window.

I made a small patch against Cygwin/X 1.13.0-1 which will stop the
WIN_POLLING_MOUSE_TIMER_ID, whenever the user minimizes a window. If the
user changes the window's size again, and the timer was stopped, it will
be started again.
The patch introduces a new flag in s_pScreenPriv to remember the state
of the timer.

Regards
Heiko Bihr

-- 
Dipl.-Inform. Heiko Bihr
Senior Consultant, Software Development
Business Unit Government
secunet Security Networks AG


[-- Attachment #2: cygwin-x-motion-notify.patch --]
[-- Type: text/plain, Size: 3023 bytes --]

diff -ur xserver-cygwin-1.13.0-1.orig/hw/xwin/win.h xserver-cygwin-1.13.0-1/hw/xwin/win.h
--- xserver-cygwin-1.13.0-1.orig/hw/xwin/win.h	2012-12-10 15:19:42.093750000 +0100
+++ xserver-cygwin-1.13.0-1/hw/xwin/win.h	2012-12-10 15:27:40.031250000 +0100
@@ -595,6 +595,9 @@
     UnrealizeFontPtr UnrealizeFont;
 #endif
 
+    /* mouse polling */
+    BOOL bMousePollingTimerStoppedWhileMinimized;
+
 } winPrivScreenRec;
 
 #ifdef XWIN_MULTIWINDOWEXTWM
diff -ur xserver-cygwin-1.13.0-1.orig/hw/xwin/winmultiwindowwndproc.c xserver-cygwin-1.13.0-1/hw/xwin/winmultiwindowwndproc.c
--- xserver-cygwin-1.13.0-1.orig/hw/xwin/winmultiwindowwndproc.c	2012-12-10 15:19:42.140625000 +0100
+++ xserver-cygwin-1.13.0-1/hw/xwin/winmultiwindowwndproc.c	2012-12-10 15:26:50.359375000 +0100
@@ -415,6 +415,22 @@
 
         SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) XMING_SIGNATURE);
 
+        /*
+         * Initialize variables for mouse polling in s_pScreenPriv.
+         * Need to initialize s_pSreenPriv first, as WIN_WINDOW_PROP
+         * was read before we set it in WM_CREATE 
+         */
+        if ((pWin = GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
+          {
+            /* Get a pointer to our window privates */
+            pWinPriv = winGetWindowPriv(pWin);
+            
+            /* Get pointers to our screen privates and screen info */
+            s_pScreenPriv = pWinPriv->pScreenPriv;
+            
+            s_pScreenPriv->bMousePollingTimerStoppedWhileMinimized = FALSE;
+  	}
+
         return 0;
 
     case WM_INIT_SYS_MENU:
@@ -1007,6 +1023,27 @@
         return 0;
 
     case WM_SIZE:
+        if(wParam == SIZE_MINIMIZED)
+          {
+            /* Kill the timer used to poll mouse events, if window gets minimized */
+            if (g_uipMousePollingTimerID != 0)
+              {
+                KillTimer (s_pScreenPriv->hwndScreen, WIN_POLLING_MOUSE_TIMER_ID);
+                g_uipMousePollingTimerID = 0;
+                s_pScreenPriv->bMousePollingTimerStoppedWhileMinimized = TRUE;
+              }
+          }
+        else
+          {
+            /* If timer was killed on minimize, restart it */
+            if(s_pScreenPriv->bMousePollingTimerStoppedWhileMinimized == TRUE)
+              {
+                s_pScreenPriv->bMousePollingTimerStoppedWhileMinimized = FALSE;
+                winStartMousePolling(s_pScreenPriv);
+              }
+          }
+
+
         /* see dix/window.c */
 #if CYGWINDOWING_DEBUG
     {
diff -ur xserver-cygwin-1.13.0-1.orig/hw/xwin/winwndproc.c xserver-cygwin-1.13.0-1/hw/xwin/winwndproc.c
--- xserver-cygwin-1.13.0-1.orig/hw/xwin/winwndproc.c	2012-12-10 15:19:42.187500000 +0100
+++ xserver-cygwin-1.13.0-1/hw/xwin/winwndproc.c	2012-12-10 15:20:52.703125000 +0100
@@ -139,6 +139,10 @@
 
             winInitNotifyIcon(s_pScreenPriv);
         }
+
+	/* initialize variables for mouse polling in s_pScreenPriv */
+	s_pScreenPriv->bMousePollingTimerStoppedWhileMinimized = FALSE;
+
         return 0;
 
     case WM_DISPLAYCHANGE:


[-- Attachment #3: Type: text/plain, Size: 223 bytes --]

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-12-18 17:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-10 19:01 Excess MotionNotify events to a minimized window in multiwindow mode Heiko Bihr
2012-12-17 18:38 ` Jon TURNEY
2012-12-18  7:30   ` Heiko Bihr
2012-12-18 17:37     ` Jon TURNEY

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).