From 548b3acee1782a0d4498f5903e165693ee6ea528 Mon Sep 17 00:00:00 2001 From: Olivier Duchateau Date: Wed, 13 Mar 2019 18:12:23 +0100 Subject: [PATCH] Replace deprecated 'gdk_screen_get_active_window' by Xlib functions --- Makefile.am | 16 ++++++++++ configure.ac.in | 2 ++ lib/screenshooter-capture.c | 64 ++++++++++++++++++++++++++++++++++--- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 210a862..65ed875 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,11 +41,14 @@ lib_libscreenshooter_la_CFLAGS = \ -I$(top_builddir)/lib \ @EXO_CFLAGS@ \ @GTK_CFLAGS@ \ + @GDK_CFLAGS@ \ + @GDKX11_CFLAGS@ \ @GLIB_CFLAGS@ \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCE4UI_CFLAGS@ \ @LIBXML_CFLAGS@ \ @SOUP_CFLAGS@ \ + @LIBX11_CFLAGS@ \ @XFIXES_CFLAGS@ \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" @@ -53,6 +56,8 @@ lib_libscreenshooter_la_LIBADD = \ -lm \ @EXO_LIBS@ \ @GTK_LIBS@ \ + @GDK_LIBS@ \ + @GDKX11_LIBS@ \ @LIBXFCE4UTIL_LIBS@ \ @LIBXFCE4UI_LIBS@ \ @GLIB_LIBS@ \ @@ -60,6 +65,7 @@ lib_libscreenshooter_la_LIBADD = \ @LIBXML_LIBS@ \ @LIBXEXT_LIBS@ \ @LIBX11_LIBS@ \ + @LIBX11_LDFLAGS@ \ @XFIXES_LIBS@ lib_libscreenshooter_built_sources = \ @@ -94,21 +100,28 @@ src_xfce4_screenshooter_CFLAGS = \ -I$(top_builddir)/lib \ @EXO_CFLAGS@ \ @GTK_CFLAGS@ \ + @GDK_CFLAGS@ \ + @GDKX11_CFLAGS@ \ @GLIB_CFLAGS@ \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCE4UI_CFLAGS@ \ @GTHREAD_CFLAGS@ \ @SOUP_CFLAGS@ \ @LIBXML_CFLAGS@ \ + @LIBX11_CFLAGS@ \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" src_xfce4_screenshooter_LDFLAGS = \ @EXO_LIBS@ \ @GTK_LIBS@ \ + @GDK_LIBS@ \ + @GDKX11_LIBS@ \ @GLIB_LIBS@ \ @GTHREAD_LIBS@ \ @SOUP_LIBS@ \ @LIBXML_LIBS@ \ + @LIBX11_LIBS@ \ + @LIBX11_LDFLAGS@ \ @LIBXFCE4UTIL_LIBS@ \ @LIBXFCE4UI_LIBS@ @@ -150,6 +163,7 @@ panel_plugin_libscreenshooterplugin_la_CFLAGS = \ @LIBXFCE4UI_CFLAGS@ \ @GTHREAD_CFLAGS@ \ @LIBXML_CFLAGS@ \ + @LIBX11_CFLAGS@ \ @SOUP_CFLAGS@ panel_plugin_libscreenshooterplugin_la_LDFLAGS = \ @@ -165,6 +179,8 @@ panel_plugin_libscreenshooterplugin_la_LIBADD = \ @GTHREAD_LIBS@ \ @SOUP_LIBS@ \ @LIBXML_LIBS@ \ + @LIBX11_LIBS@ \ + @LIBX11_LDFLAGS@ \ @LIBXFCE4UI_LIBS@ \ lib/libscreenshooter.la diff --git a/configure.ac.in b/configure.ac.in index 200a45d..9af51af 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -50,6 +50,8 @@ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.10.0]) XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.12.0]) XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.16.0]) XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.20.0]) +XDT_CHECK_PACKAGE([GDK], [gdk-3.0], [3.20.0]) +XDT_CHECK_PACKAGE([GDKX11], [gdk-x11-3.0], [3.20.0]) XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0]) XDT_CHECK_PACKAGE([SOUP], [libsoup-2.4], [2.26.0]) XDT_CHECK_PACKAGE([LIBXML], [libxml-2.0], [2.4.0]) diff --git a/lib/screenshooter-capture.c b/lib/screenshooter-capture.c index 4e4b78e..7035e87 100644 --- a/lib/screenshooter-capture.c +++ b/lib/screenshooter-capture.c @@ -20,6 +20,11 @@ #include "screenshooter-capture.h" #include "screenshooter-utils.h" +#include +#include +#include +#include + #define BACKGROUND_TRANSPARENCY 0.4 enum { @@ -63,7 +68,7 @@ typedef struct /* Prototypes */ - +static Window get_active_window_from_xlib (void); static GdkWindow *get_active_window (GdkScreen *screen, gboolean *needs_unref, gboolean *border); @@ -106,6 +111,52 @@ static GdkPixbuf *get_rectangle_screenshot_composited (gint delay); /* Internals */ +static Window +get_active_window_from_xlib (void) +{ + GdkDisplay *display; + Display *dsp; + Atom active_win, type; + int status, format; + unsigned long n_items, bytes_after; + unsigned char *prop; + Window window; + + display = gdk_display_get_default (); + dsp = gdk_x11_display_get_xdisplay (display); + + active_win = XInternAtom (dsp, "_NET_ACTIVE_WINDOW", True); + if (active_win == None) + return None; + + gdk_x11_display_error_trap_push (display); + + status = XGetWindowProperty (dsp, DefaultRootWindow (dsp), + active_win, 0, G_MAXLONG, False, + XA_WINDOW, &type, &format, &n_items, + &bytes_after, &prop); + if (status != Success || type != XA_WINDOW) + { + if (prop) + XFree (prop); + + gdk_x11_display_error_trap_pop_ignored (display); + return None; + } + + if (gdk_x11_display_error_trap_pop (display) != Success) + { + if (prop) + XFree (prop); + + return None; + } + + window = *(Window *) prop; + XFree (prop); + return window; +} + static GdkWindow @@ -114,12 +165,17 @@ static GdkWindow gboolean *border) { GdkWindow *window, *window2; + Window xwindow; + GdkDisplay *display; TRACE ("Get the active window"); -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - window = gdk_screen_get_active_window (screen); -G_GNUC_END_IGNORE_DEPRECATIONS + display = gdk_display_get_default (); + xwindow = get_active_window_from_xlib (); + if (xwindow != None) + window = gdk_x11_window_foreign_new_for_display (display, xwindow); + else + window = NULL; /* If there is no active window, we fallback to the whole screen. */ if (G_UNLIKELY (window == NULL)) -- 2.20.1