new version of LibGtkStatusIcon.js with XPCOMUtils.defineLazyGetter()

This commit is contained in:
foudfou 2011-07-11 18:59:12 +02:00
parent 7cac32441e
commit d85edced00
2 changed files with 66 additions and 57 deletions

View File

@ -23,15 +23,14 @@ mozt.Main = {
return false; return false;
} }
LibGtkStatusIcon.init();
this.tray_icon = LibGtkStatusIcon.gtk_status_icon_new(); this.tray_icon = LibGtkStatusIcon.gtk_status_icon_new();
var mozApp = mozt.Utils.appInfoService.name; var mozApp = mozt.Utils.appInfoService.name;
var icon_filename = MOZT_ICON_DIR + mozApp.toLowerCase() + MOZT_ICON_SUFFIX; var icon_filename = MOZT_ICON_DIR + mozApp.toLowerCase() + MOZT_ICON_SUFFIX;
LibGtkStatusIcon.gtk_status_icon_set_from_file(this.tray_icon, LibGtkStatusIcon.gtk_status_icon_set_from_file(this.tray_icon,
icon_filename); icon_filename);
// TODO: produces: // FIXME: hover on icno produces:
// (firefox-bin:5302): Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed // (firefox-bin:5302): Gdk-CRITICAL **: IA__gdk_window_get_root_coords:
// (thunderbird-bin:5380): Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed // assertion `GDK_IS_WINDOW (window)' failed
LibGtkStatusIcon.gtk_status_icon_set_tooltip_text(this.tray_icon, LibGtkStatusIcon.gtk_status_icon_set_tooltip_text(this.tray_icon,
mozApp); mozApp);

View File

@ -2,81 +2,91 @@
var EXPORTED_SYMBOLS = ["LibGtkStatusIcon"]; var EXPORTED_SYMBOLS = ["LibGtkStatusIcon"];
const LIB_GTK = "libgtk-x11-2.0.so";
const Cc = Components.classes; const Cc = Components.classes;
const Ci = Components.interfaces; const Ci = Components.interfaces;
const Cu = Components.utils; const Cu = Components.utils;
const LIB_GTK = "libgtk-x11-2.0.so";
var LibGtkStatusIcon = {
_lib: null,
init: function() {
// If ctypes doesn't exist, try to get it
Cu.import("resource://gre/modules/ctypes.jsm"); Cu.import("resource://gre/modules/ctypes.jsm");
// If we still don't have ctypes, this isn't going to work... Cu.import("resource://gre/modules/XPCOMUtils.jsm");
if (typeof(ctypes) == "undefined") {
throw ("Could not load JS-Ctypes");
}
try { XPCOMUtils.defineLazyGetter(this, "libgtk", function() {
// Try to start up dependencies - if they fail, they'll throw var libgtk = ctypes.open(LIB_GTK);
// exceptions. ex: GObjectLib.init(); if (!libgtk)
throw "libgtk is unavailable";
this._lib = ctypes.open(LIB_GTK); return libgtk;
if (!this._lib) });
throw ("Could not load " + LIB_GTK);
} catch (e) {
this.shutdown();
throw(e);
}
// 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 // Types
this.GtkStatusIcon = ctypes.StructType("GtkStatusIcon"); XPCOMUtils.defineLazyGetter(this, "GtkStatusIcon", function() {
this.GtkStatusIconRef = ctypes.PointerType(this.GtkStatusIcon); return ctypes.StructType("GtkStatusIcon");
this.GdkPixbuf = ctypes.StructType("GdkPixbuf"); });
this.GdkPixbufRef = ctypes.PointerType(this.GdkPixbuf);
// Consts
// this.INDICATOR_MESSAGES_SERVER_TYPE = "message";
// Functions // Functions
XPCOMUtils.defineLazyGetter(this, "gtk_status_icon_new", function() {
this.gtk_status_icon_new = this._lib.declare( var gtk_status_icon_new = libgtk.declare(
"gtk_status_icon_new", "gtk_status_icon_new",
ctypes.default_abi, ctypes.default_abi,
this.GtkStatusIconRef this.GtkStatusIcon.ptr
); );
this.gtk_status_icon_set_from_file = this._lib.declare( if (!gtk_status_icon_new)
throw "gtk_status_icon_new is unavailable";
return gtk_status_icon_new;
});
XPCOMUtils.defineLazyGetter(this, "gtk_status_icon_set_from_file", function() {
var gtk_status_icon_set_from_file = libgtk.declare(
"gtk_status_icon_set_from_file", "gtk_status_icon_set_from_file",
ctypes.default_abi, ctypes.default_abi,
ctypes.void_t, ctypes.void_t,
this.GtkStatusIconRef, this.GtkStatusIcon.ptr,
ctypes.char.ptr ctypes.char.ptr
); );
this.gtk_status_icon_set_tooltip_text = this._lib.declare( 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(
"gtk_status_icon_set_tooltip_text", "gtk_status_icon_set_tooltip_text",
ctypes.default_abi, ctypes.default_abi,
ctypes.void_t, ctypes.void_t,
this.GtkStatusIconRef, this.GtkStatusIcon.ptr,
ctypes.char.ptr 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,
}; };