Dobrý den,
jen jsem trochu upravil TinyWM, ale stejně mi to nikdy nešlo:
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <cstdio>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
extern struct _IO_FILE *stdin; // Standard input stream
extern struct _IO_FILE *stdout; // Standard output stream
extern struct _IO_FILE *stderr; // Standard error output stream
int main()
{
Display *currentDisplay = XOpenDisplay(NULL);
if(!currentDisplay)
{
fprintf(stderr, "Fatal error -> Can't open display!");
return 1;
}
Window rootWindow = DefaultRootWindow(currentDisplay);
XWindowAttributes windowAttributes;
XButtonEvent mouseButton;
int offsetX, offsetY;
XEvent systemEvent;
XGrabKey
(
currentDisplay,
XKeysymToKeycode(currentDisplay, XK_F1),
Mod1Mask,
rootWindow,
True,
GrabModeAsync,
GrabModeAsync
);
XGrabButton
(
currentDisplay,
1,
Mod1Mask,
rootWindow,
True,
ButtonPressMask,
GrabModeAsync,
GrabModeAsync,
None,
None
);
XGrabButton
(
currentDisplay,
3,
Mod1Mask,
rootWindow,
True,
ButtonPressMask,
GrabModeAsync,
GrabModeAsync,
None,
None
);
fprintf(stderr, "Welcome in IwroQ!");
while(true)
{
XNextEvent(currentDisplay, &systemEvent);
switch(systemEvent.type)
{
case KeyPress:
if(systemEvent.xkey.subwindow != None)
XRaiseWindow(currentDisplay, systemEvent.xkey.subwindow);
break;
case ButtonPress:
if(systemEvent.xbutton.subwindow != None)
{
XGrabPointer
(
currentDisplay,
systemEvent.xbutton.subwindow,
True,
PointerMotionMask | ButtonReleaseMask,
GrabModeAsync,
GrabModeAsync,
None,
None,
CurrentTime
);
XGetWindowAttributes(currentDisplay, systemEvent.xbutton.subwindow, &windowAttributes);
mouseButton = systemEvent.xbutton;
}
break;
case MotionNotify:
while(XCheckTypedEvent(currentDisplay, MotionNotify, &systemEvent));
offsetX = systemEvent.xbutton.x_root - mouseButton.x_root;
offsetY = systemEvent.xbutton.y_root - mouseButton.y_root;
XMoveResizeWindow
(
currentDisplay,
systemEvent.xmotion.window,
windowAttributes.x + (mouseButton.button == 1 ? offsetX : 0),
windowAttributes.y + (mouseButton.button == 1 ? offsetY : 0),
MAX(1, windowAttributes.width + (mouseButton.button == 3 ? offsetX : 0)),
MAX(1, windowAttributes.height + (mouseButton.button == 3 ? offsetY : 0))
);
break;
case ButtonRelease:
XUngrabPointer(currentDisplay, CurrentTime);
break;
}
}
}
(pouštím z Roxtermu pomocí DISPLAY=: 1)
Abych věděl, zda to vůbec běží, dal jsem tam pro kontrolu ta "fprintf". Běží to, avšak na vstup (jakýkoliv) to absolutně kašle. Neví někdo proč?
Děkuji.
EDIT:
Už vím jistě, že "XNextEvent(currentDisplay, &systemEvent);" čeká na událost, která nepřichází. Ovšem - proč nepřichází?