Re: [PATCH] Set a flag property on the root window to say if the X server VT is active

2014-04-03 Thread Dave Airlie
On Mon, Mar 31, 2014 at 7:19 PM, Michael Thayer
michael.tha...@oracle.com wrote:
 An X11 client may need to know whether the X server virtual terminal is
 currently the active one.  This change adds a root window property which
 provides that information.  Intended interface user: the VirtualBox Guest
 Additions.
 Signed-off-by: Michael Thayer michael.tha...@oracle.com

Seems like it should work okay to me,

Reviewed-by: Dave Airlie airl...@redhat.com
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel


[PATCH] Set a flag property on the root window to say if the X server VT is active

2014-03-31 Thread Michael Thayer
An X11 client may need to know whether the X server virtual terminal is
currently the active one.  This change adds a root window property which
provides that information.  Intended interface user: the VirtualBox Guest
Additions.
Signed-off-by: Michael Thayer michael.tha...@oracle.com
---
This is an updated version of a previous patch to address concerns expressed
by Daniel Martin.

Regards,

Michael

 hw/xfree86/common/xf86Events.c  | 28 
 hw/xfree86/common/xf86Init.c| 16 +++-
 hw/xfree86/common/xf86Privstr.h |  4 
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 06af739..35a673d 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -56,6 +56,7 @@
 #include X11/X.h
 #include X11/Xpoll.h
 #include X11/Xproto.h
+#include X11/Xatom.h
 #include misc.h
 #include compiler.h
 #include xf86.h
@@ -431,6 +432,29 @@ xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo)
 pInfo-flags = ~XI86_DEVICE_DISABLED;
 }
 
+/*
+ * xf86UpdateHasVTProperty --
+ *Update a flag property on the root window to say whether the server VT
+ *is currently the active one as some clients need to know this.
+ */
+static void
+xf86UpdateHasVTProperty(Bool hasVT)
+{
+Atom property_name;
+int32_t value = hasVT ? 1 : 0;
+int i;
+
+property_name = MakeAtom(HAS_VT_ATOM_NAME, sizeof(HAS_VT_ATOM_NAME) - 1,
+ FALSE);
+if (property_name == BAD_RESOURCE)
+FatalError(Failed to retrieve \HAS_VT\ atom\n);
+for (i = 0; i  xf86NumScreens; i++) {
+ChangeWindowProperty(xf86ScrnToScreen(xf86Screens[i])-root,
+ property_name, XA_INTEGER, 32,
+ PropModeReplace, 1, value, TRUE);
+}
+}
+
 void
 xf86VTLeave(void)
 {
@@ -490,6 +514,8 @@ xf86VTLeave(void)
 if (xorgHWAccess)
 xf86DisableIO();
 
+xf86UpdateHasVTProperty(FALSE);
+
 return;
 
 switch_failed:
@@ -574,6 +600,8 @@ xf86VTEnter(void)
 xf86platformVTProbe();
 #endif
 
+xf86UpdateHasVTProperty(TRUE);
+
 OsReleaseSIGIO();
 }
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 4579ff5..5a45004 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -387,6 +387,11 @@ InstallSignalHandlers(void)
 }
 }
 
+/* The memory storing the initial value of the XFree86_has_VT root window
+ * property.  This has to remain available until server start-up, so we just
+ * use a global. */
+static CARD32 HasVTValue = 1;
+
 /*
  * InitOutput --
  * Initialize screenInfo for all actually accessible framebuffers.
@@ -731,7 +736,9 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 if (xf86Info.vtno = 0) {
 #define VT_ATOM_NAME XFree86_VT
 Atom VTAtom = -1;
+Atom HasVTAtom = -1;
 CARD32 *VT = NULL;
+CARD32 *HasVT = HasVTValue;
 int ret;
 
 /* This memory needs to stay available until the screen has been
@@ -744,6 +751,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 *VT = xf86Info.vtno;
 
 VTAtom = MakeAtom(VT_ATOM_NAME, sizeof(VT_ATOM_NAME) - 1, TRUE);
+HasVTAtom = MakeAtom(HAS_VT_ATOM_NAME,
+ sizeof(HAS_VT_ATOM_NAME) - 1, TRUE);
 
 for (i = 0, ret = Success; i  xf86NumScreens  ret == Success;
  i++) {
@@ -751,9 +760,14 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 xf86RegisterRootWindowProperty(xf86Screens[i]-scrnIndex,
VTAtom, XA_INTEGER, 32, 1,
VT);
+if (ret == Success)
+ret = xf86RegisterRootWindowProperty(xf86Screens[i]
+ -scrnIndex,
+ HasVTAtom, XA_INTEGER,
+ 32, 1, HasVT);
 if (ret != Success)
 xf86DrvMsg(xf86Screens[i]-scrnIndex, X_WARNING,
-   Failed to register VT property\n);
+   Failed to register VT properties\n);
 }
 }
 
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index f7a9c9f..410ef17 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -163,4 +163,8 @@ typedef struct _RootWinProp {
 #define WSCONS   32
 #endif
 
+/* Root window property to tell clients whether our VT is currently active.
+ * Name chosen to match the XFree86_VT property. */
+#define HAS_VT_ATOM_NAME XFree86_has_VT
+
 #endif  /* _XF86PRIVSTR_H */
--
ORACLE Deutschland B.V.  Co. KG   Michael Thayer

[PATCH] Set a flag property on the root window to say if the X server VT is active

2014-03-25 Thread Michael Thayer
An X11 client may need to know whether the X server virtual terminal is
currently the active one.  This change adds a root window property which
provides that information.  Intended interface user: the VirtualBox Guest
Additions.
Signed-off-by: Michael Thayer michael.tha...@oracle.com
---
This is an updated version of my previous patch to address Daniel's concerns.

Regards,

Michael

 hw/xfree86/common/xf86Events.c  | 28 
 hw/xfree86/common/xf86Init.c| 16 +++-
 hw/xfree86/common/xf86Privstr.h |  4 
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 06af739..35a673d 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -56,6 +56,7 @@
 #include X11/X.h
 #include X11/Xpoll.h
 #include X11/Xproto.h
+#include X11/Xatom.h
 #include misc.h
 #include compiler.h
 #include xf86.h
@@ -431,6 +432,29 @@ xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo)
 pInfo-flags = ~XI86_DEVICE_DISABLED;
 }
 
+/*
+ * xf86UpdateHasVTProperty --
+ *Update a flag property on the root window to say whether the server VT
+ *is currently the active one as some clients need to know this.
+ */
+static void
+xf86UpdateHasVTProperty(Bool hasVT)
+{
+Atom property_name;
+int32_t value = hasVT ? 1 : 0;
+int i;
+
+property_name = MakeAtom(HAS_VT_ATOM_NAME, sizeof(HAS_VT_ATOM_NAME) - 1,
+ FALSE);
+if (property_name == BAD_RESOURCE)
+FatalError(Failed to retrieve \HAS_VT\ atom\n);
+for (i = 0; i  xf86NumScreens; i++) {
+ChangeWindowProperty(xf86ScrnToScreen(xf86Screens[i])-root,
+ property_name, XA_INTEGER, 32,
+ PropModeReplace, 1, value, TRUE);
+}
+}
+
 void
 xf86VTLeave(void)
 {
@@ -490,6 +514,8 @@ xf86VTLeave(void)
 if (xorgHWAccess)
 xf86DisableIO();
 
+xf86UpdateHasVTProperty(FALSE);
+
 return;
 
 switch_failed:
@@ -574,6 +600,8 @@ xf86VTEnter(void)
 xf86platformVTProbe();
 #endif
 
+xf86UpdateHasVTProperty(TRUE);
+
 OsReleaseSIGIO();
 }
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 4579ff5..5a45004 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -387,6 +387,11 @@ InstallSignalHandlers(void)
 }
 }
 
+/* The memory storing the initial value of the XFree86_has_VT root window
+ * property.  This has to remain available until server start-up, so we just
+ * use a global. */
+static CARD32 HasVTValue = 1;
+
 /*
  * InitOutput --
  * Initialize screenInfo for all actually accessible framebuffers.
@@ -731,7 +736,9 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 if (xf86Info.vtno = 0) {
 #define VT_ATOM_NAME XFree86_VT
 Atom VTAtom = -1;
+Atom HasVTAtom = -1;
 CARD32 *VT = NULL;
+CARD32 *HasVT = HasVTValue;
 int ret;
 
 /* This memory needs to stay available until the screen has been
@@ -744,6 +751,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 *VT = xf86Info.vtno;
 
 VTAtom = MakeAtom(VT_ATOM_NAME, sizeof(VT_ATOM_NAME) - 1, TRUE);
+HasVTAtom = MakeAtom(HAS_VT_ATOM_NAME,
+ sizeof(HAS_VT_ATOM_NAME) - 1, TRUE);
 
 for (i = 0, ret = Success; i  xf86NumScreens  ret == Success;
  i++) {
@@ -751,9 +760,14 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 xf86RegisterRootWindowProperty(xf86Screens[i]-scrnIndex,
VTAtom, XA_INTEGER, 32, 1,
VT);
+if (ret == Success)
+ret = xf86RegisterRootWindowProperty(xf86Screens[i]
+ -scrnIndex,
+ HasVTAtom, XA_INTEGER,
+ 32, 1, HasVT);
 if (ret != Success)
 xf86DrvMsg(xf86Screens[i]-scrnIndex, X_WARNING,
-   Failed to register VT property\n);
+   Failed to register VT properties\n);
 }
 }
 
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index f7a9c9f..410ef17 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -163,4 +163,8 @@ typedef struct _RootWinProp {
 #define WSCONS   32
 #endif
 
+/* Root window property to tell clients whether our VT is currently active.
+ * Name chosen to match the XFree86_VT property. */
+#define HAS_VT_ATOM_NAME XFree86_has_VT
+
 #endif  /* _XF86PRIVSTR_H */
--
ORACLE Deutschland B.V.  Co. KG   Michael Thayer
Werkstrasse 24