add initial transparency support, hardcode xpm
This commit is contained in:
parent
a3759f3d17
commit
8b0c579d21
12
Makefile.in
12
Makefile.in
|
@ -3,7 +3,7 @@ SHARE_PATH=@prefix@/share/fookb
|
|||
MAN_PATH=@prefix@/man/man1
|
||||
|
||||
# FLAGS=-Wall -g -DDEBUG @DEFS@
|
||||
FLAGS=-Wall -Werror @DEFS@
|
||||
FLAGS=-Wall -Werror -DPIXPATH=\"$(SHARE_PATH)\" @DEFS@
|
||||
|
||||
GCC=@CC@
|
||||
|
||||
|
@ -55,10 +55,6 @@ install: fookb
|
|||
mkdir -p ${BIN_PATH}
|
||||
mkdir -p ${SHARE_PATH}
|
||||
mkdir -p ${MAN_PATH}
|
||||
cp fookb ${BIN_PATH}
|
||||
cp 1.xpm ${SHARE_PATH}
|
||||
cp 2.xpm ${SHARE_PATH}
|
||||
cp 3.xpm ${SHARE_PATH}
|
||||
cp 4.xpm ${SHARE_PATH}
|
||||
cp rus.xpm ${SHARE_PATH}
|
||||
cp lat.xpm ${SHARE_PATH}
|
||||
install -m0755 fookb ${BIN_PATH}
|
||||
install -m0644 fr.xpm ${SHARE_PATH}
|
||||
install -m0644 ru.xpm ${SHARE_PATH}
|
||||
|
|
54
fookb.c
54
fookb.c
|
@ -28,11 +28,8 @@
|
|||
|
||||
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)); */
|
||||
*gc = XCreateGC(dpy, win, 0, NULL);
|
||||
//XSetBackground(dpy, *gc, 0L);
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,12 +63,6 @@ int main(int argc, register char *argv[])
|
|||
int state = 0; /* We suppose that latin keyboard is the
|
||||
primal state FIXME */
|
||||
|
||||
/*
|
||||
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
|
||||
*/
|
||||
|
@ -94,10 +85,6 @@ int main(int argc, register char *argv[])
|
|||
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 */
|
||||
|
||||
/* We would like receive the only Xkb event: XkbStateNotify. And only
|
||||
* when XkbLockGroup happens. */
|
||||
|
||||
|
@ -183,42 +170,13 @@ int main(int argc, register char *argv[])
|
|||
break;
|
||||
update_window(billy, gc, state, dpy);
|
||||
break;
|
||||
case ButtonPress:
|
||||
|
||||
switch (labuda.core.xbutton.button) {
|
||||
case Button1:
|
||||
#ifdef DEBUG
|
||||
puts("Button1 pressed.");
|
||||
#endif
|
||||
XkbLockGroup(dpy,
|
||||
XkbUseCoreKbd,
|
||||
(state + 1) % 4);
|
||||
break;
|
||||
case Button2:
|
||||
#ifdef DEBUG
|
||||
puts("Button2 pressed.");
|
||||
#endif
|
||||
XkbLockGroup(dpy,
|
||||
XkbUseCoreKbd,
|
||||
(state + 3) % 4);
|
||||
break;
|
||||
case Button3:
|
||||
#ifdef DEBUG
|
||||
puts("Button3 pressed, bye.");
|
||||
#endif
|
||||
XFreeGC(dpy, gc);
|
||||
XDestroyWindow(dpy, billy);
|
||||
XCloseDisplay(dpy);
|
||||
exit(0);
|
||||
}
|
||||
break;
|
||||
default: /* XkbLockGroup happens : FIXME */
|
||||
state = labuda.state.group;
|
||||
#ifdef DEBUG
|
||||
printf("%u\n", state);
|
||||
#endif
|
||||
if ((state < 0) || (state > 4))
|
||||
state = 4;
|
||||
if ((state < 0) || (state > 1))
|
||||
state = 1;
|
||||
update_window(billy, gc, state, dpy);
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -227,4 +185,8 @@ int main(int argc, register char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
XFreeGC(dpy, gc);
|
||||
XDestroyWindow(dpy, billy);
|
||||
XCloseDisplay(dpy);
|
||||
exit(0);
|
||||
}
|
||||
|
|
52
fr.xpm
52
fr.xpm
|
@ -1,7 +1,7 @@
|
|||
/* XPM */
|
||||
static char *fr[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"20 13 9 1 ",
|
||||
"30 30 16 1 ",
|
||||
" c #002F58",
|
||||
". c #00335B",
|
||||
"X c #D7183B",
|
||||
|
@ -11,18 +11,42 @@ static char *fr[] = {
|
|||
"@ c #FDFEFE",
|
||||
"# c #FEFEFE",
|
||||
"$ c white",
|
||||
"% c white",
|
||||
"& c white",
|
||||
"* c white",
|
||||
"= c white",
|
||||
"- c white",
|
||||
"; c white",
|
||||
": c None",
|
||||
/* pixels */
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo",
|
||||
"..... O@$$$$#+Xooooo"
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
":::::..... O@$$$$#+Xooooo:::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::"
|
||||
};
|
||||
|
|
60
images.c
60
images.c
|
@ -21,7 +21,8 @@
|
|||
static int w = 0;
|
||||
static int h = 0;
|
||||
|
||||
static XImage *stupid_picture[5]; /* Icons for fookb */
|
||||
static XImage *stupid_picture[2]; /* Icons for fookb */
|
||||
static XImage *stupid_picture_alpha[2]; /* Icons for fookb */
|
||||
|
||||
int get_width() {
|
||||
return w;
|
||||
|
@ -36,7 +37,7 @@ static int get_one_image(char *name, int index, Display *dpy)
|
|||
int foo;
|
||||
|
||||
foo = XpmReadFileToImage(dpy, name, &stupid_picture[index],
|
||||
NULL, NULL);
|
||||
&stupid_picture_alpha[index], NULL);
|
||||
|
||||
if (0 == w) {
|
||||
w = stupid_picture[index]->width;
|
||||
|
@ -72,23 +73,17 @@ void read_images(Display *dpy)
|
|||
int res;
|
||||
int status = 0;
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 2; i++) {
|
||||
|
||||
switch (i) {
|
||||
case 0:
|
||||
res = get_one_image(read_param("Icon1"), 0, dpy);
|
||||
res = get_one_image(PIXPATH "/ru.xpm", 0, dpy);
|
||||
break;
|
||||
case 1:
|
||||
res = get_one_image(read_param("Icon2"), 1, dpy);
|
||||
break;
|
||||
case 2:
|
||||
res = get_one_image(read_param("Icon3"), 2, dpy);
|
||||
break;
|
||||
case 3:
|
||||
res = get_one_image(read_param("Icon4"), 3, dpy);
|
||||
res = get_one_image(PIXPATH "/fr.xpm", 1, dpy);
|
||||
break;
|
||||
default:
|
||||
res = get_one_image(read_param("IconBoom"), 4, dpy);
|
||||
res = get_one_image(PIXPATH "/ru.xpm", 4, dpy);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -113,19 +108,10 @@ void read_images(Display *dpy)
|
|||
status += 1 << i;
|
||||
switch (i) {
|
||||
case 0:
|
||||
lputs(read_param("Icon1"));
|
||||
lputs("ru");
|
||||
break;
|
||||
case 1:
|
||||
lputs(read_param("Icon2"));
|
||||
break;
|
||||
case 2:
|
||||
lputs(read_param("Icon3"));
|
||||
break;
|
||||
case 3:
|
||||
lputs(read_param("Icon4"));
|
||||
break;
|
||||
case 4:
|
||||
lputs(read_param("IconBoom"));
|
||||
lputs("fr");
|
||||
break;
|
||||
default:
|
||||
lputs("UNKNOWN ERROR! PLEASE REPORT!!!");
|
||||
|
@ -141,8 +127,32 @@ void update_window(Window win, GC gc, unsigned int whattodo, Display *dpy)
|
|||
{
|
||||
int err;
|
||||
|
||||
err = XPutImage(dpy, win, gc, stupid_picture[whattodo],
|
||||
0, 0, 0, 0, w, h);
|
||||
if (stupid_picture_alpha[whattodo] == NULL) {
|
||||
err = XPutImage(dpy, win, gc, stupid_picture[whattodo],
|
||||
0, 0, 0, 0, w, h);
|
||||
} else {
|
||||
Pixmap pix;
|
||||
GC g;
|
||||
|
||||
pix = XCreatePixmap(dpy, win, w, h,
|
||||
stupid_picture_alpha[whattodo]->depth);
|
||||
g = XCreateGC (dpy, pix, 0, NULL);
|
||||
err = XPutImage(dpy, pix, g, stupid_picture_alpha[whattodo],
|
||||
0, 0, 0, 0, w, h);
|
||||
|
||||
if (err == 0) {
|
||||
/* set clip origin and copy */
|
||||
XSetClipMask(dpy, gc, pix);
|
||||
XSetClipOrigin(dpy, gc, 0, 0);
|
||||
err = XPutImage(dpy, win, gc, stupid_picture[whattodo],
|
||||
0, 0, 0, 0, w, h);
|
||||
/* Remove clip mask */
|
||||
XSetClipMask(dpy, gc, None);
|
||||
}
|
||||
|
||||
XFreeGC(dpy, g);
|
||||
XFreePixmap(dpy, pix);
|
||||
}
|
||||
|
||||
if (0 == err) return;
|
||||
|
||||
|
|
2
images.h
2
images.h
|
@ -12,7 +12,5 @@ int get_height();
|
|||
void read_images(Display *dpy);
|
||||
char *get_me_name(int);
|
||||
|
||||
//extern XImage *stupid_picture[5]; /* Icons for fookb */
|
||||
|
||||
void update_window(Window, GC, unsigned int, Display *);
|
||||
#endif /* IMAGES_H */
|
||||
|
|
39
opts.c
39
opts.c
|
@ -18,21 +18,6 @@
|
|||
static int tblentr = 6; /* There are 6 recognized
|
||||
options */
|
||||
static XrmOptionDescRec tbl[] = {
|
||||
{"-icon1", ".icon1",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL},
|
||||
{"-icon2", ".icon2",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL},
|
||||
{"-icon3", ".icon3",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL},
|
||||
{"-icon4", ".icon4",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL},
|
||||
{"-iconboom", ".iconBoom",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL},
|
||||
{"-display", ".display",
|
||||
XrmoptionSepArg,
|
||||
(XPointer) NULL}
|
||||
|
@ -54,11 +39,6 @@ void ParseOptions(int *argc, register char *argv[])
|
|||
puts("Fookb v 3.0");
|
||||
puts("\tUsage: fookb [options]");
|
||||
puts("Possible options:");
|
||||
puts("-icon1 xpm_file\t\tIcon to show for the 1st Xkb group");
|
||||
puts("-icon2 xpm_file\t\tIcon to show for the 2nd Xkb group");
|
||||
puts("-icon3 xpm_file\t\tIcon to show for the 3rd Xkb group");
|
||||
puts("-icon4 xpm_file\t\tIcon to show for the 4th Xkb group");
|
||||
puts("-iconboom xpm_file\tIcon to show when Xkb system goes crazy");
|
||||
puts("-display X_display\tX display to use (normally not needed)");
|
||||
puts("");
|
||||
puts("Command line paramaters takes precedence over X resources!");
|
||||
|
@ -77,22 +57,3 @@ void ParseOptions(int *argc, register char *argv[])
|
|||
|
||||
}
|
||||
|
||||
void MoreOptions(Display *dpy)
|
||||
{
|
||||
|
||||
XrmDatabase servDB, appDB;
|
||||
|
||||
appDB = XrmGetFileDatabase
|
||||
("/usr/X11R6/lib/X11/app-defaults/Fookb");
|
||||
(void) XrmMergeDatabases(appDB, &finalDB); /* Fookb defaults file
|
||||
added into final
|
||||
database */
|
||||
|
||||
/* Let's look: does xrdb load server defautls? (As a property of
|
||||
root window.) */
|
||||
if (XResourceManagerString(dpy) != NULL) {
|
||||
servDB = XrmGetStringDatabase(XResourceManagerString(dpy));
|
||||
XrmMergeDatabases(servDB, &finalDB);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
6
opts.h
6
opts.h
|
@ -23,10 +23,4 @@ void ParseOptions(int *argc, register char *argv[]); /* Parse
|
|||
line
|
||||
options */
|
||||
|
||||
void MoreOptions(Display *dpy); /* Parse
|
||||
app-defaults
|
||||
and X
|
||||
resources
|
||||
database */
|
||||
|
||||
#endif /* OPTS_H */
|
||||
|
|
59
ru.xpm
59
ru.xpm
|
@ -1,29 +1,52 @@
|
|||
/* XPM */
|
||||
static char *ru[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"20 13 10 1 ",
|
||||
" c #4C3E79",
|
||||
"30 30 16 1 ",
|
||||
" c #D81D04",
|
||||
". c #D71E05",
|
||||
"X c #D81D04",
|
||||
"o c #D81E05",
|
||||
"O c #004DB8",
|
||||
"X c #D81E05",
|
||||
"o c #004DB8",
|
||||
"O c #4C3E79",
|
||||
"+ c #0051BA",
|
||||
"@ c #0051BD",
|
||||
"# c #5A8ED2",
|
||||
"$ c #FDFEFE",
|
||||
"% c white",
|
||||
"& c white",
|
||||
"* c white",
|
||||
"= c white",
|
||||
"- c white",
|
||||
"; c white",
|
||||
": c None",
|
||||
/* pixels */
|
||||
"%%%%%%%%%%%%%%%%%%%%",
|
||||
"%%%%%%%%%%%%%%%%%%%%",
|
||||
"%%%%%%%%%%%%%%%%%%%%",
|
||||
"$$$$$$$$$$$$$$$$$$$$",
|
||||
"####################",
|
||||
"OOOOOOOOOOOOOOOOOOOO",
|
||||
"++++++++++++++++++++",
|
||||
"@@@@@@@@@@@@@@@@@@@@",
|
||||
" ",
|
||||
"....................",
|
||||
"XXXXXXXXXXXXXXXXXXXX",
|
||||
"oooooooooooooooooooo",
|
||||
"oooooooooooooooooooo"
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
":::::%%%%%%%%%%%%%%%%%%%%:::::",
|
||||
":::::%%%%%%%%%%%%%%%%%%%%:::::",
|
||||
":::::%%%%%%%%%%%%%%%%%%%%:::::",
|
||||
":::::$$$$$$$$$$$$$$$$$$$$:::::",
|
||||
":::::####################:::::",
|
||||
":::::oooooooooooooooooooo:::::",
|
||||
":::::++++++++++++++++++++:::::",
|
||||
":::::@@@@@@@@@@@@@@@@@@@@:::::",
|
||||
":::::OOOOOOOOOOOOOOOOOOOO:::::",
|
||||
":::::....................:::::",
|
||||
"::::: :::::",
|
||||
":::::XXXXXXXXXXXXXXXXXXXX:::::",
|
||||
":::::XXXXXXXXXXXXXXXXXXXX:::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::",
|
||||
"::::::::::::::::::::::::::::::"
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue