summaryrefslogtreecommitdiffstats
path: root/libvo/x11_common.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-11-05 17:02:04 +0100
committerwm4 <wm4@nowhere>2012-11-12 20:06:14 +0100
commitd4bdd0473d6f43132257c9fb3848d829755167a3 (patch)
tree8021c2f7da1841393c8c832105e20cd527826d6c /libvo/x11_common.c
parentbd48deba77bd5582c5829d6fe73a7d2571088aba (diff)
downloadmpv-d4bdd0473d6f43132257c9fb3848d829755167a3.tar.bz2
mpv-d4bdd0473d6f43132257c9fb3848d829755167a3.tar.xz
Rename directories, move files (step 1 of 2) (does not compile)
Tis drops the silly lib prefixes, and attempts to organize the tree in a more logical way. Make the top-level directory less cluttered as well. Renames the following directories: libaf -> audio/filter libao2 -> audio/out libvo -> video/out libmpdemux -> demux Split libmpcodecs: vf* -> video/filter vd*, dec_video.* -> video/decode mp_image*, img_format*, ... -> video/ ad*, dec_audio.* -> audio/decode libaf/format.* is moved to audio/ - this is similar to how mp_image.* is located in video/. Move most top-level .c/.h files to core. (talloc.c/.h is left on top- level, because it's external.) Park some of the more annoying files in compat/. Some of these are relicts from the time mplayer used ffmpeg internals. sub/ is not split, because it's too much of a mess (subtitle code is mixed with OSD display and rendering). Maybe the organization of core is not ideal: it mixes playback core (like mplayer.c) and utility helpers (like bstr.c/h). Should the need arise, the playback core will be moved somewhere else, while core contains all helper and common code.
Diffstat (limited to 'libvo/x11_common.c')
-rw-r--r--libvo/x11_common.c2404
1 files changed, 0 insertions, 2404 deletions
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
deleted file mode 100644
index 04d5c6880b..0000000000
--- a/libvo/x11_common.c
+++ /dev/null
@@ -1,2404 +0,0 @@
-/*
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <inttypes.h>
-#include <limits.h>
-
-#include "config.h"
-#include "bstr.h"
-#include "options.h"
-#include "mp_msg.h"
-#include "mp_fifo.h"
-#include "libavutil/common.h"
-#include "x11_common.h"
-#include "talloc.h"
-
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include "video_out.h"
-#include "aspect.h"
-#include "geometry.h"
-#include "osdep/timer.h"
-
-#include <X11/Xmd.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-#include <X11/keysym.h>
-
-#ifdef CONFIG_XSS
-#include <X11/extensions/scrnsaver.h>
-#endif
-
-#ifdef CONFIG_XDPMS
-#include <X11/extensions/dpms.h>
-#endif
-
-#ifdef CONFIG_XINERAMA
-#include <X11/extensions/Xinerama.h>
-#endif
-
-#ifdef CONFIG_XF86VM
-#include <X11/extensions/xf86vmode.h>
-#endif
-
-#ifdef CONFIG_XF86XK
-#include <X11/XF86keysym.h>
-#endif
-
-#ifdef CONFIG_XV
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvlib.h>
-
-#include "subopt-helper.h"
-#endif
-
-#include "input/input.h"
-#include "input/keycodes.h"
-
-#define WIN_LAYER_ONBOTTOM 2
-#define WIN_LAYER_NORMAL 4
-#define WIN_LAYER_ONTOP 6
-#define WIN_LAYER_ABOVE_DOCK 10
-
-int fs_layer = WIN_LAYER_ABOVE_DOCK;
-
-int stop_xscreensaver = 1;
-
-static int dpms_disabled = 0;
-
-char *mDisplayName = NULL;
-
-char **vo_fstype_list;
-
-/* 1 means that the WM is metacity (broken as hell) */
-int metacity_hack = 0;
-
-#ifdef CONFIG_XF86VM
-static int modecount;
-static XF86VidModeModeInfo **vidmodes;
-static XF86VidModeModeLine modeline;
-#endif
-
-static int vo_x11_get_fs_type(int supported);
-static void saver_off(Display *);
-static void saver_on(Display *);
-
-/*
- * Sends the EWMH fullscreen state event.
- *
- * action: could be one of _NET_WM_STATE_REMOVE -- remove state
- * _NET_WM_STATE_ADD -- add state
- * _NET_WM_STATE_TOGGLE -- toggle
- */
-void vo_x11_ewmh_fullscreen(struct vo_x11_state *x11, int action)
-{
- assert(action == _NET_WM_STATE_REMOVE ||
- action == _NET_WM_STATE_ADD || action == _NET_WM_STATE_TOGGLE);
-
- if (x11->fs_type & vo_wm_FULLSCREEN)
- {
- XEvent xev;
-
- /* init X event structure for _NET_WM_FULLSCREEN client message */
- xev.xclient.type = ClientMessage;
- xev.xclient.serial = 0;
- xev.xclient.send_event = True;
- xev.xclient.message_type = x11->XA_NET_WM_STATE;
- xev.xclient.window = x11->window;
- xev.xclient.format = 32;
- xev.xclient.data.l[0] = action;
- xev.xclient.data.l[1] = x11->XA_NET_WM_STATE_FULLSCREEN;
- xev.xclient.data.l[2] = 0;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
-
- /* finally send that damn thing */
- if (!XSendEvent(x11->display, DefaultRootWindow(x11->display), False,
- SubstructureRedirectMask | SubstructureNotifyMask,
- &xev))
- {
- mp_tmsg(MSGT_VO, MSGL_ERR, "\nX11: Couldn't send EWMH fullscreen event!\n");
- }
- }
-}
-
-static void vo_hidecursor(Display * disp, Window win)
-{
- Cursor no_ptr;
- Pixmap bm_no;
- XColor black, dummy;
- Colormap colormap;
- const char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-
- if (WinID == 0)
- return; // do not hide if playing on the root window
-
- colormap = DefaultColormap(disp, DefaultScreen(disp));
- if ( !XAllocNamedColor(disp, colormap, "black", &black, &dummy) )
- {
- return; // color alloc failed, give up
- }
- bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8, 8);
- no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0);
- XDefineCursor(disp, win, no_ptr);
- XFreeCursor(disp, no_ptr);
- if (bm_no != None)
- XFreePixmap(disp, bm_no);
- XFreeColors(disp,colormap,&black.pixel,1,0);
-}
-
-static void vo_showcursor(Display * disp, Window win)
-{
- if (WinID == 0)
- return;
- XDefineCursor(disp, win, 0);
-}
-
-static int x11_errorhandler(Display * display, XErrorEvent * event)
-{
-#define MSGLEN 60
- char msg[MSGLEN];
-
- XGetErrorText(display, event->error_code, (char *) &msg, MSGLEN);
-
- mp_msg(MSGT_VO, MSGL_ERR, "X11 error: %s\n", msg);
-
- mp_msg(MSGT_VO, MSGL_V,
- "Type: %x, display: %p, resourceid: %lx, serial: %lx\n",
- event->type, event->display, event->resourceid, event->serial);
- mp_msg(MSGT_VO, MSGL_V,
- "Error code: %x, request code: %x, minor code: %x\n",
- event->error_code, event->request_code, event->minor_code);
-
-// abort();
- return 0;
-#undef MSGLEN
-}
-
-void fstype_help(void)
-{
- mp_tmsg(MSGT_VO, MSGL_INFO, "Available fullscreen layer change modes:\n");
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_FULL_SCREEN_TYPES\n");
-
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none",
- "don't set fullscreen window layer");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer",
- "use _WIN_LAYER hint with default layer");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>",
- "use _WIN_LAYER hint with a given layer number");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm",
- "force NETWM style");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above",
- "use _NETWM_STATE_ABOVE hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below",
- "use _NETWM_STATE_BELOW hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen",
- "use _NETWM_STATE_FULLSCREEN hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top",
- "use _NETWM_STATE_STAYS_ON_TOP hint if available");
- mp_msg(MSGT_VO, MSGL_INFO,
- "You can also negate the settings with simply putting '-' in the beginning");
- mp_msg(MSGT_VO, MSGL_INFO, "\n");
-}
-
-static void fstype_dump(int fstype)
-{
- if (fstype)
- {
- mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours");
- if (fstype & vo_wm_LAYER)
- mp_msg(MSGT_VO, MSGL_V, " LAYER");
- if (fstype & vo_wm_FULLSCREEN)
- mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN");
- if (fstype & vo_wm_STAYS_ON_TOP)
- mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP");
- if (fstype & vo_wm_ABOVE)
- mp_msg(MSGT_VO, MSGL_V, " ABOVE");
- if (fstype & vo_wm_BELOW)
- mp_msg(MSGT_VO, MSGL_V, " BELOW");
- mp_msg(MSGT_VO, MSGL_V, " X atoms\n");
- } else
- mp_msg(MSGT_VO, MSGL_V,
- "[x11] Current fstype setting doesn't honour any X atoms\n");
-}
-
-static int net_wm_support_state_test(struct vo_x11_state *x11, Atom atom)
-{
-#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);
- NET_WM_STATE_TEST(STAYS_ON_TOP);
- NET_WM_STATE_TEST(BELOW);
- return 0;
-}
-
-static int x11_get_property(struct vo_x11_state *x11, Atom type, Atom ** args,
- unsigned long *nitems)
-{
- int format;
- unsigned long bytesafter;
-
- return Success ==
- XGetWindowProperty(x11->display, x11->rootwin, type, 0, 16384, False,
- AnyPropertyType, &type, &format, nitems,
- &bytesafter, (unsigned char **) args)
- && *nitems > 0;
-}
-
-static int vo_wm_detect(struct vo *vo)
-{
- struct vo_x11_state *x11 = vo->x11;
- int i;
- int wm = 0;
- unsigned long nitems;
- Atom *args = NULL;
-
- if (WinID >= 0)
- return 0;
-
-// -- supports layers
- 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] == x11->XA_WIN_LAYER)
- {
- wm |= vo_wm_LAYER;
- metacity_hack |= 1;
- } else
- /* metacity is the only window manager I know which reports
- * supporting only the _WIN_LAYER hint in _WIN_PROTOCOLS.
- * (what's more support for it is broken) */
- metacity_hack |= 2;
- }
- XFree(args);
- if (wm && (metacity_hack == 1))
- {
- // metacity claims to support layers, but it is not the truth :-)
- wm ^= vo_wm_LAYER;
- mp_msg(MSGT_VO, MSGL_V,
- "[x11] Using workaround for Metacity bugs.\n");
- }
- }
-// --- netwm
- 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(vo->x11, args[i]);
- XFree(args);
- }
-
- if (wm == 0)
- mp_msg(MSGT_VO, MSGL_V, "[x11] Unknown wm type...\n");
- return wm;
-}
-
-#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);
- XA_INIT(_NET_WM_STATE_FULLSCREEN);
- XA_INIT(_NET_WM_STATE_ABOVE);
- XA_INIT(_NET_WM_STATE_STAYS_ON_TOP);
- XA_INIT(_NET_WM_STATE_BELOW);
- XA_INIT(_NET_WM_PID);
- XA_INIT(_NET_WM_NAME);
- XA_INIT(_NET_WM_ICON_NAME);
- XA_INIT(_WIN_PROTOCOLS);
- XA_INIT(_WIN_LAYER);
- XA_INIT(_WIN_HINTS);
- XA_INIT(WM_PROTOCOLS);
- XA_INIT(WM_DELETE_WINDOW);
- XA_INIT(UTF8_STRING);
- char buf[50];
- sprintf(buf, "_NET_WM_CM_S%d", x11->screen);
- x11->XA_NET_WM_CM = XInternAtom(x11->display, buf, False);
-}
-
-void update_xinerama_info(struct vo *vo) {
- struct MPOpts *opts = vo->opts;
- xinerama_x = xinerama_y = 0;
-#ifdef CONFIG_XINERAMA
- if (xinerama_screen >= -1 && XineramaIsActive(vo->x11->display))
- {
- int screen = xinerama_screen;
- XineramaScreenInfo *screens;
- int num_screens;
-
- screens = XineramaQueryScreens(vo->x11->display, &num_screens);
- if (screen >= num_screens)
- screen = num_screens - 1;
- if (screen == -1) {
- int x = vo->dx + vo->dwidth / 2;
- int y = vo->dy + vo->dheight / 2;
- for (screen = num_screens - 1; screen > 0; screen--) {
- int left = screens[screen].x_org;
- int right = left + screens[screen].width;
- int top = screens[screen].y_org;
- int bottom = top + screens[screen].height;
- if (left <= x && x <= right && top <= y && y <= bottom)
- break;
- }
- }
- if (screen < 0)
- screen = 0;
- opts->vo_screenwidth = screens[screen].width;
- opts->vo_screenheight = screens[screen].height;
- xinerama_x = screens[screen].x_org;
- xinerama_y = screens[screen].y_org;
-
- XFree(screens);
- }
-#endif
- aspect_save_screenres(vo, opts->vo_screenwidth, opts->vo_screenheight);
-}
-
-int vo_init(struct vo *vo)
-{
- struct MPOpts *opts = vo->opts;
-// int mScreen;
- int depth, bpp;
- unsigned int mask;
-
-// char * DisplayName = ":0.0";
-// Display * mDisplay;
- XImage *mXImage = NULL;
-
-// Window mRootWin;
- XWindowAttributes attribs;
- char *dispName;
-
- if (vo->x11)
- return 1;
-
- vo->x11 = vo_x11_init_state();
- struct vo_x11_state *x11 = vo->x11;
-
- if (vo_rootwin)
- WinID = 0; // use root window
-
- if (x11->depthonscreen)
- {
- saver_off(x11->display);
- return 1; // already called
- }
-
- XSetErrorHandler(x11_errorhandler);
-
-#if 0
- if (!mDisplayName)
- if (!(mDisplayName = getenv("DISPLAY")))
- mDisplayName = strdup(":0.0");
-#else
- dispName = XDisplayName(mDisplayName);
-#endif
-
- mp_msg(MSGT_VO, MSGL_V, "X11 opening display: %s\n", dispName);
-
- x11->display = XOpenDisplay(dispName);
- if (!x11->display)
- {
- mp_msg(MSGT_VO, MSGL_ERR,
- "vo: couldn't open the X11 display (%s)!\n", dispName);
- talloc_free(x11);
- vo->x11 = NULL;
- return 0;
- }
- x11->screen = DefaultScreen(x11->display); // screen ID
- x11->rootwin = RootWindow(x11->display, x11->screen); // root window ID
-
- x11->xim = XOpenIM(x11->display, NULL, NULL, NULL);
-
- init_atoms(vo->x11);
-
-#ifdef CONFIG_XF86VM
- {
- int clock;
-
- XF86VidModeGetModeLine(x11->display, x11->screen, &clock, &modeline);
- if (!opts->vo_screenwidth)
- opts->vo_screenwidth = modeline.hdisplay;
- if (!opts->vo_screenheight)
- opts->vo_screenheight = modeline.vdisplay;
- }
-#endif
- {
- if (!opts->vo_screenwidth)
- opts->vo_screenwidth = DisplayWidth(x11->display, x11->screen);
- if (!opts->vo_screenheight)
- opts->vo_screenheight = DisplayHeight(x11->display, x11->screen);
- }
- // get color depth (from root window, or the best visual):
- XGetWindowAttributes(x11->display, x11->rootwin, &attribs);
- depth = attribs.depth;
-
- if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
- {
- Visual *visual;
-
- depth = vo_find_depth_from_visuals(x11->display, x11->screen, &visual);
- if (depth != -1)
- mXImage = XCreateImage(x11->display, visual, depth, ZPixmap,
- 0, NULL, 1, 1, 8, 1);
- } else
- mXImage =
- XGetImage(x11->display, x11->rootwin, 0, 0, 1, 1, AllPlanes, ZPixmap);
-
- x11->depthonscreen = depth; // display depth on screen
-
- // get bits/pixel from XImage structure:
- if (mXImage == NULL)
- {
- mask = 0;
- } else
- {
- /*
- * for the depth==24 case, the XImage structures might use
- * 24 or 32 bits of data per pixel. The x11->depthonscreen
- * field stores the amount of data per pixel in the
- * XImage structure!
- *
- * Maybe we should rename vo_depthonscreen to (or add) vo_bpp?
- */
- bpp = mXImage->bits_per_pixel;
- if ((x11->depthonscreen + 7) / 8 != (bpp + 7) / 8)
- x11->depthonscreen = bpp; // by A'rpi
- mask =
- mXImage->red_mask | mXImage->green_mask | mXImage->blue_mask;
- mp_msg(MSGT_VO, MSGL_V,
- "vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n", mask,
- mXImage->red_mask, mXImage->green_mask, mXImage->blue_mask);
- XDestroyImage(mXImage);
- }
- if (((x11->depthonscreen + 7) / 8) == 2)
- {
- if (mask == 0x7FFF)
- x11->depthonscreen = 15;
- else if (mask == 0xFFFF)
- x11->depthonscreen = 16;
- }
-// XCloseDisplay( mDisplay );
-/* slightly improved local display detection AST */
- if (strncmp(dispName, "unix:", 5) == 0)
- dispName += 4;
- else if (strncmp(dispName, "localhost:", 10) == 0)
- dispName += 9;
- if (*dispName == ':' && atoi(dispName + 1) < 10)
- x11->display_is_local = 1;
- else
- x11->display_is_local = 0;
- mp_msg(MSGT_VO, MSGL_V,
- "vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n",
- opts->vo_screenwidth, opts->vo_screenheight, depth, x11->depthonscreen,
- dispName, x11->display_is_local ? "local" : "remote");
-
- x11->wm_type = vo_wm_detect(vo);
-
- x11->fs_type = vo_x11_get_fs_type(x11->wm_type);
-
- fstype_dump(x11->fs_type);
-
- saver_off(x11->display);
- return 1;
-}
-
-void vo_uninit(struct vo_x11_state *x11)
-{
- if (!x11)
- return;
- if (!x11->display)
- {
- mp_msg(MSGT_VO, MSGL_V,
- "vo: x11 uninit called but X11 not initialized..\n");
- } else {
- mp_msg(MSGT_VO, MSGL_V, "vo: uninit ...\n");
- if (x11->xim)
- XCloseIM(x11->xim);
- XSetErrorHandler(NULL);
- XCloseDisplay(x11->display);
- x11->depthonscreen = 0;
- x11->display = NULL;
- }
- talloc_free(x11);
-}
-
-static const struct mp_keymap keymap[] = {
- // special keys
- {XK_Pause, KEY_PAUSE}, {XK_Escape, KEY_ESC}, {XK_BackSpace, KEY_BS},
- {XK_Tab, KEY_TAB}, {XK_Return, KEY_ENTER},
- {XK_Menu, KEY_MENU}, {XK_Print, KEY_PRINT},
-
- // cursor keys
- {XK_Left, KEY_LEFT}, {XK_Right, KEY_RIGHT}, {XK_Up, KEY_UP}, {XK_Down, KEY_DOWN},
-
- // navigation block
- {XK_Insert, KEY_INSERT}, {XK_Delete, KEY_DELETE}, {XK_Home, KEY_HOME}, {XK_End, KEY_END},
- {XK_Page_Up, KEY_PAGE_UP}, {XK_Page_Down, KEY_PAGE_DOWN},
-
- // F-keys
- {XK_F1, KEY_F+1}, {XK_F2, KEY_F+2}, {XK_F3, KEY_F+3}, {XK_F4, KEY_F+4},
- {XK_F5, KEY_F+5}, {XK_F6, KEY_F+6}, {XK_F7, KEY_F+7}, {XK_F8, KEY_F+8},
- {XK_F9, KEY_F+9}, {XK_F10, KEY_F+10}, {XK_F11, KEY_F+11}, {XK_F12, KEY_F+12},
-
- // numpad independent of numlock
- {XK_KP_Subtract, '-'}, {XK_KP_Add, '+'}, {XK_KP_Multiply, '*'}, {XK_KP_Divide, '/'},
- {XK_KP_Enter, KEY_KPENTER},
-
- // numpad with numlock
- {XK_KP_0, KEY_KP0}, {XK_KP_1, KEY_KP1}, {XK_KP_2, KEY_KP2},
- {XK_KP_3, KEY_KP3}, {XK_KP_4, KEY_KP4}, {XK_KP_5, KEY_KP5},
- {XK_KP_6, KEY_KP6}, {XK_KP_7, KEY_KP7}, {XK_KP_8, KEY_KP8},
- {XK_KP_9, KEY_KP9}, {XK_KP_Decimal, KEY_KPDEC},
- {XK_KP_Separator, KEY_KPDEC},
-
- // numpad without numlock
- {XK_KP_Insert, KEY_KPINS}, {XK_KP_End, KEY_KP1}, {XK_KP_Down, KEY_KP2},
- {XK_KP_Page_Down, KEY_KP3}, {XK_KP_Left, KEY_KP4}, {XK_KP_Begin, KEY_KP5},
- {XK_KP_Right, KEY_KP6}, {XK_KP_Home, KEY_KP7}, {XK_KP_Up, KEY_KP8},
- {XK_KP_Page_Up, KEY_KP9}, {XK_KP_Delete, KEY_KPDEL},
-
-#ifdef XF86XK_AudioPause
- {XF86XK_MenuKB, KEY_MENU},
- {XF86XK_AudioPlay, KEY_PLAY}, {XF86XK_AudioPause, KEY_PAUSE}, {XF86XK_AudioStop, KEY_STOP},
- {XF86XK_AudioPrev, KEY_PREV}, {XF86XK_AudioNext, KEY_NEXT},
- {XF86XK_AudioMute, KEY_MUTE}, {XF86XK_AudioLowerVolume, KEY_VOLUME_DOWN}, {XF86XK_AudioRaiseVolume, KEY_VOLUME_UP},
-#endif
-
- {0, 0}
-};
-
-static int vo_x11_lookupkey(int key)
-{
- static const char *passthrough_keys = " -+*/<>`~!@#$%^&()_{}:;\"\',.?\\|=[]";
- int mpkey = 0;
- if ((key >= 'a' && key <= 'z') ||
- (key >= 'A' && key <= 'Z') ||
- (key >= '0' && key <= '9') ||
- (key > 0 && key < 256 && strchr(passthrough_keys, key)))
- mpkey = key;
-
- if (!mpkey)
- mpkey = lookup_keymap_table(keymap, key);
-
- return mpkey;
-}
-
-
-// ----- Motif header: -------
-
-#define MWM_HINTS_FUNCTIONS (1L << 0)
-#define MWM_HINTS_DECORATIONS (1L << 1)
-#define MWM_HINTS_INPUT_MODE (1L << 2)
-#define MWM_HINTS_STATUS (1L << 3)
-
-#define MWM_FUNC_ALL (1L << 0)
-#define MWM_FUNC_RESIZE (1L << 1)
-#define MWM_FUNC_MOVE (1L << 2)
-#define MWM_FUNC_MINIMIZE (1L << 3)
-#define MWM_FUNC_MAXIMIZE (1L << 4)
-#define MWM_FUNC_CLOSE (1L << 5)
-
-#define MWM_DECOR_ALL (1L << 0)
-#define MWM_DECOR_BORDER (1L << 1)
-#define MWM_DECOR_RESIZEH (1L << 2)
-#define MWM_DECOR_TITLE (1L << 3)
-#define MWM_DECOR_MENU (1L << 4)
-#define MWM_DECOR_MINIMIZE (1L << 5)
-#define MWM_DECOR_MAXIMIZE (1L << 6)
-
-#define MWM_INPUT_MODELESS 0
-#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
-#define MWM_INPUT_SYSTEM_MODAL 2
-#define MWM_INPUT_FULL_APPLICATION_MODAL 3
-#define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL
-
-#define MWM_TEAROFF_WINDOW (1L<<0)
-
-typedef struct
-{
- long flags;
- long functions;
- long decorations;
- long input_mode;
- long state;
-} MotifWmHints;
-
-static MotifWmHints vo_MotifWmHints;
-static Atom vo_MotifHints = None;
-
-void vo_x11_decoration(struct vo *vo, int d)
-{
- struct vo_x11_state *x11 = vo->x11;
- Atom mtype;
- int mformat;
- unsigned long mn, mb;
-
- if (!WinID)
- return;
-
- if (vo_fsmode & 8)
- {
- XSetTransientForHint(x11->display, x11->window,
- RootWindow(x11->display, x11->screen));
- }
-
- vo_MotifHints = XInternAtom(x11->display, "_MOTIF_WM_HINTS", 0);
- if (vo_MotifHints != None)
- {
- if (!d)
- {
- MotifWmHints *mhints = NULL;
-
- XGetWindowProperty(x11->display, x11->window,
- vo_MotifHints, 0, 20, False,
- vo_MotifHints, &mtype, &mformat, &mn,
- &mb, (unsigned char **) &mhints);
- if (mhints)
- {
- if (mhints->flags & MWM_HINTS_DECORATIONS)
- x11->olddecor = mhints->decorations;
- if (mhints->flags & MWM_HINTS_FUNCTIONS)
- x11->oldfuncs = mhints->functions;
- XFree(mhints);
- }
- }
-
- memset(&vo_MotifWmHints, 0, sizeof(MotifWmHints));
- vo_MotifWmHints.flags =
- MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS;
- if (d)
- {
- vo_MotifWmHints.functions = x11->oldfuncs;
- d = x11->olddecor;
- }
-#if 0
- vo_MotifWmHints.decorations =
- d | ((vo_fsmode & 2) ? 0 : MWM_DECOR_MENU);
-#else
- vo_MotifWmHints.decorations =
- d | ((vo_fsmode & 2) ? MWM_DECOR_MENU : 0);
-#endif
- XChangeProperty(x11->display, x11->window, vo_MotifHints,
- vo_MotifHints, 32,
- PropModeReplace,
- (unsigned char *) &vo_MotifWmHints,
- (vo_fsmode & 4) ? 4 : 5);
- }
-}
-
-void vo_x11_classhint(struct vo *vo, Window window, const char *name)
-{
- struct MPOpts *opts = vo->opts;
- struct vo_x11_state *x11 = vo->x11;
- XClassHint wmClass;
- pid_t pid = getpid();
-
- wmClass.res_name = opts->vo_winname ? opts->vo_winname : (char *)name;
- wmClass.res_class = "mpv";
- XSetClassHint(x11->display, window, &wmClass);
- XChangeProperty(x11->display, window, x11->XA_NET_WM_PID, XA_CARDINAL,
- 32, PropModeReplace, (unsigned char *) &pid, 1);
-}
-
-void vo_x11_uninit(struct vo *vo)
-{
- struct vo_x11_state *x11 = vo->x11;
- saver_on(x11->display);
- if (x11->window != None)
- vo_showcursor(x11->display, x11->window);
-
- if (x11->f_gc != None)
- {
- XFreeGC(vo->x11->display, x11->f_gc);
- x11->f_gc = None;
- }
- {
- if (x11->vo_gc != None)
- {
- XFreeGC(vo->x11->display, x11->vo_gc);
- x11->vo_gc = None;
- }
- if (x11->window != None)
- {
- XClearWindow(x11->display, x11->window);
- if (WinID < 0)
- {
- XEvent xev;
-
- if (x11->xic)
- XDestroyIC(x11->xic);
- x11->xic = NULL;
-
- XUnmapWindow(x11->display, x11->window);
- XSelectInput(x11->display, x11->window, StructureNotifyMask);
- XDestroyWindow(x11->display, x11->window);
- do
- {
- XNextEvent(x11->display, &xev);
- }
- while (xev.type != DestroyNotify
- || xev.xdestroywindow.event != x11->window);
- }
- x11->window = None;
- }
- vo_fs = 0;
- x11->vo_old_width = x11->vo_old_height = 0;
- x11->last_video_width = 0;
- x11->last_video_height = 0;
- x11->size_changed_during_fs = false;
- }
- vo_uninit(x11);
- vo->x11 = NULL;
-}
-
-static int check_resize(struct vo *vo)
-{
- int old_w = vo->dwidth, old_h = vo->dheight;
- int old_x = vo->dx, old_y = vo->dy;
- int rc = 0;
- vo_x11_update_geometry(vo, true);
- if (vo->dwidth != old_w || vo->dheight != old_h)
- rc |= VO_EVENT_RESIZE;
- if (vo->dx != old_x || vo->dy != old_y)
- rc |= VO_EVENT_MOVE;
- return rc;
-}
-
-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;
- XEvent Event;
-
- if (x11->mouse_waiting_hide && opts->cursor_autohide_delay != -1 &&
- (GetTimerMS() - x11->mouse_timer >= opts->cursor_autohide_delay)) {
- vo_hidecursor(display, x11->window);
- x11->mouse_waiting_hide = 0;
- }
-
- if (WinID > 0)
- ret |= check_resize(vo);
- while (XPending(display))
- {
- XNextEvent(display, &Event);
-// printf("\rEvent.type=%X \n",Event.type);
- switch (Event.type)
- {
- case Expose:
- ret |= VO_EVENT_EXPOSE;
- break;
- case ConfigureNotify:
- if (x11->window == None)
- break;
- ret |= check_resize(vo);
- break;
- case KeyPress:
- {
- char buf[100];
- KeySym keySym = 0;
- int modifiers = 0;
- if (Event.xkey.state & ShiftMask)
- modifiers |= KEY_MODIFIER_SHIFT;
- if (Event.xkey.state & ControlMask)
- modifiers |= KEY_MODIFIER_CTRL;
- if (Event.xkey.state & Mod1Mask)
- modifiers |= KEY_MODIFIER_ALT;
- if (Event.xkey.state & Mod4Mask)
- modifiers |= KEY_MODIFIER_META;
- if (x11->xic) {
- Status status;
- int len = Xutf8LookupString(x11->xic, &Event.xkey, buf,
- sizeof(buf), &keySym,
- &status);
- int mpkey = vo_x11_lookupkey(keySym);
- if (mpkey) {
- mplayer_put_key(vo->key_fifo, mpkey | modifiers);
- } else if (status == XLookupChars
- || status == XLookupBoth)
- {
- struct bstr t = { buf, len };
- mplayer_put_key_utf8(vo->key_fifo, modifiers, t);
- }
- } else {
- XLookupString(&Event.xkey, buf, sizeof(buf), &keySym,
- &x11->compose_status);
- int mpkey = vo_x11_lookupkey(keySym);
- if (mpkey)
- mplayer_put_key(vo->key_fifo, mpkey | modifiers);
- }
- ret |= VO_EVENT_KEYPRESS;
- }
- break;
- case MotionNotify:
- vo_mouse_movement(vo, Event.xmotion.x, Event.xmotion.y);
-
- if (opts->cursor_autohide_delay > -2) {
- vo_showcursor(display, x11->window);
- x11->mouse_waiting_hide = 1;
- x11->mouse_timer = GetTimerMS();
- }
- break;
- case ButtonPress:
- if (opts->cursor_autohide_delay > -2) {
- vo_showcursor(display, x11->window);
- x11->mouse_waiting_hide = 1;
- x11->mouse_timer = GetTimerMS();
- }
- mplayer_put_key(vo->key_fifo,
- (MOUSE_BTN0 + Event.xbutton.button - 1)
- | MP_KEY_DOWN);
- break;
- case ButtonRelease:
- if (opts->cursor_autohide_delay > -2) {
- vo_showcursor(display, x11->window);
- x11->mouse_waiting_hide = 1;
- x11->mouse_timer = GetTimerMS();
- }
- mplayer_put_key(vo->key_fifo,
- MOUSE_BTN0 + Event.xbutton.button - 1);
- break;
- case PropertyNotify:
- {
- char *name =
- XGetAtomName(display, Event.xproperty.atom);
-
- if (!name)
- break;
-
-// fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",vo_window,name,Event.xproperty.atom );
-
- XFree(name);
- }
- break;
- case MapNotify:
- x11->vo_hint.win_gravity = x11->old_gravity;
- XSetWMNormalHints(display, x11->window, &x11->vo_hint);
- x11->fs_flip = 0;
- break;
- case DestroyNotify:
- mp_msg(MSGT_VO, MSGL_WARN, "Our window was destroyed, exiting\n");
- mplayer_put_key(vo->key_fifo, KEY_CLOSE_WIN);
- break;
- case ClientMessage:
- if (Event.xclient.message_type == x11->XAWM_PROTOCOLS &&
- Event.xclient.data.l[0] == x11->XAWM_DELETE_WINDOW)
- mplayer_put_key(vo->key_fifo, KEY_CLOSE_WIN);
- break;
- }
- }
- return ret;
-}
-
-/**
- * \brief sets the size and position of the non-fullscreen window.
- */
-static void vo_x11_nofs_sizepos(struct vo *vo, int x, int y,
- int width, int height)
-{
- struct vo_x11_state *x11 = vo->x11;
- if (width == x11->last_video_width && height == x11->last_video_height) {
- if (!vo->opts->force_window_position && !x11->size_changed_during_fs)
- return;
- } else if (vo_fs)
- x11->size_changed_during_fs = true;
- x11->last_video_height = height;
- x11->last_video_width = width;
- vo_x11_sizehint(vo, x, y, width, height, 0);
- if (vo_fs) {
- x11->vo_old_x = x;
- x11->vo_old_y = y;
- x11->vo_old_width = width;
- x11->vo_old_height = height;
- }
- else
- {
- vo->dwidth = width;
- vo->dheight = height;
- if (vo->opts->force_window_position)
- XMoveResizeWindow(vo->x11->display, vo->x11->window, x, y, width,
- height);
- else
- XResizeWindow(vo->x11->display, vo->x11->window, width, height);
- }
-}
-
-void vo_x11_sizehint(struct vo *vo, int x, int y, int width, int height, int max)
-{
- struct vo_x11_state *x11 = vo->x11;
- x11->vo_hint.flags = 0;
- if (vo_keepaspect)
- {
- x11->vo_hint.flags |= PAspect;
- x11->vo_hint.min_aspect.x = width;
- x11->vo_hint.min_aspect.y = height;
- x11->vo_hint.max_aspect.x = width;
- x11->vo_hint.max_aspect.y = height;
- }
-
- x11->vo_hint.flags |= PPosition | PSize;
- x11->vo_hint.x = x;
- x11->vo_hint.y = y;
- x11->vo_hint.width = width;
- x11->vo_hint.height = height;
- if (max)
- {
- x11->vo_hint.flags |= PMaxSize;
- x11->vo_hint.max_width = width;
- x11->vo_hint.max_height = height;
- } else
- {
- x11->vo_hint.max_width = 0;
- x11->vo_hint.max_height = 0;
- }
-
- // Set minimum height/width to 4 to avoid off-by-one errors.
- x11->vo_hint.flags |= PMinSize;
- x11->vo_hint.min_width = x11->vo_hint.min_height = 4;
-
- // Set the base size. A window manager might display the window
- // size to the user relative to this.