wok rev 6394

Bumped some packages by adding a empty line. Added a patch to lxpanel to fix failure to react to keyboard map changes. Added DEPENDS to BUILD_DEPENDS of gnome-mplayer.
author Christopher Rogers <slaxemulator@gmail.com>
date Fri Sep 24 04:32:19 2010 +0000 (2010-09-24)
parents 89382e31e2cd
children 36a0e1608714
files cdrdao-utils/receipt cdrdao/receipt gnome-mplayer/receipt grsync/receipt gtk+/receipt lxpanel/receipt lxpanel/stuff/Fix-failure-to-react-to-keyboard-map-changes-initiat.patch
line diff
     1.1 --- a/cdrdao-utils/receipt	Fri Sep 24 02:27:38 2010 +0000
     1.2 +++ b/cdrdao-utils/receipt	Fri Sep 24 04:32:19 2010 +0000
     1.3 @@ -14,6 +14,5 @@
     1.4  {
     1.5  	mkdir -p $fs/usr/bin
     1.6  	cp -a $_pkg/usr/bin/ $fs/usr
     1.7 -	rm $fs/usr/bin/cdrdao	
     1.8 -
     1.9 +	rm $fs/usr/bin/cdrdao
    1.10  }
     2.1 --- a/cdrdao/receipt	Fri Sep 24 02:27:38 2010 +0000
     2.2 +++ b/cdrdao/receipt	Fri Sep 24 04:32:19 2010 +0000
     2.3 @@ -36,5 +36,4 @@
     2.4  	mkdir -p $fs/usr/bin
     2.5  	cp -a $_pkg/usr/bin/cdrdao $fs/usr/bin
     2.6  	cp -a $_pkg/usr/share $fs/usr
     2.7 -
     2.8  }
     3.1 --- a/gnome-mplayer/receipt	Fri Sep 24 02:27:38 2010 +0000
     3.2 +++ b/gnome-mplayer/receipt	Fri Sep 24 04:32:19 2010 +0000
     3.3 @@ -5,8 +5,8 @@
     3.4  CATEGORY="multimedia"
     3.5  SHORT_DESC="simple MPlayer GUI"
     3.6  MAINTAINER="jozee@slitaz.org"
     3.7 -DEPENDS="mplayer dbus-glib libnotify alsa-lib libgpod"
     3.8 -BUILD_DEPENDS="mplayer dbus-dev dbus-glib-dev libnotify libnotify-dev libgpod libgpod-dev pkg-config xorg-libX11-dev libxcb-dev gtk+-dev xorg-libXss-dev"
     3.9 +DEPENDS="mplayer gtk+ dbus-glib libnotify alsa-lib libgpod"
    3.10 +BUILD_DEPENDS="$DEPENDS dbus-dev dbus-glib-dev libnotify-dev libgpod-dev pkg-config xorg-libX11-dev libxcb-dev gtk+-dev xorg-libXss-dev"
    3.11  SUGGESTED="libgpod"
    3.12  TARBALL="$PACKAGE-$VERSION.tar.gz"
    3.13  WEB_SITE="http://gnome-mplayer.googlecode.com/" 
     4.1 --- a/grsync/receipt	Fri Sep 24 02:27:38 2010 +0000
     4.2 +++ b/grsync/receipt	Fri Sep 24 04:32:19 2010 +0000
     4.3 @@ -34,3 +34,4 @@
     4.4      	sed -i s'|#!/bin/bash|#!/bin/sh|' $fs/usr/bin/grsync-batch
     4.5  	chmod +x $fs/usr/bin/*
     4.6  }
     4.7 +
     5.1 --- a/gtk+/receipt	Fri Sep 24 02:27:38 2010 +0000
     5.2 +++ b/gtk+/receipt	Fri Sep 24 04:32:19 2010 +0000
     5.3 @@ -76,3 +76,4 @@
     5.4  		rm -rf $1/usr/lib/gtk-2.0/2.4.0
     5.5  	fi
     5.6  }
     5.7 +
     6.1 --- a/lxpanel/receipt	Fri Sep 24 02:27:38 2010 +0000
     6.2 +++ b/lxpanel/receipt	Fri Sep 24 04:32:19 2010 +0000
     6.3 @@ -19,6 +19,7 @@
     6.4  compile_rules()
     6.5  {
     6.6  	cd $src
     6.7 +	patch -p1 -i ../stuff/Fix-failure-to-react-to-keyboard-map-changes-initiat.patch
     6.8  	./configure \
     6.9  		--prefix=/usr \
    6.10  		--sysconfdir=/etc \
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/lxpanel/stuff/Fix-failure-to-react-to-keyboard-map-changes-initiat.patch	Fri Sep 24 04:32:19 2010 +0000
     7.3 @@ -0,0 +1,555 @@
     7.4 +From 438d9fdbd3e0be04de933705917d508a02b7c04b Mon Sep 17 00:00:00 2001
     7.5 +From: Marty Jack <martyj@linux.local>
     7.6 +Date: Sat, 20 Feb 2010 16:23:57 -0500
     7.7 +Subject: [PATCH 4/5] Fix failure to react to keyboard map changes initiated outside the plugin
     7.8 + - Occurred when setxkbmap was run, or when HAL configured the keyboard at X startup
     7.9 + - Caused by failure to process the NewKeyboard event
    7.10 + - Caused by dropping events due to faulty code to read them
    7.11 + - Cosmetic change, the tooltip now the Xkb Group name rather than Xkb Symbol name
    7.12 +
    7.13 +---
    7.14 + src/plugins/xkb/xkb-plugin.c |   92 +++++++++--------
    7.15 + src/plugins/xkb/xkb.c        |  236 +++++++++++++++++++++--------------------
    7.16 + src/plugins/xkb/xkb.h        |    7 +-
    7.17 + 3 files changed, 173 insertions(+), 162 deletions(-)
    7.18 +
    7.19 +diff --git a/src/plugins/xkb/xkb-plugin.c b/src/plugins/xkb/xkb-plugin.c
    7.20 +index f49a77d..80a14ba 100644
    7.21 +--- a/src/plugins/xkb/xkb-plugin.c
    7.22 ++++ b/src/plugins/xkb/xkb-plugin.c
    7.23 +@@ -1,18 +1,23 @@
    7.24 +-/*
    7.25 +-//====================================================================
    7.26 +-//  xfce4-xkb-plugin - XFCE4 Xkb Layout Indicator panel plugin
    7.27 +-// -------------------------------------------------------------------
    7.28 +-//  Alexander Iliev <sasoiliev@mamul.org>
    7.29 +-//  20-Feb-04
    7.30 +-// -------------------------------------------------------------------
    7.31 +-//  Parts of this code belong to Michael Glickman <wmalms@yahooo.com>
    7.32 +-//  and his program wmxkb.
    7.33 +-//  WARNING: DO NOT BOTHER Michael Glickman WITH QUESTIONS ABOUT THIS
    7.34 +-//           PROGRAM!!! SEND INSTEAD EMAILS TO <sasoiliev@mamul.org>
    7.35 +-//====================================================================
    7.36 +-*/
    7.37 +-
    7.38 +-/* Modified by Hong Jen Yee (PCMan) <pcman.tw@gmail.com> on 2008-04-06 for lxpanel */
    7.39 ++/**
    7.40 ++ * Copyright (c) 2010 LxDE Developers, see the file AUTHORS for details.
    7.41 ++ *
    7.42 ++ * This program is free software; you can redistribute it and/or modify
    7.43 ++ * it under the terms of the GNU General Public License as published by
    7.44 ++ * the Free Software Foundation; either version 2 of the License, or
    7.45 ++ * (at your option) any later version.
    7.46 ++ *
    7.47 ++ * This program is distributed in the hope that it will be useful,
    7.48 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
    7.49 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    7.50 ++ * GNU General Public License for more details.
    7.51 ++ *
    7.52 ++ * You should have received a copy of the GNU General Public License
    7.53 ++ * along with this program; if not, write to the Free Software Foundation,
    7.54 ++ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    7.55 ++ */
    7.56 ++
    7.57 ++/* Originally derived from xfce4-xkb-plugin, Copyright 2004 Alexander Iliev,
    7.58 ++ * which credits Michael Glickman. */
    7.59 + 
    7.60 + #ifdef HAVE_CONFIG_H
    7.61 + #include <config.h>
    7.62 +@@ -49,38 +54,45 @@ void xkb_redraw(XkbPlugin * xkb)
    7.63 +     if (xkb->display_type == IMAGE)
    7.64 +     {
    7.65 +         int size = xkb->plugin->panel->icon_size;
    7.66 +-        char * group_name = (char *) xkb_get_current_group_name_lowercase(xkb);
    7.67 +-        char * filename = g_strdup_printf("%s/%s.png", FLAGSDIR, group_name);
    7.68 +-        GdkPixbuf * unscaled_pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
    7.69 +-        g_free(filename);
    7.70 +-        g_free(group_name);
    7.71 +-
    7.72 +-        if (unscaled_pixbuf != NULL)
    7.73 ++        char * group_name = (char *) xkb_get_current_symbol_name_lowercase(xkb);
    7.74 ++        if (group_name != NULL)
    7.75 +         {
    7.76 +-            /* Loaded successfully. */
    7.77 +-            int width = gdk_pixbuf_get_width(unscaled_pixbuf);
    7.78 +-            int height = gdk_pixbuf_get_height(unscaled_pixbuf);
    7.79 +-            GdkPixbuf * pixbuf = gdk_pixbuf_scale_simple(unscaled_pixbuf, size * width / height, size, GDK_INTERP_BILINEAR);
    7.80 +-            if (pixbuf != NULL)
    7.81 ++            char * filename = g_strdup_printf("%s/%s.png", FLAGSDIR, group_name);
    7.82 ++            GdkPixbuf * unscaled_pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
    7.83 ++            g_free(filename);
    7.84 ++            g_free(group_name);
    7.85 ++
    7.86 ++            if (unscaled_pixbuf != NULL)
    7.87 +             {
    7.88 +-                gtk_image_set_from_pixbuf(GTK_IMAGE(xkb->image), pixbuf);
    7.89 +-                g_object_unref(G_OBJECT(pixbuf));
    7.90 +-                gtk_widget_hide(xkb->label);
    7.91 +-                gtk_widget_show(xkb->image);
    7.92 +-                gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb));
    7.93 +-                valid_image = TRUE;
    7.94 ++                /* Loaded successfully. */
    7.95 ++                int width = gdk_pixbuf_get_width(unscaled_pixbuf);
    7.96 ++                int height = gdk_pixbuf_get_height(unscaled_pixbuf);
    7.97 ++                GdkPixbuf * pixbuf = gdk_pixbuf_scale_simple(unscaled_pixbuf, size * width / height, size, GDK_INTERP_BILINEAR);
    7.98 ++                if (pixbuf != NULL)
    7.99 ++                {
   7.100 ++                    gtk_image_set_from_pixbuf(GTK_IMAGE(xkb->image), pixbuf);
   7.101 ++                    g_object_unref(G_OBJECT(pixbuf));
   7.102 ++                    gtk_widget_hide(xkb->label);
   7.103 ++                    gtk_widget_show(xkb->image);
   7.104 ++                    gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb));
   7.105 ++                    valid_image = TRUE;
   7.106 ++                }
   7.107 ++                g_object_unref(unscaled_pixbuf);
   7.108 +             }
   7.109 +-            g_object_unref(unscaled_pixbuf);
   7.110 +         }
   7.111 +     }
   7.112 + 
   7.113 +     /* Set the label. */
   7.114 +     if ((xkb->display_type == TEXT) || ( ! valid_image))
   7.115 +     {
   7.116 +-        panel_draw_label_text(xkb->plugin->panel, xkb->label, (char *) xkb_get_current_group_name(xkb), TRUE, TRUE);
   7.117 +-        gtk_widget_hide(xkb->image);
   7.118 +-        gtk_widget_show(xkb->label);
   7.119 +-        gtk_widget_set_tooltip_text(xkb->btn, NULL);
   7.120 ++        char * group_name = (char *) xkb_get_current_symbol_name(xkb);
   7.121 ++        if (group_name != NULL)
   7.122 ++        {
   7.123 ++            panel_draw_label_text(xkb->plugin->panel, xkb->label, (char *) group_name, TRUE, TRUE);
   7.124 ++            gtk_widget_hide(xkb->image);
   7.125 ++            gtk_widget_show(xkb->label);
   7.126 ++            gtk_widget_set_tooltip_text(xkb->btn, xkb_get_current_group_name(xkb));
   7.127 ++        }
   7.128 +     }
   7.129 + }
   7.130 + 
   7.131 +@@ -196,10 +208,6 @@ static int xkb_constructor(Plugin * plugin, char ** fp)
   7.132 +     /* Initialize the XKB interface. */
   7.133 +     xkb_mechanism_constructor(xkb);
   7.134 + 
   7.135 +-    /* Initialize a channel to listen for XKB events. */
   7.136 +-    GIOChannel * channel = g_io_channel_unix_new(xkb_get_connection_number(xkb));
   7.137 +-    xkb->source_id = g_io_add_watch(channel, G_IO_IN | G_IO_PRI, (GIOFunc) xkb_gio_callback, (gpointer) xkb);
   7.138 +-
   7.139 +     /* Connect signals. */
   7.140 +     g_signal_connect(xkb->btn, "button-press-event", G_CALLBACK(xkb_button_press_event), xkb);
   7.141 +     g_signal_connect(xkb->btn, "scroll-event", G_CALLBACK(xkb_scroll_event), xkb);
   7.142 +diff --git a/src/plugins/xkb/xkb.c b/src/plugins/xkb/xkb.c
   7.143 +index 5bb0c39..898a931 100644
   7.144 +--- a/src/plugins/xkb/xkb.c
   7.145 ++++ b/src/plugins/xkb/xkb.c
   7.146 +@@ -1,18 +1,23 @@
   7.147 +-/*
   7.148 +-// ====================================================================
   7.149 +-//  xfce4-xkb-plugin - XFCE4 Xkb Layout Indicator panel plugin
   7.150 +-// -------------------------------------------------------------------
   7.151 +-//  Alexander Iliev <sasoiliev@mamul.org>
   7.152 +-//  20-Feb-04
   7.153 +-// -------------------------------------------------------------------
   7.154 +-//  Parts of this code belong to Michael Glickman <wmalms@yahooo.com>
   7.155 +-//  and his program wmxkb.
   7.156 +-//  WARNING: DO NOT BOTHER Michael Glickman WITH QUESTIONS ABOUT THIS
   7.157 +-//           PROGRAM!!! SEND INSTEAD EMAILS TO <sasoiliev@mamul.org>
   7.158 +-//====================================================================
   7.159 +-*/
   7.160 +-
   7.161 +-/* Modified by Hong Jen Yee (PCMan) <pcman.tw@gmail.com> on 2008-04-06 for lxpanel */
   7.162 ++/**
   7.163 ++ * Copyright (c) 2010 LxDE Developers, see the file AUTHORS for details.
   7.164 ++ *
   7.165 ++ * This program is free software; you can redistribute it and/or modify
   7.166 ++ * it under the terms of the GNU General Public License as published by
   7.167 ++ * the Free Software Foundation; either version 2 of the License, or
   7.168 ++ * (at your option) any later version.
   7.169 ++ *
   7.170 ++ * This program is distributed in the hope that it will be useful,
   7.171 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
   7.172 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   7.173 ++ * GNU General Public License for more details.
   7.174 ++ *
   7.175 ++ * You should have received a copy of the GNU General Public License
   7.176 ++ * along with this program; if not, write to the Free Software Foundation,
   7.177 ++ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   7.178 ++ */
   7.179 ++
   7.180 ++/* Originally derived from xfce4-xkb-plugin, Copyright 2004 Alexander Iliev,
   7.181 ++ * which credits Michael Glickman. */
   7.182 + 
   7.183 + #include "xkb.h"
   7.184 + 
   7.185 +@@ -26,9 +31,13 @@
   7.186 + #include <gdk-pixbuf/gdk-pixbuf.h>
   7.187 + #include <glib.h>
   7.188 + 
   7.189 ++/* The X Keyboard Extension: Library Specification
   7.190 ++ * http://www.xfree86.org/current/XKBlib.pdf */
   7.191 ++
   7.192 + static void xkb_enter_locale_by_process(XkbPlugin * xkb);
   7.193 + static void refresh_group_xkb(XkbPlugin * xkb);
   7.194 +-static int do_init_xkb(XkbPlugin * xkb);
   7.195 ++static int initialize_keyboard_description(XkbPlugin * xkb);
   7.196 ++static GdkFilterReturn xkb_event_filter(GdkXEvent * xevent, GdkEvent * event, XkbPlugin * xkb);
   7.197 + 
   7.198 + /* Insert a process and its layout into the hash table. */
   7.199 + static void xkb_enter_locale_by_process(XkbPlugin * xkb)
   7.200 +@@ -56,60 +65,65 @@ int xkb_get_group_count(XkbPlugin * xkb)
   7.201 +   return xkb->group_count;
   7.202 + }
   7.203 + 
   7.204 ++/* Get the current group name. */
   7.205 ++const char * xkb_get_current_group_name(XkbPlugin * xkb) 
   7.206 ++{
   7.207 ++    return xkb->group_names[xkb->current_group_xkb_no];
   7.208 ++}
   7.209 ++
   7.210 + /* Convert a group number to a symbol name. */
   7.211 + const char * xkb_get_symbol_name_by_res_no(XkbPlugin * xkb, int n) 
   7.212 + {
   7.213 +     return xkb->symbol_names[n];
   7.214 + }
   7.215 + 
   7.216 +-/* Get the current group name. */
   7.217 +-const char * xkb_get_current_group_name(XkbPlugin * xkb) 
   7.218 ++/* Get the current symbol name. */
   7.219 ++const char * xkb_get_current_symbol_name(XkbPlugin * xkb) 
   7.220 + {
   7.221 +     return xkb_get_symbol_name_by_res_no(xkb, xkb->current_group_xkb_no);
   7.222 + }
   7.223 + 
   7.224 +-/* Get the current group name converted to lowercase. */
   7.225 +-const char * xkb_get_current_group_name_lowercase(XkbPlugin * xkb) 
   7.226 ++/* Get the current symbol name converted to lowercase. */
   7.227 ++const char * xkb_get_current_symbol_name_lowercase(XkbPlugin * xkb) 
   7.228 + {
   7.229 +-    const char * tmp = xkb_get_current_group_name(xkb);
   7.230 +-    return g_utf8_strdown(tmp, -1);
   7.231 ++    const char * tmp = xkb_get_current_symbol_name(xkb);
   7.232 ++    return ((tmp != NULL) ? g_utf8_strdown(tmp, -1) : NULL);
   7.233 + }
   7.234 + 
   7.235 + /* Refresh current group number from Xkb state. */
   7.236 + static void refresh_group_xkb(XkbPlugin * xkb) 
   7.237 + {
   7.238 +     XkbStateRec xkb_state;
   7.239 +-    XkbGetState(xkb->dsp, xkb->device_id, &xkb_state);
   7.240 ++    XkbGetState(GDK_DISPLAY(), XkbUseCoreKbd, &xkb_state);
   7.241 +     xkb->current_group_xkb_no = xkb_state.group;
   7.242 + }
   7.243 + 
   7.244 +-/* Initialize the Xkb structures. */
   7.245 +-static int do_init_xkb(XkbPlugin * xkb) 
   7.246 ++/* Initialize the keyboard description initially or after a NewKeyboard event. */
   7.247 ++static int initialize_keyboard_description(XkbPlugin * xkb)
   7.248 + {
   7.249 +-    /* Create hash table. */
   7.250 +-    xkb->group_hash_table = g_hash_table_new(g_direct_hash, NULL);
   7.251 +-
   7.252 +-    /* Initialize the Xkb extension. */
   7.253 +-    int major, minor, opcode;
   7.254 +-    Bool status = XkbQueryExtension(xkb->dsp, &opcode,
   7.255 +-        &xkb->base_event_code, &xkb->base_error_code, &major, &minor);
   7.256 +-
   7.257 +-    /* Use the core keyboard. */
   7.258 +-    xkb->device_id = XkbUseCoreKbd;
   7.259 ++    /* Free the strings. */
   7.260 ++    int i;
   7.261 ++    for (i = 0; i < XkbNumKbdGroups; i += 1)
   7.262 ++    {
   7.263 ++        g_free(xkb->group_names[i]);
   7.264 ++        g_free(xkb->symbol_names[i]);
   7.265 ++        xkb->group_names[i] = NULL;
   7.266 ++        xkb->symbol_names[i] = NULL;
   7.267 ++    }
   7.268 + 
   7.269 +     /* Allocate a keyboard description structure. */
   7.270 ++    int status = False;
   7.271 +     XkbDescRec * kbd_desc_ptr = XkbAllocKeyboard();
   7.272 +     if (kbd_desc_ptr == NULL)
   7.273 +     {
   7.274 +         ERR("Failed to get keyboard description\n");
   7.275 +         goto HastaLaVista;
   7.276 +     }
   7.277 +-    kbd_desc_ptr->dpy = xkb->dsp;
   7.278 + 
   7.279 +     /* Fetch information into the keyboard description. */
   7.280 +-    XkbGetControls(xkb->dsp, XkbAllControlsMask, kbd_desc_ptr);
   7.281 +-    XkbGetNames(xkb->dsp, XkbSymbolsNameMask, kbd_desc_ptr);
   7.282 +-    XkbGetNames(xkb->dsp, XkbGroupNamesMask, kbd_desc_ptr);
   7.283 ++    XkbGetControls(GDK_DISPLAY(), XkbAllControlsMask, kbd_desc_ptr);
   7.284 ++    XkbGetNames(GDK_DISPLAY(), XkbSymbolsNameMask, kbd_desc_ptr);
   7.285 ++    XkbGetNames(GDK_DISPLAY(), XkbGroupNamesMask, kbd_desc_ptr);
   7.286 + 
   7.287 +     if (kbd_desc_ptr->names == NULL)
   7.288 +     {
   7.289 +@@ -137,12 +151,11 @@ static int do_init_xkb(XkbPlugin * xkb)
   7.290 + 
   7.291 +     /* Determine the group names.  Trim off text beginning at a '('. */
   7.292 +     const Atom * tmp_group_source = kbd_desc_ptr->names->groups;
   7.293 +-    int i;
   7.294 +     for (i = 0; i < xkb->group_count; i++)
   7.295 +     {
   7.296 +         if (tmp_group_source[i] != None)
   7.297 +         {
   7.298 +-            char * ptr = XGetAtomName(xkb->dsp, tmp_group_source[i]);
   7.299 ++            char * ptr = XGetAtomName(GDK_DISPLAY(), tmp_group_source[i]);
   7.300 +             xkb->group_names[i] = ptr;
   7.301 +             if ((ptr != NULL) && ((ptr = strchr(ptr, '('))) != NULL)
   7.302 +                 *ptr = '\0';
   7.303 +@@ -153,7 +166,7 @@ static int do_init_xkb(XkbPlugin * xkb)
   7.304 +     Atom sym_name_atom = kbd_desc_ptr->names->symbols;
   7.305 +     char * sym_name;
   7.306 +     if ((sym_name_atom == None)
   7.307 +-    || ((sym_name = XGetAtomName(xkb->dsp, sym_name_atom)) == NULL))
   7.308 ++    || ((sym_name = XGetAtomName(GDK_DISPLAY(), sym_name_atom)) == NULL))
   7.309 +         goto HastaLaVista;
   7.310 + 
   7.311 +     /* Parse and store symbol names. */
   7.312 +@@ -190,83 +203,106 @@ static int do_init_xkb(XkbPlugin * xkb)
   7.313 +     {
   7.314 +         xkb->group_count = 2;
   7.315 +         xkb->symbol_names[1] = xkb->symbol_names[0];
   7.316 +-        xkb->symbol_names[0] = strdup("us");
   7.317 +-        xkb->group_names[0] = strdup("US/ASCII");
   7.318 +-        xkb->group_names[1] = strdup("Japanese");
   7.319 ++        xkb->symbol_names[0] = g_strdup("us");
   7.320 ++        xkb->group_names[0] = g_strdup("US/ASCII");
   7.321 ++        xkb->group_names[1] = g_strdup("Japanese");
   7.322 +     }
   7.323 +     else if (count < xkb->group_count)
   7.324 +     {
   7.325 +         /* Ensure that the names are fully initialized. */
   7.326 +         int j = count, k = xkb->group_count;
   7.327 +         while(--j >= 0) xkb->symbol_names[--k] = xkb->symbol_names[j];
   7.328 +-        while(--k >= 0) xkb->symbol_names[k] = strdup("en_US");
   7.329 ++        while(--k >= 0) xkb->symbol_names[k] = g_strdup("en_US");
   7.330 +     }
   7.331 + 
   7.332 +-    /* Enxure that the names are fully initialized. */
   7.333 ++    /* Ensure that the names are fully initialized. */
   7.334 +     for (i = 0; i < xkb->group_count; i++)
   7.335 +     {
   7.336 +         if (xkb->symbol_names[i] == NULL)
   7.337 +         {
   7.338 +             ERR("\nGroup Symbol %i is undefined, set to 'U/A' !\n", i+1);
   7.339 +-            xkb->symbol_names[i] = strdup("U/A");
   7.340 ++            xkb->symbol_names[i] = g_strdup("U/A");
   7.341 +         }
   7.342 +     }
   7.343 + 
   7.344 ++    /* Create or recreate hash table.
   7.345 ++     * The layout that was associated to the windows may or may not be at the same group number,
   7.346 ++     * and worse, may no longer exist, which there is no meaningful way to deal with. */
   7.347 ++    if (xkb->group_hash_table != NULL)
   7.348 ++        g_hash_table_destroy(xkb->group_hash_table);
   7.349 ++    xkb->group_hash_table = g_hash_table_new(g_direct_hash, NULL);
   7.350 ++
   7.351 +     status = True;
   7.352 + 
   7.353 + HastaLaVista:
   7.354 +     if (kbd_desc_ptr != NULL)
   7.355 +         XkbFreeKeyboard(kbd_desc_ptr, 0, True);
   7.356 ++
   7.357 +     return status;
   7.358 + }
   7.359 + 
   7.360 ++/* GDK event filter that receives events from all windows and the Xkb extension. */
   7.361 ++static GdkFilterReturn xkb_event_filter(GdkXEvent * xevent, GdkEvent * event, XkbPlugin * xkb)
   7.362 ++{
   7.363 ++    XEvent * ev = (XEvent *) xevent;
   7.364 ++
   7.365 ++    if (ev->xany.type == xkb->base_event_code + XkbEventCode)
   7.366 ++    {
   7.367 ++        /* Xkb event. */
   7.368 ++        XkbEvent * xkbev = (XkbEvent *) ev;
   7.369 ++        if (xkbev->any.xkb_type == XkbNewKeyboardNotify)
   7.370 ++        {
   7.371 ++            initialize_keyboard_description(xkb);
   7.372 ++            refresh_group_xkb(xkb);
   7.373 ++            xkb_redraw(xkb);
   7.374 ++            xkb_enter_locale_by_process(xkb);
   7.375 ++        }
   7.376 ++        else if (xkbev->any.xkb_type == XkbStateNotify)
   7.377 ++        {
   7.378 ++            if (xkbev->state.group != xkb->current_group_xkb_no)
   7.379 ++            {
   7.380 ++                /* Switch to the new group and redraw the display. */
   7.381 ++                xkb->current_group_xkb_no = xkbev->state.group;
   7.382 ++                refresh_group_xkb(xkb);
   7.383 ++                xkb_redraw(xkb);
   7.384 ++                xkb_enter_locale_by_process(xkb);
   7.385 ++            }
   7.386 ++        }
   7.387 ++    }
   7.388 ++    return GDK_FILTER_CONTINUE;
   7.389 ++}
   7.390 ++
   7.391 + /* Initialize the Xkb interface. */
   7.392 + void xkb_mechanism_constructor(XkbPlugin * xkb)
   7.393 + {
   7.394 +-    /* Enable the Xkb extension on all clients. */
   7.395 +-    XkbIgnoreExtension(False);
   7.396 +-
   7.397 +-    /* Open the display. */
   7.398 +-    int major = XkbMajorVersion;
   7.399 +-    int minor = XkbMinorVersion;
   7.400 +-    char * display_name = "";
   7.401 +-    int event_code;
   7.402 +-    int error_rtrn;
   7.403 +-    int reason_rtrn;
   7.404 +-    xkb->dsp = XkbOpenDisplay(display_name, &event_code, &error_rtrn, &major, &minor, &reason_rtrn);
   7.405 +-
   7.406 +-    switch (reason_rtrn)
   7.407 ++    /* Initialize Xkb extension. */
   7.408 ++    int opcode;
   7.409 ++    int maj = XkbMajorVersion;
   7.410 ++    int min = XkbMinorVersion;
   7.411 ++    if ((XkbLibraryVersion(&maj, &min))
   7.412 ++    && (XkbQueryExtension(GDK_DISPLAY(), &opcode, &xkb->base_event_code, &xkb->base_error_code, &maj, &min)))
   7.413 +     {
   7.414 +-        case XkbOD_BadLibraryVersion:
   7.415 +-            ERR("Bad XKB library version.\n");
   7.416 +-            return;
   7.417 +-        case XkbOD_ConnectionRefused:
   7.418 +-            ERR("Connection to X server refused.\n");
   7.419 +-            return;
   7.420 +-        case XkbOD_BadServerVersion:
   7.421 +-            ERR("Bad X server version.\n");
   7.422 +-            return;
   7.423 +-        case XkbOD_NonXkbServer:
   7.424 +-            ERR("XKB not present.\n");
   7.425 +-            return;
   7.426 +-        case XkbOD_Success:
   7.427 +-            break;
   7.428 +-    }
   7.429 ++        /* Read the keyboard description. */
   7.430 ++        initialize_keyboard_description(xkb);
   7.431 + 
   7.432 +-    /* Initialize our mechanism. */
   7.433 +-    if (do_init_xkb(xkb) != True)
   7.434 +-        return;
   7.435 ++        /* Establish GDK event filter. */
   7.436 ++        gdk_window_add_filter(NULL, (GdkFilterFunc) xkb_event_filter, (gpointer) xkb);
   7.437 + 
   7.438 +-    /* Specify events we will receive. */
   7.439 +-    XkbSelectEventDetails(xkb->dsp, xkb->device_id, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask);
   7.440 ++        /* Specify events we will receive. */
   7.441 ++        XkbSelectEvents(GDK_DISPLAY(), XkbUseCoreKbd, XkbNewKeyboardNotifyMask, XkbNewKeyboardNotifyMask);
   7.442 ++        XkbSelectEventDetails(GDK_DISPLAY(), XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask);
   7.443 + 
   7.444 +-    /* Get current state. */
   7.445 +-    refresh_group_xkb(xkb);
   7.446 ++        /* Get current state. */
   7.447 ++        refresh_group_xkb(xkb);
   7.448 ++    }
   7.449 + }
   7.450 + 
   7.451 + /* Deallocate resources associated with Xkb interface. */
   7.452 + void xkb_mechanism_destructor(XkbPlugin * xkb) 
   7.453 + {
   7.454 ++    /* Remove event filter. */
   7.455 ++    gdk_window_remove_filter(NULL, (GdkFilterFunc) xkb_event_filter, xkb);
   7.456 ++
   7.457 +     /* Free group and symbol name memory. */
   7.458 +     int i;
   7.459 +     for (i = 0; i < xkb->group_count; i++)
   7.460 +@@ -283,21 +319,11 @@ void xkb_mechanism_destructor(XkbPlugin * xkb)
   7.461 +         }
   7.462 +     }
   7.463 + 
   7.464 +-    /* Close the display. */
   7.465 +-    XCloseDisplay(xkb->dsp);
   7.466 +-    xkb->dsp = NULL;
   7.467 +-
   7.468 +     /* Destroy the hash table. */
   7.469 +     g_hash_table_destroy(xkb->group_hash_table);
   7.470 +     xkb->group_hash_table = NULL;
   7.471 + }
   7.472 + 
   7.473 +-/* Return the connection number for the display. */
   7.474 +-int xkb_get_connection_number(XkbPlugin * xkb)
   7.475 +-{
   7.476 +-    return ConnectionNumber(xkb->dsp);
   7.477 +-}
   7.478 +-
   7.479 + /* Set the layout to the next layout. */
   7.480 + int xkb_change_group(XkbPlugin * xkb, int increment) 
   7.481 + {
   7.482 +@@ -307,33 +333,13 @@ int xkb_change_group(XkbPlugin * xkb, int increment)
   7.483 +     if (next_group >= xkb->group_count) next_group = 0;
   7.484 + 
   7.485 +     /* Execute the change. */
   7.486 +-    XkbLockGroup(xkb->dsp, xkb->device_id, next_group);
   7.487 ++    XkbLockGroup(GDK_DISPLAY(), XkbUseCoreKbd, next_group);
   7.488 +     refresh_group_xkb(xkb);
   7.489 +     xkb_redraw(xkb);
   7.490 +     xkb_enter_locale_by_process(xkb);
   7.491 +     return 1;
   7.492 + }
   7.493 + 
   7.494 +-/* Callback when activity detected on the Xkb channel. */
   7.495 +-gboolean xkb_gio_callback(GIOChannel * source, GIOCondition condition, gpointer data) 
   7.496 +-{
   7.497 +-    XkbPlugin * xkb = (XkbPlugin *) data;
   7.498 +-
   7.499 +-    XkbEvent evnt;
   7.500 +-    XNextEvent(xkb->dsp, &evnt.core);
   7.501 +-    if ((evnt.type == xkb->base_event_code)
   7.502 +-    && (evnt.any.xkb_type == XkbStateNotify)
   7.503 +-    && (evnt.state.group != xkb->current_group_xkb_no))
   7.504 +-    {
   7.505 +-        /* Switch to the new group and redraw the display. */
   7.506 +-        xkb->current_group_xkb_no = evnt.state.group;
   7.507 +-        refresh_group_xkb(xkb);
   7.508 +-        xkb_redraw(xkb);
   7.509 +-        xkb_enter_locale_by_process(xkb);
   7.510 +-    }
   7.511 +-    return TRUE;
   7.512 +-}
   7.513 +-
   7.514 + /* React to change of focus by switching to the application's layout or the default layout. */
   7.515 + void xkb_active_window_changed(XkbPlugin * xkb, gint pid)
   7.516 + {
   7.517 +@@ -345,7 +351,7 @@ void xkb_active_window_changed(XkbPlugin * xkb, gint pid)
   7.518 + 
   7.519 +     if (new_group_xkb_no < xkb->group_count)
   7.520 +     {
   7.521 +-        XkbLockGroup(xkb->dsp, xkb->device_id, new_group_xkb_no);
   7.522 ++        XkbLockGroup(GDK_DISPLAY(), XkbUseCoreKbd, new_group_xkb_no);
   7.523 +         refresh_group_xkb(xkb);
   7.524 +     }
   7.525 + }
   7.526 +diff --git a/src/plugins/xkb/xkb.h b/src/plugins/xkb/xkb.h
   7.527 +index 9265198..20c7ed3 100644
   7.528 +--- a/src/plugins/xkb/xkb.h
   7.529 ++++ b/src/plugins/xkb/xkb.h
   7.530 +@@ -49,10 +49,8 @@ typedef struct {
   7.531 +     GtkWidget * per_app_default_layout_menu;	/* Combo box of all available layouts */
   7.532 + 
   7.533 +     /* Mechanism. */
   7.534 +-    Display * dsp;				/* Handle to X display */
   7.535 +     int base_event_code;			/* Result of initializing Xkb extension */
   7.536 +     int base_error_code;
   7.537 +-    int device_id;				/* Keyboard device ID (always "core keyboard") */
   7.538 +     int current_group_xkb_no;			/* Current layout */
   7.539 +     int group_count;				/* Count of groups as returned by Xkb */
   7.540 +     char * group_names[XkbNumKbdGroups];	/* Group names as returned by Xkb */
   7.541 +@@ -67,12 +65,11 @@ extern int xkb_get_current_group_xkb_no(XkbPlugin * xkb);
   7.542 + extern int xkb_get_group_count(XkbPlugin * xkb);
   7.543 + extern const char * xkb_get_symbol_name_by_res_no(XkbPlugin * xkb, int group_res_no);
   7.544 + extern const char * xkb_get_current_group_name(XkbPlugin * xkb);
   7.545 +-extern const char * xkb_get_current_group_name_lowercase(XkbPlugin * xkb);
   7.546 ++extern const char * xkb_get_current_symbol_name(XkbPlugin * xkb);
   7.547 ++extern const char * xkb_get_current_symbol_name_lowercase(XkbPlugin * xkb);
   7.548 + extern void xkb_mechanism_constructor(XkbPlugin * xkb);
   7.549 + extern void xkb_mechanism_destructor(XkbPlugin * xkb);
   7.550 +-extern int xkb_get_connection_number(XkbPlugin * xkb);
   7.551 + extern int xkb_change_group(XkbPlugin * xkb, int increment);
   7.552 +-extern gboolean xkb_gio_callback(GIOChannel * source, GIOCondition condition, gpointer data);
   7.553 + extern void xkb_active_window_changed(XkbPlugin * xkb, GPid pid);
   7.554 + 
   7.555 + #endif
   7.556 +-- 
   7.557 +1.7.0
   7.558 +