mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-11 19:06:33 +00:00
ximagesrc: Fix the destination coordinates of the cursor
XFixes provides the cursor coordinates relative to the root window, this is not taken into account when using the xid property to capture a specific window, the result is that the cursor gets drawn at the wrong position. In order to fix this consider the window location when calculating the cursor position in the destination image. https://bugzilla.gnome.org/show_bug.cgi?id=690646
This commit is contained in:
parent
d3eea8f606
commit
cb70a7f6a7
2 changed files with 26 additions and 6 deletions
|
@ -169,6 +169,9 @@ gst_ximage_src_open_display (GstXImageSrc * s, const gchar * name)
|
|||
int status;
|
||||
XWindowAttributes attrs;
|
||||
Window window;
|
||||
int x, y;
|
||||
Window child;
|
||||
Bool coord_translated;
|
||||
|
||||
if (s->xid != 0) {
|
||||
status = XGetWindowAttributes (s->xcontext->disp, s->xid, &attrs);
|
||||
|
@ -205,8 +208,19 @@ gst_ximage_src_open_display (GstXImageSrc * s, const gchar * name)
|
|||
g_assert (s->xwindow != 0);
|
||||
s->width = attrs.width;
|
||||
s->height = attrs.height;
|
||||
GST_INFO_OBJECT (s, "Using default window size of %dx%d",
|
||||
s->width, s->height);
|
||||
|
||||
coord_translated = XTranslateCoordinates (s->xcontext->disp, s->xwindow,
|
||||
s->xcontext->root, 0, 0, &x, &y, &child);
|
||||
if (coord_translated) {
|
||||
s->x = x;
|
||||
s->y = y;
|
||||
} else {
|
||||
s->x = 0;
|
||||
s->y = 0;
|
||||
}
|
||||
|
||||
GST_INFO_OBJECT (s, "Using default window size of %dx%d at location %d,%d",
|
||||
s->width, s->height, s->x, s->y);
|
||||
}
|
||||
use_root_window:
|
||||
|
||||
|
@ -601,8 +615,10 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
|||
if (ximagesrc->cursor_image) {
|
||||
gint x, y, width, height;
|
||||
|
||||
x = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot;
|
||||
y = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot;
|
||||
x = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot -
|
||||
ximagesrc->x;
|
||||
y = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot -
|
||||
ximagesrc->y;
|
||||
width = ximagesrc->cursor_image->width;
|
||||
height = ximagesrc->cursor_image->height;
|
||||
|
||||
|
@ -696,10 +712,12 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
|||
int startx, starty, iwidth, iheight;
|
||||
gboolean cursor_in_image = TRUE;
|
||||
|
||||
cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot;
|
||||
cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot -
|
||||
ximagesrc->x;
|
||||
if (cx < 0)
|
||||
cx = 0;
|
||||
cy = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot;
|
||||
cy = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot -
|
||||
ximagesrc->y;
|
||||
if (cy < 0)
|
||||
cy = 0;
|
||||
count = ximagesrc->cursor_image->width * ximagesrc->cursor_image->height;
|
||||
|
|
|
@ -49,6 +49,8 @@ struct _GstXImageSrc
|
|||
|
||||
/* Information on display */
|
||||
GstXContext *xcontext;
|
||||
gint x;
|
||||
gint y;
|
||||
gint width;
|
||||
gint height;
|
||||
|
||||
|
|
Loading…
Reference in a new issue