Am 26.09.2016 um 00:11 schrieb Dmitrij D. Czarkoff <[email protected]>:
>> The diff below fixes fullscreen mode on window managers that prevent
>> applications from resizing their windows.
For example, which WM?
>> This is done by setting
>> _NET_WM_STATE_FULLSCREEN atom.
>
> Ping.
Shouldn't the WM fixed instead?
> --
> Dmitrij D. Czarkoff
>
> Index: video.c
> ===================================================================
> RCS file: /var/cvs/xenocara/app/video/video.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 video.c
> --- video.c 6 Jun 2016 19:31:22 -0000 1.19
> +++ video.c 18 Sep 2016 21:33:29 -0000
> @@ -160,6 +160,7 @@ struct video {
> int conv_type;
> int enc;
> int full_screen;
> + int net_wm;
> int width;
> int height;
> int bpf;
> @@ -178,6 +179,7 @@ int xv_get_info(struct video *);
> int xv_sel_adap(struct video *);
> void xv_dump_info(struct video *);
> int xv_init(struct video *);
> +void net_wm_supported(struct video *);
> void resize_window(struct video *, int);
> void display_event(struct video *);
>
> @@ -500,34 +502,84 @@ xv_init(struct video *vid)
> }
>
> void
> +net_wm_supported(struct video *vid)
> +{
> + struct xdsp *x = &vid->xdsp;
> + Atom query, fullscreen;
> + Atom type;
> + Atom *data;
> + long off;
> + int fmt, len = 12;
> + unsigned long nitems, remain;
> + int i;
> +
> + query = XInternAtom(x->dpy, "_NET_SUPPORTED", True);
> + fullscreen = XInternAtom(x->dpy, "_NET_WM_STATE_FULLSCREEN", \
> True);
> +
> + for (off = 0; XGetWindowProperty(x->dpy, x->rwin, query, off,
> + len, False, XA_ATOM, &type, &fmt, \
> &nitems, &remain,
> + (unsigned char **)&data) == Success; \
> off += len) {
> + if (type == XA_ATOM && fmt == 32) {
> + for (i = 0; i < nitems; i++) {
> + if (data[i] == fullscreen) {
> + vid->net_wm = 1;
> + XFree(data);
> + return;
> + }
> + }
> + }
> + XFree(data);
> + }
> +
> + return;
> +}
> +
> +void
> resize_window(struct video *vid, int fullscreen)
> {
> struct xdsp *x = &vid->xdsp;
> XWindowAttributes winatt;
> Window junk;
> - int new_width;
> - int new_height;
> int new_x;
> int new_y;
> + XEvent ev;
> + Atom property, value;
>
> if (fullscreen == 1) {
> if (vid->full_screen == 1) {
> - new_width = x->saved_w;
> - new_height = x->saved_h;
> + x->width = x->saved_w;
> + x->height = x->saved_h;
> new_x = x->saved_x;
> new_y = x->saved_y;
> - vid->full_screen = 0;
> } else {
> - new_width = x->max_width;
> - new_height = x->max_height;
> + x->width = x->max_width;
> + x->height = x->max_height;
> new_x = 0;
> new_y = 0;
> - vid->full_screen = 1;
> }
> - x->width = new_width;
> - x->height = new_height;
> - XMoveResizeWindow(x->dpy, x->window, new_x, new_y,
> - new_width, new_height);
> +
> + vid->full_screen = !vid->full_screen;
> +
> + if (vid->net_wm) {
> + property = XInternAtom(x->dpy, "_NET_WM_STATE", \
> False);
> + value = XInternAtom(x->dpy, "_NET\
> _WM_STATE_FULLSCREEN",
> + False);
> +
> + memset(&ev, 0, sizeof(ev));
> + ev.type = ClientMessage;
> + ev.xclient.window = x->window;
> + ev.xclient.message_type = property;
> + ev.xclient.format = 32;
> + ev.xclient.data.l[0] = vid->full_screen;
> + ev.xclient.data.l[1] = value;
> +
> + XSendEvent(x->dpy, x->rwin, False,
> + SubstructureNotifyMask | Subs\
> tructureRedirectMask,
> + &ev);
> + } else {
> + XMoveResizeWindow(x->dpy, x->window, x->width,
> + x->height, new_x, new_y);
> + }
> } else if (!vid->full_screen) {
> XGetWindowAttributes(x->dpy, x->window, &winatt);
> XTranslateCoordinates(x->dpy, x->window, x->rwin,
> @@ -536,8 +588,8 @@ resize_window(struct video *vid, int ful
> x->saved_h = x->height = winatt.height;
> x->saved_x = new_x;
> x->saved_y = new_y;
> - XResizeWindow(x->dpy, x->window, x->width, x->height);
> }
> +
> XSync(x->dpy, False);
> XSync(x->dpy, True);
> }
> @@ -1435,6 +1487,9 @@ setup(struct video *vid)
> if (!mmap_init(vid))
> return 0;
> }
> +
> + if (vid->mode & M_OUT_XV)
> + net_wm_supported(vid);
>
> return 1;
> }
>