This is the mail archive of the
cygwin-xfree@cygwin.com
mailing list for the Cygwin XFree86 project.
Removing focus from X
- From: "Gerald S. Williams" <gsw at agere dot com>
- To: <cygwin-xfree at cygwin dot com>
- Date: Thu, 14 Nov 2002 12:49:03 -0500
- Subject: Removing focus from X
- Reply-to: cygwin-xfree at cygwin dot com
I had meant to try this, but I'm having some build problems
at the moment. I backed out my patch, and found that the
build still fails on the CVS snapshot I took 2 weeks ago. It
reports this error when I run "make" in xc/programs/Xserver:
[...]
gcc -o XWin.exe -O2 -fno-strength-reduce -Wall -Wpointer-arith -mwindows -e _ma
inCRTStartup -L../../exports/lib hw/xwin/stubs.o hw/xwin/XWin.res dix
/libdix.a os/libos.a ../../exports/lib/libXau.a ../../exports/lib/libXdmcp.a hw
/xwin/libXwin.a fb/libfb.a dix/libxpstubs.a mi/libmi.a Xext/libext.a xkb/libxkb.
a Xi/libxinput.a lbx/liblbx.a ../../lib/lbx
util/liblbxutil.a dbe/libdbe.a record/librecord.a XTrap/libxt
rap.a GL/glx/libglx.a GL/mesa/GLcore/libGLcore.a
render/librender.a miext/shadow/libshadow.a hw/xfree86/parser/libxf
86config.a -L/usr/X11R6/lib ../../lib/font/libXfont.a dix/libxpstubs.a -lfr
eetype -L../../exports/lib -lXext -lX11 -lz.dll -lgdi32 -Wl,
--enable-auto-import
hw/xwin/libXwin.a(winscrinit.o)(.text+0x9ce):winscrinit.c: undefined reference to `_LayerStartInit'
hw/xwin/libXwin.a(winscrinit.o)(.text+0xa2e):winscrinit.c: undefined reference to `_LayerFinishInit'
hw/xwin/libXwin.a(winlayer.o)(.text+0xa9):winlayer.c: undefined reference to `_LayerCreate'
hw/xwin/libXwin.a(winlayer.o)(.text+0xfd):winlayer.c: undefined reference to `_LayerWindowAdd'
hw/xwin/libXwin.a(winlayer.o)(.text+0x15d):winlayer.c: undefined reference to `_LayerWindowRemove'
collect2: ld returned 1 exit status
make: *** [XWin.exe] Error 1
Was there a problem with the CVS snapshot, or am I just
doing something wrong? Any ideas?
========================
Anyway, here are the changes that I had made to the file
xc/programs/Xserver/hw/xwin/winwndproc.c:
Index: xc/programs/Xserver/hw/xwin/winwndproc.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xwin/winwndproc.c,v
retrieving revision 1.23
diff -u -1 -0 -r1.23 winwndproc.c
--- xc/programs/Xserver/hw/xwin/winwndproc.c 2002/10/17 08:18:25 1.23
+++ xc/programs/Xserver/hw/xwin/winwndproc.c 2002/11/14 17:36:39
@@ -29,20 +29,40 @@
* Suhaib M Siddiqi
* Peter Busch
* Harold L Hunt II
* MATSUZAKI Kensuke
*/
/* $XFree86: xc/programs/Xserver/hw/xwin/winwndproc.c,v 1.23 2002/10/17 08:18:25 alanh Exp $ */
#include "win.h"
#include <commctrl.h>
+#define KILL_FOCUS_ENHANCEMENT
+#ifdef KILL_FOCUS_ENHANCEMENT
+
+#define INCLUDE_XLIB_WORKAROUND
+#ifdef INCLUDE_XLIB_WORKAROUND
+typedef void Display;
+
+extern Display *XOpenDisplay(
+ const char* /* display_name */
+);
+
+extern void XSetInputFocus(
+ Display* /* display */,
+ Window /* focus */,
+ int /* revert_to */,
+ Time /* time */
+);
+#endif /* INCLUDE_XLIB_WORKAROUND */
+#endif /* KILL_FOCUS_ENHANCEMENT */
+
BOOL CALLBACK
winChangeDepthDlgProc (HWND hDialog, UINT message,
WPARAM wParam, LPARAM lParam);
/*
* Called by winWakeupHandler
* Processes current Windows message
*/
@@ -831,20 +851,33 @@
case WM_KILLFOCUS:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
/* Store the state of all mode keys */
winStoreModeKeyStates (s_pScreen);
/* Release any pressed keys */
winKeybdReleaseKeys ();
+
+#ifdef KILL_FOCUS_ENHANCEMENT
+ /* Remove focus from all X windows (crude implementation) */
+ {
+ Display *display = XOpenDisplay(NULL);
+
+ if (display)
+ {
+ /* Revert is ignored... */
+ XSetInputFocus(display,None,RevertToNone,CurrentTime);
+ }
+ }
+#endif /* KILL_FOCUS_ENHANCEMENT */
return 0;
#if WIN_NEW_KEYBOARD_SUPPORT
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
case WM_SYSKEYUP:
case WM_KEYUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
========================
As you can see, it simply sets the input focus to NONE when
the KILLFOCUS event is received. Does this sound like a
reasonable approach? Sorry about the weird declarations at
the top--if you try to #include <X11/Xlib.h> in this file,
you get some duplicate declarations (another thing for me
to look into).
I'm not sure if anything needs to be done with the SETFOCUS
event or not--I figured I'd try this change out first. For
mouse-initiated focus changes, I would expect the focus to
be updated anyway. I suppose alt-tab initiated changes may
not get the focus updated (I haven't tracked it through).
Perhaps a WarpCursor call could be added to SETFOCUS (if
needed).
-Jerry