You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.6 KiB
87 lines
2.6 KiB
// tests for window gravity |
|
|
|
#include <iostream> |
|
#include <stdlib.h> |
|
#include <X11/Xlib.h> |
|
#include <X11/Xutil.h> |
|
|
|
using namespace std; |
|
|
|
const int gravities[ 10 ] = { |
|
NorthWestGravity, |
|
NorthGravity, |
|
NorthEastGravity, |
|
WestGravity, |
|
CenterGravity, |
|
EastGravity, |
|
SouthWestGravity, |
|
SouthGravity, |
|
SouthEastGravity, |
|
StaticGravity |
|
}; |
|
|
|
const char* const gravity_names[ 10 ] = { |
|
"NW", "N", "NE", "W", "C", "E", "SW", "S", "SE", "ST" |
|
}; |
|
|
|
Display* dpy = NULL; |
|
|
|
int get_gravity(const char* name) |
|
{ |
|
for (int i = 0; |
|
i < 10; |
|
++i) |
|
if (strcmp(name, gravity_names[ i ]) == 0) |
|
return gravities[ i ]; |
|
cerr << "Wrong gravity name" << endl; |
|
exit(1); |
|
} |
|
|
|
void test(const char* gravity) |
|
{ |
|
XSetWindowAttributes attrs; |
|
XSizeHints hints; |
|
hints.flags = USPosition | PWinGravity; |
|
hints.win_gravity = get_gravity(gravity); |
|
Window w = XCreateWindow(dpy, DefaultRootWindow(dpy), 100, 100, 200, 100, 0, CopyFromParent, CopyFromParent, |
|
CopyFromParent, 0, &attrs); |
|
XSetWMNormalHints(dpy, w, &hints); |
|
XSelectInput(dpy, w, StructureNotifyMask | ButtonPressMask); |
|
XMapWindow(dpy, w); |
|
for (;;) { |
|
XEvent ev; |
|
XNextEvent(dpy, &ev); |
|
if (ev.type == ConfigureNotify) { |
|
cout << "CONFIGURENOTIFY:" << ev.xany.send_event << ":" << ev.xconfigure.x << ":" << ev.xconfigure.y |
|
<< ":" << ev.xconfigure.width << ":" << ev.xconfigure.height << endl; |
|
Window root, child; |
|
int x, x_local, y, y_local; |
|
unsigned int width, height, border, depth; |
|
XGetGeometry(dpy, w, &root, &x_local, &y_local, &width, &height, &border, &depth); |
|
XTranslateCoordinates(dpy, w, root, 0, 0, &x, &y, &child); |
|
cout << "GEOMETRY:" << x << ":" << y << ":" << width << ":" << height << ":(" << x_local << ":" << y_local << ")" << endl; |
|
} else if (ev.type == ButtonPress) { |
|
if (ev.xbutton.button == Button1) { // move |
|
cout << "MOVE" << endl; |
|
XMoveWindow(dpy, w, 100, 100); |
|
} else if (ev.xbutton.button == Button2) { // resize |
|
cout << "RESIZE" << endl; |
|
XResizeWindow(dpy, w, 200, 100); |
|
} else if (ev.xbutton.button == Button3) { // move and resize |
|
cout << "MOVERESIZE" << endl; |
|
XMoveResizeWindow(dpy, w, 100, 100, 200, 100); |
|
} |
|
} |
|
} |
|
} |
|
|
|
int main(int argc, char* argv[]) |
|
{ |
|
dpy = XOpenDisplay(NULL); |
|
if (argc != 2) { |
|
cerr << "specify gravity" << endl; |
|
exit(1); |
|
} |
|
test(argv[ 1 ]); |
|
XCloseDisplay(dpy); |
|
}
|
|
|