From 890c4579c349ba9826cef1bbcc7d6fa4497c1d72 Mon Sep 17 00:00:00 2001 From: foudfou Date: Wed, 3 Aug 2011 15:48:56 +0200 Subject: [PATCH] Revert "new version of LibGtkStatusIcon.js with XPCOMUtils.defineLazyGetter()" This reverts commit d85edced00fd09b71500cd33978b3cc28fe4ac6a. First, it'll be easier to merge with hide/show feature. Then we prefer to keep 2 examples of js-ctypes libs: we still aren't clear about when/how to call lib.close()... --- src/chrome/content/overlay.js | 7 +- src/modules/LibGtkStatusIcon.js | 116 +++++++++++++++----------------- 2 files changed, 57 insertions(+), 66 deletions(-) diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js index c2baeba..a58b7a1 100644 --- a/src/chrome/content/overlay.js +++ b/src/chrome/content/overlay.js @@ -23,14 +23,15 @@ mozt.Main = { return false; } + LibGtkStatusIcon.init(); this.tray_icon = LibGtkStatusIcon.gtk_status_icon_new(); var mozApp = mozt.Utils.appInfoService.name; var icon_filename = MOZT_ICON_DIR + mozApp.toLowerCase() + MOZT_ICON_SUFFIX; LibGtkStatusIcon.gtk_status_icon_set_from_file(this.tray_icon, icon_filename); - // FIXME: hover on icno produces: - // (firefox-bin:5302): Gdk-CRITICAL **: IA__gdk_window_get_root_coords: - // assertion `GDK_IS_WINDOW (window)' failed + // TODO: produces: + // (firefox-bin:5302): Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed + // (thunderbird-bin:5380): Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed LibGtkStatusIcon.gtk_status_icon_set_tooltip_text(this.tray_icon, mozApp); diff --git a/src/modules/LibGtkStatusIcon.js b/src/modules/LibGtkStatusIcon.js index d64a1e8..6e0c74d 100644 --- a/src/modules/LibGtkStatusIcon.js +++ b/src/modules/LibGtkStatusIcon.js @@ -2,91 +2,81 @@ var EXPORTED_SYMBOLS = ["LibGtkStatusIcon"]; -const LIB_GTK = "libgtk-x11-2.0.so"; - const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; -Cu.import("resource://gre/modules/ctypes.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +const LIB_GTK = "libgtk-x11-2.0.so"; -XPCOMUtils.defineLazyGetter(this, "libgtk", function() { - var libgtk = ctypes.open(LIB_GTK); - if (!libgtk) - throw "libgtk is unavailable"; +var LibGtkStatusIcon = { - return libgtk; -}); + _lib: null, -// Types -XPCOMUtils.defineLazyGetter(this, "GtkStatusIcon", function() { - return ctypes.StructType("GtkStatusIcon"); -}); + init: function() { + // If ctypes doesn't exist, try to get it + Cu.import("resource://gre/modules/ctypes.jsm"); + // If we still don't have ctypes, this isn't going to work... + if (typeof(ctypes) == "undefined") { + throw ("Could not load JS-Ctypes"); + } -// Functions -XPCOMUtils.defineLazyGetter(this, "gtk_status_icon_new", function() { - var gtk_status_icon_new = libgtk.declare( - "gtk_status_icon_new", - ctypes.default_abi, - this.GtkStatusIcon.ptr - ); + try { + // Try to start up dependencies - if they fail, they'll throw + // exceptions. ex: GObjectLib.init(); - if (!gtk_status_icon_new) - throw "gtk_status_icon_new is unavailable"; + this._lib = ctypes.open(LIB_GTK); + if (!this._lib) + throw ("Could not load " + LIB_GTK); - return gtk_status_icon_new; -}); + } catch (e) { + this.shutdown(); + throw(e); + } -XPCOMUtils.defineLazyGetter(this, "gtk_status_icon_set_from_file", function() { - var gtk_status_icon_set_from_file = libgtk.declare( + // Ok, we got everything - let's declare. + this._declare(); + }, + + shutdown: function() { + // Close our connection to the library. + if (this._lib) + this._lib.close(); + }, + + _declare: function() { + // Types + this.GtkStatusIcon = ctypes.StructType("GtkStatusIcon"); + this.GtkStatusIconRef = ctypes.PointerType(this.GtkStatusIcon); + this.GdkPixbuf = ctypes.StructType("GdkPixbuf"); + this.GdkPixbufRef = ctypes.PointerType(this.GdkPixbuf); + + // Consts + // this.INDICATOR_MESSAGES_SERVER_TYPE = "message"; + + // Functions + + this.gtk_status_icon_new = this._lib.declare( + "gtk_status_icon_new", + ctypes.default_abi, + this.GtkStatusIconRef + ); + + this.gtk_status_icon_set_from_file = this._lib.declare( "gtk_status_icon_set_from_file", ctypes.default_abi, ctypes.void_t, - this.GtkStatusIcon.ptr, + this.GtkStatusIconRef, ctypes.char.ptr ); - if (!gtk_status_icon_new) - throw "gtk_status_icon_set_from_file is unavailable"; - - return gtk_status_icon_set_from_file; -}); - -XPCOMUtils.defineLazyGetter(this, "gtk_status_icon_set_tooltip_text", function() { - var gtk_status_icon_set_tooltip_text = libgtk.declare( + this.gtk_status_icon_set_tooltip_text = this._lib.declare( "gtk_status_icon_set_tooltip_text", ctypes.default_abi, ctypes.void_t, - this.GtkStatusIcon.ptr, + this.GtkStatusIconRef, ctypes.char.ptr ); - if (!gtk_status_icon_set_tooltip_text) - throw "gtk_status_icon_set_tooltip_text is unavailable"; + } - return gtk_status_icon_set_tooltip_text; -}); - -var LibGtkStatusIcon = { - /* - * FIXME: for now, we manually close the lib, but m_conley said: well, the - * first idea that comes to mind is to add an "unload" or "shutdown" function - * to the main MessagingMenu object that listens for an xpcom shutdown event, - * and then unloads the library - */ - shutdown: function() { - if (libgtk) libgtk.close(); - }, - - // Types - GtkStatusIcon: GtkStatusIcon, - - // Constants - // INDICATOR_MESSAGES_SERVER_TYPE: "message", - - // Functions - gtk_status_icon_new: gtk_status_icon_new, - gtk_status_icon_set_from_file: gtk_status_icon_set_from_file, - gtk_status_icon_set_tooltip_text: gtk_status_icon_set_tooltip_text, };