LINUX.ORG.RU

xlib: проба пера


0

0

Решил тут попробовать поюзать сабж. Ну, и для примера выбрал ни много ни мало - window manager:-)

Нашел в инете некий tinywm - пример примитивного wm, который, по идее, умеет двигать/ресайзить окошки.

Вот, собственно, код:

#include <X11/Xlib.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main()
{
    Window root;
    XWindowAttributes attr;
    XButtonEvent start;
    XEvent ev;
    
    Display * dpy = XOpenDisplay(0);

    if(!dpy) return 1;

    root = DefaultRootWindow(dpy);

    XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("F1")), Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
    XGrabButton(dpy, 1, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
    XGrabButton(dpy, 3, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);

    for(;;)
    {
        XNextEvent(dpy, &ev);
        if(ev.type == KeyPress && ev.xkey.subwindow != None)
            XRaiseWindow(dpy, ev.xkey.subwindow);
        else if(ev.type == ButtonPress && ev.xbutton.subwindow != None)
        {
            XGrabPointer(dpy, ev.xbutton.subwindow, True,
                    PointerMotionMask|ButtonReleaseMask, GrabModeAsync,
                    GrabModeAsync, None, None, CurrentTime);
            XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
            start = ev.xbutton;
        }
        else if(ev.type == MotionNotify)
        {
            int xdiff;
            int ydiff;
            
            while(XCheckTypedEvent(dpy, MotionNotify, &ev));
            xdiff = ev.xbutton.x_root - start.x_root;
            ydiff = ev.xbutton.y_root - start.y_root;
            XMoveResizeWindow(dpy, ev.xmotion.window,
                attr.x + (start.button==1 ? xdiff : 0),
                attr.y + (start.button==1 ? ydiff : 0),
                MAX(1, attr.width + (start.button==3 ? xdiff : 0)),
                MAX(1, attr.height + (start.button==3 ? ydiff : 0)));
        }
        else if(ev.type == ButtonRelease)
            XUngrabPointer(dpy, CurrentTime);
    }
}

Компилю, запускаю - и никаких изменений, что до запуска, что после. В консоль ничего не валит.

Что я делаю не так? И что сделать, чтобы оно таки заработало?

PS: Пускаю это все в VirtualBox, guest os - debian etch.
★★★

а) нафига вбокс? есть xnest.

б) а каких ты изменений ожидал? оно ничего не малюет — вот ничего и не меняется. в остальном должно левой кнопкой елозить, правой — ресайзить.

anonymous
()

алсо — грабь, не грабь, а XSelectInput делать надо. иначе ничего не придёт.

впрочем, и так работать всё равно не будет. патамуша гладиолус.

anonymous
()
Ответ на: комментарий от anonymous

> а каких ты изменений ожидал? оно ничего не малюет — вот ничего и не меняется

Я и не ждал, что оно что-то нарисует, я про ресайз и говорил.

friday ★★★
() автор топика
Ответ на: комментарий от anonymous

> алсо — грабь, не грабь, а XSelectInput делать надо. иначе ничего не придёт.

А можно пример, если не сложно?

friday ★★★
() автор топика
Ответ на: комментарий от friday

примерно вот так:
XSelectInput(dpy, root, KeyPressMask|ButtonPressMask|ButtonReleaseMask);

но всё равно гладиолус, ибо хватает сообщения только на рутовом окне. каковое не елозится и не ресайзится. не стоит начинать изучение xlib с wm. и даже продолжать так не стоит.

anonymous
()

Все работает. Mod1+Button1=перетаскивает. Mod1+Button3=ресайзит.

Анонимусу с гладиолусом передаю привет и пожелание запустить этот пример и почитать документацию.

anonymous
()
Ответ на: комментарий от anonymous

> не стоит начинать изучение xlib с wm. и даже продолжать так не стоит

Собсно, есть задача - написать wm и несколько приложений под него. Тут уж никуда не денешься.

friday ★★★
() автор топика
Ответ на: комментарий от friday

э… да, кажыдцо я ошибся с устатку. извиняюсь. у меня-то alt занят, соответственно до xnest не добирался.

anonymous
()
Ответ на: комментарий от friday

>Собсно, есть задача - написать wm и несколько приложений под него. Тут уж никуда не денешься.

взять что-то уже написаное и обработать напильником?

anonymous
()
Ответ на: комментарий от Valeriy_Onuchin

таки да — это я с устатку напутал. давно wm не писал. %-))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.