x11_common.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,222 行 · 第 1/5 页
C
2,222 行
{ int u_dheight, u_dwidth, left_ov, left_ov2; if (!f_gc) return; u_dheight = use_fs ? vo_screenheight : vo_dheight; u_dwidth = use_fs ? vo_screenwidth : vo_dwidth; if ((u_dheight <= img_height) && (u_dwidth <= img_width)) return; left_ov = (u_dheight - img_height) / 2; left_ov2 = (u_dwidth - img_width) / 2; XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov); XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight - left_ov - 1, u_dwidth, left_ov + 1); if (u_dwidth > img_width) { XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2, img_height); XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth - left_ov2 - 1, left_ov, left_ov2 + 1, img_height); } XFlush(mDisplay);}void vo_x11_clearwindow(Display * mDisplay, Window vo_window){ if (!f_gc) return; XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth, vo_screenheight); // XFlush(mDisplay);}void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer){ if (WinID >= 0) return; if (vo_fs_type & vo_wm_LAYER) { XClientMessageEvent xev; if (!orig_layer) orig_layer = vo_x11_get_gnome_layer(mDisplay, vo_window); memset(&xev, 0, sizeof(xev)); xev.type = ClientMessage; xev.display = mDisplay; xev.window = vo_window; xev.message_type = 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, (XEvent *) & xev); } else if (vo_fs_type & vo_wm_NETWM) { XClientMessageEvent xev; char *state; memset(&xev, 0, sizeof(xev)); xev.type = ClientMessage; xev.message_type = XA_NET_WM_STATE; xev.display = mDisplay; 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; else if (vo_fs_type & vo_wm_ABOVE) xev.data.l[1] = XA_NET_WM_STATE_ABOVE; else if (vo_fs_type & vo_wm_FULLSCREEN) xev.data.l[1] = 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; XSendEvent(mDisplay, mRootWin, False, SubstructureRedirectMask, (XEvent *) & xev); state = XGetAtomName(mDisplay, xev.data.l[1]); mp_msg(MSGT_VO, MSGL_V, "[x11] NET style stay on top (layer %d). Using state %s.\n", layer, state); XFree(state); }}static int vo_x11_get_fs_type(int supported){ int i; int type = supported; if (vo_fstype_list) { i = 0; for (i = 0; vo_fstype_list[i]; i++) { int neg = 0; char *arg = vo_fstype_list[i]; if (vo_fstype_list[i][0] == '-') { neg = 1; arg = vo_fstype_list[i] + 1; } if (!strncmp(arg, "layer", 5)) { if (!neg && (arg[5] == '=')) { char *endptr = NULL; int layer = strtol(vo_fstype_list[i] + 6, &endptr, 10); if (endptr && *endptr == '\0' && layer >= 0 && layer <= 15) fs_layer = layer; } if (neg) type &= ~vo_wm_LAYER; else type |= vo_wm_LAYER; } else if (!strcmp(arg, "above")) { if (neg) type &= ~vo_wm_ABOVE; else type |= vo_wm_ABOVE; } else if (!strcmp(arg, "fullscreen")) { if (neg) type &= ~vo_wm_FULLSCREEN; else type |= vo_wm_FULLSCREEN; } else if (!strcmp(arg, "stays_on_top")) { if (neg) type &= ~vo_wm_STAYS_ON_TOP; else type |= vo_wm_STAYS_ON_TOP; } else if (!strcmp(arg, "below")) { if (neg) type &= ~vo_wm_BELOW; else type |= vo_wm_BELOW; } else if (!strcmp(arg, "netwm")) { if (neg) type &= ~vo_wm_NETWM; else type |= vo_wm_NETWM; } else if (!strcmp(arg, "none")) return 0; } } return type;}void vo_x11_fullscreen(void){ int x, y, w, h; if (WinID >= 0 || vo_fs_flip) return; if (vo_fs) { // fs->win if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // not needed with EWMH fs { x = vo_old_x; y = vo_old_y; w = vo_old_width; h = vo_old_height; } vo_x11_ewmh_fullscreen(_NET_WM_STATE_REMOVE); // removes fullscreen state if wm supports EWMH vo_fs = VO_FALSE; } else { // win->fs vo_x11_ewmh_fullscreen(_NET_WM_STATE_ADD); // sends fullscreen state to be added if wm supports EWMH vo_fs = VO_TRUE; if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // not needed with EWMH fs { vo_old_x = vo_dx; vo_old_y = vo_dy; vo_old_width = vo_dwidth; vo_old_height = vo_dheight; } update_xinerama_info(); x = xinerama_x; y = xinerama_y; w = vo_screenwidth; h = vo_screenheight; } { long dummy; XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy); if (!(vo_hint.flags & PWinGravity)) old_gravity = NorthWestGravity; else old_gravity = vo_hint.win_gravity; } if (vo_wm_type == 0 && !(vo_fsmode & 16)) { XUnmapWindow(mDisplay, vo_window); // required for MWM XWithdrawWindow(mDisplay, vo_window, mScreen); vo_fs_flip = 1; } if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // not needed with EWMH fs { vo_x11_decoration(mDisplay, vo_window, (vo_fs) ? 0 : 1); vo_x11_sizehint(x, y, w, h, 0); vo_x11_setlayer(mDisplay, vo_window, vo_fs); XMoveResizeWindow(mDisplay, vo_window, x, y, w, h); } /* some WMs lose ontop after fullscreen */ if ((!(vo_fs)) & vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); XMapRaised(mDisplay, vo_window); if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // some WMs change window pos on map XMoveResizeWindow(mDisplay, vo_window, x, y, w, h); XRaiseWindow(mDisplay, vo_window); XFlush(mDisplay);}void vo_x11_ontop(void){ vo_ontop = (!(vo_ontop)); vo_x11_setlayer(mDisplay, vo_window, vo_ontop);}/* * XScreensaver stuff */static int got_badwindow;static XErrorHandler old_handler;static int badwindow_handler(Display * dpy, XErrorEvent * error){ if (error->error_code != BadWindow) return (*old_handler) (dpy, error); got_badwindow = True; return 0;}static Window find_xscreensaver_window(Display * dpy){ int i; Window root = RootWindowOfScreen(DefaultScreenOfDisplay(dpy)); Window root2, parent, *kids; Window retval = 0; Atom xs_version; unsigned int nkids = 0; xs_version = XInternAtom(dpy, "_SCREENSAVER_VERSION", True); if (!(xs_version != None && XQueryTree(dpy, root, &root2, &parent, &kids, &nkids) && kids && nkids)) return 0; old_handler = XSetErrorHandler(badwindow_handler); for (i = 0; i < nkids; i++) { Atom type; int format; unsigned long nitems, bytesafter; char *v; int status; got_badwindow = False; status = XGetWindowProperty(dpy, kids[i], xs_version, 0, 200, False, XA_STRING, &type, &format, &nitems, &bytesafter, (unsigned char **) &v); XSync(dpy, False); if (got_badwindow) status = BadWindow; if (status == Success && type != None) { retval = kids[i]; break; } } XFree(kids); XSetErrorHandler(old_handler); return retval;}static Window xs_windowid = 0;static Atom deactivate;static Atom screensaver;static unsigned int time_last;void xscreensaver_heartbeat(void){ unsigned int time = GetTimerMS(); XEvent ev; if (mDisplay && xs_windowid && (time - time_last) > 30000) { time_last = time; ev.xany.type = ClientMessage; ev.xclient.display = mDisplay; ev.xclient.window = xs_windowid; ev.xclient.message_type = screensaver; ev.xclient.format = 32; memset(&ev.xclient.data, 0, sizeof(ev.xclient.data)); ev.xclient.data.l[0] = (long) deactivate; mp_msg(MSGT_VO, MSGL_DBG2, "Pinging xscreensaver.\n"); old_handler = XSetErrorHandler(badwindow_handler); XSendEvent(mDisplay, xs_windowid, False, 0L, &ev); XSync(mDisplay, False); XSetErrorHandler(old_handler); }}static void xscreensaver_disable(Display * dpy){ mp_msg(MSGT_VO, MSGL_DBG2, "xscreensaver_disable()\n"); xs_windowid = find_xscreensaver_window(dpy); if (!xs_windowid) { mp_msg(MSGT_VO, MSGL_INFO, MSGTR_CouldNotFindXScreenSaver); return; } mp_msg(MSGT_VO, MSGL_INFO, "xscreensaver_disable: xscreensaver wid=%ld.\n", xs_windowid); deactivate = XInternAtom(dpy, "DEACTIVATE", False); screensaver = XInternAtom(dpy, "SCREENSAVER", False);}static void xscreensaver_enable(void){ xs_windowid = 0;}/* * End of XScreensaver stuff */void saver_on(Display * mDisplay){#ifdef HAVE_XDPMS int nothing; if (dpms_disabled) { if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) { if (!DPMSEnable(mDisplay)) { // restoring power saving settings mp_msg(MSGT_VO, MSGL_WARN, "DPMS not available?\n"); } else { // DPMS does not seem to be enabled unless we call DPMSInfo BOOL onoff; CARD16 state; DPMSForceLevel(mDisplay, DPMSModeOn); DPMSInfo(mDisplay, &state, &onoff); if (onoff) { mp_msg(MSGT_VO, MSGL_V, "Successfully enabled DPMS\n"); } else { mp_msg(MSGT_VO, MSGL_WARN, "Could not enable DPMS\n"); } } } dpms_disabled = 0; }#endif if (timeout_save) { int dummy, interval, prefer_blank, allow_exp; XGetScreenSaver(mDisplay, &dummy, &interval, &prefer_blank, &allow_exp); XSetScreenSaver(mDisplay, timeout_save, interval, prefer_blank, allow_exp); XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, &allow_exp); timeout_save = 0; } if (stop_xscreensaver) xscreensaver_enable(); if (kdescreensaver_was_running && stop_xscreensaver) { system ("dcop kdesktop KScreensaverIface enable true 2>/dev/null >/dev/null"); kdescreensaver_was_running = 0; }}void saver_off(Display * mDisplay){ int interval, prefer_blank, allow_exp;#ifdef HAVE_XDPMS int nothing; if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) { BOOL onoff; CARD16 state;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?