[Spice-devel] [PATCH vdagent 09/12] seamless-mode: Add new window atom filter function
Jakub Janků
janku.jakub.jj at gmail.com
Tue Aug 8 12:56:59 UTC 2017
From: Lukas Venhoda <lvenhoda at redhat.com>
Stop filtering out taskbars, alt-tab menues etc.
Add a new function for future Atom type filtering.
---
src/vdagent/x11-seamless-mode.c | 75 ++++++++++++++---------------------------
1 file changed, 25 insertions(+), 50 deletions(-)
diff --git a/src/vdagent/x11-seamless-mode.c b/src/vdagent/x11-seamless-mode.c
index 1621126..a664c6a 100644
--- a/src/vdagent/x11-seamless-mode.c
+++ b/src/vdagent/x11-seamless-mode.c
@@ -67,46 +67,6 @@ get_window_property(Display *display, Window window,
return 0;
}
-/* Get current desktop number, or -1. */
-static gint
-get_current_desktop(Display *display)
-{
- guchar *data = NULL;
- Window root;
-
- root = DefaultRootWindow(display);
- if (get_window_property(display, root, "_NET_CURRENT_DESKTOP",
- XA_CARDINAL, 32, &data) == 1) {
- gulong current;
-
- current = *(gulong *)data;
- XFree(data);
-
- return (gint)current;
- }
-
- return -1;
-}
-
-/* Get window desktop number, or -1. */
-static gint
-get_desktop(Display *display, Window window)
-{
- guchar *data = NULL;
-
- if (get_window_property(display, window, "_NET_WM_DESKTOP",
- XA_CARDINAL, 32, &data) == 1) {
- gulong desktop;
-
- desktop = *(gulong *)data;
- XFree(data);
-
- return (gint)desktop;
- }
-
- return -1;
-}
-
/* Get window type, or None. */
static Atom
get_window_type(Display *display, Window window)
@@ -126,6 +86,28 @@ get_window_type(Display *display, Window window)
return None;
}
+static gboolean
+filter_window_type(Display *display, Atom atom)
+{
+ unsigned int list_size;
+ Atom filter_atom;
+
+ static const char *blacklist[] = {
+ "_NET_WM_WINDOW_TYPE_DESKTOP"
+ };
+
+ list_size = sizeof(blacklist)/sizeof(blacklist[0]);
+
+ for (int i = 0; i < list_size; i++) {
+ filter_atom = XInternAtom(display, blacklist[i], 0);
+
+ if (filter_atom == atom)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
get_geometry(Display *display, Window window,
VDAgentSeamlessModeWindow *geometry)
@@ -177,7 +159,7 @@ get_geometry(Display *display, Window window,
static gboolean
is_visible(Display *display, Window window)
{
- Atom atom, type;
+ Atom type;
XWindowAttributes attributes;
/* Visible window must have window type specified. */
@@ -185,15 +167,8 @@ is_visible(Display *display, Window window)
if (type == None)
return FALSE;
- /* Window must be on current desktop if it isn't popup menu. */
- atom = XInternAtom(display, "_NET_WM_WINDOW_TYPE_POPUP_MENU", 0);
- if (type != atom) {
- gint current;
-
- current = get_current_desktop(display);
- if (get_desktop(display, window) != current)
- return FALSE;
- }
+ if (!filter_window_type(display, type))
+ return FALSE;
/* Window must be viewable. */
XGetWindowAttributes(display, window, &attributes);
--
2.13.4
More information about the Spice-devel
mailing list