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, &nothing, &nothing))        {            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, &nothing, &nothing))    {        BOOL onoff;        CARD16 state;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?