From de6517b8d1bf16ec9ee87aacc96adf2d8c836870 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Fri, 5 Aug 2011 12:28:34 -0400 Subject: connect to both notify["has-toplevel-focus"] and set_focus the former tells us when a new window has been focused, the latter tells us when the focus changes from one widget to another within a window. --- modules/gtk3/caribou-gtk-module.vala | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'modules') diff --git a/modules/gtk3/caribou-gtk-module.vala b/modules/gtk3/caribou-gtk-module.vala index 46a76ce..4441f97 100644 --- a/modules/gtk3/caribou-gtk-module.vala +++ b/modules/gtk3/caribou-gtk-module.vala @@ -38,19 +38,26 @@ namespace Caribou { toplevels = Gtk.Window.list_toplevels (); foreach (Gtk.Window window in toplevels) { if (!windows.lookup (window)) { - window.notify["has-toplevel-focus"].connect (has_top_level_focus_changed); + window.notify["has-toplevel-focus"].connect (toplevel_focus_changed); + window.set_focus.connect (window_focus_changed); window.destroy.connect (() => { windows.remove (window); }); windows.insert (window, true); } } } - private void has_top_level_focus_changed (Object obj, ParamSpec prop) { + private void toplevel_focus_changed (Object obj, ParamSpec prop) { Gtk.Window window = (Gtk.Window) obj; - if (!window.has_toplevel_focus) - return; + if (window.has_toplevel_focus) + do_focus_change (window.get_focus ()); + } + + private void window_focus_changed (Gtk.Window window, + Gtk.Widget? widget) { + do_focus_change (widget); + } - Gtk.Widget? widget = window.get_focus (); + private void do_focus_change (Gtk.Widget? widget) { uint32 timestamp = Gtk.get_current_event_time (); if (widget != null && (widget is Gtk.Entry || widget is Gtk.TextView) && widget is Gtk.Editable) { Gdk.Window current_window = widget.get_window (); -- cgit v1.2.1