[Pkg-mozext-commits] [firetray] 86/399: * refactoring: Icon management exposed only through firetray.Handler * fix mailSessionListener removal
David Prévot
taffit at alioth.debian.org
Tue Oct 29 18:23:19 UTC 2013
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch dfsg-clean
in repository firetray.
commit 2fabe37d0cd95c7a99648cfa3baded1c2fa7922d
Author: foudfou <foudil.newbie+git at gmail.com>
Date: Sun Nov 6 19:32:46 2011 +0100
* refactoring: Icon management exposed only through firetray.Handler
* fix mailSessionListener removal
---
TODO | 2 -
src/chrome/skin/{newmail.png => blank-icon.png} | Bin 1413 -> 1413 bytes
src/modules/FiretrayHandler.jsm | 131 ++++++----
src/modules/FiretrayIconLinux.jsm | 310 +++++++++++------------
src/modules/FiretrayMessaging.jsm | 14 +-
5 files changed, 240 insertions(+), 217 deletions(-)
diff --git a/TODO b/TODO
index d7beca0..d2e5246 100644
--- a/TODO
+++ b/TODO
@@ -11,8 +11,6 @@
Not easily feasible since newmailalerts are hard-coded
http://mxr.mozilla.org/comm-central/find?string=content/newmailalert
-* make multi-platform. At least have js-ctypes library call dependant on OS detection. (best would be to have the OS-dependant modules loaded at startup)
-
* convert to a https://developer.mozilla.org/en/Extensions/Bootstrapped_extensions
see ../restartless-restart-ffext/ and
diff --git a/src/chrome/skin/newmail.png b/src/chrome/skin/blank-icon.png
similarity index 100%
rename from src/chrome/skin/newmail.png
rename to src/chrome/skin/blank-icon.png
diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index 6c7954b..6b2ae51 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -20,7 +20,7 @@ if ("undefined" == typeof(firetray)) {
};
/**
- * Singleton object for tray icon management
+ * Singleton object and abstraction for tray icon management.
*/
// NOTE: modules work outside of the window scope. Unlike scripts in the
// chrome, modules don't have access to objects such as window, document, or
@@ -28,11 +28,92 @@ if ("undefined" == typeof(firetray)) {
// (https://developer.mozilla.org/en/XUL_School/JavaScript_Object_Management)
firetray.Handler = {
initialized: false,
+ appName: null,
+ FILENAME_DEFAULT: null,
+ FILENAME_SUFFIX: "32.png",
+ FILENAME_BLANK: null,
+ FILENAME_NEWMAIL: null,
+ runtimeOS: null,
inMailApp: false,
_windowsHidden: false,
_handledDOMWindows: [],
+ init: function() { // creates icon
+ this.appName = Services.appinfo.name.toLowerCase();
+ this.FILENAME_DEFAULT = firetray.Utils.chromeToPath(
+ "chrome://firetray/skin/" + this.appName + this.FILENAME_SUFFIX);
+ this.FILENAME_BLANK = firetray.Utils.chromeToPath(
+ "chrome://firetray/skin/blank-icon.png");
+ this.FILENAME_NEWMAIL = firetray.Utils.chromeToPath(
+ "chrome/skin/message-mail-new.png");
+
+ // init all handled windows
+ this._updateHandledDOMWindows();
+
+ // OS/platform checks
+ this.runtimeOS = Services.appinfo.OS; // "WINNT", "Linux", "Darwin"
+ // version checked during install, so we shouldn't need to care
+ let xulVer = Services.appinfo.platformVersion; // Services.vc.compare(xulVer,"2.0a")>=0
+ LOG("OS=" + this.runtimeOS + ", XULrunner=" + xulVer);
+ switch (this.runtimeOS) {
+ case "Linux":
+ Cu.import("resource://firetray/FiretrayIconLinux.jsm");
+ LOG('FiretrayIconLinux imported');
+
+ // instanciate tray icon
+ firetray.IconLinux.init();
+ LOG('IconLinux initialized');
+
+ break;
+ default:
+ ERROR("FIRETRAY: only Linux platform supported at this time. Firetray not loaded");
+ return false;
+ }
+
+ // check if in mail app
+ var mozAppId = Services.appinfo.ID;
+ if (mozAppId === THUNDERBIRD_ID || mozAppId === SEAMONKEY_ID) {
+ this.inMailApp = true;
+ try {
+ Cu.import("resource://firetray/FiretrayMessaging.jsm");
+ let prefMailNotification = firetray.Utils.prefService.getIntPref("mail_notification");
+ if (prefMailNotification !== NOTIFICATION_DISABLED)
+ firetray.Messaging.enable();
+ } catch (x) {
+ ERROR(x);
+ return false;
+ }
+ }
+ LOG('inMailApp: '+this.inMailApp);
+
+ this.initialized = true;
+ return true;
+ },
+
+ shutdown: function() {
+ if (this.inMailApp)
+ firetray.Messaging.disable();
+
+ switch (this.runtimeOS) {
+ case "Linux":
+ firetray.IconLinux.shutdown();
+ break;
+ default:
+ ERROR("runtimeOS unknown or undefined.");
+ return false;
+ }
+
+ return true;
+ },
+
+ // these get overridden in OS-specific Icon handlers
+ setImage: function(filename) {},
+ setImageDefault: function() {},
+ setText: function(text, color) {},
+ setTooltip: function(localizedMessage) {},
+ setTooltipDefault: function() {},
+
_getBaseOrXULWindowFromDOMWindow: function(win, winType) {
let winInterface, winOut;
try { // thx Neil Deakin !!
@@ -147,54 +228,6 @@ firetray.Handler = {
ERROR(x);
return;
}
- },
-
- init: function() { // creates icon
-
- // platform checks
- let runtimeOS = Services.appinfo.OS; // "WINNT", "Linux", "Darwin"
- // version checked during install, so we shouldn't need to care
- let xulVer = Services.appinfo.platformVersion; // Services.vc.compare(xulVer,"2.0a")>=0
- LOG("OS=" + runtimeOS + ", XULrunner=" + xulVer);
- if (runtimeOS != "Linux") {
- ERROR("FIRETRAY: only Linux platform supported at this time. Firetray not loaded");
- return false;
- }
- Cu.import("resource://firetray/FiretrayIconLinux.jsm");
- LOG('FiretrayIconLinux imported');
-
- // init all handled windows
- this._updateHandledDOMWindows();
-
- // instanciate tray icon
- firetray.IconLinux.init();
- LOG('IconLinux initialized');
-
- // check if in mail app
- var mozAppId = Services.appinfo.ID;
- if (mozAppId === THUNDERBIRD_ID || mozAppId === SEAMONKEY_ID) {
- this.inMailApp = true;
- try {
- Cu.import("resource://firetray/FiretrayMessaging.jsm");
- let prefMailNotification = firetray.Utils.prefService.getIntPref("mail_notification");
- if (prefMailNotification !== NOTIFICATION_DISABLED)
- firetray.Messaging.enable();
- } catch (x) {
- ERROR(x);
- return false;
- }
- }
- LOG('inMailApp: '+this.inMailApp);
-
- this.initialized = true;
- return true;
- },
-
- shutdown: function() { // NOT USED YET
- if (this.inMailApp)
- firetray.Messaging.disable();
-
- firetray.IconLinux.shutdown();
}
}; // firetray.Handler
diff --git a/src/modules/FiretrayIconLinux.jsm b/src/modules/FiretrayIconLinux.jsm
index 3f0581b..38c77a3 100644
--- a/src/modules/FiretrayIconLinux.jsm
+++ b/src/modules/FiretrayIconLinux.jsm
@@ -47,31 +47,22 @@ var _find_data_t = ctypes.StructType("_find_data_t", [
firetray.IconLinux = {
tryIcon: null,
menu: null,
- appName: null,
- FILENAME_DEFAULT: null,
- FILENAME_SUFFIX: "32.png",
- FILENAME_NEWMAIL: "newmail.png",
MIN_FONT_SIZE: 4,
init: function() {
try {
// init tray icon, some variables
this.trayIcon = gtk.gtk_status_icon_new();
- this.appName = Services.appinfo.name.toLowerCase();
- this.FILENAME_DEFAULT = firetray.Utils.chromeToPath(
- "chrome://firetray/skin/" + this.appName + this.FILENAME_SUFFIX);
- this.FILENAME_NEWMAIL = firetray.Utils.chromeToPath(
- "chrome://firetray/skin/newmail.png");
} catch (x) {
ERROR(x);
return false;
}
- this.setImageDefault();
+ firetray.Handler.setImageDefault();
this._buildPopupMenu();
- this.setTooltipDefault();
+ firetray.Handler.setTooltipDefault();
// attach popupMenu to trayIcon
try {
@@ -144,154 +135,6 @@ firetray.IconLinux = {
},
- setImage: function(filename) {
- if (!this.trayIcon)
- return false;
- LOG(filename);
-
- try {
- gtk.gtk_status_icon_set_from_file(this.trayIcon,
- filename);
- } catch (x) {
- ERROR(x);
- return false;
- }
- return true;
- },
-
- setImageDefault: function() {
- if (!this.FILENAME_DEFAULT)
- throw "Default application icon filename not set";
- this.setImage(this.FILENAME_DEFAULT);
- },
-
- // GTK bug: Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed
- setTooltip: function(toolTipStr) {
- if (!this.trayIcon)
- return false;
-
- try {
- gtk.gtk_status_icon_set_tooltip_text(this.trayIcon,
- toolTipStr);
- } catch (x) {
- ERROR(x);
- return false;
- }
- return true;
- },
-
- setTooltipDefault: function() {
- if (!this.appName)
- throw "application name not initialized";
- this.setTooltip(this.appName);
- },
-
- setText: function(text, color) { // TODO: split into smaller functions;
- LOG("setText");
- if (typeof(text) != "string")
- throw new TypeError();
-
- try {
- // build background from image
- let specialIcon = gdk.gdk_pixbuf_new_from_file(this.FILENAME_NEWMAIL, null); // GError **error);
- let dest = gdk.gdk_pixbuf_copy(specialIcon);
- let w = gdk.gdk_pixbuf_get_width(specialIcon);
- let h = gdk.gdk_pixbuf_get_height(specialIcon);
-
- // prepare colors/alpha
- let colorMap = gdk.gdk_screen_get_system_colormap(gdk.gdk_screen_get_default());
- let visual = gdk.gdk_colormap_get_visual(colorMap);
- let visualDepth = visual.contents.depth;
- LOG("colorMap="+colorMap+" visual="+visual+" visualDepth="+visualDepth);
- let fore = new gdk.GdkColor;
- fore.pixel = fore.red = fore.green = fore.blue = 0;
- let alpha = new gdk.GdkColor;
- alpha.pixel = alpha.red = alpha.green = alpha.blue = 0xFFFF;
- if (!fore || !alpha)
- WARN("Undefined GdkColor fore or alpha");
- gdk.gdk_color_parse(color, fore.address());
- if(fore.red == alpha.red && fore.green == alpha.green && fore.blue == alpha.blue) {
- alpha.red=0; // make sure alpha is different from fore
- }
- gdk.gdk_colormap_alloc_color(colorMap, fore.address(), true, true);
- gdk.gdk_colormap_alloc_color(colorMap, alpha.address(), true, true);
-
- // build pixmap with rectangle
- let pm = gdk.gdk_pixmap_new(null, w, h, visualDepth);
- let pmDrawable = ctypes.cast(pm, gdk.GdkDrawable.ptr);
- let cr = gdk.gdk_cairo_create(pmDrawable);
- gdk.gdk_cairo_set_source_color(cr, alpha.address());
- cairo.cairo_rectangle(cr, 0, 0, w, h);
- cairo.cairo_set_source_rgb(cr, 1, 1, 1);
- cairo.cairo_fill(cr);
-
- // build text
- let scratch = gtk.gtk_window_new(gtk.GTK_WINDOW_TOPLEVEL);
- let layout = gtk.gtk_widget_create_pango_layout(scratch, null);
- gtk.gtk_widget_destroy(scratch);
- let fnt = pango.pango_font_description_from_string("Sans 18");
- pango.pango_font_description_set_weight(fnt,pango.PANGO_WEIGHT_SEMIBOLD);
- pango.pango_layout_set_spacing(layout,0);
- pango.pango_layout_set_font_description(layout, fnt);
- LOG("layout="+layout);
- LOG("text="+text);
- pango.pango_layout_set_text(layout, text,-1);
- let tw = new ctypes.int;
- let th = new ctypes.int;
- let sz;
- let border = 4;
- pango.pango_layout_get_pixel_size(layout, tw.address(), th.address());
- LOG("tw="+tw.value+" th="+th.value);
- // fit text to the icon by decreasing font size
- while ( tw.value > (w - border) || th.value > (h - border) ) {
- sz = pango.pango_font_description_get_size(fnt);
- if(sz < this.MIN_FONT_SIZE) {
- sz = this.MIN_FONT_SIZE;
- break;
- }
- sz -= pango.PANGO_SCALE;
- pango.pango_font_description_set_size(fnt,sz);
- pango.pango_layout_set_font_description(layout, fnt);
- pango.pango_layout_get_pixel_size(layout, tw.address(), th.address());
- }
- LOG("tw="+tw.value+" th="+th.value);
- pango.pango_font_description_free(fnt);
- // center text
- let px = (w-tw.value)/2;
- let py = (h-th.value)/2;
-
- // draw text on pixmap
- gdk.gdk_cairo_set_source_color(cr, fore.address());
- cairo.cairo_move_to(cr, px, py);
- pangocairo.pango_cairo_show_layout(cr, layout);
- cairo.cairo_destroy(cr);
- gobject.g_object_unref(layout);
-
- let buf = gdk.gdk_pixbuf_get_from_drawable(null, pmDrawable, null, 0, 0, 0, 0, w, h);
- gobject.g_object_unref(pm);
- LOG("alpha="+alpha);
- let alphaRed = gobject.guint16(alpha.red);
- let alphaRed_guchar = ctypes.cast(alphaRed, gobject.guchar);
- let alphaGreen = gobject.guint16(alpha.green);
- let alphaGreen_guchar = ctypes.cast(alphaGreen, gobject.guchar);
- let alphaBlue = gobject.guint16(alpha.blue);
- let alphaBlue_guchar = ctypes.cast(alphaBlue, gobject.guchar);
- let bufAlpha = gdk.gdk_pixbuf_add_alpha(buf, true, alphaRed_guchar, alphaGreen_guchar, alphaBlue_guchar);
- gobject.g_object_unref(buf);
-
- // merge the rendered text on top
- gdk.gdk_pixbuf_composite(bufAlpha,dest,0,0,w,h,0,0,1,1,gdk.GDK_INTERP_NEAREST,255);
- gobject.g_object_unref(bufAlpha);
-
- gtk.gtk_status_icon_set_from_pixbuf(this.trayIcon, dest);
- } catch (x) {
- ERROR(x);
- return false;
- }
-
- return true;
- },
-
/**
* Iterate over all Gtk toplevel windows to find a window. We rely on
* Service.wm to watch windows correctly: we should find only one window.
@@ -394,3 +237,152 @@ firetray.IconLinux = {
}
}; // firetray.IconLinux
+
+
+firetray.Handler.setImage = function(filename) {
+ if (!firetray.IconLinux.trayIcon)
+ return false;
+ LOG(filename);
+
+ try {
+ gtk.gtk_status_icon_set_from_file(firetray.IconLinux.trayIcon,
+ filename);
+ } catch (x) {
+ ERROR(x);
+ return false;
+ }
+ return true;
+};
+
+firetray.Handler.setImageDefault = function() {
+ if (!this.FILENAME_DEFAULT)
+ throw "Default application icon filename not set";
+ this.setImage(this.FILENAME_DEFAULT);
+};
+
+// GTK bug: Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed
+firetray.Handler.setTooltip = function(toolTipStr) {
+ if (!firetray.IconLinux.trayIcon)
+ return false;
+
+ try {
+ gtk.gtk_status_icon_set_tooltip_text(firetray.IconLinux.trayIcon,
+ toolTipStr);
+ } catch (x) {
+ ERROR(x);
+ return false;
+ }
+ return true;
+};
+
+firetray.Handler.setTooltipDefault = function() {
+ if (!this.appName)
+ throw "application name not initialized";
+ this.setTooltip(this.appName);
+};
+
+firetray.Handler.setText = function(text, color) { // TODO: split into smaller functions;
+ LOG("setText");
+ if (typeof(text) != "string")
+ throw new TypeError();
+
+ try {
+ // build background from image
+ let specialIcon = gdk.gdk_pixbuf_new_from_file(this.FILENAME_BLANK, null); // GError **error);
+ let dest = gdk.gdk_pixbuf_copy(specialIcon);
+ let w = gdk.gdk_pixbuf_get_width(specialIcon);
+ let h = gdk.gdk_pixbuf_get_height(specialIcon);
+
+ // prepare colors/alpha
+ let colorMap = gdk.gdk_screen_get_system_colormap(gdk.gdk_screen_get_default());
+ let visual = gdk.gdk_colormap_get_visual(colorMap);
+ let visualDepth = visual.contents.depth;
+ LOG("colorMap="+colorMap+" visual="+visual+" visualDepth="+visualDepth);
+ let fore = new gdk.GdkColor;
+ fore.pixel = fore.red = fore.green = fore.blue = 0;
+ let alpha = new gdk.GdkColor;
+ alpha.pixel = alpha.red = alpha.green = alpha.blue = 0xFFFF;
+ if (!fore || !alpha)
+ WARN("Undefined GdkColor fore or alpha");
+ gdk.gdk_color_parse(color, fore.address());
+ if(fore.red == alpha.red && fore.green == alpha.green && fore.blue == alpha.blue) {
+ alpha.red=0; // make sure alpha is different from fore
+ }
+ gdk.gdk_colormap_alloc_color(colorMap, fore.address(), true, true);
+ gdk.gdk_colormap_alloc_color(colorMap, alpha.address(), true, true);
+
+ // build pixmap with rectangle
+ let pm = gdk.gdk_pixmap_new(null, w, h, visualDepth);
+ let pmDrawable = ctypes.cast(pm, gdk.GdkDrawable.ptr);
+ let cr = gdk.gdk_cairo_create(pmDrawable);
+ gdk.gdk_cairo_set_source_color(cr, alpha.address());
+ cairo.cairo_rectangle(cr, 0, 0, w, h);
+ cairo.cairo_set_source_rgb(cr, 1, 1, 1);
+ cairo.cairo_fill(cr);
+
+ // build text
+ let scratch = gtk.gtk_window_new(gtk.GTK_WINDOW_TOPLEVEL);
+ let layout = gtk.gtk_widget_create_pango_layout(scratch, null);
+ gtk.gtk_widget_destroy(scratch);
+ let fnt = pango.pango_font_description_from_string("Sans 18");
+ pango.pango_font_description_set_weight(fnt,pango.PANGO_WEIGHT_SEMIBOLD);
+ pango.pango_layout_set_spacing(layout,0);
+ pango.pango_layout_set_font_description(layout, fnt);
+ LOG("layout="+layout);
+ LOG("text="+text);
+ pango.pango_layout_set_text(layout, text,-1);
+ let tw = new ctypes.int;
+ let th = new ctypes.int;
+ let sz;
+ let border = 4;
+ pango.pango_layout_get_pixel_size(layout, tw.address(), th.address());
+ LOG("tw="+tw.value+" th="+th.value);
+ // fit text to the icon by decreasing font size
+ while ( tw.value > (w - border) || th.value > (h - border) ) {
+ sz = pango.pango_font_description_get_size(fnt);
+ if(sz < firetray.IconLinux.MIN_FONT_SIZE) {
+ sz = firetray.IconLinux.MIN_FONT_SIZE;
+ break;
+ }
+ sz -= pango.PANGO_SCALE;
+ pango.pango_font_description_set_size(fnt,sz);
+ pango.pango_layout_set_font_description(layout, fnt);
+ pango.pango_layout_get_pixel_size(layout, tw.address(), th.address());
+ }
+ LOG("tw="+tw.value+" th="+th.value);
+ pango.pango_font_description_free(fnt);
+ // center text
+ let px = (w-tw.value)/2;
+ let py = (h-th.value)/2;
+
+ // draw text on pixmap
+ gdk.gdk_cairo_set_source_color(cr, fore.address());
+ cairo.cairo_move_to(cr, px, py);
+ pangocairo.pango_cairo_show_layout(cr, layout);
+ cairo.cairo_destroy(cr);
+ gobject.g_object_unref(layout);
+
+ let buf = gdk.gdk_pixbuf_get_from_drawable(null, pmDrawable, null, 0, 0, 0, 0, w, h);
+ gobject.g_object_unref(pm);
+ LOG("alpha="+alpha);
+ let alphaRed = gobject.guint16(alpha.red);
+ let alphaRed_guchar = ctypes.cast(alphaRed, gobject.guchar);
+ let alphaGreen = gobject.guint16(alpha.green);
+ let alphaGreen_guchar = ctypes.cast(alphaGreen, gobject.guchar);
+ let alphaBlue = gobject.guint16(alpha.blue);
+ let alphaBlue_guchar = ctypes.cast(alphaBlue, gobject.guchar);
+ let bufAlpha = gdk.gdk_pixbuf_add_alpha(buf, true, alphaRed_guchar, alphaGreen_guchar, alphaBlue_guchar);
+ gobject.g_object_unref(buf);
+
+ // merge the rendered text on top
+ gdk.gdk_pixbuf_composite(bufAlpha,dest,0,0,w,h,0,0,1,1,gdk.GDK_INTERP_NEAREST,255);
+ gobject.g_object_unref(bufAlpha);
+
+ gtk.gtk_status_icon_set_from_pixbuf(firetray.IconLinux.trayIcon, dest);
+ } catch (x) {
+ ERROR(x);
+ return false;
+ }
+
+ return true;
+};
diff --git a/src/modules/FiretrayMessaging.jsm b/src/modules/FiretrayMessaging.jsm
index 0881734..5c1037b 100644
--- a/src/modules/FiretrayMessaging.jsm
+++ b/src/modules/FiretrayMessaging.jsm
@@ -8,7 +8,7 @@ const Cu = Components.utils;
Cu.import("resource:///modules/mailServices.js");
Cu.import("resource://gre/modules/PluralForm.jsm");
-Cu.import("resource://firetray/FiretrayIconLinux.jsm");
+// Cu.import("resource://firetray/FiretrayHandler.jsm");
Cu.import("resource://firetray/commons.js");
const FLDR_UNINTERESTING =
@@ -52,8 +52,8 @@ firetray.Messaging = {
if (!this.enabled)
return;
- MailServices.mailSession.RemoveFolderListener(this);
- firetray.IconLinux.setImageDefault();
+ MailServices.mailSession.RemoveFolderListener(this.mailSessionListener);
+ firetray.Handler.setImageDefault();
this.enabled = false;
},
@@ -110,16 +110,16 @@ firetray.Messaging = {
// update icon
if (this._unreadMsgCount == 0) {
- firetray.IconLinux.setImageDefault();
- firetray.IconLinux.setTooltipDefault();
+ firetray.Handler.setImageDefault();
+ firetray.Handler.setTooltipDefault();
} else if (this._unreadMsgCount > 0) {
let prefIconTextColor = firetray.Utils.prefService.getCharPref("icon_text_color");
- firetray.IconLinux.setText(this._unreadMsgCount.toString(), prefIconTextColor);
+ firetray.Handler.setText(this._unreadMsgCount.toString(), prefIconTextColor);
let localizedMessage = PluralForm.get(
this._unreadMsgCount,
firetray.Utils.strings.GetStringFromName("tooltip.unread_messages"))
.replace("#1", this._unreadMsgCount);;
- firetray.IconLinux.setTooltip(localizedMessage);
+ firetray.Handler.setTooltip(localizedMessage);
} else {
throw "negative message count"; // should never happen
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/firetray.git
More information about the Pkg-mozext-commits
mailing list