[PATCH 10/17] fookb: Port to libdockapp.

Doug Torrance <[email protected]> Sat, 9 Sep 2017 21:24:26 -0400
Newsgroups gmane.compw.window-managers.windowmaker.devel
Message-ID <[email protected]>
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 <X11/XKBlib.h>
 
+#include <libdockapp/dockapp.h>
+
 /* 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
-				 */
 
-	ParseOptions(&argc, argv);	/* We should parse command line
-					   options and try to find '-display'
-					   before opening X display */
+	DAParseArguments(argc, argv, NULL, 0,
+			 "XKB state indicator for Window Maker",
+			 PACKAGE_STRING);
 
-/* 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 */
-
-/* Run out! */
-	billy = XCreateSimpleWindow(dpy,
-				    root,
-				    0, 0,
-				    get_width(), get_height(),
-				    border,
-				    BlackPixel(dpy, scr),
-				    WhitePixel(dpy, scr));
-	XStoreName(dpy, billy, "fookb");
-
-#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
+	pixmap = DAMakePixmap();
 
+	update_window(pixmap, DAGC, state, DADisplay);
+	DASetPixmap(pixmap);
 
-/* 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;
 
-- 
2.11.0


-- 
To unsubscribe, send mail to [email protected].