LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

Вот рабочий код. Я проверил.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>

int
main (int argc, char **argv)
{
    XEvent xev;
    int fixes_opcode, fixes_event_base, fixes_error_base;
    PointerBarrier barrier;
    int dpy_w;
    int dpy_h;
    Display *dpy;

    dpy = XOpenDisplay(NULL);

    if (!XQueryExtension(dpy, "XFIXES",
			 &fixes_opcode,
			 &fixes_event_base,
			 &fixes_error_base))
	return EXIT_FAILURE;

    dpy_w = DisplayWidth (dpy, DefaultScreen (dpy));
    dpy_h = DisplayHeight (dpy, DefaultScreen (dpy));

    barrier = XFixesCreatePointerBarrier (dpy, DefaultRootWindow(dpy), 
					  100, 0, 100, dpy_h, 
					  0, 0, NULL); // for vertical barrier
    while (1) {
	XNextEvent (dpy, &xev);
    }
}

Параметры каждого монитора можно из расширения RandR узнать. Там будет указано, какой монитор где расположен и какие у них разрешения. dpy_w = DisplayWidth (dpy, DefaultScreen (dpy)); выдаст тебе ширину всего виртуального экрана :0, а не помониторно.

UPD. Или сделай так, чтобы координату вертикального барьера можно было передать через командную строчку. Скажем

./vertical-pointer-barrier 1280

Исправление Zubok, :

Вот рабочий код. Я проверил.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>

int
main (int argc, char **argv)
{
    XEvent xev;
    int fixes_opcode, fixes_event_base, fixes_error_base;
    PointerBarrier barrier;
    int dpy_w;
    int dpy_h;
    Display *dpy;

    dpy = XOpenDisplay(NULL);

    if (!XQueryExtension(dpy, "XFIXES",
			 &fixes_opcode,
			 &fixes_event_base,
			 &fixes_error_base))
	return EXIT_FAILURE;

    dpy_w = DisplayWidth (dpy, DefaultScreen (dpy));
    dpy_h = DisplayHeight (dpy, DefaultScreen (dpy));

    barrier = XFixesCreatePointerBarrier (dpy, DefaultRootWindow(dpy), 
					  100, 0, 100, dpy_h, 
					  0, 0, NULL); // for vertical barrier
    while (1) {
	XNextEvent (dpy, &xev);
    }
}

Параметры каждого монитора можно из расширения RandR узнать. Там будет указано, какой монитор где расположен и какие у них разрешения. dpy_w = DisplayWidth (dpy, DefaultScreen (dpy)); выдаст тебе ширину всего виртуального экрана :0, а не помониторно.

Исходная версия Zubok, :

Вот рабочий код. Я проверил.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>

int
main (int argc, char **argv)
{
    XEvent xev;
    int fixes_opcode, fixes_event_base, fixes_error_base;
    PointerBarrier barrier;
    int dpy_w;
    int dpy_h;
    Display *dpy;

    dpy = XOpenDisplay(NULL);

    if (!XQueryExtension(dpy, "XFIXES",
			 &fixes_opcode,
			 &fixes_event_base,
			 &fixes_error_base))
	return EXIT_FAILURE;

    dpy_w = DisplayWidth (dpy, DefaultScreen (dpy));
    dpy_h = DisplayHeight (dpy, DefaultScreen (dpy));

    barrier = XFixesCreatePointerBarrier (dpy, DefaultRootWindow(dpy), 
					  100, 0, 100, dpy_h, 
					  0, 0, NULL); // for vertical barrier
    while (1) {
	XNextEvent (dpy, &xev);
    }
}