xwinwrap.c + два монитора

Модератор: Модераторы разделов

qqq1971
Сообщения: 157

xwinwrap.c + два монитора

Сообщение qqq1971 »

У меня 2 монитора, настроены как twinview.
Пытаюсь сделать видео в качестве обоев рабочего стола.
Скачал xwinwrap, запускаю, а кино показывает не на основном мониторе, а на телевизоре.

Скачал исходник и закомментарил одну строку в нем:
// XSetWMProperties (dpy, win, NULL, NULL, argv, argc, &xsh, &xwmh, NULL);

Кино стало показываться на основном экране.

А вопросы у меня такие (С и разработка в иксах - ЦПШ со словарем):
1. Что я сделал, почему такой кардинальный результат эта строчка дает?
2. Как правильно управлять выводом на какой монитор повесить кино?

Исходник маленький, приведу его полностью.

Код:

/* * Copyright Вc 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman <davidr@novell.com> */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/Xproto.h> #include <X11/extensions/shape.h> #include <X11/extensions/Xrender.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/types.h> #define WIDTH 512 #define HEIGHT 384 #define OPAQUE 0xffffffff #define NAME "xwinwrap" static pid_t pid = 0; static char **childArgv = 0; static int nChildArgv = 0; static int addArguments (char **argv, int n) { char **newArgv; int i; newArgv = realloc (childArgv, sizeof (char *) * (nChildArgv + n)); if (!newArgv) return 0; for (i = 0; i < n; i++) newArgv[nChildArgv + i] = argv[i]; childArgv = newArgv; nChildArgv += n; return n; } static void setWindowOpacity (Display *dpy, Window win, unsigned int opacity) { CARD32 o; o = opacity; XChangeProperty (dpy, win, XInternAtom (dpy, "_NET_WM_WINDOW_OPACITY", 0), XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &o, 1); } static Visual * findArgbVisual (Display *dpy, int scr) { XVisualInfo *xvi; XVisualInfo template; int nvi; int i; XRenderPictFormat *format; Visual *visual; template.screen = scr; template.depth = 32; template.class = TrueColor; xvi = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &template, &nvi); if (!xvi) return 0; visual = 0; for (i = 0; i < nvi; i++) { format = XRenderFindVisualFormat (dpy, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; break; } } XFree (xvi); return visual; } static void sigHandler (int sig) { kill (pid, sig); } static void usage (void) { fprintf (stderr, "Usage: %s [-g] [-ni] [-argb] [-fs] [-s] [-st] [-sp] [-a] " "[-b] [-nf]\n [-o OPACITY] -- COMMAND ARG1...\n", NAME); } int main (int argc, char **argv) { Display *dpy; Window win; Window root; int screen; XSizeHints xsh; XWMHints xwmh; char widArg[256]; char *widArgv[] = { widArg }; char *endArg = NULL; int i; int status = 0; unsigned int opacity = OPAQUE; int x = 0; int y = 0; unsigned int width = WIDTH; unsigned int height = HEIGHT; int argb = 0; int fullscreen = 0; int noInput = 0; int noFocus = 0; Atom state[256]; int nState = 0; dpy = XOpenDisplay (NULL); if (!dpy) { fprintf (stderr, "%s: Error: couldn't open display\n", argv[0]); return 1; } screen = DefaultScreen (dpy); root = RootWindow (dpy, screen); for (i = 1; i < argc; i++) { if (strcmp (argv[i], "-g") == 0) { if (++i < argc) XParseGeometry (argv[i], &x, &y, &width, &height); } else if (strcmp (argv[i], "-ni") == 0) { noInput = 1; } else if (strcmp (argv[i], "-argb") == 0) { argb = 1; } else if (strcmp (argv[i], "-fs") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_FULLSCREEN", 0); fullscreen = 1; } else if (strcmp (argv[i], "-s") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_STICKY", 0); } else if (strcmp (argv[i], "-st") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_SKIP_TASKBAR", 0); } else if (strcmp (argv[i], "-sp") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_SKIP_PAGER", 0); } else if (strcmp (argv[i], "-a") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_ABOVE", 0); } else if (strcmp (argv[i], "-b") == 0) { state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_BELOW", 0); } else if (strcmp (argv[i], "-nf") == 0) { noFocus = 1; } else if (strcmp (argv[i], "-o") == 0) { if (++i < argc) opacity = (unsigned int) (atof (argv[i]) * OPAQUE); } else if (strcmp (argv[i], "--") == 0) { break; } else { usage (); return 1; } } for (i = i + 1; i < argc; i++) { if (strcmp (argv[i], "WID") == 0) addArguments (widArgv, 1); else addArguments (&argv[i], 1); } if (!nChildArgv) { fprintf (stderr, "%s: Error: couldn't create command line\n", argv[0]); usage (); return 1; } addArguments (&endArg, 1); if (fullscreen) { xsh.flags = PSize | PPosition; xsh.width = DisplayWidth (dpy, screen); xsh.height = DisplayHeight (dpy, screen); } else { xsh.flags = PSize; xsh.width = width; xsh.height = height; } xwmh.flags = InputHint; xwmh.input = !noFocus; if (argb) { XSetWindowAttributes attr; Visual *visual; visual = findArgbVisual (dpy, screen); if (!visual) { fprintf (stderr, "%s: Error: couldn't find argb visual\n", argv[0]); return 1; } attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, root, visual, AllocNone); win = XCreateWindow (dpy, root, 0, 0, xsh.width, xsh.height, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap, &attr); } else { win = XCreateWindow (dpy, root, 0, 0, xsh.width, xsh.height, 0, CopyFromParent, InputOutput, CopyFromParent, 0, NULL); } // XSetWMProperties (dpy, win, NULL, NULL, argv, argc, &xsh, &xwmh, NULL); if (opacity != OPAQUE) setWindowOpacity (dpy, win, opacity); if (noInput) { Region region; region = XCreateRegion (); if (region) { XShapeCombineRegion (dpy, win, ShapeInput, 0, 0, region, ShapeSet); XDestroyRegion (region); } } if (nState) XChangeProperty (dpy, win, XInternAtom (dpy, "_NET_WM_STATE", 0), XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); XMapWindow (dpy, win); XSync (dpy, win); sprintf (widArg, "0x%x", (int) win); pid = fork (); switch (pid) { case -1: perror ("fork"); return 1; case 0: execvp (childArgv[0], childArgv); perror (childArgv[0]); exit (2); break; default: break; } signal (SIGTERM, sigHandler); signal (SIGINT, sigHandler); for (;;) { if (waitpid (pid, &status, 0) != -1) { if (WIFEXITED (status)) fprintf (stderr, "%s died, exit status %d\n", childArgv[0], WEXITSTATUS (status)); break; } } XDestroyWindow (dpy, win); XCloseDisplay (dpy); return 0; }
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: xwinwrap.c + два монитора

Сообщение diesel »

Спасибо сказали: