public inbox for cygwin-xfree@sourceware.org
help / color / mirror / Atom feed
* XRaiseWindow for activating windows in multiwindow mode
@ 2011-08-13 18:39 Oliver Schmidt
  2011-09-03 19:02 ` Jon TURNEY
  0 siblings, 1 reply; 11+ messages in thread
From: Oliver Schmidt @ 2011-08-13 18:39 UTC (permalink / raw)
  To: cygwin-xfree

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

Hi,

as reported in 

  http://www.cygwin.com/ml/cygwin-xfree/2005-06/msg00072.html

windows are not raised from the Cygwin X Server in multiwindow
mode, if a program wants to programmatically activate a window.

I played around and figured out that the problem can be solved by 
invoking the windows function SetForegroundWindow if a top level 
window is to be restacked and has no previous sibling.

I enclose the patch in this email. It works fine for me, but 
I'm not sure if it has any side effects for other configurations 
or usage patterns.

It would be nice if this feature could be integrated into future
versions of the Cygwin X Server.

Best regards,
Oliver


diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 956a9a5..22390b3 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -465,6 +465,7 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
   HWND			hInsertAfter;
   HWND                  hWnd = NULL;
 #endif
+  static Bool fRestacking = FALSE; /* Avoid recusive calls to this function */
   ScreenPtr		pScreen = pWin->drawable.pScreen;
   winScreenPriv(pScreen);
 
@@ -472,10 +473,27 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
   winTrace ("winRestackMultiWindow - %08x\n", pWin);
 #endif
   
+  if (fRestacking)
+    {
+      /* It is a recusive call so immediately exit */
+#if CYGWINDOWING_DEBUG
+      ErrorF ("winRestackWindowMultiWindow - "
+	      "exit because fRestacking == TRUE\n");
+#endif
+      return;
+    }
+  fRestacking = TRUE;
+
    WIN_UNWRAP(RestackWindow);
    if (pScreen->RestackWindow) 
      (*pScreen->RestackWindow)(pWin, pOldNextSib);
    WIN_WRAP(RestackWindow, winRestackWindowMultiWindow);
+
+  if (isToplevelWindow(pWin) && pWin->prevSib == NULL)
+    {
+      winWindowPriv(pWin);
+      SetForegroundWindow(pWinPriv->hWnd);
+    }
   
 #if 1
   /*
@@ -538,6 +556,8 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
 		0, 0,
 		uFlags);
 #endif
+
+  fRestacking = FALSE;
 }
 
 static void

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 1405 bytes --]

diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 956a9a5..22390b3 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -465,6 +465,7 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
   HWND			hInsertAfter;
   HWND                  hWnd = NULL;
 #endif
+  static Bool fRestacking = FALSE; /* Avoid recusive calls to this function */
   ScreenPtr		pScreen = pWin->drawable.pScreen;
   winScreenPriv(pScreen);
 
@@ -472,10 +473,27 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
   winTrace ("winRestackMultiWindow - %08x\n", pWin);
 #endif
   
+  if (fRestacking)
+    {
+      /* It is a recusive call so immediately exit */
+#if CYGWINDOWING_DEBUG
+      ErrorF ("winRestackWindowMultiWindow - "
+	      "exit because fRestacking == TRUE\n");
+#endif
+      return;
+    }
+  fRestacking = TRUE;
+
    WIN_UNWRAP(RestackWindow);
    if (pScreen->RestackWindow) 
      (*pScreen->RestackWindow)(pWin, pOldNextSib);
    WIN_WRAP(RestackWindow, winRestackWindowMultiWindow);
+
+  if (isToplevelWindow(pWin) && pWin->prevSib == NULL)
+    {
+      winWindowPriv(pWin);
+      SetForegroundWindow(pWinPriv->hWnd);
+    }
   
 #if 1
   /*
@@ -538,6 +556,8 @@ winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
 		0, 0,
 		uFlags);
 #endif
+
+  fRestacking = FALSE;
 }
 
 static void


[-- 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] 11+ messages in thread
* Re: XRaiseWindow for activating windows in multiwindow mode
@ 2014-06-11 20:50 Patrick Herbst
  2014-06-19 10:07 ` Oliver Schmidt
  0 siblings, 1 reply; 11+ messages in thread
From: Patrick Herbst @ 2014-06-11 20:50 UTC (permalink / raw)
  To: cygwin-xfree

On 03 Sep 2011, Jon TURNEY wrote:
>
> On 13/08/2011 19:39, Oliver Schmidt wrote:
> > as reported in
> >
> >    http://www.cygwin.com/ml/cygwin-xfree/2005-06/msg00072.html
> >
> > windows are not raised from the Cygwin X Server in multiwindow
> > mode, if a program wants to programmatically activate a window.
> >
> > I played around and figured out that the problem can be solved by
> > invoking the windows function SetForegroundWindow if a top level
> > window is to be restacked and has no previous sibling.
> >
> > I enclose the patch in this email. It works fine for me, but
> > I'm not sure if it has any side effects for other configurations
> > or usage patterns.
>
> Thanks for looking into this, and for the patch.
>
> There definitely are some problems in this area, but I'm not sure this is the
> 'correct' fix, though.
>
> The code as it stands is the product of some ... erm ... historical compromises.
>
> If I am reading the code correctly, it looks like currently no attempt is made
> to synchronize changes in the X window Z-order (e.g. made by XRaiseWindow())
> to the native Windows window Z-order, and the comment in [1] seems to bear
> this out.  The code which perhaps would do this is in the disabled branch of
> the #if/#else/#endif in winRestackWindowMultiWindow()
>
> The relevant thread seems to be [2] and the relevant change seems to be [3],
> but I can't reconstruct the reasoning behind it.
>
> As discussed in the thread [2] various scenarios, e.g. AOT windows, native
> windows interleaved with X windows in the native Z order, Windows with
> focus-follows-mouse enabled via TweakUI all need testing after trying to fix
> this, to ensure you haven't regressed them.
>
> [1] http://sourceware.org/ml/cygwin-xfree/2004-12/msg00074.html
> [2] http://sourceware.org/ml/cygwin-xfree/2004-03/msg00540.html
> [3]
> http://cgit.freedesktop.org/xorg/xserver/commit/?h=CYGWIN&id=40bb4441ac7c87cfa0c62e8553c7e53b9fe4d765
>
> > It would be nice if this feature could be integrated into future
> > versions of the Cygwin X Server.
> >
> > Best regards,
> > Oliver
> >

Is there a fix planned for this?  I too use applications that make use
of XRaiseWindow to navigate around multiple windows, and it doesn't
work.

Anyone have any info on this issue??

Thanks!
Patrick Herbst

Ref: https://cygwin.com/ml/cygwin-xfree/2011-09/msg00000.html

--
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] 11+ messages in thread

end of thread, other threads:[~2014-06-19 10:07 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-13 18:39 XRaiseWindow for activating windows in multiwindow mode Oliver Schmidt
2011-09-03 19:02 ` Jon TURNEY
2011-09-04  8:52   ` Oliver Schmidt
2011-09-04  9:09     ` Oliver Schmidt
2011-09-04 11:18   ` Oliver Schmidt
2011-10-19  9:33     ` Michel Hummel
2011-10-21 10:36       ` Oliver Schmidt
2011-10-21 11:43         ` Michel Hummel
2011-10-21 12:26           ` Oliver Schmidt
2014-06-11 20:50 Patrick Herbst
2014-06-19 10:07 ` Oliver Schmidt

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).