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.
This commit is contained in:
parent
b8ce2c9cd2
commit
0448b4965d
|
@ -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
|
||||
|
|
|
@ -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],
|
||||
|
|
229
fookb/fookb.c
229
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
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue