From 7159af499c3bab41e37eb27dcbcae20bd4bb999d Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Mon, 21 Apr 2008 02:50:40 +0300 Subject: Move static X11 atoms to struct --- libvo/vo_xv.c | 2 +- libvo/x11_common.c | 103 ++++++++++++++++++++++++----------------------------- libvo/x11_common.h | 19 ++++++++-- 3 files changed, 65 insertions(+), 59 deletions(-) (limited to 'libvo') 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 -- cgit v1.2.3