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

This reverts commit d85edced00.

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()...
This commit is contained in:
foudfou 2011-08-03 15:48:56 +02:00
parent d85edced00
commit 890c4579c3
2 changed files with 57 additions and 66 deletions

View File

@ -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);

View File

@ -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,
};