[gtk+] tools: Rewrite screenshotting code for shooter
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] tools: Rewrite screenshotting code for shooter
- Date: Sun, 20 Nov 2016 10:53:10 +0000 (UTC)
commit 78888ade0d2e7bbf0aec6787e922ac067fee1b8f
Author: Benjamin Otte <otte redhat com>
Date: Sun Nov 20 11:43:09 2016 +0100
tools: Rewrite screenshotting code for shooter
Uses X directly, so bypasses both the need to query the root window and
to draw window contents.
docs/tools/shooter.c | 50 ++++++++++++++++++++++++++++----------------------
1 files changed, 28 insertions(+), 22 deletions(-)
---
diff --git a/docs/tools/shooter.c b/docs/tools/shooter.c
index 8ce1dfc..a3bc656 100644
--- a/docs/tools/shooter.c
+++ b/docs/tools/shooter.c
@@ -1,6 +1,7 @@
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdkx.h>
+#include <cairo-xlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/wait.h>
@@ -136,9 +137,10 @@ static GdkPixbuf *
take_window_shot (Window child,
DecorationType decor)
{
- GdkWindow *window, *root_window;
+ cairo_surface_t *surface;
+ XWindowAttributes attrs;
Window xid;
- gint x_orig, y_orig;
+ Display *dpy;
gint x = 0, y = 0;
gint width, height;
@@ -150,35 +152,39 @@ take_window_shot (Window child,
else
xid = child;
- window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), xid);
- root_window = gdk_screen_get_root_window (gdk_window_get_screen (window));
+ dpy = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
+ XGetWindowAttributes (dpy, xid, &attrs);
- width = gdk_window_get_width (window);
- height = gdk_window_get_height (window);
- gdk_window_get_origin (window, &x_orig, &y_orig);
+ width = attrs.width;
+ height = attrs.height;
- if (x_orig < 0)
+ if (attrs.x < 0)
{
- x = - x_orig;
- width = width + x_orig;
- x_orig = 0;
+ x = - attrs.x;
+ width = width + attrs.x;
}
- if (y_orig < 0)
+ if (attrs.y < 0)
{
- y = - y_orig;
- height = height + y_orig;
- y_orig = 0;
+ y = - attrs.y;
+ height = height + attrs.y;
}
- if (x_orig + width > gdk_window_get_width (root_window))
- width = gdk_window_get_width (root_window) - x_orig;
+ if (attrs.x + x + width > WidthOfScreen (DefaultScreenOfDisplay (dpy)))
+ width = WidthOfScreen (DefaultScreenOfDisplay (dpy)) - attrs.x - x;
- if (y_orig + height > gdk_window_get_height (root_window))
- height = gdk_window_get_height (root_window) - y_orig;
+ if (attrs.y + y + height > HeightOfScreen (DefaultScreenOfDisplay (dpy)))
+ height = HeightOfScreen (DefaultScreenOfDisplay (dpy)) - attrs.y - y;
- tmp = gdk_pixbuf_get_from_window (window,
- x, y, width, height);
+ surface = cairo_xlib_surface_create (dpy,
+ xid,
+ attrs.visual,
+ attrs.width,
+ attrs.height);
+ tmp = gdk_pixbuf_get_from_surface (surface,
+ x, y,
+ width, height);
+ cairo_surface_destroy (surface);
if (tmp != NULL)
{
@@ -203,8 +209,8 @@ take_window_shot (Window child,
static GList *toplevels;
static guint shot_id;
-static gboolean
+static gboolean
window_is_csd (GdkWindow *window)
{
gboolean set;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]