Re: [dev] Bug when unfocusing/focusing GTK3 windows

From: Josh Rickmar <jrick_AT_devio.us>
Date: Mon, 20 Aug 2012 10:31:55 -0400

Eckehard Berns <ecki-suckless_AT_ecki.to> wrote:

> On Fri, Aug 17, 2012 at 03:53:22PM +0200, Eckehard Berns wrote:
> > I'll try things at home and maybe I find another workaround.
>
> It was just to hot here over the weekend to do anything productive.
>
> I looked into this again today and could see that GDK just doesn't send
> any focus related events any more after the toplevel GTK window has a
> flag called has_pointer_focus set. GTK on the other hand doesn't think
> it has the focus if a flag called has_focus isn't set.
>
> I found bug reports that indicate that GTK2 also had problems regarding
> has_focus and has_pointer_focus in 2005 or so. Now they introduced
> something similar with GTK3... Makes me wonder what has_pointer_focus
> is good for anyway.
>
> I don't know if this is the best way of dealing with the situation, but
> the following patch to gtk+-3.4.4 seems to fix it for me. I haven't tried
> it with xombrero yet (webkitgtk is still compiling in the background - my
> machine at work is pretty old).
>
> --- gtk+-3.4.4.orig/gdk/x11/gdkdevicemanager-core-x11.c 2012-07-15 17:48:47.000000000 +0200
> +++ gtk+-3.4.4/gdk/x11/gdkdevicemanager-core-x11.c 2012-08-20 10:43:58.824103715 +0200
> _AT_@ -802,9 +802,9 @@ _gdk_device_manager_core_handle_focus (G
> int detail,
> int mode)
> {
> GdkToplevelX11 *toplevel;
> - gboolean had_focus;
> + gboolean has_focus, had_focus;
>
> g_return_if_fail (GDK_IS_WINDOW (window));
> g_return_if_fail (GDK_IS_DEVICE (device));
> g_return_if_fail (source_device == NULL || GDK_IS_DEVICE (source_device));
> _AT_@ -822,9 +822,9 @@ _gdk_device_manager_core_handle_focus (G
>
> if (toplevel->focus_window == original)
> return;
>
> - had_focus = HAS_FOCUS (toplevel);
> + had_focus = toplevel->has_focus | (toplevel->has_pointer_focus << 1);
>
> switch (detail)
> {
> case NotifyAncestor:
> _AT_@ -869,9 +869,11 @@ _gdk_device_manager_core_handle_focus (G
> default:
> break;
> }
>
> - if (HAS_FOCUS (toplevel) != had_focus)
> + has_focus = toplevel->has_focus | (toplevel->has_pointer_focus << 1);
> +
> + if (has_focus != had_focus)
> {
> GdkEvent *event;
>
> event = gdk_event_new (GDK_FOCUS_CHANGE);
>
> --
> Eckehard Berns
>

Rebuilt my GTK with this patch and it did wonders; thanks for looking
into this! You should also post this patch to that Evince bug report
to get more feedback.

-- 
Josh Rickmar
http://jrick.devio.us/

Received on Mon Aug 20 2012 - 16:31:55 CEST

This archive was generated by hypermail 2.3.0 : Mon Aug 20 2012 - 16:36:04 CEST