fbxkb-0.6/0000775000175000001440000000000010542566131012207 5ustar aanatolyusersfbxkb-0.6/man/0000755000175000001440000000000010542566131012760 5ustar aanatolyusersfbxkb-0.6/man/Makefile0000644000175000001440000000073210134326200014406 0ustar aanatolyusers# Part 0 # load common stuff TOPDIR = .. include $(TOPDIR)/Makefile.common # backslashify slashes to avoid problems with sed BPREFIX := $(subst /,\/,$(PREFIX)) SRC = fbxkb.1 TARGET = fbxkb.1.gz all: $(TARGET) $(TARGET): $(SRC) sed 's/PREFIX/$(BPREFIX)/g' < $(SRC) | gzip - > $@ clean: $(RM) $(TARGET) *~ install: all # install -d $(PREFIX)/share/man/man1 # install -m 644 $(TARGET) $(PREFIX)/share/man/man1 uninstall: # rm -f $(PREFIX)/share/man/man1/$(TARGET) fbxkb-0.6/man/fbxkb.10000644000175000001440000000402210133763175014137 0ustar aanatolyusers.\" man page originally for the Debian/GNU Linux system .TH FBPANEL "1" "February 2004" "fbxkb 2.2" "User Commands" .SH NAME fbxkb \- a lightweight GTK2-based panel for UNIX desktop. .SH SYNOPSIS .B fbxkb [\fIOPTION\fR] .br .SH DESCRIPTION .PP fbxkb is desktop panel which provides graphical information and feedback about desktop activity and allows interaction with the window manager. It features: .HP \(bu taskbar \- shows a list of the managed windows (tasks) .HP \(bu pager \- thumbnailed view of the desktop. .HP \(bu launchbar \- buttons to quickly launch applications .HP \(bu show desktop \- button to iconify or shade all windows .HP \(bu image \- display an image .HP \(bu clock \- show the current time and/or date .HP \(bu system tray \- tray for XEMBED icons (aka docklets) .PP fbxkb requires NETWM (www.freedesktop.org) compliant window manager. You can run many instances of fbxkb each with its own configuration (see \fBOPTIONS\fR below). Most updated info about fbxkb can be found on its home page: http://fbxkb.sf.net/ .SH OPTIONS .TP \fB\-h\fR \- print help message and exit. .TP \fB\-v\fR \- print version and exit. .TP \fB\-p \fR \- use the profile . The profile is loaded from the file ~/.fbxkb/. If that fails, fbxkb will load PREFIX/share/fbxkb/. No \fB\-p\fR option is equivalent to \fB\-p default\fR .SH CUSTOMIZATION To change default settings, copy profile file to your home directory .br mkdir -p ~/.fbxkb cp PREFIX/share/fbxkb/default ~/.fbxkb .br and edit it. Default profile file contains comments and explanation inside, so it should be easy. For full list of options please visit fbxkb's home page. .SH FILES .TP PREFIX/share/fbxkb Directory with system-wide resources and default settings .TP ~/.fbxkb/ Directory with the user's private profiles .TP ~/.fbxkb/default The user's default profile. .SH AUTHOR fbxkb was written by Anatoly Asviyan . This manual page was originally written for the Debian GNU/Linux system by Shyamal Prasad . fbxkb-0.6/man/.cvsignore0000644000175000001440000000001310133763175014755 0ustar aanatolyusersfbxkb.1.gz fbxkb-0.6/Makefile0000644000175000001440000000231110541252234013635 0ustar aanatolyusers# Part 0 # load common stuff TOPDIR = . include $(TOPDIR)/Makefile.common # Part 1 # recursive make .PHONY: subdirs all clean distclean install uninstall: subdirs SUBDIRS = man images .PHONY: $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ $(MAKECMDGOALS) SRC = fbxkb.c eggtrayicon.c OBJ = $(SRC:%.c=%.o) DEP = $(SRC:%.c=%.dep) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),distclean) ifneq ($(MAKECMDGOALS),tar) -include $(DEP) endif endif endif TARGET = fbxkb $(TARGET): $(OBJ) $(CC) $(LDFLAGS) $(LIBS) $(OBJ) -o $@ ifeq (,$(DEVEL)) strip $@ endif all: $(TARGET) clean: $(RM) $(TARGET) $(OBJ) $(DEP) *~ distclean: rm -f Makefile.config config.h install: install -d $(PREFIX)/bin install -m 755 $(TARGET) $(PREFIX)/bin uninstall: rm -f $(PREFIX)/bin/$(TARGET) .PHONY: tar CWD=$(shell pwd) VER=$(shell grep -e "\#define[[:space:]]\+VERSION[[:space:]]\+" version.h | \ sed -e 's/^[^\"]\+\"//' -e 's/\".*$$//' ) tar: $(MAKE) distclean cd ..; \ if [ -e fbxkb-$(VER) ]; then \ echo fbxkb-$(VER) already exist; \ echo "won't override";\ exit 1;\ else\ ln -s $(CWD) fbxkb-$(VER);\ tar --exclude=.svn -hzcvf fbxkb-$(VER).tgz fbxkb-$(VER);\ rm -f fbxkb-$(VER);\ fi; fbxkb-0.6/dbg.h0000644000175000001440000000161110541037101013076 0ustar aanatolyusers#include #define ERR(fmt, args...) fprintf(stderr, fmt, ## args) #define DBG2(fmt, args...) fprintf(stderr, "%s:%-5d: " fmt, __FUNCTION__, __LINE__, ## args) #define ENTER2 do { fprintf(stderr, "%s:%-5d: ENTER\n", __FUNCTION__, __LINE__); } while(0) #define RET2(args...) do { fprintf(stderr, "%s:%-5d: RETURN\n", __FUNCTION__, __LINE__);\ return args; } while(0) #define DBG3(fmt, args...) fprintf(stderr, fmt, ## args) #ifdef DEBUG #define ENTER do { fprintf(stderr, "%s:%-5d: ENTER\n", __FUNCTION__, __LINE__); } while(0) #define RET(args...) do { fprintf(stderr, "%s:%-5d: RETURN\n", __FUNCTION__, __LINE__);\ return args; } while(0) #define DBG(fmt, args...) fprintf(stderr, "%s:%-5d: " fmt, __FUNCTION__, __LINE__, ## args) #else #define ENTER do { } while(0) #define RET(args...) return args; #define DBG(fmt, args...) do { } while(0) #endif fbxkb-0.6/README0000644000175000001440000000000010133763173013054 0ustar aanatolyusersfbxkb-0.6/Makefile.common0000644000175000001440000000164210134046323015130 0ustar aanatolyusersifeq (,$(TOPDIR)) $(error TOPDIR variable must be defined) endif all: $(TOPDIR)/Makefile.config: $(error Please run $(TOPDIR)/configure first) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),distclean) ifneq ($(MAKECMDGOALS),tar) -include $(TOPDIR)/Makefile.config endif endif endif CC = gcc LIBS = $(shell pkg-config --libs gtk+-2.0 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0) -L/usr/X11R6/lib -lXmu INCS = $(shell pkg-config --cflags gtk+-2.0 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0) CFLAGS = -O2 # overwriten by command line or env. variable CFLAGS += -Wall # always nice to have ifneq (,$(DEVEL)) CFLAGS := -g -Wall endif # -DGTK_DISABLE_DEPRECATED does not work yet CFLAGS += -g -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED %.o: %.c $(CC) $(CFLAGS) $(INCS) -c $< %.dep: %.c $(CC) $(CFLAGS) $(INCS) -MM $< -o $@ .PHONY: all clean distclean install uninstall distclean: clean install: all fbxkb-0.6/configure0000755000175000001440000000232410133763173014116 0ustar aanatolyusers#!/bin/sh #echo "fbxkb configuration script" help () { echo "supported options are:" echo "--help - print this help and exit" echo "--prefix= specify install path. " echo " /bin - will hold all binaries" echo " /share/fbxkb - config files, pixmaps etc" echo " default is /usr" echo "--devel - enable devel mode: no optimization + debug symbols" echo "--transparency - enable EXPERIMENTAL transparency support" } PREFIX="/usr" while [ $# -gt 0 ]; do case $1 in --help) help exit 0 ;; --prefix=*) PREFIX=`echo $1 | sed 's/--prefix=//'` ;; --devel) DEVEL=true ;; --transparency) TRANSPARENCY=true ;; *) echo "unknwon option $1" help exit 1 ;; esac shift done echo "Installation prefix is $PREFIX" echo "updating config.h" echo "//created by ./configure script" > config.h echo "#define PREFIX \"$PREFIX\"" >> config.h if [ "x$TRANSPARENCY" != "x" ]; then echo "#define TRANSPARENCY" fi echo "updating Makefile" echo "PREFIX:=$PREFIX" > Makefile.config echo "DEVEL:=$DEVEL" >> Makefile.config fbxkb-0.6/fbxkb.c0000644000175000001440000003447410541606210013451 0ustar aanatolyusers #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "eggtrayicon.h" #include "version.h" static gchar version[] = VERSION; //#define DEBUG #include "dbg.h" /****************************************************************** * TYPEDEFS * ******************************************************************/ typedef struct _kbd_info { gchar *sym; gchar *name; GdkPixbuf *flag; } kbd_info; #define IMGPREFIX PREFIX "/share/fbxkb/images/" /****************************************************************** * GLOBAL VARSIABLES * ******************************************************************/ /* X11 common stuff */ static Atom a_XKB_RULES_NAMES; static Display *dpy; static int xkb_event_type; /* internal state mashine */ static int cur_group; static int ngroups; static GHashTable *sym2pix; static kbd_info group2info[XkbNumKbdGroups]; static GdkPixbuf *zzflag; static int active; /* gtk gui */ static GtkWidget *flag_menu; static GtkWidget *app_menu; static GtkWidget *docklet; static GtkWidget *image; static GtkWidget *about_dialog = NULL; /****************************************************************** * DECLARATION * ******************************************************************/ static int init(); static void read_kbd_description(); static void update_flag(int no); static GdkFilterReturn filter( XEvent *xev, GdkEvent *event, gpointer data); static void Xerror_handler(Display * d, XErrorEvent * ev); static GdkPixbuf *sym2flag(char *sym); static void flag_menu_create(); static void flag_menu_destroy(); static void flag_menu_activated(GtkWidget *widget, gpointer data); static void app_menu_create(); static void app_menu_about(GtkWidget *widget, gpointer data); static void app_menu_exit(GtkWidget *widget, gpointer data); static int docklet_create(); static int create_all(); /****************************************************************** * CODE * ******************************************************************/ /****************************************************************** * gtk gui * ******************************************************************/ static void flag_menu_create() { int i; GdkPixbuf *flag; GtkWidget *mi, *img; //static GString *s = NULL;; ENTER; flag_menu = gtk_menu_new(); for (i = 0; i < ngroups; i++) { mi = gtk_image_menu_item_new_with_label( group2info[i].name ? group2info[i].name : group2info[i].sym); g_signal_connect(G_OBJECT(mi), "activate", (GCallback)flag_menu_activated, GINT_TO_POINTER(i)); gtk_menu_shell_append (GTK_MENU_SHELL (flag_menu), mi); gtk_widget_show (mi); flag = sym2flag(group2info[i].sym); img = gtk_image_new_from_pixbuf(flag); gtk_widget_show(img); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); } RET(); } static void flag_menu_destroy() { if (flag_menu) { gtk_widget_destroy(flag_menu); flag_menu = NULL; } } static void flag_menu_activated(GtkWidget *widget, gpointer data) { int i; ENTER; i = GPOINTER_TO_INT(data); DBG("asking %d group\n", i); XkbLockGroup(dpy, XkbUseCoreKbd, i); RET(); } static void app_menu_create() { GtkWidget *mi; ENTER; app_menu = gtk_menu_new(); mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL); g_signal_connect(G_OBJECT(mi), "activate", (GCallback)app_menu_about, NULL); gtk_menu_shell_append (GTK_MENU_SHELL (app_menu), mi); gtk_widget_show (mi); mi = gtk_menu_item_new (); gtk_widget_show (mi); gtk_menu_shell_append (GTK_MENU_SHELL (app_menu), mi); gtk_widget_set_sensitive (mi, FALSE); mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); g_signal_connect(G_OBJECT(mi), "activate", (GCallback)app_menu_exit, NULL); gtk_menu_shell_append (GTK_MENU_SHELL (app_menu), mi); gtk_widget_show (mi); RET(); } static void app_menu_about(GtkWidget *widget, gpointer data) { ENTER; if (!about_dialog) { about_dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "fbxkb %s\nX11 Keyboard switcher\nAuthor: Anatoly Asviyan ", version); /* Destroy the dialog when the user responds to it (e.g. clicks a button) */ g_signal_connect_swapped (about_dialog, "response", G_CALLBACK (gtk_widget_hide), about_dialog); } gtk_widget_show (about_dialog); RET(); } static void app_menu_exit(GtkWidget *widget, gpointer data) { ENTER; exit(0); RET(); } static void docklet_embedded(GtkWidget *widget, void *data) { ENTER; RET(); } static void docklet_destroyed(GtkWidget *widget, void *data) { ENTER; //g_object_unref(G_OBJECT(docklet)); docklet = NULL; g_idle_add(create_all, NULL); RET(); } void docklet_clicked(GtkWidget *button, GdkEventButton *event, void *data) { //GtkWidget *menu; ENTER; if (event->type != GDK_BUTTON_PRESS) RET(); if (event->button == 1) { int no; no = (cur_group + 1) % ngroups; DBG("no=%d\n", no); XkbLockGroup(dpy, XkbUseCoreKbd, no); } else if (event->button == 2) { gtk_menu_popup(GTK_MENU(flag_menu), NULL, NULL, NULL, NULL, event->button, event->time); } else if (event->button == 3) { gtk_menu_popup(GTK_MENU(app_menu), NULL, NULL, NULL, NULL, event->button, event->time); } RET(); } static int docklet_create() { GtkWidget *box; ENTER; docklet = (GtkWidget*)egg_tray_icon_new("fbxkb"); box = gtk_event_box_new(); image = gtk_image_new(); //image = gtk_image_new(); g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_embedded), NULL); g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_destroyed), NULL); g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_clicked), NULL); gtk_container_set_border_width(GTK_CONTAINER(box), 0); gtk_container_add(GTK_CONTAINER(box), image); gtk_container_add(GTK_CONTAINER(docklet), box); gtk_widget_show_all(GTK_WIDGET(docklet)); RET(1); } /****************************************************************** * internal state machine * ******************************************************************/ static gboolean my_str_equal (gchar *a, gchar *b) { return (a[0] == b[0] && a[1] == b[1]); } static GdkPixbuf * sym2flag(char *sym) { GdkPixbuf *flag; static GString *s = NULL; char tmp[3]; ENTER; g_assert(sym != NULL && strlen(sym) > 1); flag = g_hash_table_lookup(sym2pix, sym); if (flag) RET(flag); if (!s) s = g_string_new(IMGPREFIX "tt.png"); s->str[s->len-6] = sym[0]; s->str[s->len-5] = sym[1]; flag = gdk_pixbuf_new_from_file_at_size(s->str, 24, 24, NULL); if (!flag) RET(zzflag); tmp[0] = sym[0]; tmp[1] = sym[1]; tmp[2] = 0; g_hash_table_insert(sym2pix, tmp, flag); RET(flag); } static void read_kbd_description() { unsigned int mask; XkbDescRec *kbd_desc_ptr; XkbStateRec xkb_state; Atom sym_name_atom; int i; ENTER; // clean up cur_group = ngroups = 0; for (i = 0; i < XkbNumKbdGroups; i++) { g_free(group2info[i].sym); g_free(group2info[i].name); /* if (group2info[i].flag) g_object_unref(G_OBJECT(group2info[i].flag)); */ } bzero(group2info, sizeof(group2info)); // get kbd info mask = XkbControlsMask | XkbServerMapMask; kbd_desc_ptr = XkbAllocKeyboard(); if (!kbd_desc_ptr) { ERR("can't alloc kbd info\n"); goto out_us; } kbd_desc_ptr->dpy = dpy; if (XkbGetControls(dpy, XkbAllControlsMask, kbd_desc_ptr) != Success) { ERR("can't get Xkb controls\n"); goto out; } ngroups = kbd_desc_ptr->ctrls->num_groups; if (ngroups < 1) goto out; if (XkbGetState(dpy, XkbUseCoreKbd, &xkb_state) != Success) { ERR("can't get Xkb state\n"); goto out; } cur_group = xkb_state.group; DBG("cur_group = %d ngroups = %d\n", cur_group, ngroups); g_assert(cur_group < ngroups); if (XkbGetNames(dpy, XkbSymbolsNameMask, kbd_desc_ptr) != Success) { ERR("can't get Xkb symbol description\n"); goto out; } if (XkbGetNames(dpy, XkbGroupNamesMask, kbd_desc_ptr) != Success) ERR("Failed to get keyboard description\n"); g_assert(kbd_desc_ptr->names); sym_name_atom = kbd_desc_ptr->names->symbols; // parse kbd info if (sym_name_atom != None) { char *sym_name, *tmp, *tok; int no; sym_name = XGetAtomName(dpy, sym_name_atom); if (!sym_name) goto out; /* to know how sym_name might look like do this: * % xlsatoms | grep pc * 150 pc/pc(pc101)+pc/us+pc/ru(phonetic):2+group(shift_toggle) * 470 pc(pc105)+us+ru(phonetic):2+il(phonetic):3+group(shifts_toggle)+group(switch) */ DBG("sym_name=%s\n", sym_name); for (tok = strtok(sym_name, "+"); tok; tok = strtok(NULL, "+")) { DBG("tok=%s\n", tok); tmp = strchr(tok, ':'); if (tmp) { if (sscanf(tmp+1, "%d", &no) != 1) ERR("can't read kbd number\n"); no--; *tmp = 0; } else { no = 0; } for (tmp = tok; isalpha(*tmp); tmp++); *tmp = 0; DBG("map=%s no=%d\n", tok, no); if (!strcmp(tok, "pc") || !strcmp(tok, "group")) continue; g_assert((no >= 0) && (no < ngroups)); if (group2info[no].sym != NULL) { ERR("xkb group #%d is already defined\n", no); } group2info[no].sym = g_strdup(tok); group2info[no].flag = sym2flag(tok); group2info[no].name = XGetAtomName(dpy, kbd_desc_ptr->names->groups[no]); } XFree(sym_name); } out: XkbFreeKeyboard(kbd_desc_ptr, 0, True); // sanity check: group numbering must be continous for (i = 0; (i < XkbNumKbdGroups) && (group2info[i].sym != NULL); i++); if (i != ngroups) { ERR("kbd group numbering is not continous\n"); ERR("run 'xlsatoms | grep pc' to know what hapends\n"); exit(1); } out_us: //if no groups were defined just add default 'us' kbd group if (!ngroups) { ngroups = 1; cur_group = 0; group2info[0].sym = g_strdup("us"); group2info[0].flag = sym2flag("us"); group2info[0].name = NULL; ERR("no kbd groups defined. adding default 'us' group\n"); } RET(); } static void update_flag(int no) { kbd_info *k = &group2info[no]; ENTER; g_assert(k != NULL); DBG("k->sym=%s\n", k->sym); gtk_image_set_from_pixbuf(GTK_IMAGE(image), k->flag); RET(); } static GdkFilterReturn filter( XEvent *xev, GdkEvent *event, gpointer data) { ENTER; if (!active) RET(GDK_FILTER_CONTINUE); if (xev->type == xkb_event_type) { XkbEvent *xkbev = (XkbEvent *) xev; DBG("XkbTypeEvent %d \n", xkbev->any.xkb_type); if (xkbev->any.xkb_type == XkbStateNotify) { DBG("XkbStateNotify: %d\n", xkbev->state.group); cur_group = xkbev->state.group; if (cur_group < ngroups) update_flag(cur_group); } else if (xkbev->any.xkb_type == XkbNewKeyboardNotify) { DBG("XkbNewKeyboardNotify\n"); read_kbd_description(); //cur_group = 0; update_flag(cur_group); flag_menu_destroy(); flag_menu_create(); } RET(GDK_FILTER_REMOVE); } RET(GDK_FILTER_CONTINUE); } static int init() { int dummy; ENTER; sym2pix = g_hash_table_new(g_str_hash, (GEqualFunc) my_str_equal); dpy = GDK_DISPLAY(); a_XKB_RULES_NAMES = XInternAtom(dpy, "_XKB_RULES_NAMES", False); if (a_XKB_RULES_NAMES == None) ERR("_XKB_RULES_NAMES - can't get this atom\n"); if (!XkbQueryExtension(dpy, &dummy, &xkb_event_type, &dummy, &dummy, &dummy)) RET(0); DBG("xkb_event_type=%d\n", xkb_event_type); XkbSelectEventDetails(dpy, XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask); gdk_window_add_filter(NULL, (GdkFilterFunc)filter, NULL); zzflag = gdk_pixbuf_new_from_file_at_size(IMGPREFIX "zz.png", 24, 24, NULL); RET(1); } #if 0 static void app_menu_destroy() { ENTER; if (app_menu) { gtk_widget_destroy(app_menu); app_menu = NULL; } RET(); } static void destroy_all() { active = 0; gdk_window_remove_filter(NULL, (GdkFilterFunc)filter, NULL); XkbSelectEventDetails(dpy, XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, 0UL); flag_menu_destroy(); app_menu_destroy(); } #endif static int create_all() { ENTER; read_kbd_description(); docklet_create(); flag_menu_create(); app_menu_create(); update_flag(cur_group); active = 1; RET(FALSE);// FALSE will remove us from idle func } int main(int argc, char *argv[], char *env[]) { ENTER; setlocale(LC_CTYPE, ""); gtk_set_locale(); gtk_init(&argc, &argv); XSetLocaleModifiers(""); XSetErrorHandler((XErrorHandler) Xerror_handler); if (!init()) ERR("can't init. exiting\n"); create_all(); gtk_main (); RET(0); } /********************************************************************/ void Xerror_handler(Display * d, XErrorEvent * ev) { char buf[256]; ENTER; XGetErrorText(GDK_DISPLAY(), ev->error_code, buf, 256); ERR( "fbxkb : X error: %s\n", buf); RET(); } fbxkb-0.6/CHANGELOG0000644000175000001440000000123310541710546013416 0ustar aanatolyusers0.6 * Makefile does not include .svn in a tarball * if xorg has no groups fbxkb creates fallback 'us' group to display * some sanity checks * code clean up * 1-pixel border around a flag was removed 0.5 * fixed crash when there is no 'pc/pc' in description * using X server description of the group if available 0.4 * Fixed Bugs * 1048450 start up code issues * 1048456 race condition when restarting 0.3 * New Features * add right-click menu with 'exit' and 'about' options 0.2 * New Features * removing _XKB_RULES_NAMES usage from code * adding menu with country flags 0.1 * New Features * initial code base * submiting code to sf fbxkb-0.6/images/0000755000175000001440000000000010541035054013444 5ustar aanatolyusersfbxkb-0.6/images/Makefile0000644000175000001440000000101410133763174015110 0ustar aanatolyusers# Part 0 # load common stuff TOPDIR = .. include $(TOPDIR)/Makefile.common # backslashify slashes to avoid problems with sed BPREFIX := $(subst /,\/,$(PREFIX)) CFG := $(wildcard *.cfg) RES := $(CFG:%.cfg=%) all: $(RES) %: %.cfg sed 's/PREFIX/$(BPREFIX)/g' < $< > $@ clean: $(RM) $(RES) *~ install: install -d $(PREFIX)/share/fbxkb # install -m 644 $(RES) $(PREFIX)/share/fbxkb install -d $(PREFIX)/share/fbxkb/images install -m 644 *.png $(PREFIX)/share/fbxkb/images/ uninstall: rm -rf $(PREFIX)/share/fbxkb fbxkb-0.6/images/ae.png0000644000175000001440000000026210133763174014547 0ustar aanatolyusersPNG  IHDR<(qlgAMA a PLTEmKgbKGDH pHYs  ~tIME :IDATxcU0 H`8#Pw",2mIENDB`fbxkb-0.6/images/am.png0000644000175000001440000000025710133763174014563 0ustar aanatolyusersPNG  IHDR<(qlgAMA a PLTE!bKGDH pHYs  ~tIME*#sIDATxcX :?*vPT0 ){XIENDB`fbxkb-0.6/images/be.png0000644000175000001440000000032610133763174014551 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &:`SIDATxϱ 0 0.=K:3sg]}^K:u 3\gp:u 3\gp:u^NbIENDB`fbxkb-0.6/images/bg.png0000644000175000001440000000032110133763174014546 0ustar aanatolyusersPNG  IHDR<(-gAMA a pHYs  ~tIME:@_G`IDATxA @t`јAǠa9tVKWZ4ODSM%*]빧 EM%J4h*TivESM%J4U$k`XYIENDB`fbxkb-0.6/images/ar.png0000644000175000001440000000053610133763174014570 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  d_tIME "m7kIDATx!@E+!$#pG@ +8W"iAE %3~鶉3X-]@M[' a넰uB:WJxac: kM p H׌ү+ 7yy#>LE0_xd{V t{B) 22-@a넰uB:!l;7T(bIENDB`fbxkb-0.6/images/bh.png0000644000175000001440000000143510133763174014556 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTE0077==>>8899::;;<<==??@@AABBDDEEFFGGJJKKLLMMOOPPQQRRSSUUVVWW^^__XXYYZZ\\]]^^__``bbccccddeeffgghhjjkkllmmnnoossttuuvvwwyyzz{{||}}~~\!bKGDH pHYs  ~tIME 1.8U9IDATxA @C=rppD`ˣܬ'mf fl6x';Xm>5ƃiŽ^/7;~]tmR<m>IENDB`fbxkb-0.6/images/at.png0000644000175000001440000000033310133763174014565 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME (MBXIDATx S庅B.o~I&E^3`: 3`:6l0tLg0]]g0tLg0]]OK"IENDB`fbxkb-0.6/images/ca.png0000644000175000001440000000057310133763174014552 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &*שIDATxQ Da7ZEh;S*ʧ-jn/` GgນB:LG:t8:>{Rxv3A)`GbjvyGs )Lݙ|ˍxN`K9]ť4vp) ,!%oLӂq+x~JA#q-:{g|6=>fӊN N :g?Y8/IENDB`fbxkb-0.6/images/az.png0000644000175000001440000000124510133763174014576 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTE33445566778899::;;<<==>>??TH@@AABBCCDDEEFFGGJJKKMMNNOOPPRRTTUUVVWWYYZZ[[\\]]^^__``aabbcceeffhhjjkkllmmppqqrrssttuuvvxxyy{{||}}3/37_9a:b]SZk[kg}h|47:;߁߂ᇇለ቉ኊ⋋⍍⎎㐐㑑㒒䓓䔔䕕䖖嗗曛朜杝枞砠碢裣褤襥覦駧騨驩骪ꫫꬬꮮ믯배뱱벲쳳촴쵵춶￿lrbKGDH pHYs  ~tIME og\IDATxc0j<\5L2SZN!GX r.zI )S&R"gS`E̳1F 'Q0yTp chǍIENDB`fbxkb-0.6/images/br.png0000644000175000001440000000156510133763174014574 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &/]6IDATx+t@\#Y$.m]*׺ qDm%uH:pe`f!0M~;CMՈp.R0GFԗ6@>O]gUSWR3,p)!9d62*q)aUkG~|k#9a"3Eܖ5 (0ɫ5'.x#aS={= 8J2[ϊn"#s cW]@%C4P)5[L_:FGx^Y@/-iˡ=<748z@J(z t1V 1z WU^jXU6_Q&`Wa(]؎ևpG3C[ ,VC&7w+ wqri"t t'ÒXv\̦=/pMO}mqYRo~mfXXNCtO3x+k m5P(Ue)3(; /i:W{uw{K \\ZHʱE6 /yh`]kQxCh3ykVj-KG0'oB"Tp]S]<+R)ٗ}<;- x/؃5&Kqu:mQ~/-iZR߇Yޖ ?鷥B!wuvϥ u{)IENDB`fbxkb-0.6/images/ch.png0000644000175000001440000000036710133763174014562 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &&atIDATx 0Q0r]JqoG\+N_t-C=b 3`qyX]*޲tLg0U/s 3`q=Ǐt=GϫIENDB`fbxkb-0.6/images/by.png0000644000175000001440000000200610133763174014572 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTE@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@0bKGDH pHYs  ~tIMECKy|IDATx 0C3Dͨ ꜭGٽNܘj\3ӱ˺AIdU^xц5mA rhILzUZTBIYzֶ{!2]1ɥd%%rxT/zw=IENDB`fbxkb-0.6/images/de.png0000644000175000001440000000033410133763174014552 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &YIDATx SʺB.~$'EN0=LO0=TJLO0=ӫOףp '`zՁ/cQEiIENDB`fbxkb-0.6/images/dj.png0000644000175000001440000000071110133763174014556 0ustar aanatolyusersPNG  IHDR;(IgAMA a$PLTE' ߖH1o[nעښ܆PbKGDH pHYs. . tIME IDATx}0 E3Ag7#=_`dRK13I$.MJm{TOuzxf>`^Xe'62.z|xk Nƕx=ڏ/.~ߔ%nk],o؛&ʆ~Lㆅ8 |-ei'æDwUc0]'#TӠ25v,Mq7:W%3ƌ 2IENDB`fbxkb-0.6/images/cu.png0000644000175000001440000000176110133763174014576 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME a:AnIDATxݚOHQ?3f(ԡ4!&ARɃ*VA ڋ(AXIEHl֡,?LnQ:V-Y=VK/3r"Yİ':@.V(Gl w) xQumd<ѧ_XE/N.G9IO>ŸcG9ArRp-ycwW9֔ T-VPxI\yPW\C/.^2FROPX_KG' @N*x 6owb#PZ S^ d<>,_Yf?#^ =vS8)9[|C鄲gsHH0OËfw )V8V}AMMBTVl!wT?-<EhfX@.RaM9!PAnqTd"E:;{zD/;0d, p~DZZD~5UUme[ HE#""nHvp4LKIL -iB3 k^rY?`>`IDATx! ЍqH>ԭGe~kLg0tLg0ݸNmm܄ ZLg0tLg0tmEn FIENDB`fbxkb-0.6/images/cz.png0000644000175000001440000000056710133763174014606 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  d_tIME'<IDATx;0 Q_Yl r# @r |aCJ9*-׬ڏ֋Ma-vSXˤ%E֢k_"j_"j kQ(ӄ5ӄ5K5oK5o˅5˅5[STo=iXjm>=6 {j-4 {j-:& {jMa5|ґ€p_QECn cC8Pp8y>;x~%B=DIENDB`fbxkb-0.6/images/ee.png0000644000175000001440000000033410133763174014553 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &Pp YIDATx S庅B.o~d&E^3`: 3`k`: 3`3] Lg0tLW|K&IENDB`fbxkb-0.6/images/eg.png0000644000175000001440000000174110133763174014560 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTEf3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3wUD"wUD"wUD"ݻwwwUUUDDD"""bKGDH pHYs  ~tIME 09$WIDATx 1aw?v#r>~V!6xpW]`xVAìMQqWm. c$|Y-"2xpW]dIENDB`fbxkb-0.6/images/dz.png0000644000175000001440000000037510133763174014604 0ustar aanatolyusersPNG  IHDR<(qlgAMA a PLTE:3bKGDH pHYs  ~tIME 1HjIDATxѻ 0   )r)} dP'ٖ?A(&o`H#;7,7wƒ kUdW{FR{~;eʞA\IENDB`fbxkb-0.6/images/es.png0000644000175000001440000000033510133763174014572 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME & qZIDATx 0@ 9 _ի giLg0tq7 \`: 3`: 3Vo0+na 3`ORRIENDB`fbxkb-0.6/images/fi.png0000644000175000001440000000035210133763174014560 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME &=gIDATxA /?(Dqs$523N缧`: 3`:uڝtL.x\;tLg0tL7 ICIENDB`fbxkb-0.6/images/eu.png0000644000175000001440000000461210133763174014576 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  #utIME !S֪S IDATxn*6{֤Xb$ *GWm @` lk$vdo((ۓ  ,_Y#@Qy* .-{;4۷:{| N3@Lǚ":T${Py`[r@aنW=lhȆSC9hYwjVxP0߂&>@1פېH|QKPlsQT>]M6,Ts ^ h;Aё:{X U @Wt:}(;+/`1]XkBMxjY:T?Zܻs#@ǖ 7Zʮn@D~تm? {Sm5ZE޷,F_J^nV@tiE6Qł^m}t/- rhwsXcN%K=7KA$c+l{%qyva5YMJIUBJawa܀߱z: h*]Y҉4~ cH$n?l\Hm)TǒZJ 4<W]X= < 1w!̈́[t0]]L+w#D1jA⾭3S'%);Dvy0k9h D` "K/ln:yX6DTJ\ LoZiVK M i j"eʯ`?{7M)AуdW4_ߍJw^/>a4KK0tsvZ˖EmHdFe(U `+" 0aM k %&ң6Cl "U\)v6e1-i("6Bl y\k/E_&NJ.p&V H-n=!8krEV2-U|`ol p珳}p٠֔4}h"QZy r!ƟOKpN=-V82HW-nj kM^_ćwIIdֺo#3KTstW.:Ek%Z_ ۊ#lg< p &+RkE]Ԛ]&}-sBFO/x&Xź;4 X ^8yOM5oѡ&yXZڸȡax**DRÒ.@rHĆ2[kbYt^8-NJ[7ƘoV^uT2c)V֩7Mffu LHw{ 3S\Zsӝ*V%53-sKxVg5S_t4fA?7xa MI|(p)5]kJݫFEйV[v Iipgw&zt,|]wԂ5-[VԒh#ֆ=:ți^Rm"[8wprqD#<&A{*pzAC4}قy' 8[Vݴ^JǖwLύϱvgআ V7^ljxjKR[$%X Oz6?޴z Bv)"pJ\+}CNF ܥ< >0̟gsMk 6VyDLgjs݌YYh|vҰK3ֹOJnN.ڻ^Kn8 5 Ce ¶Mɩ@Km/$!ޞ?ɕ^3r&dSlX%_FebAX 5ZJȳ3F5O8FѾhXy"\rАk?5 ^vJ0@k<ݖ]{±94HuKy!3)duȳs"{t9̉<]p'9%( _hi6i$>1ltU1^inInǢJH6^W!fd \F ,vM rh`dU9$b@UWCjǤ4No{ JedB)U:PYn^<[[[כ֭RS\NiVplEyMEױŞpZ˸qHWȲ Cqu5bִRK8\w$c/`pf>4}bhi]Ov]`!XkTNg62pJ 9NXTEMF*g^  RmiO*|eDuVHdtθ2jA2}9h9hCA/W7`&%gvьpY=VTXO6Ķx.afVu=VmR[s :E$_+ G0wϫ/1g].b-et[gIENDB`fbxkb-0.6/images/ge.png0000644000175000001440000000026210133763174014555 0ustar aanatolyusersPNG  IHDR<(qlgAMA a PLTEbKGDH pHYs  ~tIME ;IDATxc`UP@o~( *ӗAVОtIENDB`fbxkb-0.6/images/fr.png0000644000175000001440000000032610133763174014572 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME %;JڈSIDATxϱ 0 .=K s=vkԳVu 5kXװa]úu 5kXװa]úu ֽ N\IENDB`fbxkb-0.6/images/gr.png0000644000175000001440000000040610133763174014572 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME %/͐IDATxA _ev8Y1Ua_ק|}X<B.a ɪ G5a({#7xd4AXI[:#-%la:r偊\:X0a ӑAt^KAv;IENDB`fbxkb-0.6/images/hr.png0000644000175000001440000000465110133763174014601 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTE*װFz~rdhNQzZ^B ?NnE_:F.3> z~J26ƿ:?1.Z=f vekv*H0"~z&wIǾBGp /:z,>ޢކz; %)uprb~ .#0V2RV"r(|pⲚ\Z;*Gk좘!" ^6 Q[!' . :"2*hJ/4I.b&~"Xee6.>^.R6 N&Br~~rO$􎎨.沺:~ JVpdZPZ&~>ŗ:: **d(F2zz֑f׺&>N$Jz4^]jdd֟W 36Ζwvw~6La"*& "IA0 v6:*b>bl0"!.qr \P*/"!14 zff>6 Jb;9%~4h'F 2Bʰ!*=Mުpv>^fJ2VbISJ2;,<1tRNS@fbKGDH pHYs  ~%IDATx} \SUǯ4RB PC)9$>Pr Xs^M͜' v0XiLJm 䱍-uF /5v;ws? {r|z\\zGGGzzzKе?4q@zGqp% fJqVrJL;%ْ;))Gn,rF6]K$`* 4"/ bo99>?BAiW(*POv[#5(9JRzH<ȴ_c?wW+zȐ7(p[E 4?hcz=WNs9ʨʀk;l^HRW}u*hZ% a^!Xs'o[zb"]!]R2I¼|kָ)SVsН'~iͥQ,[i072w͚}g1y76fgً0]Qvm+ꌌ |/8p߾Og) gyLul^ 8;ujňAnshM_5!`2IӸv?GԜ.켫qIAƚm]~L0 sHRa5;-Ԅ zڊZ퍊*O}@eZd7ױ#>p-fQtDVH$Z2c{ QX5n"uuZ䃯DeE"!-#S'ZF&|Cdbmj/plvU0 l_~ M3eޞI :R$DuCL9"5.d-abOzRM`nqҴffv^T_AVXTjRÀetmd~O9DS6-Wn ש8El1/%'d3 eMMc4y9&_4滽4ᅬ{[nZ,oBɛCv a?|E[,=4wծޜ3VZ#"nFZ#'MhVy}eV[{I1-KDJrss%@Zdϼsjo^h_]^-)++C XDDC'A.BEO4n_3tƻl&|Dc v&In4Æ]8vkGB T3j-.^>mڴb Ү y^237ּ ` kg& KkUɂ:auFwu8K8~*N݉48~*F@\]AQ;UI,<3M#降SZ^jtaw"NYN M&XIENDB`fbxkb-0.6/images/la.png0000644000175000001440000000043110133763174014554 0ustar aanatolyusersPNG  IHDR<(PgAMA a-PLTEccRRBB!!bKGDH pHYs  ~tIME"q!bIDATxc FJ HdOpKIf`@׎y/͇Cz~i/&4:w1·4Q`IENDB`fbxkb-0.6/images/km.png0000644000175000001440000000043110133763174014567 0ustar aanatolyusersPNG  IHDR<(u gAMA aPLTE2K<bKGDH pHYs  ~tIME 2;IDATx 0 `nG9qE*9_Oi&ɠns`L֫[@ڄo`*&/ڭ : N .{rtk1VCTXH)#3b-ArI0(IENDB`fbxkb-0.6/images/lb.png0000644000175000001440000000122110133763174014553 0ustar aanatolyusersPNG  IHDR<(eigAMA aJPLTE333ffffff33̙33ff333f3388ff谨3ب3f3f33fȠff3̙ff3f3̙h̙3ffX̙3Hfff3̙3f333ff3f3H`3ff8Xf3f3ff3ff33f3f33ffȸظШȘhhxxXX3f3̙HH8833ff((333fx,̕bKGDH pHYs  ~tIME 2HIDATx ^Dq!.ٴ@-zĘt>D14q|x Ĕձ^6R;(-FaRV PzˉAÞ 2|,_rK<3֭UҫTj)g7}V2(+ٜ:SPZpgIENDB`fbxkb-0.6/images/kr.png0000644000175000001440000000262010133763174014576 0ustar aanatolyusersPNG  IHDR<(bKGDC pHYs  d_tIME  )IDATxMHUizdҠKw-q3yp7hSQ)1a1ĴHb q׹jf"=x{5[W_:|FTVV5vɣGU^MNNg477KӶ hxxxY{AkkUTTӧsH_۶9regb^z/Ҡc HP(Dww7k׮T*Ç=>lmB%#6)((mlذD"@K6x9ҡ!zjjY\5,$qQ1ݓ*xN:%@jkk$OHUUS,Kz8k|z֬Y#@Ϟ=ƍի|2<55,NTjBEܹ&*eZ ۶L&uuMNN:ڶits} m޼Y]|TJnv~Y.J:|N<)@e… F1,I}}}M6KJKK3{0xR~w-ׯ_yY.*SPzyݞ:1ܿ_bؒi}Yfr L&=k쾹\42W#d ߼iVQŸARss|j3sQ_p^LO<7~̃aXxW{M,@#? e Cڝ|&ܟ?HI <`/oCY"p@0ʂ!9Յ1/^,ynYNjkm(kxxXbڲeiњD"ϟ;zju:hiiQpXDbs y陙'=*}6W޶ vvu:/`IIENDB`fbxkb-0.6/images/lt.png0000644000175000001440000000033710133763174014604 0ustar aanatolyusersPNG  IHDR<(ռiIDATxQ0CoP>~u-3'_|CCV` D8:<mڈ6h%[n1*lݐ&R`3싚zE-\.—ɅA]3 Y*lx:6<Q^źtlx: U Odž'wIENDB`fbxkb-0.6/images/mk.png0000644000175000001440000000244210133763175014574 0ustar aanatolyusersPNG  IHDR<(-gAMA abKGD pHYs  ~tIME $6:hIDATx]lUvWǶBQSC"b|h/j&MHD6G͈EjL$> [BRa:engfNݝs7wιw.-AĶ_gVDe$<_Bē]^4mtU WG܃A9r<$\ )KyT=Mm,x:Q6鬉D]_hT>;?5EQסj@xP]@;Puf(Ľh0: K(.:33j  wH'|~`ѝ7Q[,ACfTjU>u ?R3^]CQ ?{tGк!_xo w[gյvDѯn<ځ!KQ AyWB- ڱ[; FYEQJ>עݞ@s0Sh#D :4A7p? ڱ}ʠ3!+Akь.?u QСpb ױ Mo04p @Q1cVp3,6X E K:ar00C00S7[8ntRihP dJIA%B;AC-dBRŏ@"JHZb$)yw0LChY;hqf Ԉ.Hю,)8r65 ifh TB =Z#I5:FjEkbNҋ^[\Cy48;. &D2=ZU?qы N &sR+C(2Abfߣ-}wwwWa.ko]O٦"RH)R)E"@J RH)%!68%aʋ PO#sl25Rt-b} %5B}fїVD,>ߠ *IKRߨ+;e{fSxԺ\܇0Θӻ%Y^ENq欏,TڡҎ3|; nbv4Sb瀵`jC=mIGC#G[o`ՌE"A ݿN)MϿnjuph;_E2${:ړQ|h9P]p;(?iOF+̈X]KĔ'ȳm>@Q:ssx\N<@M/kfFL|6y#te !ϿUuɨ%B!Y{')wǘq\[e~(糖t>+ӍiPLa;?ŀVe]ZqexX ųR$R)E"@J RH)R?vhh:IENDB`fbxkb-0.6/images/no.png0000644000175000001440000000040110133763175014572 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME $/ԋ?~IDATx Q7_cDA2;( 륍VJ+=x8\6f0tLg0tR `&\o1&.v{ 3`: 3`MU^IENDB`fbxkb-0.6/images/om.png0000644000175000001440000000156410133763175014604 0ustar aanatolyusersPNG  IHDR<(eigAMA aPLTE3f3333f333ff3fffff3f̙3f3f3333f3333333333f333333f3f33f3ff3f3f33333f33̙33333f3333333f333ff3fffff3f3f33ff3f3f3fffff3fffffffffff3ffff̙fff3fffffff3fffff3f3333f333ff3fffff3f̙̙̙3̙f̙̙̙3f3f̙3333f3̙33ff3fff̙ff3f̙̙3f̙3f̙3f3333f333ff3fffff3f̙3f3f}jbKGDH pHYs  ~tIME 8, \bIDATxK aCu`,+3`pa|HB1ZttZaE mmT+/%E=06+166Nr@IENDB`fbxkb-0.6/images/pl.png0000644000175000001440000000032310133763175014574 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME $(JPIDATx 0 1nqWgww.=k +XW`]ui +XW`]u ֽ}*I'32IENDB`fbxkb-0.6/images/qa.png0000644000175000001440000000044210133763175014564 0ustar aanatolyusersPNG  IHDR<(PgAMA a0PLTEXFbKGDH pHYs  ~tIME 7(WhIDATx!m|8#ltoZZ5|ԷY&NT(ݓCwX4 @npE; '}/vsl–=+l8LIENDB`fbxkb-0.6/images/pt.png0000644000175000001440000000113710133763175014610 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME $#=sIDATxYr v_К$\u4`Xَ dgx~Vl<qaȖS bD } >Ž(Zc3^KS ɐ[R3#tڨ%t&ܷ4.]-6V⼲_..M*RSӊd@La:f4RfagHP9Dx,9ōG= C :> %!0lV(?s}H#{r$B6ONz2^2lО֙ . PؓϮu,pa] ęUZ:TٸC{ji{msrl]-=tJ56C wJ"VWH$j:1|'pr$e8dst|QcZF3kwǴYxY w>|!<;~.>F\IENDB`fbxkb-0.6/images/sa.png0000644000175000001440000000060010133763175014562 0ustar aanatolyusersPNG  IHDR<(PgAMA a$PLTEƜ{k{ZkZkc9kRR9f WbKGDH pHYs  ~tIME 3 ߺv_IDATx? 0jEy(#.M\9gnZ@S-)@ h 4hMfzhMN߿(@ h 4hMZ@e PL+TIENDB`fbxkb-0.6/images/si.png0000644000175000001440000000044110133763175014575 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME $0bIDATx1 9Bؾ!Ap0wsFH 3A3[ZS+ok0:t£OGC}+IJ|;N&ށڨ W:JӅ4V]7|EJZHsHa #at$ё0:ts|QR2 IENDB`fbxkb-0.6/images/ru.png0000644000175000001440000000032710133763175014613 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME $TIDATx 0 @w[?" 3`: 3ntLg0t낧`: 3`uF IENDB`fbxkb-0.6/images/sk.png0000644000175000001440000000226510133763175014605 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME #;}2IDATx]H[gDadK$X:zQHtb1+[VՐ7nN e.c7;S/dS&;'ix46'uy?}#|iKvZ罼hx?tq:/b8d3p=,@[-`dI4{y(:FZށ dHi#,$[CBٛ^¼cUŸګ|.QFk __nC(tN6&URhsށM; *QQgʋAy6ss\wNLy,w.{YMK@ɆAlwMLG⶘=QL'xPy(erO ޖ݇5ۊ4~iEd_&ZӲaT@suˀ JOc3ZXK$mHb'λq47xE@"5n ^n.N31ɑGitL̺Z"r!nw1mu1UYEog)X#Dғ<Xm3@X}*䶾IENDB`fbxkb-0.6/images/tn.png0000644000175000001440000000034410133763175014605 0ustar aanatolyusersPNG  IHDR<(u gAMA aPLTEZbKGDH pHYs  ~tIME -tTIDATxch8`e0C!?uƏPLJ p)b0VcFsa&4'k $1IENDB`fbxkb-0.6/images/sy.png0000644000175000001440000000041410133763175014615 0ustar aanatolyusersPNG  IHDR<(PgAMA a0PLTE33ffIbKGDH pHYs  ~tIME -&@VRIDATxc0 F// ^z=ua^^)k*<C?Bp$_^r/,aN *VQ0O琉[rIENDB`fbxkb-0.6/images/tr.png0000644000175000001440000000061010133763175014605 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME #+mjIDATx Ee{jڙ*dV񊠐S }f`〿3RDkXu{Z}S@KE.mZZzۓ"BY=k|9.WM Z!esB(n4wx`ua%Jׁl~NT 2XēUX#evUNM%g0 |8|iܖo襽+++D!FWA#XIENDB`fbxkb-0.6/images/uk.png0000644000175000001440000000227210133763175014605 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME %4G7IDATxZ-Z]M4lx4nM#m=qliצmƴ9A.(rqyf%>6?޴z Bv)"pJ\+}CNF ܥ< >0̟gsMk 6VyDLgjs݌YYh|vҰK3ֹOJnN.ڻ^Kn8 5 Ce ¶Mɩ@Km/$!ޞ?ɕ^3r&dSlX%_FebAX 5ZJȳ3F5O8FѾhXy"\rАk?5 ^vJ0@k<ݖ]{±94HuKy!3)duȳs"{t9̉<]p'9%( _hi6i$>1ltU1^inInǢJH6^W!fd \F ,vM rh`dU9$b@UWCjǤ4No{ JedB)U:PYn^<[[[כ֭RS\NiVplEyMEױŞpZ˸qHWȲ Cqu5bִRK8\w$c/`pf>4}bhi]Ov]`!XkTNg62pJ 9NXTEMF*g^  RmiO*|eDuVHdtθ2jA2}9h9hCA/W7`&%gvьpY=VTXO6Ķx.afVu=VmR[s :E$_+ G0wϫ/1g].b-et[gIENDB`fbxkb-0.6/images/un.png0000644000175000001440000000205410133763175014606 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME #$ pIDATxYn@bY)(GJ)x+SQǡGuA)J#OpÂ'QOB EQ8#[ώ#<~?Kx|a#^xN", >IR r\ },͗<^](}.ۥ&--@(a]?g?m秗u1yk\0a F$}E풴|\C1N7i> Y^E6eG3U\{I?3K$֦l/69צ.s/lۧ 4|ljmR+R{«+,SDw"N6 6-uݿV傳!L'҅f9 yIxM5l'$]ы0 JoJפILj;Xg sֽ#-"(h|1.D9Eﳴ^40e\i 0+R\I|řF)P:uI8z^ GM!74_mm}F@i9~{45AIڔ OKZi/Ԩ $K H<^].(W !'ztJ/#z0خD]^ЄNkx7BJ)s\45gԴlp9t/b=G{f9 i%!ev[|ݕ_K|fΏ]1HhfyuPc5f>fKjNi"%xd JkfK:4wii!lhZ1hѐ~pO3R': u`t֣FFCa$:ڎU?踷0l8 aYBWFTqM'# ~A;`m?fܿ?uEZ⤄?"."qv/jIENDB`fbxkb-0.6/images/us.png0000644000175000001440000000157110133763175014616 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME #$eIDATxKaǿLª02X[ cqۓKjH u:HBAxZ<%R$d.P2Y,!tqyrVyai<ߝyΞǺ7?|yHHQ_DB_"°@d"QKDy-qombta&L$u組@hPàKa KvP56Yvi;a6s?v%eR9Y:s( hL'ѓzk193~lzndܖ%Hdb;LwO390{\:C0!h yb*!cQ;1zd"Eylu.Sajz*9U0]X^)`6B 05ȰY)8+!fal1/%"T3Zs[J9ek,>d%趄@hPDLýd% oORZk-%,\Y꺮@l0p,JpLGQW[ͰS'1y|ñ(aK ԸDZÃF RXO ֦&=7 TAHws_%|yLK^R^^Lr)i^Μ(WҢ\+<.w-*<<.w7SOri;$,w?߿3*,P=i?IENDB`fbxkb-0.6/images/vn.png0000644000175000001440000000041510133763175014606 0ustar aanatolyusersPNG  IHDR<(PgAMA a$PLTEjTbKGDH pHYs  ~tIME+(R_IDATxK P \j~Һfa"SFUచU1&9.Kƫ%|ے1.ײ|84\IENDB`fbxkb-0.6/images/uy.png0000644000175000001440000000164410133763175014625 0ustar aanatolyusersPNG  IHDR<(gAMA abKGD pHYs  ~tIME #!IDATxOHq?Z/6HA9ab(F"eaC#(BhTt-hʺĠdP*S.)I C; Js}^drUr Xjd }?CTw 1p*n:Zt }}js[\/2vN ʉF!MàPd錂FOo% |v/CF#i]҂JڕVl0&/B5Dc3k3B`gɋ^{8h}E5؛D%x2@WFK.MJ=esjlS:ЛFxqcqɼz*3pdB\5* @>(A"`e#:W iͷg|kñƿaOky|6*PSȬ>7ڐH̬a݋:wƳz_ xۢҙF8E+ȀxA ڕRW;ث.Ƞ@NW͈q4ԡ-V;췩8 };mjTD|| `ɼz9/(h[. Ĝ1ÎfVh4v3gi4L6!UǰBo!ߠB_ !.KP{.ielgfdnFf6~lKZ[*~0➞ nȘCԀX˂Ϊ,a# :r:`CȂO ]$LϚ-IENDB`fbxkb-0.6/images/ye.png0000644000175000001440000000032610133763175014601 0ustar aanatolyusersPNG  IHDR<(PgAMA a0PLTElbKGDH pHYs  ~tIME -MIDATxc0J_?^0*=G`:0!|IENDB`fbxkb-0.6/images/yu.png0000644000175000001440000000031410133763175014616 0ustar aanatolyusersPNG  IHDR<(bKGD pHYs  d_tIME  "lYIDATx HoZyu%3)tLg0tӝ_pa 3`:$UCLg0t_OKmIENDB`fbxkb-0.6/images/zz.png0000644000175000001440000000045110133763175014626 0ustar aanatolyusersPNG  IHDR<(P-PLTEࠀ@p P0``0P0` @phbKGDH pHYs  ~tIME U<IDAT8 p t3h"|5J2Ms f¹쀢){ĚBΚ<81nk>aƌig+s_?w ?{_!cȳIENDB`fbxkb-0.6/eggtrayicon.c0000644000175000001440000002255210133763174014674 0ustar aanatolyusers/* eggtrayicon.c * * Contributed by Line72 * * Thanks to: * Anders Carlsson * */ #include #include #include "eggtrayicon.h" #define SYSTEM_TRAY_REQUEST_DOCK 0 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 #define SYSTEM_TRAY_CANCEL_MESSAGE 2 static GtkPlugClass *parent_class = NULL; static void egg_tray_icon_init (EggTrayIcon *icon); static void egg_tray_icon_class_init (EggTrayIconClass *klass); static void egg_tray_icon_unrealize (GtkWidget *widget); static void egg_tray_icon_update_manager_window (EggTrayIcon *icon); GType egg_tray_icon_get_type (void) { static GType our_type = 0; our_type = g_type_from_name("EggTrayIcon"); if (our_type == 0) { static const GTypeInfo our_info = { sizeof (EggTrayIconClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) egg_tray_icon_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EggTrayIcon), 0, /* n_preallocs */ (GInstanceInitFunc) egg_tray_icon_init }; our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); } else if (parent_class == NULL) { /* we're reheating the old class from a previous instance - engage ugly hack =( */ egg_tray_icon_class_init((EggTrayIconClass *)g_type_class_peek(our_type)); } return our_type; } static void egg_tray_icon_init (EggTrayIcon *icon) { icon->stamp = 1; gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); } static void egg_tray_icon_class_init (EggTrayIconClass *klass) { GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; parent_class = g_type_class_peek_parent (klass); widget_class->unrealize = egg_tray_icon_unrealize; } static GdkFilterReturn egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) { EggTrayIcon *icon = user_data; XEvent *xev = (XEvent *)xevent; if (xev->xany.type == ClientMessage && xev->xclient.message_type == icon->manager_atom && xev->xclient.data.l[1] == icon->selection_atom) { egg_tray_icon_update_manager_window (icon); } else if (xev->xany.window == icon->manager_window) { if (xev->xany.type == DestroyNotify) { egg_tray_icon_update_manager_window (icon); } } return GDK_FILTER_CONTINUE; } static void egg_tray_icon_unrealize (GtkWidget *widget) { EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkWindow *root_window; if (icon->manager_window != None) { GdkWindow *gdkwin; #if HAVE_GTK_MULTIHEAD gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), icon->manager_window); #else gdkwin = gdk_window_lookup (icon->manager_window); #endif gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); } #if HAVE_GTK_MULTIHEAD root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); #else root_window = gdk_window_lookup (gdk_x11_get_default_root_xwindow ()); #endif gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } static void egg_tray_icon_send_manager_message (EggTrayIcon *icon, long message, Window window, long data1, long data2, long data3) { XClientMessageEvent ev; Display *display; ev.type = ClientMessage; ev.window = window; ev.message_type = icon->system_tray_opcode_atom; ev.format = 32; ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); ev.data.l[1] = message; ev.data.l[2] = data1; ev.data.l[3] = data2; ev.data.l[4] = data3; #if HAVE_GTK_MULTIHEAD display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); #else display = gdk_display; #endif gdk_error_trap_push (); XSendEvent (display, icon->manager_window, False, NoEventMask, (XEvent *)&ev); XSync (display, False); gdk_error_trap_pop (); } static void egg_tray_icon_send_dock_request (EggTrayIcon *icon) { egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_REQUEST_DOCK, icon->manager_window, gtk_plug_get_id (GTK_PLUG (icon)), 0, 0); } static void egg_tray_icon_update_manager_window (EggTrayIcon *icon) { Display *xdisplay; #if HAVE_GTK_MULTIHEAD xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); #else xdisplay = gdk_display; #endif if (icon->manager_window != None) { GdkWindow *gdkwin; #if HAVE_GTK_MULTIHEAD gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), icon->manager_window); #else gdkwin = gdk_window_lookup (icon->manager_window); #endif gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); } XGrabServer (xdisplay); icon->manager_window = XGetSelectionOwner (xdisplay, icon->selection_atom); if (icon->manager_window != None) XSelectInput (xdisplay, icon->manager_window, StructureNotifyMask); XUngrabServer (xdisplay); XFlush (xdisplay); if (icon->manager_window != None) { GdkWindow *gdkwin; #if HAVE_GTK_MULTIHEAD gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), icon->manager_window); #else gdkwin = gdk_window_lookup (icon->manager_window); #endif gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); /* Send a request that we'd like to dock */ egg_tray_icon_send_dock_request (icon); } } EggTrayIcon * egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name) { EggTrayIcon *icon; char buffer[256]; GdkWindow *root_window; g_return_val_if_fail (xscreen != NULL, NULL); icon = g_object_new (EGG_TYPE_TRAY_ICON, NULL); gtk_window_set_title (GTK_WINDOW (icon), name); #if HAVE_GTK_MULTIHEAD /* FIXME: this code does not compile, screen is undefined. Now try * getting the GdkScreen from xscreen (:. Dunno how to solve this * (there is prolly some easy way I cant think of right now) */ gtk_plug_construct_for_display (GTK_PLUG (icon), gdk_screen_get_display (screen), 0); #else gtk_plug_construct (GTK_PLUG (icon), 0); #endif gtk_widget_realize (GTK_WIDGET (icon)); /* Now see if there's a manager window around */ g_snprintf (buffer, sizeof (buffer), "_NET_SYSTEM_TRAY_S%d", XScreenNumberOfScreen (xscreen)); icon->selection_atom = XInternAtom (DisplayOfScreen (xscreen), buffer, False); icon->manager_atom = XInternAtom (DisplayOfScreen (xscreen), "MANAGER", False); icon->system_tray_opcode_atom = XInternAtom (DisplayOfScreen (xscreen), "_NET_SYSTEM_TRAY_OPCODE", False); egg_tray_icon_update_manager_window (icon); #if HAVE_GTK_MULTIHEAD root_window = gdk_screen_get_root_window (gtk_widget_get_screen (screen)); #else root_window = gdk_window_lookup (gdk_x11_get_default_root_xwindow ()); #endif /* Add a root window filter so that we get changes on MANAGER */ gdk_window_add_filter (root_window, egg_tray_icon_manager_filter, icon); return icon; } #if HAVE_GTK_MULTIHEAD EggTrayIcon * egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) { EggTrayIcon *icon; char buffer[256]; g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); return egg_tray_icon_new_for_xscreen (GDK_SCREEN_XSCREEN (screen), name); } #endif EggTrayIcon* egg_tray_icon_new (const gchar *name) { return egg_tray_icon_new_for_xscreen (DefaultScreenOfDisplay (gdk_display), name); } guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const gchar *message, gint len) { guint stamp; g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); g_return_val_if_fail (timeout >= 0, 0); g_return_val_if_fail (message != NULL, 0); if (icon->manager_window == None) return 0; if (len < 0) len = strlen (message); stamp = icon->stamp++; /* Get ready to send the message */ egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), timeout, len, stamp); /* Now to send the actual message */ gdk_error_trap_push (); while (len > 0) { XClientMessageEvent ev; Display *xdisplay; #if HAVE_GTK_MULTIHEAD xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); #else xdisplay = gdk_display; #endif ev.type = ClientMessage; ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); ev.format = 8; ev.message_type = XInternAtom (xdisplay, "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); if (len > 20) { memcpy (&ev.data, message, 20); len -= 20; message += 20; } else { memcpy (&ev.data, message, len); len = 0; } XSendEvent (xdisplay, icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev); XSync (xdisplay, False); } gdk_error_trap_pop (); return stamp; } void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id) { g_return_if_fail (EGG_IS_TRAY_ICON (icon)); g_return_if_fail (id > 0); egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), id, 0, 0); } fbxkb-0.6/eggtrayicon.h0000644000175000001440000000322510133763174014675 0ustar aanatolyusers/* eggtrayicon.h * * Contributed by Line72 * * Thanks to: * Anders Carlsson * */ #ifndef __EGG_TRAY_ICON_H__ #define __EGG_TRAY_ICON_H__ #include #include G_BEGIN_DECLS #define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ()) #define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) #define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) #define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) #define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) #define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) typedef struct _EggTrayIcon EggTrayIcon; typedef struct _EggTrayIconClass EggTrayIconClass; struct _EggTrayIcon { GtkPlug parent_instance; guint stamp; Atom selection_atom; Atom manager_atom; Atom system_tray_opcode_atom; Window manager_window; }; struct _EggTrayIconClass { GtkPlugClass parent_class; }; GType egg_tray_icon_get_type (void); #if EGG_TRAY_ENABLE_MULTIHEAD EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, const gchar *name); #endif EggTrayIcon *egg_tray_icon_new (const gchar *name); guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const char *message, gint len); void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id); G_END_DECLS #endif /* __EGG_TRAY_ICON_H__ */ fbxkb-0.6/INSTALL0000644000175000001440000000034010133763173013234 0ustar aanatolyusersInstallation: 1. Default way Most users (99.99%) should use this way :-) ./confugire make su - make install 2. Litle customization Run ./configure --help to see supported options, then goto step 1 fbxkb-0.6/version.h0000644000175000001440000000021510541600300014023 0ustar aanatolyusers#ifndef _VERSION_H #define _VERSION_H /* do not change this line - Makefile's 'tar' target depends on it */ #define VERSION "0.6" #endif fbxkb-0.6/COPYING0000644000175000001440000000210210133763173013234 0ustar aanatolyusersCopyright (C) 2002 Anatoly Asviyan (aka Arsen) Copyright (C) 2000 Peter Zelezny Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Soft- ware"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following condi- tions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fbxkb-0.6/CREDITS0000644000175000001440000000022110134103735013212 0ustar aanatolyusersTHANKS * Thanks for xfce4 team for providing xfce4. xfce4's code served as exellent how-to. CREADITS * Diego Bazzanella for egg tray icon code