From 1e4254b26fbcd733402543ca2e2199b76945fe65 Mon Sep 17 00:00:00 2001 From: foudfou Date: Sun, 1 Jan 2012 19:25:56 +0100 Subject: [PATCH] * fix gdk declarations + typo in FiretrayWindow.jsm * unsuccessful attempt to catch a real minimize event with Gtk 'window-state-event' The problem is that GDK_WINDOW_STATE_ICONIFIED is fired on virtual desktop change... even both e->changed_mask and e->new_window_state get GDK_WINDOW_STATE_ICONIFIED ! Gdk obviously relies on WM_STATE, which may not be up-to-date. We better try to check _NET_WM_STATE at X11 level. See ex: http://trac.wxwidgets.org/ticket/10973 --- src/modules/gobject.jsm | 66 +++++++++++++++-------------- src/modules/gtk2/FiretrayWindow.jsm | 23 ++++++++-- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/modules/gobject.jsm b/src/modules/gobject.jsm index 0854c1a..d7a617c 100644 --- a/src/modules/gobject.jsm +++ b/src/modules/gobject.jsm @@ -53,36 +53,35 @@ Cu.import("resource://firetray/glib.jsm"); function gobject_defines(lib) { this.GdkEventMask = ctypes.int; // enum - this.GDK_EXPOSURE_MASK = 1 << 1, - this.GDK_POINTER_MOTION_MASK = 1 << 2, - this.GDK_POINTER_MOTION_HINT_MASK = 1 << 3, - this.GDK_BUTTON_MOTION_MASK = 1 << 4, - this.GDK_BUTTON1_MOTION_MASK = 1 << 5, - this.GDK_BUTTON2_MOTION_MASK = 1 << 6, - this.GDK_BUTTON3_MOTION_MASK = 1 << 7, - this.GDK_BUTTON_PRESS_MASK = 1 << 8, - this.GDK_BUTTON_RELEASE_MASK = 1 << 9, - this.GDK_KEY_PRESS_MASK = 1 << 10, - this.GDK_KEY_RELEASE_MASK = 1 << 11, - this.GDK_ENTER_NOTIFY_MASK = 1 << 12, - this.GDK_LEAVE_NOTIFY_MASK = 1 << 13, - this.GDK_FOCUS_CHANGE_MASK = 1 << 14, - this.GDK_STRUCTURE_MASK = 1 << 15, - this.GDK_PROPERTY_CHANGE_MASK = 1 << 16, - this.GDK_VISIBILITY_NOTIFY_MASK = 1 << 17, - this.GDK_PROXIMITY_IN_MASK = 1 << 18, - this.GDK_PROXIMITY_OUT_MASK = 1 << 19, - this.GDK_SUBSTRUCTURE_MASK = 1 << 20, - this.GDK_SCROLL_MASK = 1 << 21, - this.GDK_ALL_EVENTS_MASK = 0x3FFFFE + this.GDK_EXPOSURE_MASK = 1 << 1; + this.GDK_POINTER_MOTION_MASK = 1 << 2; + this.GDK_POINTER_MOTION_HINT_MASK = 1 << 3; + this.GDK_BUTTON_MOTION_MASK = 1 << 4; + this.GDK_BUTTON1_MOTION_MASK = 1 << 5; + this.GDK_BUTTON2_MOTION_MASK = 1 << 6; + this.GDK_BUTTON3_MOTION_MASK = 1 << 7; + this.GDK_BUTTON_PRESS_MASK = 1 << 8; + this.GDK_BUTTON_RELEASE_MASK = 1 << 9; + this.GDK_KEY_PRESS_MASK = 1 << 10; + this.GDK_KEY_RELEASE_MASK = 1 << 11; + this.GDK_ENTER_NOTIFY_MASK = 1 << 12; + this.GDK_LEAVE_NOTIFY_MASK = 1 << 13; + this.GDK_FOCUS_CHANGE_MASK = 1 << 14; + this.GDK_STRUCTURE_MASK = 1 << 15; + this.GDK_PROPERTY_CHANGE_MASK = 1 << 16; + this.GDK_VISIBILITY_NOTIFY_MASK = 1 << 17; + this.GDK_PROXIMITY_IN_MASK = 1 << 18; + this.GDK_PROXIMITY_OUT_MASK = 1 << 19; + this.GDK_SUBSTRUCTURE_MASK = 1 << 20; + this.GDK_SCROLL_MASK = 1 << 21; + this.GDK_ALL_EVENTS_MASK = 0x3FFFFE; this.GSignalMatchType = ctypes.int; // enum - this.G_SIGNAL_MATCH_ID = 1 << 0, - this.G_SIGNAL_MATCH_DETAIL = 1 << 1, - this.G_SIGNAL_MATCH_CLOSURE = 1 << 2, - this.G_SIGNAL_MATCH_FUNC = 1 << 3, - this.G_SIGNAL_MATCH_DATA = 1 << 4, - this.G_SIGNAL_MATCH_UNBLOCKED = 1 << 5 - + this.G_SIGNAL_MATCH_ID = 1 << 0; + this.G_SIGNAL_MATCH_DETAIL = 1 << 1; + this.G_SIGNAL_MATCH_CLOSURE = 1 << 2; + this.G_SIGNAL_MATCH_FUNC = 1 << 3; + this.G_SIGNAL_MATCH_DATA = 1 << 4; + this.G_SIGNAL_MATCH_UNBLOCKED = 1 << 5; this.gpointer = ctypes.voidptr_t; this.gulong = ctypes.unsigned_long; this.guint = ctypes.unsigned_int; @@ -97,9 +96,11 @@ function gobject_defines(lib) { this.gsize = ctypes.unsigned_long; this.GCallback = ctypes.voidptr_t; this.GClosureNotify = this.gpointer; - this.GConnectFlags = this.guint; this.GFunc = ctypes.void_t.ptr; this.GList = ctypes.StructType("GList"); + this.GConnectFlags = this.guint; // enum + this.G_CONNECT_AFTER = 1 << 0; + this.G_CONNECT_SWAPPED = 1 << 1; this.GType = this.gsize; this.GData = ctypes.StructType("GData"); @@ -133,7 +134,10 @@ function gobject_defines(lib) { this.g_signal_connect = function(instance, detailed_signal, handler, data) { return this.g_signal_connect_data(instance, detailed_signal, handler, data, null, 0); - } + }; + this.g_signal_connect_after = function(instance, detailed_signal, handler, data) { + return this.g_signal_connect_data(instance, detailed_signal, handler, data, null, this.G_CONNECT_AFTER); + }; lib.lazy_bind("g_object_unref", ctypes.void_t, this.gpointer); lib.lazy_bind("g_list_free", ctypes.void_t, this.GList.ptr); diff --git a/src/modules/gtk2/FiretrayWindow.jsm b/src/modules/gtk2/FiretrayWindow.jsm index 068d490..0dde823 100644 --- a/src/modules/gtk2/FiretrayWindow.jsm +++ b/src/modules/gtk2/FiretrayWindow.jsm @@ -203,10 +203,25 @@ firetray.Window = { LOG("restored WindowState: " + firetray.Handler.windows[xid].chromeWin.windowState); }, + // http://www.gtkforums.com/viewtopic.php?t=1624 onWindowState: function(gtkWidget, gdkEventState, userData){ - // LOG("window-state-event"); - // if(event->new_window_state & GDK_WINDOW_STATE_ICONIFIED){ - let stopPropagation = true; + LOG("window-state-event: "+gdkEventState.contents.new_window_state); + + if (gdkEventState.contents.new_window_state & gdk.GDK_WINDOW_STATE_ICONIFIED) { + let xid = firetray.Window.getXIDFromGtkWidget(gtkWidget); + LOG(xid+" iconified: "+gdkEventState.contents.changed_mask+" "+gdkEventState.contents.new_window_state); + + // let hides_on_minimize = firetray.Utils.prefService.getBoolPref('hides_on_minimize'); + // let hides_single_window = firetray.Utils.prefService.getBoolPref('hides_single_window'); + // if (hides_on_minimize) { + // if (hides_single_window) { + // firetray.Handler.hideSingleWindow(xid); + // } else + // firetray.Handler.hideAllWindows(); + // } + } + + let stopPropagation = true; // not usefull return stopPropagation; } @@ -296,7 +311,7 @@ firetray.Handler.getWindowIdFromChromeWindow = firetray.Window.getXIDFromChromeW firetray.Handler.unregisterWindow = function(win) { LOG("unregister window"); - let xid = firetray.Window.getWinXIDFromChromeWindow(win); + let xid = firetray.Window.getXIDFromChromeWindow(win); return this._unregisterWindowByXID(xid); };