diff --git a/flags.patch b/flags.patch index eea35c8..85e6b15 100644 --- a/flags.patch +++ b/flags.patch @@ -1,12 +1,12 @@ -diff -up libxklavier-4.0/libxklavier/xkl_engine.h.flags libxklavier-4.0/libxklavier/xkl_engine.h ---- libxklavier-4.0/libxklavier/xkl_engine.h.flags 2009-07-09 14:44:22.219289759 -0400 -+++ libxklavier-4.0/libxklavier/xkl_engine.h 2009-07-09 14:44:32.981284927 -0400 +diff -up libxklavier-5.0/libxklavier/xkl_engine.h.flags libxklavier-5.0/libxklavier/xkl_engine.h +--- libxklavier-5.0/libxklavier/xkl_engine.h.flags 2010-01-16 22:13:38.250606995 -0500 ++++ libxklavier-5.0/libxklavier/xkl_engine.h 2010-01-16 22:13:49.852829286 -0500 @@ -59,7 +59,7 @@ extern "C" { * xkl_start_listen(engine,XKLL_MANAGE_LAYOUTS); * @XKLF_DEVICE_DISCOVERY: Backend supports device discovery, can notify */ - typedef enum { + typedef enum { /*< flags >*/ - XKLF_CAN_TOGGLE_INDICATORS = 0x01, - XKLF_CAN_OUTPUT_CONFIG_AS_ASCII = 0x02, - XKLF_CAN_OUTPUT_CONFIG_AS_BINARY = 0x04, + XKLF_CAN_TOGGLE_INDICATORS = 1 << 0, + XKLF_CAN_OUTPUT_CONFIG_AS_ASCII = 1 << 1, + XKLF_CAN_OUTPUT_CONFIG_AS_BINARY = 1 << 2, diff --git a/libxklavier.spec b/libxklavier.spec index 21108c2..4f01970 100644 --- a/libxklavier.spec +++ b/libxklavier.spec @@ -1,7 +1,7 @@ Summary: High-level API for X Keyboard Extension Name: libxklavier -Version: 4.0 -Release: 7%{?dist} +Version: 5.0 +Release: 1%{?dist} License: LGPLv2+ Group: Development/Libraries URL: http://gswitchit.sourceforge.net/ @@ -12,11 +12,10 @@ BuildRequires: libXi-devel BuildRequires: libxml2-devel BuildRequires: glib2-devel >= 2.6.0 BuildRequires: iso-codes-devel -Source: http://download.gnome.org/sources/libxklavier/4.0/%{name}-%{version}.tar.bz2 +Source: http://download.gnome.org/sources/libxklavier/5.0/%{name}-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) # http://bugs.freedesktop.org/show_bug.cgi?id=22687 Patch0: flags.patch -Patch1: xinput-fixes.patch Patch2: catch-more-xerrors.patch %description @@ -40,7 +39,6 @@ needed to develop libxklavier applications. %prep %setup -q %patch0 -p1 -b .flags -%patch1 -p0 -b .xinput %patch2 -p1 -b .catch-more-xerrors %build @@ -82,6 +80,9 @@ rm -rf %{buildroot} %{_datadir}/gtk-doc/html/libxklavier/ %changelog +* Sat Jan 16 2010 Matthias Clasen - 5.0-1 +- Update to 5.0 + * Thu Dec 10 2009 Matthias Clasen - 4.0-7 - Catch more X errors diff --git a/xinput-fixes.patch b/xinput-fixes.patch deleted file mode 100644 index 4ab7cec..0000000 --- a/xinput-fixes.patch +++ /dev/null @@ -1,437 +0,0 @@ -? xinput-fixes.patch -Index: libxklavier/xklavier_evt.c -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_evt.c,v -retrieving revision 1.26 -retrieving revision 1.29 -diff -u -r1.26 -r1.29 ---- libxklavier/xklavier_evt.c 24 Apr 2009 22:10:19 -0000 1.26 -+++ libxklavier/xklavier_evt.c 30 Sep 2009 09:49:57 -0000 1.29 -@@ -50,7 +50,8 @@ - break; - case CreateNotify: - xkl_engine_process_create_window_evt(engine, -- &xev->xcreatewindow); -+ &xev-> -+ xcreatewindow); - break; - case DestroyNotify: - xkl_debug(150, -@@ -100,6 +101,8 @@ - XFocusChangeEvent * fev) - { - Window win; -+ Window prev_toplevel_win = -+ xkl_engine_priv(engine, curr_toplvl_win); - Window toplevel_win; - XklState selected_window_state; - -@@ -135,36 +138,51 @@ - - if (xkl_engine_get_toplevel_window_state - (engine, toplevel_win, &selected_window_state)) { -- if (xkl_engine_priv(engine, curr_toplvl_win) != -- toplevel_win) { -- gboolean old_win_transparent, new_win_transparent; -- XklState tmp_state; -- -- old_win_transparent = -- xkl_engine_is_toplevel_window_transparent -- (engine, -- xkl_engine_priv(engine, curr_toplvl_win)); -- if (old_win_transparent) -- xkl_debug(150, -- "Leaving transparent window\n"); -+ if (prev_toplevel_win != toplevel_win) { -+ gboolean new_win_transparent; -+ Window parent = (Window) NULL, root = -+ (Window) NULL, *children = NULL; -+ guint nchildren = 0; - - /* -- * Reload the current state from the current window. -- * Do not do it for transparent window - we keep the state from -- * the _previous_ window. -+ * If previous focused window exists - handle transparency and state -+ * (optional) - */ -- if (!old_win_transparent && -- xkl_engine_get_toplevel_window_state(engine, -- xkl_engine_priv -- (engine, -- curr_toplvl_win), -- &tmp_state)) -- { -- xkl_engine_update_current_state(engine, -- tmp_state.group, -- tmp_state.indicators, -- "Loading current (previous) state from the current (previous) window"); -- } -+ if (xkl_engine_query_tree -+ (engine, prev_toplevel_win, &root, &parent, -+ &children, &nchildren) == Success) { -+ XklState tmp_state; -+ gboolean old_win_transparent = -+ xkl_engine_is_toplevel_window_transparent -+ (engine, prev_toplevel_win); -+ -+ if (children != NULL) -+ XFree(children); -+ -+ if (old_win_transparent) -+ xkl_debug(150, -+ "Leaving transparent window\n"); -+ /* -+ * Reload the current state from the current window. -+ * Do not do it for transparent window - we keep the state from -+ * the _previous_ window. -+ */ -+ if (!old_win_transparent -+ && -+ xkl_engine_get_toplevel_window_state -+ (engine, prev_toplevel_win, -+ &tmp_state)) { -+ xkl_engine_update_current_state -+ (engine, tmp_state.group, -+ tmp_state.indicators, -+ "Loading current (previous) state from the current (previous) window"); -+ } -+ } else -+ xkl_debug(150, -+ "Current (previous) window " -+ WINID_FORMAT -+ " does not exist any more, so transparency/state are not analyzed\n", -+ prev_toplevel_win); - - xkl_engine_priv(engine, curr_toplvl_win) = - toplevel_win; -@@ -216,8 +234,10 @@ - "Restoring the group from %d to %d after gaining focus\n", - xkl_engine_priv - (engine, -- curr_state).group, -- selected_window_state.group); -+ curr_state). -+ group, -+ selected_window_state. -+ group); - /* - * For fast mouse movements - the state is probably not updated yet - * (because of the group change notification being late). -@@ -225,17 +245,21 @@ - */ - xkl_engine_update_current_state - (engine, -- selected_window_state.group, -- selected_window_state.indicators, -+ selected_window_state. -+ group, -+ selected_window_state. -+ indicators, - "Enforcing fast update of the current state"); - xkl_engine_lock_group - (engine, -- selected_window_state.group); -+ selected_window_state. -+ group); - } else { - xkl_debug(150, - "Both old and new focused window " - "have group %d so no point restoring it\n", -- selected_window_state.group); -+ selected_window_state. -+ group); - xkl_engine_one_switch_to_secondary_group_performed - (engine); - } -@@ -249,8 +273,10 @@ - xkl_debug(150, - "Restoring the indicators from %X to %X after gaining focus\n", - xkl_engine_priv(engine, -- curr_state).indicators, -- selected_window_state.indicators); -+ curr_state). -+ indicators, -+ selected_window_state. -+ indicators); - xkl_engine_ensure_vtable_inited - (engine); - xkl_engine_vcall(engine, -@@ -261,12 +287,14 @@ - xkl_debug(150, - "Not restoring the indicators %X after gaining focus: indicator handling is not enabled\n", - xkl_engine_priv(engine, -- curr_state).indicators); -+ curr_state). -+ indicators); - } else - xkl_debug(150, - "Not restoring the group %d after gaining focus: global layout (xor transparent window)\n", - xkl_engine_priv(engine, -- curr_state).group); -+ curr_state). -+ group); - } else - xkl_debug(150, - "Same app window - just do nothing\n"); -@@ -392,11 +420,13 @@ - "Something (%d) happened to WM_STATE of window 0x%x\n", - pev->state, pev->window); - xkl_engine_select_input_merging(engine, -- pev->window, -+ pev-> -+ window, - PropertyChangeMask); - if (has_xkl_state) { - xkl_engine_delete_state(engine, -- pev->window); -+ pev-> -+ window); - } - } - } /* XKLL_MANAGE_WINDOW_STATES */ -@@ -475,8 +505,9 @@ - xkl_engine_priv(engine, last_error_code) = evt->error_code; - - switch (evt->error_code) { -- case BadWindow: - case BadAccess: -+ case BadDrawable: -+ case BadWindow: - { - XGetErrorText(evt->display, evt->error_code, buf, - sizeof(buf)); -@@ -491,6 +522,22 @@ - break; - } - default: -+ if (engine != NULL -+ && xkl_engine_priv(engine, process_x_error)) { -+ if (xkl_engine_priv(engine, process_x_error) -+ (engine, evt)) { -+ xkl_debug(200, -+ "X ERROR processed by the engine: %p, " -+ WINID_FORMAT ", %d [%s], " -+ "X11 request: %d, minor code: %d\n", -+ dpy, -+ (unsigned long) evt->resourceid, -+ (int) evt->error_code, buf, -+ (int) evt->request_code, -+ (int) evt->minor_code); -+ break; -+ } -+ } - xkl_debug(200, - "Unexpected by libxklavier X ERROR: %p, " - WINID_FORMAT ", %d [%s], " -Index: libxklavier/xklavier_evt_xkb.c -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_evt_xkb.c,v -retrieving revision 1.11 -retrieving revision 1.12 -diff -u -r1.11 -r1.12 ---- libxklavier/xklavier_evt_xkb.c 17 Nov 2008 00:19:27 -0000 1.11 -+++ libxklavier/xklavier_evt_xkb.c 30 Sep 2009 09:49:57 -0000 1.12 -@@ -162,6 +162,21 @@ - #endif - } - -+/* -+ * XKB error handler -+ */ -+gint -+xkl_xkb_process_x_error(XklEngine * engine, XErrorEvent * xerev) -+{ -+#ifdef HAVE_XINPUT -+ /* Ignore XInput errors */ -+ if (xerev->error_code == xkl_engine_backend(engine, XklXkb, xi_error_code)) -+ return 1; -+#endif -+ -+ return 0; -+} -+ - void - xkl_xkb_set_indicators(XklEngine * engine, const XklState * window_state) - { -Index: libxklavier/xklavier_private.h -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_private.h,v -retrieving revision 1.38 -retrieving revision 1.39 -diff -u -r1.38 -r1.39 ---- libxklavier/xklavier_private.h 23 Jun 2009 23:18:38 -0000 1.38 -+++ libxklavier/xklavier_private.h 30 Sep 2009 09:49:57 -0000 1.39 -@@ -157,6 +157,13 @@ - gint(*process_x_event) (XklEngine * engine, XEvent * xev); - - /* -+ * Handles X errors. -+ * return 0 if further processing is needed -+ * 1 if error was handled -+ */ -+ gint(*process_x_error) (XklEngine * engine, XErrorEvent * xerev); -+ -+ /* - * Flushes the cached server config info. - * xkb: frees XkbDesc - * xmodmap: frees internal XklConfigRec -Index: libxklavier/xklavier_private_xkb.h -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_private_xkb.h,v -retrieving revision 1.18 -retrieving revision 1.20 -diff -u -r1.18 -r1.20 ---- libxklavier/xklavier_private_xkb.h 23 Jun 2009 21:33:00 -0000 1.18 -+++ libxklavier/xklavier_private_xkb.h 30 Sep 2009 09:49:57 -0000 1.20 -@@ -48,6 +48,8 @@ - - #ifdef HAVE_XINPUT - gint xi_event_type; -+ -+ gint xi_error_code; - #endif - } XklXkb; - -@@ -86,7 +88,9 @@ - const XklConfigRec * data, - const gboolean binary); - --extern gint xkl_xkb_process_x_event(XklEngine * engine, XEvent * kev); -+extern gint xkl_xkb_process_x_event(XklEngine * engine, XEvent * xev); -+ -+extern gint xkl_xkb_process_x_error(XklEngine * engine, XErrorEvent * xerev); - - extern void xkl_xkb_free_all_info(XklEngine * engine); - -Index: libxklavier/xklavier_toplevel.c -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_toplevel.c,v -retrieving revision 1.6 -retrieving revision 1.7 -diff -u -r1.6 -r1.7 ---- libxklavier/xklavier_toplevel.c 1 Mar 2008 21:43:19 -0000 1.6 -+++ libxklavier/xklavier_toplevel.c 12 Oct 2009 20:28:55 -0000 1.7 -@@ -114,6 +114,22 @@ - g_signal_lookup("new-toplevel-window", xkl_engine_get_type()); - g_signal_emitv(params, signal_id, 0, &rv); - default_group_to_use = g_value_get_int(&rv); -+ -+ if (default_group_to_use == -1) { -+ Window transient_for = 0; -+ if (XGetTransientForHint(xkl_engine_get_display(engine), toplevel_win, &transient_for)) { -+ if (transient_for) { -+ XklState trans_state; -+ gboolean have_state = -+ xkl_engine_get_toplevel_window_state(engine, -+ transient_for, -+ &trans_state); -+ if (have_state) { -+ default_group_to_use = trans_state.group; -+ } -+ } -+ } -+ } - - if (default_group_to_use == -1) - default_group_to_use = -Index: libxklavier/xklavier_xkb.c -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_xkb.c,v -retrieving revision 1.33 -retrieving revision 1.37 -diff -u -r1.33 -r1.37 ---- libxklavier/xklavier_xkb.c 24 Apr 2009 22:10:19 -0000 1.33 -+++ libxklavier/xklavier_xkb.c 30 Sep 2009 09:49:57 -0000 1.37 -@@ -96,7 +96,7 @@ - XkbNamesNotify, XKB_NAMES_EVT_DTL_MASK, - XKB_NAMES_EVT_DTL_MASK); - #ifdef HAVE_XINPUT -- if (xkl_engine_priv(engine, features) | XKLF_DEVICE_DISCOVERY) { -+ if (xkl_engine_priv(engine, features) & XKLF_DEVICE_DISCOVERY) { - DevicePresence(display, xitype, xiclass); - XSelectExtensionEvent(display, - xkl_engine_priv(engine, root_window), -@@ -353,8 +353,8 @@ - ¤t_state_out->indicators)) - current_state_out->indicators &= - xkl_engine_backend(engine, XklXkb, -- cached_desc)-> -- indicators->phys_indicators; -+ cached_desc)->indicators-> -+ phys_indicators; - else - current_state_out->indicators = 0; - } -@@ -402,8 +402,8 @@ - xkl_engine_backend - (engine, XklXkb, - device_id), -- cached-> -- names->indicators -+ cached->names-> -+ indicators - [indicator_num], set, - False, NULL); - else { -@@ -541,7 +541,7 @@ - #ifdef LIBXKBFILE_PRESENT - gint opcode; - gboolean xkl_xkb_ext_present; -- int xi_opc, xi_event_type, xi_error_code; -+ int xi_opc; - - xkl_engine_priv(engine, backend_id) = "XKB"; - xkl_engine_priv(engine, features) = XKLF_CAN_TOGGLE_INDICATORS | -@@ -564,6 +564,7 @@ - xkl_engine_priv(engine, get_num_groups) = xkl_xkb_get_num_groups; - xkl_engine_priv(engine, lock_group) = xkl_xkb_lock_group; - xkl_engine_priv(engine, process_x_event) = xkl_xkb_process_x_event; -+ xkl_engine_priv(engine, process_x_error) = xkl_xkb_process_x_error; - xkl_engine_priv(engine, free_all_info) = xkl_xkb_free_all_info; - xkl_engine_priv(engine, if_cached_info_equals_actual) = - xkl_xkb_if_cached_info_equals_actual; -@@ -615,14 +616,24 @@ - xkl_engine_priv(engine, features) |= - XKLF_MULTIPLE_LAYOUTS_SUPPORTED; - -+#if HAVE_XINPUT - if (XQueryExtension - (display, "XInputExtension", &xi_opc, -- &xi_event_type, &xi_error_code)) { -+ &xkl_engine_backend(engine, XklXkb, xi_event_type), -+ &xkl_engine_backend(engine, XklXkb, xi_error_code))) { - xkl_debug(150, "XInputExtension found (%d, %d, %d)\n", -- xi_opc, xi_event_type, xi_error_code); -+ xi_opc, -+ xkl_engine_backend(engine, XklXkb, -+ xi_event_type), -+ xkl_engine_backend(engine, XklXkb, -+ xi_error_code)); - xkl_engine_priv(engine, features) |= XKLF_DEVICE_DISCOVERY; -- } else -+ } else { - xkl_debug(0, "XInputExtension not found\n"); -+ xkl_engine_backend(engine, XklXkb, xi_event_type) = -1; -+ xkl_engine_backend(engine, XklXkb, xi_error_code) = -1; -+ } -+#endif - return 0; - #else - xkl_debug(160, -Index: libxklavier/xklavier_xmm.c -=================================================================== -RCS file: /cvs/xklavier/libxklavier/libxklavier/xklavier_xmm.c,v -retrieving revision 1.14 -retrieving revision 1.15 -diff -u -r1.14 -r1.15 ---- libxklavier/xklavier_xmm.c 27 Apr 2008 14:59:55 -0000 1.14 -+++ libxklavier/xklavier_xmm.c 30 Sep 2009 09:49:57 -0000 1.15 -@@ -327,6 +327,7 @@ - xkl_engine_priv(engine, lock_group) = xkl_xmm_lock_group; - - xkl_engine_priv(engine, process_x_event) = xkl_xmm_process_x_event; -+ xkl_engine_priv(engine, process_x_error) = NULL; - xkl_engine_priv(engine, free_all_info) = xkl_xmm_free_all_info; - xkl_engine_priv(engine, if_cached_info_equals_actual) = - xkl_xmm_if_cached_info_equals_actual;