mirror of
https://github.com/brl/mutter.git
synced 2024-11-30 20:01:00 -05:00
135 lines
2.8 KiB
C
135 lines
2.8 KiB
C
|
#include <X11/Xlib.h>
|
||
|
#include <X11/Xutil.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <glib.h>
|
||
|
|
||
|
static Bool
|
||
|
all_events (Display *display,
|
||
|
XEvent *event,
|
||
|
XPointer arg)
|
||
|
{
|
||
|
return True;
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
static void
|
||
|
get_size (Display *d, Drawable draw,
|
||
|
int *xp, int *yp, int *widthp, int *heightp)
|
||
|
{
|
||
|
int x, y;
|
||
|
unsigned int width, height, border, depth;
|
||
|
Window root;
|
||
|
|
||
|
XGetGeometry (d, draw, &root, &x, &y, &width, &height, &border, &depth);
|
||
|
|
||
|
if (xp)
|
||
|
*xp = x;
|
||
|
if (yp)
|
||
|
*yp = y;
|
||
|
if (widthp)
|
||
|
*widthp = width;
|
||
|
if (*heightp)
|
||
|
*heightp = height;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
int
|
||
|
main (int argc, char **argv)
|
||
|
{
|
||
|
Display *d;
|
||
|
Window zero_min_size;
|
||
|
XSizeHints hints;
|
||
|
int screen;
|
||
|
XEvent ev;
|
||
|
int x, y, width, height;
|
||
|
Pixmap pix;
|
||
|
GC gc;
|
||
|
XGCValues gc_vals;
|
||
|
gboolean redraw_pending;
|
||
|
|
||
|
d = XOpenDisplay (NULL);
|
||
|
|
||
|
screen = DefaultScreen (d);
|
||
|
|
||
|
x = 0;
|
||
|
y = 0;
|
||
|
width = 100;
|
||
|
height = 100;
|
||
|
|
||
|
zero_min_size = XCreateSimpleWindow (d, RootWindow (d, screen),
|
||
|
x, y, width, height, 0,
|
||
|
WhitePixel (d, screen),
|
||
|
WhitePixel (d, screen));
|
||
|
|
||
|
XSelectInput (d, zero_min_size,
|
||
|
ButtonPressMask | ExposureMask | StructureNotifyMask);
|
||
|
|
||
|
hints.flags = PMinSize;
|
||
|
|
||
|
hints.min_width = 0;
|
||
|
hints.min_height = 0;
|
||
|
|
||
|
XSetWMNormalHints (d, zero_min_size, &hints);
|
||
|
XMapWindow (d, zero_min_size);
|
||
|
|
||
|
redraw_pending = FALSE;
|
||
|
while (1)
|
||
|
{
|
||
|
XNextEvent (d, &ev);
|
||
|
|
||
|
switch (ev.xany.type)
|
||
|
{
|
||
|
case ButtonPress:
|
||
|
if (ev.xbutton.button == 1)
|
||
|
{
|
||
|
g_print ("Exiting on button 1 press\n");
|
||
|
exit (0);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case ConfigureNotify:
|
||
|
x = ev.xconfigure.x;
|
||
|
y = ev.xconfigure.y;
|
||
|
width = ev.xconfigure.width;
|
||
|
height = ev.xconfigure.height;
|
||
|
|
||
|
redraw_pending = TRUE;
|
||
|
break;
|
||
|
|
||
|
case Expose:
|
||
|
redraw_pending = TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/* Primitive event compression */
|
||
|
if (XCheckIfEvent (d, &ev, all_events, NULL))
|
||
|
{
|
||
|
XPutBackEvent (d, &ev);
|
||
|
}
|
||
|
else if (redraw_pending)
|
||
|
{
|
||
|
pix = XCreatePixmap (d, zero_min_size, width, height,
|
||
|
DefaultDepth (d, screen));
|
||
|
|
||
|
gc_vals.foreground = WhitePixel (d, screen);
|
||
|
|
||
|
gc = XCreateGC (d, pix, GCForeground, &gc_vals);
|
||
|
|
||
|
XFillRectangle (d, pix, gc, 0, 0, width, height);
|
||
|
|
||
|
XCopyArea (d, pix, zero_min_size, gc, 0, 0, width, height, 0, 0);
|
||
|
|
||
|
XFreePixmap (d, pix);
|
||
|
XFreeGC (d, gc);
|
||
|
|
||
|
redraw_pending = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|