Date: Sunday, February 21, 2010 @ 15:02:06 Author: juergen Revision: 69677
Fix FS#18354 - [lxde] Keyboard Layout Switcher worked only for one session Added: lxpanel/trunk/Fix-failure-to-react-to-keyboard-map-changes-initiat.patch Modified: lxpanel/trunk/PKGBUILD ------------------------------------------------------------+ Fix-failure-to-react-to-keyboard-map-changes-initiat.patch | 555 +++++++++++ PKGBUILD | 13 2 files changed, 562 insertions(+), 6 deletions(-) Added: Fix-failure-to-react-to-keyboard-map-changes-initiat.patch =================================================================== --- Fix-failure-to-react-to-keyboard-map-changes-initiat.patch (rev 0) +++ Fix-failure-to-react-to-keyboard-map-changes-initiat.patch 2010-02-21 20:02:06 UTC (rev 69677) @@ -0,0 +1,555 @@ +From 438d9fdbd3e0be04de933705917d508a02b7c04b Mon Sep 17 00:00:00 2001 +From: Marty Jack <mar...@linux.local> +Date: Sat, 20 Feb 2010 16:23:57 -0500 +Subject: [PATCH 4/5] Fix failure to react to keyboard map changes initiated outside the plugin + - Occurred when setxkbmap was run, or when HAL configured the keyboard at X startup + - Caused by failure to process the NewKeyboard event + - Caused by dropping events due to faulty code to read them + - Cosmetic change, the tooltip now the Xkb Group name rather than Xkb Symbol name + +--- + src/plugins/xkb/xkb-plugin.c | 92 +++++++++-------- + src/plugins/xkb/xkb.c | 236 +++++++++++++++++++++-------------------- + src/plugins/xkb/xkb.h | 7 +- + 3 files changed, 173 insertions(+), 162 deletions(-) + +diff --git a/src/plugins/xkb/xkb-plugin.c b/src/plugins/xkb/xkb-plugin.c +index f49a77d..80a14ba 100644 +--- a/src/plugins/xkb/xkb-plugin.c ++++ b/src/plugins/xkb/xkb-plugin.c +@@ -1,18 +1,23 @@ +-/* +-//==================================================================== +-// xfce4-xkb-plugin - XFCE4 Xkb Layout Indicator panel plugin +-// ------------------------------------------------------------------- +-// Alexander Iliev <sasoil...@mamul.org> +-// 20-Feb-04 +-// ------------------------------------------------------------------- +-// Parts of this code belong to Michael Glickman <wma...@yahooo.com> +-// and his program wmxkb. +-// WARNING: DO NOT BOTHER Michael Glickman WITH QUESTIONS ABOUT THIS +-// PROGRAM!!! SEND INSTEAD EMAILS TO <sasoil...@mamul.org> +-//==================================================================== +-*/ +- +-/* Modified by Hong Jen Yee (PCMan) <pcman...@gmail.com> on 2008-04-06 for lxpanel */ ++/** ++ * Copyright (c) 2010 LxDE Developers, see the file AUTHORS for details. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++/* Originally derived from xfce4-xkb-plugin, Copyright 2004 Alexander Iliev, ++ * which credits Michael Glickman. */ + + #ifdef HAVE_CONFIG_H + #include <config.h> +@@ -49,38 +54,45 @@ void xkb_redraw(XkbPlugin * xkb) + if (xkb->display_type == IMAGE) + { + int size = xkb->plugin->panel->icon_size; +- char * group_name = (char *) xkb_get_current_group_name_lowercase(xkb); +- char * filename = g_strdup_printf("%s/%s.png", FLAGSDIR, group_name); +- GdkPixbuf * unscaled_pixbuf = gdk_pixbuf_new_from_file(filename, NULL); +- g_free(filename); +- g_free(group_name); +- +- if (unscaled_pixbuf != NULL) ++ char * group_name = (char *) xkb_get_current_symbol_name_lowercase(xkb); ++ if (group_name != NULL) + { +- /* Loaded successfully. */ +- int width = gdk_pixbuf_get_width(unscaled_pixbuf); +- int height = gdk_pixbuf_get_height(unscaled_pixbuf); +- GdkPixbuf * pixbuf = gdk_pixbuf_scale_simple(unscaled_pixbuf, size * width / height, size, GDK_INTERP_BILINEAR); +- if (pixbuf != NULL) ++ char * filename = g_strdup_printf("%s/%s.png", FLAGSDIR, group_name); ++ GdkPixbuf * unscaled_pixbuf = gdk_pixbuf_new_from_file(filename, NULL); ++ g_free(filename); ++ g_free(group_name); ++ ++ if (unscaled_pixbuf != NULL) + { +- gtk_image_set_from_pixbuf(GTK_IMAGE(xkb->image), pixbuf); +- g_object_unref(G_OBJECT(pixbuf)); +- gtk_widget_hide(xkb->label); +- gtk_widget_show(xkb->image); +- gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb)); +- valid_image = TRUE; ++ /* Loaded successfully. */ ++ int width = gdk_pixbuf_get_width(unscaled_pixbuf); ++ int height = gdk_pixbuf_get_height(unscaled_pixbuf); ++ GdkPixbuf * pixbuf = gdk_pixbuf_scale_simple(unscaled_pixbuf, size * width / height, size, GDK_INTERP_BILINEAR); ++ if (pixbuf != NULL) ++ { ++ gtk_image_set_from_pixbuf(GTK_IMAGE(xkb->image), pixbuf); ++ g_object_unref(G_OBJECT(pixbuf)); ++ gtk_widget_hide(xkb->label); ++ gtk_widget_show(xkb->image); ++ gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb)); ++ valid_image = TRUE; ++ } ++ g_object_unref(unscaled_pixbuf); + } +- g_object_unref(unscaled_pixbuf); + } + } + + /* Set the label. */ + if ((xkb->display_type == TEXT) || ( ! valid_image)) + { +- panel_draw_label_text(xkb->plugin->panel, xkb->label, (char *) xkb_get_current_group_name(xkb), TRUE, TRUE); +- gtk_widget_hide(xkb->image); +- gtk_widget_show(xkb->label); +- gtk_widget_set_tooltip_text(xkb->btn, NULL); ++ char * group_name = (char *) xkb_get_current_symbol_name(xkb); ++ if (group_name != NULL) ++ { ++ panel_draw_label_text(xkb->plugin->panel, xkb->label, (char *) group_name, TRUE, TRUE); ++ gtk_widget_hide(xkb->image); ++ gtk_widget_show(xkb->label); ++ gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb)); ++ } + } + } + +@@ -196,10 +208,6 @@ static int xkb_constructor(Plugin * plugin, char ** fp) + /* Initialize the XKB interface. */ + xkb_mechanism_constructor(xkb); + +- /* Initialize a channel to listen for XKB events. */ +- GIOChannel * channel = g_io_channel_unix_new(xkb_get_connection_number(xkb)); +- xkb->source_id = g_io_add_watch(channel, G_IO_IN | G_IO_PRI, (GIOFunc) xkb_gio_callback, (gpointer) xkb); +- + /* Connect signals. */ + g_signal_connect(xkb->btn, "button-press-event", G_CALLBACK(xkb_button_press_event), xkb); + g_signal_connect(xkb->btn, "scroll-event", G_CALLBACK(xkb_scroll_event), xkb); +diff --git a/src/plugins/xkb/xkb.c b/src/plugins/xkb/xkb.c +index 5bb0c39..898a931 100644 +--- a/src/plugins/xkb/xkb.c ++++ b/src/plugins/xkb/xkb.c +@@ -1,18 +1,23 @@ +-/* +-// ==================================================================== +-// xfce4-xkb-plugin - XFCE4 Xkb Layout Indicator panel plugin +-// ------------------------------------------------------------------- +-// Alexander Iliev <sasoil...@mamul.org> +-// 20-Feb-04 +-// ------------------------------------------------------------------- +-// Parts of this code belong to Michael Glickman <wma...@yahooo.com> +-// and his program wmxkb. +-// WARNING: DO NOT BOTHER Michael Glickman WITH QUESTIONS ABOUT THIS +-// PROGRAM!!! SEND INSTEAD EMAILS TO <sasoil...@mamul.org> +-//==================================================================== +-*/ +- +-/* Modified by Hong Jen Yee (PCMan) <pcman...@gmail.com> on 2008-04-06 for lxpanel */ ++/** ++ * Copyright (c) 2010 LxDE Developers, see the file AUTHORS for details. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++/* Originally derived from xfce4-xkb-plugin, Copyright 2004 Alexander Iliev, ++ * which credits Michael Glickman. */ + + #include "xkb.h" + +@@ -26,9 +31,13 @@ + #include <gdk-pixbuf/gdk-pixbuf.h> + #include <glib.h> + ++/* The X Keyboard Extension: Library Specification ++ * http://www.xfree86.org/current/XKBlib.pdf */ ++ + static void xkb_enter_locale_by_process(XkbPlugin * xkb); + static void refresh_group_xkb(XkbPlugin * xkb); +-static int do_init_xkb(XkbPlugin * xkb); ++static int initialize_keyboard_description(XkbPlugin * xkb); ++static GdkFilterReturn xkb_event_filter(GdkXEvent * xevent, GdkEvent * event, XkbPlugin * xkb); + + /* Insert a process and its layout into the hash table. */ + static void xkb_enter_locale_by_process(XkbPlugin * xkb) +@@ -56,60 +65,65 @@ int xkb_get_group_count(XkbPlugin * xkb) + return xkb->group_count; + } + ++/* Get the current group name. */ ++const char * xkb_get_current_group_name(XkbPlugin * xkb) ++{ ++ return xkb->group_names[xkb->current_group_xkb_no]; ++} ++ + /* Convert a group number to a symbol name. */ + const char * xkb_get_symbol_name_by_res_no(XkbPlugin * xkb, int n) + { + return xkb->symbol_names[n]; + } + +-/* Get the current group name. */ +-const char * xkb_get_current_group_name(XkbPlugin * xkb) ++/* Get the current symbol name. */ ++const char * xkb_get_current_symbol_name(XkbPlugin * xkb) + { + return xkb_get_symbol_name_by_res_no(xkb, xkb->current_group_xkb_no); + } + +-/* Get the current group name converted to lowercase. */ +-const char * xkb_get_current_group_name_lowercase(XkbPlugin * xkb) ++/* Get the current symbol name converted to lowercase. */ ++const char * xkb_get_current_symbol_name_lowercase(XkbPlugin * xkb) + { +- const char * tmp = xkb_get_current_group_name(xkb); +- return g_utf8_strdown(tmp, -1); ++ const char * tmp = xkb_get_current_symbol_name(xkb); ++ return ((tmp != NULL) ? g_utf8_strdown(tmp, -1) : NULL); + } + + /* Refresh current group number from Xkb state. */ + static void refresh_group_xkb(XkbPlugin * xkb) + { + XkbStateRec xkb_state; +- XkbGetState(xkb->dsp, xkb->device_id, &xkb_state); ++ XkbGetState(GDK_DISPLAY(), XkbUseCoreKbd, &xkb_state); + xkb->current_group_xkb_no = xkb_state.group; + } + +-/* Initialize the Xkb structures. */ +-static int do_init_xkb(XkbPlugin * xkb) ++/* Initialize the keyboard description initially or after a NewKeyboard event. */ ++static int initialize_keyboard_description(XkbPlugin * xkb) + { +- /* Create hash table. */ +- xkb->group_hash_table = g_hash_table_new(g_direct_hash, NULL); +- +- /* Initialize the Xkb extension. */ +- int major, minor, opcode; +- Bool status = XkbQueryExtension(xkb->dsp, &opcode, +- &xkb->base_event_code, &xkb->base_error_code, &major, &minor); +- +- /* Use the core keyboard. */ +- xkb->device_id = XkbUseCoreKbd; ++ /* Free the strings. */ ++ int i; ++ for (i = 0; i < XkbNumKbdGroups; i += 1) ++ { ++ g_free(xkb->group_names[i]); ++ g_free(xkb->symbol_names[i]); ++ xkb->group_names[i] = NULL; ++ xkb->symbol_names[i] = NULL; ++ } + + /* Allocate a keyboard description structure. */ ++ int status = False; + XkbDescRec * kbd_desc_ptr = XkbAllocKeyboard(); + if (kbd_desc_ptr == NULL) + { + ERR("Failed to get keyboard description\n"); + goto HastaLaVista; + } +- kbd_desc_ptr->dpy = xkb->dsp; + + /* Fetch information into the keyboard description. */ +- XkbGetControls(xkb->dsp, XkbAllControlsMask, kbd_desc_ptr); +- XkbGetNames(xkb->dsp, XkbSymbolsNameMask, kbd_desc_ptr); +- XkbGetNames(xkb->dsp, XkbGroupNamesMask, kbd_desc_ptr); ++ XkbGetControls(GDK_DISPLAY(), XkbAllControlsMask, kbd_desc_ptr); ++ XkbGetNames(GDK_DISPLAY(), XkbSymbolsNameMask, kbd_desc_ptr); ++ XkbGetNames(GDK_DISPLAY(), XkbGroupNamesMask, kbd_desc_ptr); + + if (kbd_desc_ptr->names == NULL) + { +@@ -137,12 +151,11 @@ static int do_init_xkb(XkbPlugin * xkb) + + /* Determine the group names. Trim off text beginning at a '('. */ + const Atom * tmp_group_source = kbd_desc_ptr->names->groups; +- int i; + for (i = 0; i < xkb->group_count; i++) + { + if (tmp_group_source[i] != None) + { +- char * ptr = XGetAtomName(xkb->dsp, tmp_group_source[i]); ++ char * ptr = XGetAtomName(GDK_DISPLAY(), tmp_group_source[i]); + xkb->group_names[i] = ptr; + if ((ptr != NULL) && ((ptr = strchr(ptr, '('))) != NULL) + *ptr = '\0'; +@@ -153,7 +166,7 @@ static int do_init_xkb(XkbPlugin * xkb) + Atom sym_name_atom = kbd_desc_ptr->names->symbols; + char * sym_name; + if ((sym_name_atom == None) +- || ((sym_name = XGetAtomName(xkb->dsp, sym_name_atom)) == NULL)) ++ || ((sym_name = XGetAtomName(GDK_DISPLAY(), sym_name_atom)) == NULL)) + goto HastaLaVista; + + /* Parse and store symbol names. */ +@@ -190,83 +203,106 @@ static int do_init_xkb(XkbPlugin * xkb) + { + xkb->group_count = 2; + xkb->symbol_names[1] = xkb->symbol_names[0]; +- xkb->symbol_names[0] = strdup("us"); +- xkb->group_names[0] = strdup("US/ASCII"); +- xkb->group_names[1] = strdup("Japanese"); ++ xkb->symbol_names[0] = g_strdup("us"); ++ xkb->group_names[0] = g_strdup("US/ASCII"); ++ xkb->group_names[1] = g_strdup("Japanese"); + } + else if (count < xkb->group_count) + { + /* Ensure that the names are fully initialized. */ + int j = count, k = xkb->group_count; + while(--j >= 0) xkb->symbol_names[--k] = xkb->symbol_names[j]; +- while(--k >= 0) xkb->symbol_names[k] = strdup("en_US"); ++ while(--k >= 0) xkb->symbol_names[k] = g_strdup("en_US"); + } + +- /* Enxure that the names are fully initialized. */ ++ /* Ensure that the names are fully initialized. */ + for (i = 0; i < xkb->group_count; i++) + { + if (xkb->symbol_names[i] == NULL) + { + ERR("\nGroup Symbol %i is undefined, set to 'U/A' !\n", i+1); +- xkb->symbol_names[i] = strdup("U/A"); ++ xkb->symbol_names[i] = g_strdup("U/A"); + } + } + ++ /* Create or recreate hash table. ++ * The layout that was associated to the windows may or may not be at the same group number, ++ * and worse, may no longer exist, which there is no meaningful way to deal with. */ ++ if (xkb->group_hash_table != NULL) ++ g_hash_table_destroy(xkb->group_hash_table); ++ xkb->group_hash_table = g_hash_table_new(g_direct_hash, NULL); ++ + status = True; + + HastaLaVista: + if (kbd_desc_ptr != NULL) + XkbFreeKeyboard(kbd_desc_ptr, 0, True); ++ + return status; + } + ++/* GDK event filter that receives events from all windows and the Xkb extension. */ ++static GdkFilterReturn xkb_event_filter(GdkXEvent * xevent, GdkEvent * event, XkbPlugin * xkb) ++{ ++ XEvent * ev = (XEvent *) xevent; ++ ++ if (ev->xany.type == xkb->base_event_code + XkbEventCode) ++ { ++ /* Xkb event. */ ++ XkbEvent * xkbev = (XkbEvent *) ev; ++ if (xkbev->any.xkb_type == XkbNewKeyboardNotify) ++ { ++ initialize_keyboard_description(xkb); ++ refresh_group_xkb(xkb); ++ xkb_redraw(xkb); ++ xkb_enter_locale_by_process(xkb); ++ } ++ else if (xkbev->any.xkb_type == XkbStateNotify) ++ { ++ if (xkbev->state.group != xkb->current_group_xkb_no) ++ { ++ /* Switch to the new group and redraw the display. */ ++ xkb->current_group_xkb_no = xkbev->state.group; ++ refresh_group_xkb(xkb); ++ xkb_redraw(xkb); ++ xkb_enter_locale_by_process(xkb); ++ } ++ } ++ } ++ return GDK_FILTER_CONTINUE; ++} ++ + /* Initialize the Xkb interface. */ + void xkb_mechanism_constructor(XkbPlugin * xkb) + { +- /* Enable the Xkb extension on all clients. */ +- XkbIgnoreExtension(False); +- +- /* Open the display. */ +- int major = XkbMajorVersion; +- int minor = XkbMinorVersion; +- char * display_name = ""; +- int event_code; +- int error_rtrn; +- int reason_rtrn; +- xkb->dsp = XkbOpenDisplay(display_name, &event_code, &error_rtrn, &major, &minor, &reason_rtrn); +- +- switch (reason_rtrn) ++ /* Initialize Xkb extension. */ ++ int opcode; ++ int maj = XkbMajorVersion; ++ int min = XkbMinorVersion; ++ if ((XkbLibraryVersion(&maj, &min)) ++ && (XkbQueryExtension(GDK_DISPLAY(), &opcode, &xkb->base_event_code, &xkb->base_error_code, &maj, &min))) + { +- case XkbOD_BadLibraryVersion: +- ERR("Bad XKB library version.\n"); +- return; +- case XkbOD_ConnectionRefused: +- ERR("Connection to X server refused.\n"); +- return; +- case XkbOD_BadServerVersion: +- ERR("Bad X server version.\n"); +- return; +- case XkbOD_NonXkbServer: +- ERR("XKB not present.\n"); +- return; +- case XkbOD_Success: +- break; +- } ++ /* Read the keyboard description. */ ++ initialize_keyboard_description(xkb); + +- /* Initialize our mechanism. */ +- if (do_init_xkb(xkb) != True) +- return; ++ /* Establish GDK event filter. */ ++ gdk_window_add_filter(NULL, (GdkFilterFunc) xkb_event_filter, (gpointer) xkb); + +- /* Specify events we will receive. */ +- XkbSelectEventDetails(xkb->dsp, xkb->device_id, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask); ++ /* Specify events we will receive. */ ++ XkbSelectEvents(GDK_DISPLAY(), XkbUseCoreKbd, XkbNewKeyboardNotifyMask, XkbNewKeyboardNotifyMask); ++ XkbSelectEventDetails(GDK_DISPLAY(), XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask); + +- /* Get current state. */ +- refresh_group_xkb(xkb); ++ /* Get current state. */ ++ refresh_group_xkb(xkb); ++ } + } + + /* Deallocate resources associated with Xkb interface. */ + void xkb_mechanism_destructor(XkbPlugin * xkb) + { ++ /* Remove event filter. */ ++ gdk_window_remove_filter(NULL, (GdkFilterFunc) xkb_event_filter, xkb); ++ + /* Free group and symbol name memory. */ + int i; + for (i = 0; i < xkb->group_count; i++) +@@ -283,21 +319,11 @@ void xkb_mechanism_destructor(XkbPlugin * xkb) + } + } + +- /* Close the display. */ +- XCloseDisplay(xkb->dsp); +- xkb->dsp = NULL; +- + /* Destroy the hash table. */ + g_hash_table_destroy(xkb->group_hash_table); + xkb->group_hash_table = NULL; + } + +-/* Return the connection number for the display. */ +-int xkb_get_connection_number(XkbPlugin * xkb) +-{ +- return ConnectionNumber(xkb->dsp); +-} +- + /* Set the layout to the next layout. */ + int xkb_change_group(XkbPlugin * xkb, int increment) + { +@@ -307,33 +333,13 @@ int xkb_change_group(XkbPlugin * xkb, int increment) + if (next_group >= xkb->group_count) next_group = 0; + + /* Execute the change. */ +- XkbLockGroup(xkb->dsp, xkb->device_id, next_group); ++ XkbLockGroup(GDK_DISPLAY(), XkbUseCoreKbd, next_group); + refresh_group_xkb(xkb); + xkb_redraw(xkb); + xkb_enter_locale_by_process(xkb); + return 1; + } + +-/* Callback when activity detected on the Xkb channel. */ +-gboolean xkb_gio_callback(GIOChannel * source, GIOCondition condition, gpointer data) +-{ +- XkbPlugin * xkb = (XkbPlugin *) data; +- +- XkbEvent evnt; +- XNextEvent(xkb->dsp, &evnt.core); +- if ((evnt.type == xkb->base_event_code) +- && (evnt.any.xkb_type == XkbStateNotify) +- && (evnt.state.group != xkb->current_group_xkb_no)) +- { +- /* Switch to the new group and redraw the display. */ +- xkb->current_group_xkb_no = evnt.state.group; +- refresh_group_xkb(xkb); +- xkb_redraw(xkb); +- xkb_enter_locale_by_process(xkb); +- } +- return TRUE; +-} +- + /* React to change of focus by switching to the application's layout or the default layout. */ + void xkb_active_window_changed(XkbPlugin * xkb, gint pid) + { +@@ -345,7 +351,7 @@ void xkb_active_window_changed(XkbPlugin * xkb, gint pid) + + if (new_group_xkb_no < xkb->group_count) + { +- XkbLockGroup(xkb->dsp, xkb->device_id, new_group_xkb_no); ++ XkbLockGroup(GDK_DISPLAY(), XkbUseCoreKbd, new_group_xkb_no); + refresh_group_xkb(xkb); + } + } +diff --git a/src/plugins/xkb/xkb.h b/src/plugins/xkb/xkb.h +index 9265198..20c7ed3 100644 +--- a/src/plugins/xkb/xkb.h ++++ b/src/plugins/xkb/xkb.h +@@ -49,10 +49,8 @@ typedef struct { + GtkWidget * per_app_default_layout_menu; /* Combo box of all available layouts */ + + /* Mechanism. */ +- Display * dsp; /* Handle to X display */ + int base_event_code; /* Result of initializing Xkb extension */ + int base_error_code; +- int device_id; /* Keyboard device ID (always "core keyboard") */ + int current_group_xkb_no; /* Current layout */ + int group_count; /* Count of groups as returned by Xkb */ + char * group_names[XkbNumKbdGroups]; /* Group names as returned by Xkb */ +@@ -67,12 +65,11 @@ extern int xkb_get_current_group_xkb_no(XkbPlugin * xkb); + extern int xkb_get_group_count(XkbPlugin * xkb); + extern const char * xkb_get_symbol_name_by_res_no(XkbPlugin * xkb, int group_res_no); + extern const char * xkb_get_current_group_name(XkbPlugin * xkb); +-extern const char * xkb_get_current_group_name_lowercase(XkbPlugin * xkb); ++extern const char * xkb_get_current_symbol_name(XkbPlugin * xkb); ++extern const char * xkb_get_current_symbol_name_lowercase(XkbPlugin * xkb); + extern void xkb_mechanism_constructor(XkbPlugin * xkb); + extern void xkb_mechanism_destructor(XkbPlugin * xkb); +-extern int xkb_get_connection_number(XkbPlugin * xkb); + extern int xkb_change_group(XkbPlugin * xkb, int increment); +-extern gboolean xkb_gio_callback(GIOChannel * source, GIOCondition condition, gpointer data); + extern void xkb_active_window_changed(XkbPlugin * xkb, GPid pid); + + #endif +-- +1.7.0 + Modified: PKGBUILD =================================================================== --- PKGBUILD 2010-02-21 19:05:18 UTC (rev 69676) +++ PKGBUILD 2010-02-21 20:02:06 UTC (rev 69677) @@ -1,20 +1,21 @@ # Maintainer: Juergen Hoetzel <juer...@archlinux.org> pkgname=lxpanel pkgver=0.5.5 -pkgrel=1 +pkgrel=2 pkgdesc="Panel of the LXDE Desktop" arch=('i686' 'x86_64') license=('GPL2') url="http://lxde.org/" groups=('lxde') depends=('gtk2' 'alsa-lib' 'menu-cache' 'lxmenu-data') -source=(http://downloads.sourceforge.net/sourceforge/lxde/${pkgname}-${pkgver}.tar.gz) -md5sums=('6162b7e8d912a41f9c075fe982370bfb') +source=(http://downloads.sourceforge.net/sourceforge/lxde/${pkgname}-${pkgver}.tar.gz Fix-failure-to-react-to-keyboard-map-changes-initiat.patch) +md5sums=('6162b7e8d912a41f9c075fe982370bfb' 'aade0bd1c58be45930e881f987ade17a') optdepends=(pcmanfm) build() { cd "$srcdir/$pkgname-$pkgver" - ./configure --sysconfdir=/etc --prefix=/usr || return 1 - make || return 1 - make DESTDIR="$pkgdir" install || return 1 + patch -p1 -i $srcdir/Fix-failure-to-react-to-keyboard-map-changes-initiat.patch + ./configure --sysconfdir=/etc --prefix=/usr + make + make DESTDIR="$pkgdir" install }