summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-21 02:50:40 +0300
committerUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-23 13:46:40 +0300
commit7159af499c3bab41e37eb27dcbcae20bd4bb999d (patch)
treee3feae20d45fbd893af89ef6767befd284fa3a20
parent78172918ff4c7df7c9d1305dbfc48a8df409e470 (diff)
downloadmpv-7159af499c3bab41e37eb27dcbcae20bd4bb999d.tar.bz2
mpv-7159af499c3bab41e37eb27dcbcae20bd4bb999d.tar.xz
Move static X11 atoms to struct
-rw-r--r--libvo/vo_xv.c2
-rw-r--r--libvo/x11_common.c103
-rw-r--r--libvo/x11_common.h19
3 files changed, 65 insertions, 59 deletions
diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c
index 301fed5a7b..94fc7d2f6a 100644
--- a/libvo/vo_xv.c
+++ b/libvo/vo_xv.c
@@ -376,7 +376,7 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
ctx->drwY, vo->dwidth, vo->dheight);
if (opts->vo_ontop)
- vo_x11_setlayer(x11->display, vo_window, opts->vo_ontop);
+ vo_x11_setlayer(vo, vo_window, opts->vo_ontop);
return 0;
}
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index 409b820c95..2a63ac4f0a 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -91,20 +91,6 @@ char **vo_fstype_list;
/* 1 means that the WM is metacity (broken as hell) */
int metacity_hack = 0;
-static Atom XA_NET_SUPPORTED;
-static Atom XA_NET_WM_STATE;
-static Atom XA_NET_WM_STATE_FULLSCREEN;
-static Atom XA_NET_WM_STATE_ABOVE;
-static Atom XA_NET_WM_STATE_STAYS_ON_TOP;
-static Atom XA_NET_WM_STATE_BELOW;
-static Atom XA_NET_WM_PID;
-static Atom XA_WIN_PROTOCOLS;
-static Atom XA_WIN_LAYER;
-static Atom XA_WIN_HINTS;
-static Atom XA_BLACKBOX_PID;
-static Atom XAWM_PROTOCOLS;
-static Atom XAWM_DELETE_WINDOW;
-
static int vo_old_x = 0;
static int vo_old_y = 0;
static int vo_old_width = 0;
@@ -267,9 +253,9 @@ static void fstype_dump(int fstype)
"[x11] Current fstype setting doesn't honour any X atoms\n");
}
-static int net_wm_support_state_test(Atom atom)
+static int net_wm_support_state_test(struct vo_x11_state *x11, Atom atom)
{
-#define NET_WM_STATE_TEST(x) { if (atom == XA_NET_WM_STATE_##x) { mp_msg( MSGT_VO,MSGL_V, "[x11] Detected wm supports " #x " state.\n" ); return vo_wm_##x; } }
+#define NET_WM_STATE_TEST(x) { if (atom == x11->XA_NET_WM_STATE_##x) { mp_msg( MSGT_VO,MSGL_V, "[x11] Detected wm supports " #x " state.\n" ); return vo_wm_##x; } }
NET_WM_STATE_TEST(FULLSCREEN);
NET_WM_STATE_TEST(ABOVE);
@@ -293,6 +279,7 @@ static int x11_get_property(struct vo_x11_state *x11, Atom type, Atom ** args,
static int vo_wm_detect(struct vo *vo)
{
+ struct vo_x11_state *x11 = vo->x11;
int i;
int wm = 0;
unsigned long nitems;
@@ -302,12 +289,12 @@ static int vo_wm_detect(struct vo *vo)
return 0;
// -- supports layers
- if (x11_get_property(vo->x11, XA_WIN_PROTOCOLS, &args, &nitems))
+ if (x11_get_property(x11, x11->XA_WIN_PROTOCOLS, &args, &nitems))
{
mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports layers.\n");
for (i = 0; i < nitems; i++)
{
- if (args[i] == XA_WIN_LAYER)
+ if (args[i] == x11->XA_WIN_LAYER)
{
wm |= vo_wm_LAYER;
metacity_hack |= 1;
@@ -327,18 +314,18 @@ static int vo_wm_detect(struct vo *vo)
}
}
// --- netwm
- if (x11_get_property(vo->x11, XA_NET_SUPPORTED, &args, &nitems))
+ if (x11_get_property(x11, x11->XA_NET_SUPPORTED, &args, &nitems))
{
mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports NetWM.\n");
for (i = 0; i < nitems; i++)
- wm |= net_wm_support_state_test(args[i]);
+ wm |= net_wm_support_state_test(vo->x11, args[i]);
XFree(args);
#if 0
// ugly hack for broken OpenBox _NET_WM_STATE_FULLSCREEN support
// (in their implementation it only changes internal window state, nothing more!!!)
if (wm & vo_wm_FULLSCREEN)
{
- if (x11_get_property(vo->x11, XA_BLACKBOX_PID, &args, &nitems))
+ if (x11_get_property(x11, x11->XA_BLACKBOX_PID, &args, &nitems))
{
mp_msg(MSGT_VO, MSGL_V,
"[x11] Detected wm is a broken OpenBox.\n");
@@ -354,8 +341,8 @@ static int vo_wm_detect(struct vo *vo)
return wm;
}
-#define XA_INIT(x) XA##x = XInternAtom(d, #x, False)
-static void init_atoms(Display *d)
+#define XA_INIT(x) x11->XA##x = XInternAtom(x11->display, #x, False)
+static void init_atoms(struct vo_x11_state *x11)
{
XA_INIT(_NET_SUPPORTED);
XA_INIT(_NET_WM_STATE);
@@ -457,7 +444,7 @@ int vo_init(struct vo *vo)
mScreen = DefaultScreen(x11->display); // screen ID
mRootWin = RootWindow(x11->display, mScreen); // root window ID
- init_atoms(vo->x11->display);
+ init_atoms(vo->x11);
#ifdef HAVE_XF86VM
{
@@ -948,16 +935,17 @@ void vo_x11_decoration(Display * vo_Display, Window w, int d)
}
}
-void vo_x11_classhint(Display * display, Window window, char *name)
+void vo_x11_classhint(struct vo *vo, Window window, char *name)
{
+ struct vo_x11_state *x11 = vo->x11;
XClassHint wmClass;
pid_t pid = getpid();
wmClass.res_name = name;
wmClass.res_class = "MPlayer";
- XSetClassHint(display, window, &wmClass);
- XChangeProperty(display, window, XA_NET_WM_PID, XA_CARDINAL, 32,
- PropModeReplace, (unsigned char *) &pid, 1);
+ XSetClassHint(x11->display, window, &wmClass);
+ XChangeProperty(x11->display, window, x11->XA_NET_WM_PID, XA_CARDINAL,
+ 32, PropModeReplace, (unsigned char *) &pid, 1);
}
Window vo_window = None;
@@ -1023,6 +1011,7 @@ static int mouse_waiting_hide;
int vo_x11_check_events(struct vo *vo)
{
+ struct vo_x11_state *x11 = vo->x11;
struct MPOpts *opts = vo->opts;
Display *display = vo->x11->display;
int ret = 0;
@@ -1167,8 +1156,8 @@ int vo_x11_check_events(struct vo *vo)
vo_fs_flip = 0;
break;
case ClientMessage:
- if (Event.xclient.message_type == XAWM_PROTOCOLS &&
- Event.xclient.data.l[0] == XAWM_DELETE_WINDOW)
+ if (Event.xclient.message_type == x11->XAWM_PROTOCOLS &&
+ Event.xclient.data.l[0] == x11->XAWM_DELETE_WINDOW)
mplayer_put_key(KEY_CLOSE_WIN);
break;
}
@@ -1235,7 +1224,7 @@ void vo_x11_sizehint(struct vo *vo, int x, int y, int width, int height, int max
XSetWMNormalHints(vo->x11->display, vo_window, &vo_hint);
}
-static int vo_x11_get_gnome_layer(Display * mDisplay, Window win)
+static int vo_x11_get_gnome_layer(struct vo_x11_state *x11, Window win)
{
Atom type;
int format;
@@ -1243,7 +1232,7 @@ static int vo_x11_get_gnome_layer(Display * mDisplay, Window win)
unsigned long bytesafter;
unsigned short *args = NULL;
- if (XGetWindowProperty(mDisplay, win, XA_WIN_LAYER, 0, 16384,
+ if (XGetWindowProperty(x11->display, win, x11->XA_WIN_LAYER, 0, 16384,
False, AnyPropertyType, &type, &format, &nitems,
&bytesafter,
(unsigned char **) &args) == Success
@@ -1257,7 +1246,7 @@ static int vo_x11_get_gnome_layer(Display * mDisplay, Window win)
}
//
-static Window vo_x11_create_smooth_window(Display * mDisplay, Window mRoot,
+static Window vo_x11_create_smooth_window(struct vo_x11_state *x11, Window mRoot,
Visual * vis, int x, int y,
unsigned int width, unsigned int height,
int depth, Colormap col_map)
@@ -1277,12 +1266,12 @@ static Window vo_x11_create_smooth_window(Display * mDisplay, Window mRoot,
xswa.bit_gravity = StaticGravity;
ret_win =
- XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth,
+ XCreateWindow(x11->display, mRootWin, x, y, width, height, 0, depth,
CopyFromParent, vis, xswamask, &xswa);
- XSetWMProtocols(mDisplay, ret_win, &XAWM_DELETE_WINDOW, 1);
+ XSetWMProtocols(x11->display, ret_win, &x11->XAWM_DELETE_WINDOW, 1);
if (!f_gc)
- f_gc = XCreateGC(mDisplay, ret_win, 0, 0);
- XSetForeground(mDisplay, f_gc, 0);
+ f_gc = XCreateGC(x11->display, ret_win, 0, 0);
+ XSetForeground(x11->display, f_gc, 0);
return ret_win;
}
@@ -1309,6 +1298,7 @@ void vo_x11_create_vo_window(struct vo *vo, XVisualInfo *vis, int x, int y,
const char *classname, const char *title)
{
struct MPOpts *opts = vo->opts;
+ struct vo_x11_state *x11 = vo->x11;
Display *mDisplay = vo->x11->display;
if (vo_window == None) {
XSizeHints hint;
@@ -1316,9 +1306,9 @@ void vo_x11_create_vo_window(struct vo *vo, XVisualInfo *vis, int x, int y,
vo_fs = 0;
vo->dwidth = width;
vo->dheight = height;
- vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vis->visual,
+ vo_window = vo_x11_create_smooth_window(x11, mRootWin, vis->visual,
x, y, width, height, vis->depth, col_map);
- vo_x11_classhint(mDisplay, vo_window, classname);
+ vo_x11_classhint(vo, vo_window, classname);
XStoreName(mDisplay, vo_window, title);
vo_hidecursor(mDisplay, vo_window);
XSelectInput(mDisplay, vo_window, StructureNotifyMask);
@@ -1340,7 +1330,7 @@ void vo_x11_create_vo_window(struct vo *vo, XVisualInfo *vis, int x, int y,
StructureNotifyMask | KeyPressMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | ExposureMask);
}
- if (opts->vo_ontop) vo_x11_setlayer(mDisplay, vo_window, opts->vo_ontop);
+ if (opts->vo_ontop) vo_x11_setlayer(vo, vo_window, opts->vo_ontop);
vo_x11_nofs_sizepos(vo, vo->dx, vo->dy, width, height);
if (!!vo_fs != !!(flags & VOFLAG_FULLSCREEN))
vo_x11_fullscreen(vo);
@@ -1391,8 +1381,9 @@ void vo_x11_clearwindow(struct vo *vo, Window vo_window)
}
-void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer)
+void vo_x11_setlayer(struct vo *vo, Window vo_window, int layer)
{
+ struct vo_x11_state *x11 = vo->x11;
if (WinID >= 0)
return;
@@ -1401,20 +1392,20 @@ void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer)
XClientMessageEvent xev;
if (!orig_layer)
- orig_layer = vo_x11_get_gnome_layer(mDisplay, vo_window);
+ orig_layer = vo_x11_get_gnome_layer(x11, vo_window);
memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
- xev.display = mDisplay;
+ xev.display = x11->display;
xev.window = vo_window;
- xev.message_type = XA_WIN_LAYER;
+ xev.message_type = x11->XA_WIN_LAYER;
xev.format = 32;
xev.data.l[0] = layer ? fs_layer : orig_layer; // if not fullscreen, stay on default layer
xev.data.l[1] = CurrentTime;
mp_msg(MSGT_VO, MSGL_V,
"[x11] Layered style stay on top (layer %ld).\n",
xev.data.l[0]);
- XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask,
+ XSendEvent(x11->display, mRootWin, False, SubstructureNotifyMask,
(XEvent *) & xev);
} else if (vo_fs_type & vo_wm_NETWM)
{
@@ -1423,26 +1414,26 @@ void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer)
memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
- xev.message_type = XA_NET_WM_STATE;
- xev.display = mDisplay;
+ xev.message_type = x11->XA_NET_WM_STATE;
+ xev.display = x11->display;
xev.window = vo_window;
xev.format = 32;
xev.data.l[0] = layer;
if (vo_fs_type & vo_wm_STAYS_ON_TOP)
- xev.data.l[1] = XA_NET_WM_STATE_STAYS_ON_TOP;
+ xev.data.l[1] = x11->XA_NET_WM_STATE_STAYS_ON_TOP;
else if (vo_fs_type & vo_wm_ABOVE)
- xev.data.l[1] = XA_NET_WM_STATE_ABOVE;
+ xev.data.l[1] = x11->XA_NET_WM_STATE_ABOVE;
else if (vo_fs_type & vo_wm_FULLSCREEN)
- xev.data.l[1] = XA_NET_WM_STATE_FULLSCREEN;
+ xev.data.l[1] = x11->XA_NET_WM_STATE_FULLSCREEN;
else if (vo_fs_type & vo_wm_BELOW)
// This is not fallback. We can safely assume that the situation
// where only NETWM_STATE_BELOW is supported doesn't exist.
- xev.data.l[1] = XA_NET_WM_STATE_BELOW;
+ xev.data.l[1] = x11->XA_NET_WM_STATE_BELOW;
- XSendEvent(mDisplay, mRootWin, False, SubstructureRedirectMask,
+ XSendEvent(x11->display, mRootWin, False, SubstructureRedirectMask,
(XEvent *) & xev);
- state = XGetAtomName(mDisplay, xev.data.l[1]);
+ state = XGetAtomName(x11->display, xev.data.l[1]);
mp_msg(MSGT_VO, MSGL_V,
"[x11] NET style stay on top (layer %d). Using state %s.\n",
layer, state);
@@ -1583,14 +1574,14 @@ void vo_x11_fullscreen(struct vo *vo)
{
vo_x11_decoration(x11->display, vo_window, (vo_fs) ? 0 : 1);
vo_x11_sizehint(vo, x, y, w, h, 0);
- vo_x11_setlayer(x11->display, vo_window, vo_fs);
+ vo_x11_setlayer(vo, vo_window, vo_fs);
XMoveResizeWindow(x11->display, vo_window, x, y, w, h);
}
/* some WMs lose ontop after fullscreen */
if ((!(vo_fs)) & opts->vo_ontop)
- vo_x11_setlayer(x11->display, vo_window, opts->vo_ontop);
+ vo_x11_setlayer(vo, vo_window, opts->vo_ontop);
XMapRaised(x11->display, vo_window);
if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // some WMs change window pos on map
@@ -1604,7 +1595,7 @@ void vo_x11_ontop(struct vo *vo)
struct MPOpts *opts = vo->opts;
opts->vo_ontop = !opts->vo_ontop;
- vo_x11_setlayer(vo->x11->display, vo_window, opts->vo_ontop);
+ vo_x11_setlayer(vo, vo_window, opts->vo_ontop);
}
/*
diff --git a/libvo/x11_common.h b/libvo/x11_common.h
index 58eef5caa2..c219244d98 100644
--- a/libvo/x11_common.h
+++ b/libvo/x11_common.h
@@ -9,6 +9,19 @@ struct vo;
struct vo_x11_state {
Display *display;
int depthonscreen;
+ Atom XA_NET_SUPPORTED;
+ Atom XA_NET_WM_STATE;
+ Atom XA_NET_WM_STATE_FULLSCREEN;
+ Atom XA_NET_WM_STATE_ABOVE;
+ Atom XA_NET_WM_STATE_STAYS_ON_TOP;
+ Atom XA_NET_WM_STATE_BELOW;
+ Atom XA_NET_WM_PID;
+ Atom XA_WIN_PROTOCOLS;
+ Atom XA_WIN_LAYER;
+ Atom XA_WIN_HINTS;
+ Atom XA_BLACKBOX_PID;
+ Atom XAWM_PROTOCOLS;
+ Atom XAWM_DELETE_WINDOW;
};
#ifdef X11_FULLSCREEN
@@ -44,12 +57,12 @@ void vo_x11_init_state(struct vo_x11_state *s);
int vo_init(struct vo *vo);
void vo_uninit(struct vo_x11_state *x11);
extern void vo_x11_decoration( Display * vo_Display,Window w,int d );
-extern void vo_x11_classhint( Display * display,Window window,char *name );
+void vo_x11_classhint(struct vo *vo, Window window, char *name);
void vo_x11_sizehint(struct vo *vo, int x, int y, int width, int height, int max);
int vo_x11_check_events(struct vo *vo);
extern void vo_x11_selectinput_witherr(Display *display, Window w, long event_mask);
void vo_x11_fullscreen(struct vo *vo);
-extern void vo_x11_setlayer( Display * mDisplay,Window vo_window,int layer );
+void vo_x11_setlayer(struct vo *vo, Window vo_window, int layer);
void vo_x11_uninit(struct vo *vo);
Colormap vo_x11_create_colormap(struct vo *vo, XVisualInfo *vinfo);
uint32_t vo_x11_set_equalizer(struct vo *vo, char *name, int value);
@@ -144,6 +157,8 @@ int vo_find_depth_from_visuals(Display *dpy, int screen, Visual **visual_return)
#define vo_x11_clearwindow_part(display, ...) vo_x11_clearwindow_part(global_vo, __VA_ARGS__)
#define vo_vm_close(display) vo_vm_close(global_vo)
#define vo_x11_clearwindow(display, window) vo_x11_clearwindow(global_vo, window)
+#define vo_x11_classhint(display, window, name) vo_x11_classhint(global_vo, window, name)
+#define vo_x11_setlayer(display, window, layer) vo_x11_setlayer(global_vo, window, layer)
#define mDisplay global_vo->x11->display
#define vo_depthonscreen global_vo->x11->depthonscreen