* add unregisterWindow()

* cleaning
This commit is contained in:
foudfou 2011-12-18 19:39:56 +01:00
parent 88bf1451e0
commit 79e043e9a4
3 changed files with 45 additions and 39 deletions

View File

@ -54,10 +54,13 @@ firetray.Main = {
// Remove observer
let that = this;
firetray.Utils.prefService.removeObserver("", that);
LOG('Firetray UNLOADED !');
firetray.Handler.unregisterWindow(window);
/* NOTE: don't firetray.Handler.initialized=false here, otherwise after a
window close, a new window will create a new handler (and hence, a new
tray icon) */
LOG('Firetray UNLOADED !');
},
/* GTK TEST

View File

@ -46,11 +46,6 @@ firetray.Handler = {
this.FILENAME_NEWMAIL = firetray.Utils.chromeToPath(
"chrome://firetray/skin/message-mail-new.png");
/* GTK TEST
// init all handled windows
this._updateHandledDOMWindows();
*/
// OS/platform checks
this.runtimeABI = Services.appinfo.XPCOMABI;
this.runtimeOS = Services.appinfo.OS; // "WINNT", "Linux", "Darwin"

View File

@ -43,25 +43,19 @@ var _find_data_t = ctypes.StructType("_find_data_t", [
firetray.Handler.registerWindow = function(win) {
LOG("register window");
let that = this;
/* GTK TEST. */
// register
let [gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win);
/* NOTE: it should not be necessary to gtk_widget_add_events(gtkWin,
gdk.GDK_ALL_EVENTS_MASK); */
this.windows[xid] = {}; // windows.hasOwnProperty(xid) is true, remove with: delete windows[xid]
this.windows[xid].gtkWin = gtkWin;
this.windows[xid].gdkWin = gdkWin;
try {
let gtkWin = firetray.Window.getGtkWindowHandle(win);
LOG("gtkWin="+gtkWin);
let gdkWin = gtk.gtk_widget_get_window(ctypes.cast(gtkWin, gtk.GtkWidget.ptr));
LOG("gdkWin="+gdkWin);
/* NOTE: it should not be necessary to gtk_widget_add_events(gtkWin,
gdk.GDK_ALL_EVENTS_MASK); */
// register
let xid = gdk.gdk_x11_drawable_get_xid(ctypes.cast(gdkWin, gdk.GdkDrawable.ptr));
LOG("XID="+xid);
this.windows[xid] = {}; // windows.hasOwnProperty(xid) is true, remove with: delete windows[xid]
this.windows[xid].gtkWin = gtkWin;
this.windows[xid].gdkWin = gdkWin;
/* delete_event_cb (in gtk2/nsWindow.cpp) prevents us from catching
"delete-event" */
let deleteEventId = gobject.g_signal_lookup("delete-event", gtk.gtk_window_get_type());
@ -82,6 +76,7 @@ firetray.Handler.registerWindow = function(win) {
LOG("g_connect window-state-event="+res);
} catch (x) {
this._unregisterWindowByXID(xid);
ERROR(x);
return false;
}
@ -89,7 +84,22 @@ firetray.Handler.registerWindow = function(win) {
return true;
};
firetray.Handler.unregisterWindow = function(win) {};
firetray.Handler.unregisterWindow = function(win) {
LOG("unregister window");
let [gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win);
return this._unregisterWindowByXID(xid);
};
firetray.Handler._unregisterWindowByXID = function(xid) {
if (this.windows.hasOwnProperty(xid))
delete this.windows[xid];
else {
ERROR("can't unregister unknown window "+xid);
return false;
}
return true;
};
firetray.Handler.showHideToTray = function(gtkStatusIcon, userData) {
LOG("showHideToTray: "+userData);
@ -181,32 +191,30 @@ firetray.Window = {
}
},
// FIXME: it may not be worth wrapping gtk_widget_get_window...
getGdkWindowFromGtkWindow: function(gtkWin) {
try {
let gtkWid = ctypes.cast(gtkWin, gtk.GtkWidget.ptr);
var gdkWin = gtk.gtk_widget_get_window(gtkWid);
} catch (x) {
ERROR(x);
}
return gdkWin;
},
getGdkWindowHandle: function(win) {
try {
let gtkWin = firetray.Window.getGtkWindowHandle(win);
LOG("FOUND: "+gtk.gtk_window_get_title(gtkWin).readString());
let gdkWin = this.getGdkWindowFromGtkWindow(gtkWin);
if (!gdkWin.isNull()) {
LOG("has window");
return gdkWin;
}
return gtk.gtk_widget_get_window(gtkWid);
} catch (x) {
ERROR(x);
}
return null;
},
getXIDFromGdkWindow: function(gdkWin) {
return gdk.gdk_x11_drawable_get_xid(ctypes.cast(gdkWin, gdk.GdkDrawable.ptr));
},
getWindowsFromChromeWindow: function(win) {
let gtkWin = firetray.Window.getGtkWindowHandle(win);
LOG("gtkWin="+gtkWin);
let gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWin);
LOG("gdkWin="+gdkWin);
let xid = firetray.Window.getXIDFromGdkWindow(gdkWin);
LOG("XID="+xid);
return [gtkWin, gdkWin, xid];
},
windowDelete: function(gtkWidget, gdkEv, userData){
LOG("gtk_widget_hide: "+gtkWidget+", "+gdkEv+", "+userData);
try{