From 0448b4965db43b377fd96acb35a67296023f7b23 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sat, 9 Sep 2017 21:24:26 -0400 Subject: [PATCH] fookb: Port to libdockapp. In addition to the obvious simplification to the code by removing all the window creation stuff, this also allows us to let users pick whether they want to run fookb as a dockapp or as a normal windowed application at runtime using libdockapp's --windowed command line option. Previously, this was done during build using configure's --enable-wmaker option. --- fookb/Makefile.am | 4 +- fookb/configure.ac | 1 + fookb/fookb.c | 229 +++++---------------------------------------- fookb/images.c | 2 +- 4 files changed, 29 insertions(+), 207 deletions(-) diff --git a/fookb/Makefile.am b/fookb/Makefile.am index 0f0a075..4c1840f 100644 --- a/fookb/Makefile.am +++ b/fookb/Makefile.am @@ -5,8 +5,8 @@ dist_man_MANS = fookb.1x dist_pkgdata_DATA = 1.xpm 2.xpm 3.xpm 4.xpm rus.xpm lat.xpm boom.xpm \ En.xpm Ru.xpm beep_spring.au -AM_CFLAGS = $(Xlib_CFLAGS) $(libXpm_CFLAGS) $(WUtil_CFLAGS) -LIBS += $(Xlib_LIBS) $(libXpm_LIBS) $(WUtil_LIBS) +AM_CFLAGS = $(Xlib_CFLAGS) $(libXpm_CFLAGS) $(WUtil_CFLAGS) $(libdockapp_CFLAGS) +LIBS += $(Xlib_LIBS) $(libXpm_LIBS) $(WUtil_LIBS) $(libdockapp_LIBS) EXTRA_DIST = copyright fookb.cf KNOWN_BUGS LICENSE README.russian.koi8-r \ README.russian.utf-8 diff --git a/fookb/configure.ac b/fookb/configure.ac index ef0f509..ac37c18 100644 --- a/fookb/configure.ac +++ b/fookb/configure.ac @@ -17,6 +17,7 @@ dnl Checks for libraries. PKG_CHECK_MODULES([Xlib], [x11]) PKG_CHECK_MODULES([libXpm], [xpm]) PKG_CHECK_MODULES([WUtil], [WUtil]) +PKG_CHECK_MODULES([libdockapp], [dockapp]) AC_ARG_ENABLE( [wmaker], diff --git a/fookb/fookb.c b/fookb/fookb.c index 7535214..c6cf888 100644 --- a/fookb/fookb.c +++ b/fookb/fookb.c @@ -17,6 +17,8 @@ /* XKB fun */ #include +#include + /* My own fun */ #include "fookb.h" #include "images.h" @@ -26,92 +28,27 @@ #define sterror(x) (void)printf("Strange error, please report! %s:%d, %s\n",\ __FILE__, __LINE__, x) - -static void getGC(Window win, GC *gc, Display *dpy) -{ - unsigned long valuemask = 0; /* No data in ``values'' */ - XGCValues values; - *gc = XCreateGC(dpy, win, valuemask, &values); - /* FIXME Check if there was an error */ -/* XSetForeground(dpy, *gc, BlackPixel(dpy, scr)); */ -} - - int main(int argc, register char *argv[]) { - Display *dpy; - int scr; - Window root; - - int err; - - int event_rtrn; /* for XkbOpenDisplay */ - int error_rtrn; - int reason_rtrn; - - XkbEvent labuda; /* Xkb event. X event will be labuda.core */ - - Window billy; /* _The_ Window */ - -#ifdef WMAKER - Window dilly; /* ...and his icon */ -#endif - - int border = 0; /* _The_ Window parameters */ - - XWMHints *wm_hints; - XClassHint class_hints; - -#ifdef WMAKER /* If we use Windowmaker, _The_ Window will */ - XSizeHints *BigBunny; /* be withdrawn. And we do not want to - place empty border by hand. */ -#endif - - GC gc; /* Graphic context */ - - char resn[] = "fookb"; - char resc[] = "Fookb"; - - + XkbEvent labuda; /* Xkb event. X event will be labuda.core */ int state = 0; /* We suppose that latin keyboard is the primal state FIXME */ + Pixmap pixmap; - /* - event_rtrn = malloc(sizeof(int)); - error_rtrn = malloc(sizeof(int)); - reason_rtrn = malloc(sizeof(int)); - */ - XrmInitialize(); /* We should initialize X resource - manager before doing something else - */ + DAParseArguments(argc, argv, NULL, 0, + "XKB state indicator for Window Maker", + PACKAGE_STRING); - ParseOptions(&argc, argv); /* We should parse command line - options and try to find '-display' - before opening X display */ - -/* Go, fighters, go! */ - dpy = XkbOpenDisplay(mydispname, - &event_rtrn, - &error_rtrn, NULL, NULL, &reason_rtrn); - -/* Oops. */ - if (dpy == NULL) { - (void)puts("Cannot open display."); - exit(EXIT_FAILURE); - } - - scr = DefaultScreen(dpy); - root = RootWindow(dpy, scr); - - MoreOptions(dpy); /* Now we can parse X server resource - database. It is not available - before display is opened */ + DAOpenDisplay(NULL, argc, argv); + read_images(DADisplay); /* Let's read icon images */ + DACreateIcon(PACKAGE_NAME, get_width(), get_height(), argc, argv); + XSelectInput(DADisplay, DAWindow, ButtonPressMask); /* We would like receive the only Xkb event: XkbStateNotify. And only * when XkbLockGroup happens. */ - if (False == XkbSelectEvents(dpy, + if (False == XkbSelectEvents(DADisplay, XkbUseCoreKbd, XkbAllEventsMask, 0)) { @@ -119,7 +56,7 @@ int main(int argc, register char *argv[]) exit(EXIT_FAILURE); } /* Deselect all events */ - if (False == XkbSelectEventDetails(dpy, + if (False == XkbSelectEventDetails(DADisplay, XkbUseCoreKbd, XkbStateNotify, XkbAllEventsMask, @@ -128,127 +65,18 @@ int main(int argc, register char *argv[]) exit(EXIT_FAILURE); } /* Select XkbStateNotify/XkbgroupLock */ - read_images(dpy); /* Let's read icon images */ + pixmap = DAMakePixmap(); -/* Run out! */ - billy = XCreateSimpleWindow(dpy, - root, - 0, 0, - get_width(), get_height(), - border, - BlackPixel(dpy, scr), - WhitePixel(dpy, scr)); - XStoreName(dpy, billy, "fookb"); + update_window(pixmap, DAGC, state, DADisplay); + DASetPixmap(pixmap); -#ifdef WMAKER - dilly = XCreateSimpleWindow(dpy, - root, - 0, 0, - get_width(), get_height(), - border, - BlackPixel(dpy, scr), - WhitePixel(dpy, scr)); -#endif - - class_hints.res_name = resn; - class_hints.res_class = resc; - - err = XSetClassHint(dpy, billy, &class_hints); - switch(err) { - case BadAlloc: - sterror("BadAlloc"); - exit(EXIT_FAILURE); - case BadWindow: - sterror("BadWindow"); - exit(EXIT_FAILURE); - } - - wm_hints = XAllocWMHints(); - wm_hints->window_group = billy; - -#ifdef WMAKER - wm_hints->icon_window = dilly; -#endif - - wm_hints->input = False; - wm_hints->flags = InputHint | WindowGroupHint; - -#ifdef WMAKER - wm_hints->flags = wm_hints->flags | IconWindowHint; - err = XSetWMHints(dpy, dilly, wm_hints); - switch(err) { - case BadAlloc: - sterror("BadAlloc"); - exit(EXIT_FAILURE); - case BadWindow: - sterror("BadWindow"); - exit(EXIT_FAILURE); - } - wm_hints->initial_state = WithdrawnState; - wm_hints->flags = wm_hints->flags | StateHint; -#endif - - err = XSetWMHints(dpy, billy, wm_hints); - switch(err) { - case BadAlloc: - sterror("BadAlloc"); - exit(EXIT_FAILURE); - case BadWindow: - sterror("BadWindow"); - exit(EXIT_FAILURE); - } - -#ifdef WMAKER - /* Look at the comment for XSizeHints * BigBunny */ - BigBunny = XAllocSizeHints(); - if (NULL == BigBunny) { - (void)printf("Not enough memory, %s:%d.\n", __FILE__, __LINE__); - exit(EXIT_FAILURE); - } -/* Nasty Hack. XSizeHints.x & XSizeHints.y are obsolete. */ - BigBunny->x = 0; - BigBunny->y = 0; - BigBunny->flags = PPosition; - XSetWMNormalHints(dpy, billy, BigBunny); - XFree(BigBunny); -#endif - -/* The only thing we would like to do - update our billy */ -#ifndef WMAKER - XSelectInput(dpy, billy, ExposureMask | ButtonPressMask); -#else /* ...or dilly?! */ - XSelectInput(dpy, dilly, ExposureMask | ButtonPressMask); -#endif - - XSetCommand(dpy, billy, argv, argc); - -/* Programmer supplied functions */ -#ifndef WMAKER - getGC(billy, &gc, dpy); -#else - getGC(dilly, &gc, dpy); -#endif - - -/* Let's look */ - XMapWindow(dpy, billy); /* We would like to see the window. */ + DAShow(); /* HELLO! HELLO! HELLO! Is that our GOOD FRIEND main loop here? */ while (1) { - XNextEvent(dpy, &labuda.core); + XNextEvent(DADisplay, &labuda.core); switch (labuda.core.type) { - case Expose: /* We should update our window. */ - if (labuda.core.xexpose.count != 0) - /* Well, I knew what does it mean, - but I forgot :) */ - break; -#ifndef WMAKER - update_window(billy, gc, state, dpy); -#else - update_window(dilly, gc, state, dpy); -#endif - break; case ButtonPress: switch (labuda.core.xbutton.button) { @@ -256,7 +84,7 @@ int main(int argc, register char *argv[]) #ifdef DEBUG puts("Button1 pressed."); #endif - XkbLockGroup(dpy, + XkbLockGroup(DADisplay, XkbUseCoreKbd, (state + 1) % 4); break; @@ -264,7 +92,7 @@ int main(int argc, register char *argv[]) #ifdef DEBUG puts("Button2 pressed."); #endif - XkbLockGroup(dpy, + XkbLockGroup(DADisplay, XkbUseCoreKbd, (state + 3) % 4); break; @@ -272,12 +100,9 @@ int main(int argc, register char *argv[]) #ifdef DEBUG puts("Button3 pressed, bye."); #endif - XFreeGC(dpy, gc); - XDestroyWindow(dpy, billy); -#ifdef WMAKER - XDestroyWindow(dpy, dilly); -#endif - XCloseDisplay(dpy); + XFreeGC(DADisplay, DAGC); + XDestroyWindow(DADisplay, DAWindow); + XCloseDisplay(DADisplay); exit(0); } break; @@ -289,16 +114,12 @@ int main(int argc, register char *argv[]) #endif if ((state < 0) || (state > 4)) state = 4; -#ifndef WMAKER - update_window(billy, gc, state, dpy); -#else - update_window(dilly, gc, state, dpy); -#endif + update_window(pixmap, DAGC, state, DADisplay); + DASetPixmap(pixmap); #ifdef DEBUG puts("."); /* XkbLockGroup happens */ #endif } } - } diff --git a/fookb/images.c b/fookb/images.c index 8f24949..21c04e9 100644 --- a/fookb/images.c +++ b/fookb/images.c @@ -150,7 +150,7 @@ void read_images(Display *dpy) } -void update_window(Window win, GC gc, unsigned int whattodo, Display *dpy) +void update_window(Drawable win, GC gc, unsigned int whattodo, Display *dpy) { int err;