mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
136 lines
3.2 KiB
C
136 lines
3.2 KiB
C
/* quick and dirty test application that demonstrates: Notify grabbing
|
|
*
|
|
* TODO: remake
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xproto.h>
|
|
#include <WMaker.h>
|
|
|
|
|
|
Display *dpy;
|
|
Window leader;
|
|
WMAppContext *app;
|
|
Atom delete_win;
|
|
Atom prots[6];
|
|
XWMHints *hints;
|
|
WMMenu *menu;
|
|
|
|
|
|
static void
|
|
quit(void *foo, int item, Time time)
|
|
{
|
|
exit(0);
|
|
}
|
|
|
|
|
|
static void
|
|
hide(void *foo, int item, Time time)
|
|
{
|
|
WMHideApplication(app);
|
|
}
|
|
|
|
|
|
int notify_print( int id, XEvent *event, void *data )
|
|
{
|
|
printf( "Got notification 0x%x, window 0x%lx, data '%s'\n",
|
|
id, event->xclient.data.l[1], (char *) data );
|
|
return True;
|
|
}
|
|
|
|
|
|
static void
|
|
newwin(void *foo, int item, Time time)
|
|
{
|
|
Window win;
|
|
XClassHint classhint;
|
|
char title[100];
|
|
|
|
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
|
|
0, 0, 200, 100, 0, 0, 0);
|
|
prots[0] = delete_win;
|
|
XSetWMProtocols(dpy, win, prots, 1);
|
|
sprintf(title, "Notify Test Window");
|
|
XStoreName(dpy, win, title);
|
|
|
|
/* set class hint */
|
|
classhint.res_name = "notest";
|
|
classhint.res_class = "Notest";
|
|
XSetClassHint(dpy, win, &classhint);
|
|
|
|
hints = XAllocWMHints();
|
|
/* set window group leader */
|
|
hints->window_group = leader;
|
|
hints->flags = WindowGroupHint;
|
|
XSetWMHints(dpy, win, hints);
|
|
|
|
WMAppAddWindow(app, win);
|
|
XMapWindow(dpy, win);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
XClassHint classhint;
|
|
|
|
dpy = XOpenDisplay("");
|
|
if (!dpy) {
|
|
puts("could not open display!");
|
|
exit(1);
|
|
}
|
|
delete_win = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
|
|
|
|
leader = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 10, 10,
|
|
0, 0, 0);
|
|
/* set class hint */
|
|
classhint.res_name = "notest";
|
|
classhint.res_class = "Notest";
|
|
XSetClassHint(dpy, leader, &classhint);
|
|
|
|
/* set window group leader to self */
|
|
hints = XAllocWMHints();
|
|
hints->window_group = leader;
|
|
hints->flags = WindowGroupHint;
|
|
XSetWMHints(dpy, leader, hints);
|
|
|
|
/* create app context */
|
|
app = WMAppCreateWithMain(dpy, DefaultScreen(dpy), leader);
|
|
menu = WMMenuCreate(app, "Notify Test Menu");
|
|
WMMenuAddItem(menu, "Hide", (WMMenuAction)hide, NULL, NULL, NULL);
|
|
WMMenuAddItem(menu, "Quit", (WMMenuAction)quit, NULL, NULL, NULL);
|
|
|
|
WMAppSetMainMenu(app, menu);
|
|
WMRealizeMenus(app);
|
|
|
|
/* Get some WindowMaker notifications */
|
|
WMNotifySet( app, WMN_APP_START, notify_print, (void *) "App start" );
|
|
WMNotifySet( app, WMN_APP_EXIT, notify_print, (void *) "App end" );
|
|
WMNotifySet( app, WMN_WIN_FOCUS, notify_print, (void *) "Focus in" );
|
|
WMNotifySet( app, WMN_WIN_UNFOCUS, notify_print, (void *) "Focus out" );
|
|
WMNotifySet( app, WMN_NOTIFY_ALL, notify_print, (void *) "Unknown type" );
|
|
WMNotifyMaskUpdate( app ); /* Mask isn't actually set till we do this */
|
|
|
|
/* set command to use to startup this */
|
|
XSetCommand(dpy, leader, argv, argc);
|
|
|
|
/* create first window */
|
|
newwin(NULL, 0, 0);
|
|
|
|
|
|
XFlush(dpy);
|
|
while( 1 ) {
|
|
XEvent ev;
|
|
XNextEvent(dpy, &ev);
|
|
if (ev.type==ClientMessage) {
|
|
if (ev.xclient.data.l[0]==delete_win) {
|
|
XDestroyWindow(dpy,ev.xclient.window);
|
|
break;
|
|
}
|
|
}
|
|
WMProcessEvent(app, &ev);
|
|
}
|
|
exit(0);
|
|
}
|
|
|