gstreamer/gst-libs/gst/vaapi/gstvaapiutils_x11.c
2012-01-30 19:52:10 +01:00

154 lines
4 KiB
C

/*
* gstvaapiutils_x11.c - X11 utilties
*
* Copyright (C) 2010-2011 Splitted-Desktop Systems
* Copyright (C) 2011 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#include "sysdeps.h"
#include <glib.h>
#include <X11/Xutil.h>
#include "gstvaapiutils_x11.h"
// X error trap
static int x11_error_code = 0;
static int (*old_error_handler)(Display *, XErrorEvent *);
static int error_handler(Display *dpy, XErrorEvent *error)
{
x11_error_code = error->error_code;
return 0;
}
void x11_trap_errors(void)
{
x11_error_code = 0;
old_error_handler = XSetErrorHandler(error_handler);
}
int x11_untrap_errors(void)
{
XSetErrorHandler(old_error_handler);
return x11_error_code;
}
// X window management
static const int x11_event_mask = (KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask |
PointerMotionMask |
EnterWindowMask |
ExposureMask |
StructureNotifyMask);
/**
* x11_create_window:
* @dpy: an X11 #Display
* @w: the requested width, in pixels
* @h: the requested height, in pixels
* @vis: the request visual
* @cmap: the request colormap
*
* Creates a border-less window with the specified dimensions. If @vis
* is %NULL, the default visual for @display will be used. If @cmap is
* %None, no specific colormap will be bound to the window. Also note
* the default background color is black.
*
* Return value: the newly created X #Window.
*/
Window
x11_create_window(Display *dpy, guint w, guint h, Visual *vis, Colormap cmap)
{
Window rootwin, win;
int screen, depth;
XSetWindowAttributes xswa;
unsigned long xswa_mask;
XWindowAttributes wattr;
unsigned long black_pixel;
screen = DefaultScreen(dpy);
rootwin = RootWindow(dpy, screen);
black_pixel = BlackPixel(dpy, screen);
if (!vis)
vis = DefaultVisual(dpy, screen);
XGetWindowAttributes(dpy, rootwin, &wattr);
depth = wattr.depth;
if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
depth = 24;
xswa_mask = CWBorderPixel | CWBackPixel;
xswa.border_pixel = black_pixel;
xswa.background_pixel = black_pixel;
if (cmap) {
xswa_mask |= CWColormap;
xswa.colormap = cmap;
}
win = XCreateWindow(
dpy,
rootwin,
0, 0, w, h,
0,
depth,
InputOutput,
vis,
xswa_mask, &xswa
);
if (!win)
return None;
XSelectInput(dpy, win, x11_event_mask);
return win;
}
gboolean
x11_get_geometry(
Display *dpy,
Drawable drawable,
gint *px,
gint *py,
guint *pwidth,
guint *pheight
)
{
Window rootwin;
int x, y;
guint width, height, border_width, depth;
x11_trap_errors();
XGetGeometry(
dpy,
drawable,
&rootwin,
&x, &y, &width, &height,
&border_width,
&depth
);
if (x11_untrap_errors())
return FALSE;
if (px) *px = x;
if (py) *py = y;
if (pwidth) *pwidth = width;
if (pheight) *pheight = height;
return TRUE;
}