[Pkg-mozext-commits] [firetray] 22/38: BSD - change runtimeOS

David Prévot taffit at moszumanska.debian.org
Mon Apr 6 15:58:21 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository firetray.

commit ad1ca870fadcea96c64a75a3b74a2eed1eb79322
Author: Scott Furry <scott.wl.furry at gmail.com>
Date:   Tue Mar 3 17:41:45 2015 -0700

    BSD - change runtimeOS
---
 src/Makefile                                       |   3 -
 .../icons/freebsd/hicolor/22x22/apps/chatzilla.png |   1 -
 .../icons/freebsd/hicolor/22x22/apps/firefox.png   |   1 -
 .../icons/freebsd/hicolor/22x22/apps/seamonkey.png |   1 -
 .../freebsd/hicolor/22x22/apps/thunderbird.png     |   1 -
 .../icons/freebsd/hicolor/22x22/apps/zotero.png    |   1 -
 .../freebsd/hicolor/22x22/status/mail-unread.png   |   1 -
 .../hicolor/22x22/status/user-available.png        |   1 -
 .../freebsd/hicolor/22x22/status/user-away.png     |   1 -
 .../freebsd/hicolor/22x22/status/user-busy.png     |   1 -
 .../freebsd/hicolor/22x22/status/user-offline.png  |   1 -
 src/modules/FiretrayHandler.jsm                    |   3 +
 src/modules/ctypes/freebsd/appindicator.jsm        |  58 --
 src/modules/ctypes/freebsd/cairo.jsm               |  26 -
 src/modules/ctypes/freebsd/gdk.jsm                 | 333 ---------
 src/modules/ctypes/freebsd/gio.jsm                 |  46 --
 src/modules/ctypes/freebsd/glib.jsm                |  27 -
 src/modules/ctypes/freebsd/gobject.jsm             | 140 ----
 src/modules/ctypes/freebsd/gtk.jsm                 | 174 -----
 src/modules/ctypes/freebsd/libc.jsm                |  31 -
 src/modules/ctypes/freebsd/pango.jsm               |  47 --
 src/modules/ctypes/freebsd/pangocairo.jsm          |  22 -
 src/modules/ctypes/freebsd/x11.jsm                 | 255 -------
 src/modules/freebsd/FiretrayAppIndicator.jsm       | 157 -----
 src/modules/freebsd/FiretrayChat.jsm               | 332 ---------
 src/modules/freebsd/FiretrayChatStatusIcon.jsm     | 301 --------
 src/modules/freebsd/FiretrayGtkIcons.jsm           |  67 --
 src/modules/freebsd/FiretrayGtkStatusIcon.jsm      | 341 ---------
 src/modules/freebsd/FiretrayPopupMenu.jsm          | 262 -------
 src/modules/freebsd/FiretrayStatusIcon.jsm         | 219 ------
 src/modules/freebsd/FiretrayWindow.jsm             | 761 ---------------------
 31 files changed, 3 insertions(+), 3612 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index 5084e19..eaa7f7d 100755
--- a/src/Makefile
+++ b/src/Makefile
@@ -96,7 +96,6 @@ chrome_sources := $(chrome_sources_js)								\
                $(wildcard $(chrome_source_root)/skin/icons/*.gif)				\
                $(wildcard $(chrome_source_root)/skin/icons/*.png)				\
                $(wildcard $(chrome_source_root)/skin/icons/*.svg)				\
-               $(wildcard $(chrome_source_root)/skin/icons/freebsd/hicolor/22x22/*/*.png)	\
                $(wildcard $(chrome_source_root)/skin/icons/linux/hicolor/22x22/*/*.png)		\
                $(wildcard $(chrome_source_root)/skin/icons/winnt/*.bmp)				\
                $(wildcard $(chrome_source_root)/skin/icons/winnt/*.ico)				\
@@ -110,10 +109,8 @@ modules_dir := modules
 modules_sources := $(wildcard $(modules_dir)/*.js)		\
 		$(wildcard $(modules_dir)/*.jsm)		\
 		$(wildcard $(modules_dir)/ctypes/*.jsm)		\
-		$(wildcard $(modules_dir)/ctypes/freebsd/*.jsm)	\
 		$(wildcard $(modules_dir)/ctypes/linux/*.jsm)	\
 		$(wildcard $(modules_dir)/ctypes/winnt/*.jsm)	\
-		$(wildcard $(modules_dir)/freebsd/*.jsm)	\
 		$(wildcard $(modules_dir)/linux/*.jsm)		\
 		$(wildcard $(modules_dir)/winnt/*.jsm)
 
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/chatzilla.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/chatzilla.png
deleted file mode 120000
index 0bf53df..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/chatzilla.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/chatzilla22.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/firefox.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/firefox.png
deleted file mode 120000
index be7eea5..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/firefox.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/firefox22.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/seamonkey.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/seamonkey.png
deleted file mode 120000
index 25c1150..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/seamonkey.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/seamonkey22.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/thunderbird.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/thunderbird.png
deleted file mode 120000
index c7733f5..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/thunderbird.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/thunderbird22.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/zotero.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/zotero.png
deleted file mode 120000
index ed6861f..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/apps/zotero.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/zotero22.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/mail-unread.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/status/mail-unread.png
deleted file mode 120000
index 50c5ecb..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/mail-unread.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/mail-unread.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-available.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-available.png
deleted file mode 120000
index 4a9d15a..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-available.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/pidgin-tray-available.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-away.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-away.png
deleted file mode 120000
index 00139c3..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-away.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/pidgin-tray-away.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-busy.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-busy.png
deleted file mode 120000
index 2fa96b0..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-busy.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/pidgin-tray-busy.png
\ No newline at end of file
diff --git a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-offline.png b/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-offline.png
deleted file mode 120000
index 55463da..0000000
--- a/src/chrome/skin/icons/freebsd/hicolor/22x22/status/user-offline.png
+++ /dev/null
@@ -1 +0,0 @@
-../../../../img/pidgin-tray-offline.png
\ No newline at end of file
diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index 88d3c73..6503ad1 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -77,7 +77,10 @@ firetray.Handler = {
                Services.vc.compare(this.xulVer,"27.0") < 0) {
       log.error("FireTray needs Gecko 27 and above on Windows.");
       return false;
+    } else if (this.runtimeOS == "freebsd") {
+      this.runtimeOS = "linux";
     }
+
     Cu.import("resource://firetray/"+this.runtimeOS+"/FiretrayStatusIcon.jsm");
     log.debug("FiretrayStatusIcon "+this.runtimeOS+" imported");
     Cu.import("resource://firetray/"+this.runtimeOS+"/FiretrayWindow.jsm");
diff --git a/src/modules/ctypes/freebsd/appindicator.jsm b/src/modules/ctypes/freebsd/appindicator.jsm
deleted file mode 100644
index ed7a10e..0000000
--- a/src/modules/ctypes/freebsd/appindicator.jsm
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "appind3" ];
-
-const APPINDICATOR_LIBNAME = "appindicator3";
-const APPINDICATOR_ABIS    = [ 1 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-
-function appindicator_defines(lib) {
-  this.AppIndicator = ctypes.StructType("AppIndicator");
-
-  this.INDICATOR_APPLICATION_DBUS_ADDR  = "com.canonical.indicator.application";
-  this.INDICATOR_APPLICATION_DBUS_OBJ   = "/com/canonical/indicator/application/service";
-  this.INDICATOR_APPLICATION_DBUS_IFACE = "com.canonical.indicator.application.service";
-  this.NOTIFICATION_WATCHER_DBUS_ADDR   = "org.kde.StatusNotifierWatcher";
-  this.NOTIFICATION_WATCHER_DBUS_OBJ    = "/StatusNotifierWatcher";
-  this.NOTIFICATION_WATCHER_DBUS_IFACE  = "org.kde.StatusNotifierWatcher";
-  this.NOTIFICATION_ITEM_DBUS_IFACE     = "org.kde.StatusNotifierItem";
-  this.NOTIFICATION_ITEM_DEFAULT_OBJ    = "/StatusNotifierItem";
-  this.NOTIFICATION_APPROVER_DBUS_IFACE = "org.ayatana.StatusNotifierApprover";
-
-  this.AppIndicatorCategory = ctypes.int;             // enum
-  this.APP_INDICATOR_CATEGORY_APPLICATION_STATUS = 0; /*< nick=ApplicationStatus >*/
-  this.APP_INDICATOR_CATEGORY_COMMUNICATIONS     = 1; /*< nick=Communications >*/
-  this.APP_INDICATOR_CATEGORY_SYSTEM_SERVICES    = 2; /*< nick=SystemServices >*/
-  this.APP_INDICATOR_CATEGORY_HARDWARE           = 3; /*< nick=Hardware >*/
-  this.APP_INDICATOR_CATEGORY_OTHER              = 4; /*< nick=Other >*/
-
-  this.AppIndicatorStatus = ctypes.int;    // enum
-  this.APP_INDICATOR_STATUS_PASSIVE   = 0; /*< nick=Passive >*/
-  this.APP_INDICATOR_STATUS_ACTIVE    = 1; /*< nick=Active >*/
-  this.APP_INDICATOR_STATUS_ATTENTION = 2; /*< nick=NeedsAttention >*/
-
-  lib.lazy_bind("app_indicator_new", this.AppIndicator.ptr, gobject.gchar.ptr, gobject.gchar.ptr, this.AppIndicatorCategory);
-  lib.lazy_bind("app_indicator_set_status", ctypes.void_t, this.AppIndicator.ptr, this.AppIndicatorStatus);
-  lib.lazy_bind("app_indicator_get_status", this.AppIndicatorStatus, this.AppIndicator.ptr);
-  lib.lazy_bind("app_indicator_set_menu", ctypes.void_t, this.AppIndicator.ptr, gtk.GtkMenu.ptr);
-  lib.lazy_bind("app_indicator_set_icon", ctypes.void_t, this.AppIndicator.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("app_indicator_set_attention_icon", ctypes.void_t, this.AppIndicator.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("app_indicator_set_label", ctypes.void_t, this.AppIndicator.ptr, gobject.gchar.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("app_indicator_set_secondary_activate_target", ctypes.void_t, this.AppIndicator.ptr, gtk.GtkWidget.ptr);
-
-  this.ConnectionChangedCb_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t, [this.AppIndicator.ptr, gobject.gboolean, gobject.gpointer]).ptr;
-
-  this.OnScrollCb_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t, [this.AppIndicator.ptr, gobject.gint, gobject.guint, gobject.gpointer]).ptr;
-};
-
-var appind3 = new ctypes_library(APPINDICATOR_LIBNAME, APPINDICATOR_ABIS, appindicator_defines, this);
diff --git a/src/modules/ctypes/freebsd/cairo.jsm b/src/modules/ctypes/freebsd/cairo.jsm
deleted file mode 100644
index 7a3bccc..0000000
--- a/src/modules/ctypes/freebsd/cairo.jsm
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "cairo" ];
-
-const CAIRO_LIBNAME = "cairo";
-const CAIRO_ABIS    = [ 2 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-
-function cairo_defines(lib) {
-  this.cairo_t = ctypes.StructType("cairo_t");
-
-  lib.lazy_bind("cairo_rectangle", ctypes.void_t, this.cairo_t.ptr, ctypes.double, ctypes.double, ctypes.double, ctypes.double);
-  lib.lazy_bind("cairo_set_source_rgb", ctypes.void_t, this.cairo_t.ptr, ctypes.double, ctypes.double, ctypes.double);
-  lib.lazy_bind("cairo_fill", ctypes.void_t, this.cairo_t.ptr);
-  lib.lazy_bind("cairo_move_to", ctypes.void_t, this.cairo_t.ptr, ctypes.double, ctypes.double);
-  lib.lazy_bind("cairo_destroy", ctypes.void_t, this.cairo_t.ptr);
-
-}
-
-new ctypes_library(CAIRO_LIBNAME, CAIRO_ABIS, cairo_defines, this);
diff --git a/src/modules/ctypes/freebsd/gdk.jsm b/src/modules/ctypes/freebsd/gdk.jsm
deleted file mode 100644
index 27cf198..0000000
--- a/src/modules/ctypes/freebsd/gdk.jsm
+++ /dev/null
@@ -1,333 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- *	 Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Firetray
- *
- * The Initial Developer of the Original Code is
- * Mozilla Messaging, Ltd.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *    Mike Conley <mconley at mozillamessaging.com>
- *    Foudil Brétel <foudil.newbie+amo at gmail.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-var EXPORTED_SYMBOLS = [ "gdk" ];
-
-const GDK_LIBNAME = "gdk-x11-2.0";
-const GDK_ABIS    = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/cairo.jsm");
-Cu.import("resource://firetray/ctypes/linux/glib.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/x11.jsm");
-
-function gdk_defines(lib) {
-  this.GdkInterpType = ctypes.int; // enum
-  this.GDK_INTERP_NEAREST  = 0;
-  this.GDK_INTERP_TILES    = 1;
-  this.GDK_INTERP_BILINEAR = 2;
-  this.GDK_INTERP_HYPE     = 3;
-  this.GdkFilterReturn = ctypes.int; // enum
-  this.GDK_FILTER_CONTINUE  = 0;
-  this.GDK_FILTER_TRANSLATE = 1;
-  this.GDK_FILTER_REMOVE    = 2;
-  this.GdkWindowState = ctypes.int; // enum
-  this.GDK_WINDOW_STATE_WITHDRAWN  = 1 << 0,
-  this.GDK_WINDOW_STATE_ICONIFIED  = 1 << 1,
-  this.GDK_WINDOW_STATE_MAXIMIZED  = 1 << 2,
-  this.GDK_WINDOW_STATE_STICKY     = 1 << 3,
-  this.GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
-  this.GDK_WINDOW_STATE_ABOVE      = 1 << 5,
-  this.GDK_WINDOW_STATE_BELOW      = 1 << 6;
-  this.GdkEventType = ctypes.int; // enum
-  this.GDK_NOTHING           = -1;
-  this.GDK_DELETE            = 0;
-  this.GDK_DESTROY           = 1;
-  this.GDK_EXPOSE            = 2;
-  this.GDK_MOTION_NOTIFY     = 3;
-  this.GDK_BUTTON_PRESS      = 4;
-  this.GDK_2BUTTON_PRESS     = 5;
-  this.GDK_3BUTTON_PRESS     = 6;
-  this.GDK_BUTTON_RELEASE    = 7;
-  this.GDK_KEY_PRESS         = 8;
-  this.GDK_KEY_RELEASE       = 9;
-  this.GDK_ENTER_NOTIFY      = 10;
-  this.GDK_LEAVE_NOTIFY      = 11;
-  this.GDK_FOCUS_CHANGE      = 12;
-  this.GDK_CONFIGURE         = 13;
-  this.GDK_MAP               = 14;
-  this.GDK_UNMAP             = 15;
-  this.GDK_PROPERTY_NOTIFY   = 16;
-  this.GDK_SELECTION_CLEAR   = 17;
-  this.GDK_SELECTION_REQUEST = 18;
-  this.GDK_SELECTION_NOTIFY  = 19;
-  this.GDK_PROXIMITY_IN      = 20;
-  this.GDK_PROXIMITY_OUT     = 21;
-  this.GDK_DRAG_ENTER        = 22;
-  this.GDK_DRAG_LEAVE        = 23;
-  this.GDK_DRAG_MOTION       = 24;
-  this.GDK_DRAG_STATUS       = 25;
-  this.GDK_DROP_START        = 26;
-  this.GDK_DROP_FINISHED     = 27;
-  this.GDK_CLIENT_EVENT      = 28;
-  this.GDK_VISIBILITY_NOTIFY = 29;
-  this.GDK_NO_EXPOSE         = 30;
-  this.GDK_SCROLL            = 31;
-  this.GDK_WINDOW_STATE      = 32;
-  this.GDK_SETTING           = 33;
-  this.GDK_OWNER_CHANGE      = 34;
-  this.GDK_GRAB_BROKEN       = 35;
-  this.GDK_DAMAGE            = 36;
-  this.GDK_EVENT_LAST = 37;      /* helper variable for decls */
-  this.GdkPropMode = ctypes.int; // enum
-  this.GDK_PROP_MODE_REPLACE = 0;
-  this.GDK_PROP_MODE_PREPEN  = 1;
-  this.GDK_PROP_MODE_APPEND  = 2;
-  this.GdkScrollDirection = ctypes.int; // enum
-  this.GDK_SCROLL_UP    = 0;
-  this.GDK_SCROLL_DOWN  = 1;
-  this.GDK_SCROLL_LEFT  = 2;
-  this.GDK_SCROLL_RIGHT = 3;
-  this.GdkEventMask = ctypes.int; // enum
-  this.GDK_EXPOSURE_MASK            = 1 << 1,
-  this.GDK_POINTER_MOTION_MASK      = 1 << 2,
-  this.GDK_POINTER_MOTION_HINT_MASK = 1 << 3,
-  this.GDK_BUTTON_MOTION_MASK       = 1 << 4,
-  this.GDK_BUTTON1_MOTION_MASK      = 1 << 5,
-  this.GDK_BUTTON2_MOTION_MASK      = 1 << 6,
-  this.GDK_BUTTON3_MOTION_MASK      = 1 << 7,
-  this.GDK_BUTTON_PRESS_MASK        = 1 << 8,
-  this.GDK_BUTTON_RELEASE_MASK      = 1 << 9,
-  this.GDK_KEY_PRESS_MASK           = 1 << 10,
-  this.GDK_KEY_RELEASE_MASK         = 1 << 11,
-  this.GDK_ENTER_NOTIFY_MASK        = 1 << 12,
-  this.GDK_LEAVE_NOTIFY_MASK        = 1 << 13,
-  this.GDK_FOCUS_CHANGE_MASK        = 1 << 14,
-  this.GDK_STRUCTURE_MASK           = 1 << 15,
-  this.GDK_PROPERTY_CHANGE_MASK     = 1 << 16,
-  this.GDK_VISIBILITY_NOTIFY_MASK   = 1 << 17,
-  this.GDK_PROXIMITY_IN_MASK        = 1 << 18,
-  this.GDK_PROXIMITY_OUT_MASK       = 1 << 19,
-  this.GDK_SUBSTRUCTURE_MASK        = 1 << 20,
-  this.GDK_SCROLL_MASK              = 1 << 21,
-  this.GDK_ALL_EVENTS_MASK          = 0x3FFFFE
-  this.GdkColorspace = ctypes.int;     // enum
-  this.GDK_COLORSPACE_RGB = 0;
-
-  this.GdkWindow = ctypes.StructType("GdkWindow");
-  this.GdkByteOrder = ctypes.int; // enum
-  this.GdkVisualType = ctypes.int; // enum
-  this.GdkVisual = ctypes.StructType("GdkVisual", [
-    { "parent_instance": gobject.GObject },
-    { "type": this.GdkVisualType },
-    { "depth": gobject.gint },
-    { "byte": this.GdkByteOrder },
-    { "colormap": gobject.gint },
-    { "bits": gobject.gint },
-    { "red_mask": gobject.guint32 },
-    { "red_shift": gobject.gint },
-    { "red_prec": gobject.gint },
-    { "green_mask": gobject.guint32 },
-    { "green_shift": gobject.gint },
-    { "green_prec": gobject.gint },
-    { "blue_mask": gobject.guint32 },
-    { "blue_shift": gobject.gint },
-    { "blue_prec": gobject.gint }
-  ]);
-  this.GdkColor = ctypes.StructType("GdkColor", [
-    { "pixel": gobject.guint32 },
-    { "red": gobject.guint16 },
-    { "green": gobject.guint16 },
-    { "blue": gobject.guint16 }
-  ]);
-  this.GdkColormap = ctypes.StructType("GdkColormap", [
-    { "size": gobject.gint },
-    { "colors": this.GdkColor.ptr }
-  ]);
-  this.GdkWindowType = ctypes.StructType("GdkWindowType");
-  this.GdkCursor = ctypes.StructType("GdkCursor");
-  this.GdkWindowTypeHint = ctypes.StructType("GdkWindowTypeHint");
-  this.GdkWindowClass = ctypes.StructType("GdkWindowClass");
-  this.GdkWindowAttributes = ctypes.StructType("GdkWindowAttributes", [
-    { "title": gobject.gchar },
-    { "event_mask": gobject.gint },
-    { "x": gobject.gint },
-    { "y": gobject.gint },
-    { "width": gobject.gint },
-    { "height": gobject.gint },
-    { "wclass": gobject.gint },
-    { "visual": this.GdkVisual.ptr },
-    { "colormap": this.GdkColormap.ptr },
-    { "window_type": gobject.gint },
-    { "cursor": this.GdkCursor.ptr },
-    { "wmclass_name": gobject.gchar },
-    { "wmclass_class": gobject.gchar },
-    { "override_redirect": gobject.gboolean },
-    { "type_hint": gobject.gint }
-  ]);
-  this.GdkPixbuf = ctypes.StructType("GdkPixbuf");
-  this.GdkScreen = ctypes.StructType("GdkScreen");
-  this.GdkPixmap = ctypes.StructType("GdkPixmap");
-  this.GdkDrawable = ctypes.StructType("GdkDrawable");
-  this.GdkGC = ctypes.StructType("GdkGC");
-  this.GdkXEvent = ctypes.void_t; // will probably be cast to XEvent
-  this.GdkEvent = ctypes.void_t;
-  this.GdkDisplay = ctypes.StructType("GdkDisplay");
-  this.GdkFilterFunc = ctypes.voidptr_t;
-  this.GdkEventWindowState = ctypes.StructType("GdkEventWindowState", [
-    { "type": this.GdkEventType },
-    { "window": this.GdkWindow.ptr },
-    { "send_event": gobject.gint8 },
-    { "changed_mask": this.GdkWindowState },
-    { "new_window_state": this.GdkWindowState },
-  ]);
-  this.GdkDevice = ctypes.StructType("GdkDevice");
-  this.GdkEventScroll = ctypes.StructType("GdkEventScroll", [
-    { "type": this.GdkEventType },
-    { "window": this.GdkWindow.ptr },
-    { "send_event": gobject.gint8 },
-    { "time": gobject.guint32 },
-    { "x": gobject.gdouble },
-    { "y": gobject.gdouble },
-    { "state": gobject.guint },
-    { "direction": this.GdkScrollDirection },
-    { "device": this.GdkDevice.ptr },
-    { "x_root": gobject.gdouble },
-    { "y_root": gobject.gdouble }
-  ]);
-  this.GdkAtom = ctypes.StructType("GdkAtom");
-  this.GdkEventButton = ctypes.StructType("GdkEventButton", [
-    { "type": this.GdkEventType },
-    { "window": this.GdkWindow.ptr },
-    { "send_event": gobject.gint8 },
-    { "time": gobject.guint32 },
-    { "x": gobject.gdouble },
-    { "y": gobject.gdouble },
-    { "axes": gobject.gdouble.ptr },
-    { "state": gobject.guint },
-    { "button": gobject.guint },
-    { "device": this.GdkDevice.ptr },
-    { "x_root": gobject.gdouble },
-    { "y_root": gobject.gdouble }
-  ]);
-  this.GdkEventFocus = ctypes.StructType("GdkEventFocus", [
-    { "type": this.GdkEventType },
-    { "window": this.GdkWindow.ptr },
-    { "send_event": gobject.gint8 },
-    { "in": gobject.gint16 },
-  ]);
-
-  this.GdkFilterFunc_t = ctypes.FunctionType(
-    ctypes.default_abi, this.GdkFilterReturn,
-    [this.GdkXEvent.ptr, this.GdkEvent.ptr, gobject.gpointer]).ptr;
-
-  lib.lazy_bind("gdk_flush", ctypes.void_t);
-  lib.lazy_bind("gdk_error_trap_push", ctypes.void_t);
-  lib.lazy_bind("gdk_error_trap_pop", gobject.gint);
-
-  lib.lazy_bind("gdk_x11_drawable_get_xid", x11.XID, this.GdkDrawable.ptr);
-  lib.lazy_bind("gdk_window_new", this.GdkWindow.ptr, this.GdkWindow.ptr, this.GdkWindowAttributes.ptr, gobject.gint);
-  lib.lazy_bind("gdk_window_destroy", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_x11_window_set_user_time", ctypes.void_t, this.GdkWindow.ptr, gobject.guint32);
-  lib.lazy_bind("gdk_window_hide", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_show_unraised", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_screen_get_default", this.GdkScreen.ptr);
-  lib.lazy_bind("gdk_screen_get_toplevel_windows", gobject.GList.ptr, this.GdkScreen.ptr);
-  lib.lazy_bind("gdk_screen_get_number", gobject.gint, this.GdkScreen.ptr);
-  lib.lazy_bind("gdk_screen_get_display", this.GdkDisplay.ptr, this.GdkScreen.ptr);
-  lib.lazy_bind("gdk_x11_get_xatom_by_name_for_display", x11.Atom, this.GdkDisplay.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gdk_pixbuf_new_from_file", this.GdkPixbuf.ptr, gobject.gchar.ptr, glib.GError.ptr.ptr);
-  lib.lazy_bind("gdk_pixbuf_copy", this.GdkPixbuf.ptr, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_composite", ctypes.void_t, this.GdkPixbuf.ptr, this.GdkPixbuf.ptr, ctypes.int, ctypes.int, ctypes.int, ctypes.int, ctypes.double, ctypes.double, ctypes.double, ctypes.double, ctypes.int, ctypes.int);
-  lib.lazy_bind("gdk_pixbuf_get_has_alpha", gobject.gboolean, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_add_alpha", this.GdkPixbuf.ptr, this.GdkPixbuf.ptr, gobject.gboolean, gobject.guchar, gobject.guchar, gobject.guchar);
-  lib.lazy_bind("gdk_pixbuf_get_colorspace", this.GdkColorspace, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_n_channels", ctypes.int, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_has_alpha", gobject.gboolean, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_bits_per_sample", ctypes.int, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_pixels", gobject.guchar.ptr, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_width", ctypes.int, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_height", ctypes.int, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_rowstride", ctypes.int, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_byte_length", gobject.gsize, this.GdkPixbuf.ptr);
-  lib.lazy_bind("gdk_pixbuf_copy", this.GdkPixbuf.ptr, this.GdkPixbuf.ptr);
-
-  lib.lazy_bind("gdk_screen_get_system_colormap", this.GdkColormap.ptr, this.GdkScreen.ptr);
-  lib.lazy_bind("gdk_colormap_get_visual", this.GdkVisual.ptr, this.GdkColormap.ptr);
-  lib.lazy_bind("gdk_color_parse", gobject.gboolean, gobject.gchar.ptr, this.GdkColor.ptr);
-  lib.lazy_bind("gdk_colormap_alloc_color", gobject.gboolean, this.GdkColormap.ptr, this.GdkColor.ptr, gobject.gboolean, gobject.gboolean);
-  lib.lazy_bind("gdk_pixmap_new", this.GdkPixmap.ptr, this.GdkDrawable.ptr, gobject.gint, gobject.gint, gobject.gint);
-
-  // DEPRECATED
-  // lib.lazy_bind("gdk_gc_new", this.GdkGC.ptr, this.GdkDrawable.ptr);
-  // lib.lazy_bind("gdk_gc_set_foreground", ctypes.void_t, this.GdkGC.ptr, this.GdkColor.ptr);
-  // lib.lazy_bind("gdk_draw_rectangle", ctypes.void_t, this.GdkDrawable.ptr, this.GdkGC.ptr, gobject.gboolean, gobject.gint, gobject.gint, gobject.gint, gobject.gint);
-
-  lib.lazy_bind("gdk_cairo_create", cairo.cairo_t.ptr, this.GdkDrawable.ptr);
-  lib.lazy_bind("gdk_cairo_set_source_color", ctypes.void_t, cairo.cairo_t.ptr, this.GdkColor.ptr);
-  lib.lazy_bind("gdk_pixbuf_get_from_drawable", this.GdkPixbuf.ptr, this.GdkPixbuf.ptr, this.GdkDrawable.ptr, this.GdkColormap.ptr, ctypes.int, ctypes.int, ctypes.int, ctypes.int, ctypes.int, ctypes.int);
-  lib.lazy_bind("gdk_pixbuf_add_alpha", this.GdkPixbuf.ptr, this.GdkPixbuf.ptr, gobject.gboolean, gobject.guchar, gobject.guchar, gobject.guchar);
-  lib.lazy_bind("gdk_pixbuf_composite", ctypes.void_t, this.GdkPixbuf.ptr, this.GdkPixbuf.ptr, ctypes.int, ctypes.int, ctypes.int, ctypes.int, ctypes.double, ctypes.double, ctypes.double, ctypes.double, this.GdkInterpType, ctypes.int);
-
-  lib.lazy_bind("gdk_window_stick", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_iconify", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_deiconify", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_set_title", ctypes.void_t, this.GdkWindow.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gdk_window_beep", ctypes.void_t, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_get_width", ctypes.int, this.GdkWindow.ptr);
-
-  lib.lazy_bind("gdk_window_get_events", this.GdkEventMask, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_set_events", ctypes.void_t, this.GdkWindow.ptr, this.GdkEventMask);
-  lib.lazy_bind("gdk_window_add_filter", ctypes.void_t, this.GdkWindow.ptr, this.GdkFilterFunc, gobject.gpointer);
-  lib.lazy_bind("gdk_window_remove_filter", ctypes.void_t, this.GdkWindow.ptr, this.GdkFilterFunc, gobject.gpointer);
-  lib.lazy_bind("gdk_display_get_default", this.GdkDisplay.ptr);
-  lib.lazy_bind("gdk_x11_display_get_xdisplay", x11.Display.ptr, this.GdkDisplay.ptr);
-  lib.lazy_bind("gdk_window_get_state", this.GdkWindowState, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_get_position", ctypes.void_t, this.GdkWindow.ptr, gobject.gint.ptr, gobject.gint.ptr);
-  lib.lazy_bind("gdk_drawable_get_size", ctypes.void_t, this.GdkDrawable.ptr, gobject.gint.ptr, gobject.gint.ptr);
-  // lib.lazy_bind("gdk_window_get_geometry", ctypes.void_t, this.GdkWindow.ptr, gobject.gint.ptr, gobject.gint.ptr, gobject.gint.ptr, gobject.gint.ptr, gobject.gint.ptr);
-  lib.lazy_bind("gdk_window_move_resize", ctypes.void_t, this.GdkWindow.ptr, gobject.gint, gobject.gint, gobject.gint, gobject.gint);
-  lib.lazy_bind("gdk_window_get_user_data", ctypes.void_t, this.GdkWindow.ptr, gobject.gpointer.ptr);
-  lib.lazy_bind("gdk_atom_intern", this.GdkAtom, gobject.gchar.ptr, gobject.gboolean);
-  lib.lazy_bind("gdk_property_change", ctypes.void_t, this.GdkWindow.ptr, this.GdkAtom, this.GdkAtom, gobject.gint, this.GdkPropMode, gobject.guchar.ptr, gobject.gint);
-  lib.lazy_bind("gdk_window_get_toplevel", this.GdkWindow.ptr, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_window_get_effective_toplevel", this.GdkWindow.ptr, this.GdkWindow.ptr);
-  lib.lazy_bind("gdk_screen_get_active_window", this.GdkWindow.ptr, this.GdkScreen.ptr);
-
-  lib.lazy_bind("gdk_display_get_n_screens", gobject.gint, this.GdkDisplay.ptr);
-  lib.lazy_bind("gdk_display_get_screen", this.GdkScreen.ptr, this.GdkDisplay.ptr, gobject.gint);
-}
-
-new ctypes_library(GDK_LIBNAME, GDK_ABIS, gdk_defines, this);
diff --git a/src/modules/ctypes/freebsd/gio.jsm b/src/modules/ctypes/freebsd/gio.jsm
deleted file mode 100644
index ccd7e2d..0000000
--- a/src/modules/ctypes/freebsd/gio.jsm
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "gio" ];
-
-const GIO_LIBNAME = "gio-2.0";
-const GIO_ABIS    = [ "0" ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/glib.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-
-function gio_defines(lib) {
-  this.GIcon = ctypes.StructType("GIcon");
-  this.GThemedIcon = ctypes.StructType("GThemedIcon");
-
-  lib.lazy_bind("g_themed_icon_new", this.GIcon.ptr, ctypes.char.ptr);
-  lib.lazy_bind("g_themed_icon_new_from_names", this.GIcon.ptr, ctypes.char.ptr.ptr, ctypes.int);
-  lib.lazy_bind("g_themed_icon_get_names", gobject.gchar.ptr.ptr, this.GThemedIcon.ptr);
-
-  this.GBusType = ctypes.int; // enum
-  this.G_BUS_TYPE_STARTER = -1;
-  this.G_BUS_TYPE_NONE    = 0;
-  this.G_BUS_TYPE_SYSTEM  = 1;
-  this.G_BUS_TYPE_SESSION = 2;
-  this.GDBusProxyFlags = ctypes.int; // enum
-  this.G_DBUS_PROXY_FLAGS_NONE                   = 0;
-  this.G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES = (1<<0);
-  this.G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS = (1<<1);
-  this.G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START      = (1<<2);
-
-  this.GDBusConnection = ctypes.StructType("GDBusConnection");
-  this.GCancellable = ctypes.StructType("GCancellable");
-  this.GDBusProxy = ctypes.StructType("GDBusProxy");
-  this.GDBusInterfaceInfo = ctypes.StructType("GDBusInterfaceInfo");
-
-  lib.lazy_bind("g_bus_get_sync", this.GDBusConnection.ptr, this.GBusType, this.GCancellable.ptr, glib.GError.ptr.ptr);
-  lib.lazy_bind("g_dbus_proxy_new_for_bus_sync", this.GDBusProxy.ptr, this.GBusType, this.GDBusProxyFlags, this.GDBusInterfaceInfo.ptr, gobject.gchar.ptr, gobject.gchar.ptr, gobject.gchar.ptr, this.GCancellable.ptr, glib.GError.ptr.ptr);
-  lib.lazy_bind("g_dbus_proxy_get_name_owner", gobject.gchar.ptr, this.GDBusProxy.ptr);
-}
-
-new ctypes_library(GIO_LIBNAME, GIO_ABIS, gio_defines, this);
diff --git a/src/modules/ctypes/freebsd/glib.jsm b/src/modules/ctypes/freebsd/glib.jsm
deleted file mode 100644
index 963bd5b..0000000
--- a/src/modules/ctypes/freebsd/glib.jsm
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "glib" ];
-
-const GLIB_LIBNAME = "glib-2.0";
-const GLIB_ABIS    = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-
-function glib_defines(lib) {
-  /* mutual inclusion not possible */
-  this.GQuark = ctypes.uint32_t; // this.GQuark = gobject.guint32;
-  this.GError = ctypes.StructType("GError", [
-    { domain: this.GQuark },
-    { code: ctypes.int },        // gint
-    { message: ctypes.char.ptr } // gchar.ptr
-  ]);
-  lib.lazy_bind("g_error_free", ctypes.void_t, this.GError.ptr);
-  lib.lazy_bind("g_strfreev", ctypes.void_t, ctypes.char.ptr.ptr);
-};
-
-new ctypes_library(GLIB_LIBNAME, GLIB_ABIS, glib_defines, this);
diff --git a/src/modules/ctypes/freebsd/gobject.jsm b/src/modules/ctypes/freebsd/gobject.jsm
deleted file mode 100644
index cf95946..0000000
--- a/src/modules/ctypes/freebsd/gobject.jsm
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- *	 Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Firetray
- *
- * The Initial Developer of the Original Code is
- * Mozilla Messaging, Ltd.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *    Mike Conley <mconley at mozillamessaging.com>
- *    Foudil Brétel <foudil.newbie+amo at gmail.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-var EXPORTED_SYMBOLS = [ "gobject", "glib" ];
-
-const GOBJECT_LIBNAME = "gobject-2.0";
-const GOBJECT_ABIS = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/glib.jsm");
-
-function gobject_defines(lib) {
-
-  this.GSignalMatchType = ctypes.int; // enum
-  this.G_SIGNAL_MATCH_ID            = 1 << 0;
-  this.G_SIGNAL_MATCH_DETAIL        = 1 << 1;
-  this.G_SIGNAL_MATCH_CLOSURE       = 1 << 2;
-  this.G_SIGNAL_MATCH_FUNC          = 1 << 3;
-  this.G_SIGNAL_MATCH_DATA          = 1 << 4;
-  this.G_SIGNAL_MATCH_UNBLOCKED     = 1 << 5;
-  this.gpointer = ctypes.voidptr_t;
-  this.gulong = ctypes.unsigned_long;
-  this.guint = ctypes.unsigned_int;
-  this.guint32 = ctypes.uint32_t;
-  this.guint16 = ctypes.uint16_t;
-  this.gint = ctypes.int;
-  this.gint8 = ctypes.int8_t;
-  this.gint16 = ctypes.int16_t;
-  this.gchar = ctypes.char;
-  this.guchar = ctypes.unsigned_char;
-  this.gboolean = this.gint;
-  this.FALSE = this.gboolean(0);
-  this.gfloat = ctypes.float;
-  this.gdouble = ctypes.double;
-  this.gsize = ctypes.unsigned_long;
-  this.GCallback = ctypes.voidptr_t;
-  this.GClosureNotify = this.gpointer;
-  this.GFunc = ctypes.void_t.ptr;
-  this.GList = ctypes.StructType("GList");
-  this.GConnectFlags = this.guint; // enum
-  this.G_CONNECT_AFTER   = 1 << 0;
-  this.G_CONNECT_SWAPPED = 1 << 1;
-
-  this.GType = this.gsize;
-  this.GData = ctypes.StructType("GData");
-  this._GTypeClass = ctypes.StructType("_GTypeClass", [
-    {g_type: this.GType}]);
-  this._GTypeInstance = ctypes.StructType("_GTypeInstance", [
-    {g_class: this._GTypeClass.ptr}]);
-  /* "All the fields in the GObject structure are private to the GObject
-   * implementation and should never be accessed directly." but we need to tell
-   * something about it to access GdkVisual fields */
-  this.GObject = ctypes.StructType("GObject", [
-    { g_type_instance: this._GTypeInstance },
-    { ref_count: this.guint },
-    { qdata: this.GData.ptr },
-  ]);
-  this.GClosure = ctypes.StructType("GClosure", [
-    { in_marshal: this.guint },
-    { is_invalid: this.guint },
-  ]);
-
-  /* NOTE: if we needed more/different args, we'd need to implement another
-     FunctionType */
-  this.GCallback_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t, [this.gpointer]).ptr;
-  // intended for g_list_foreach.
-  this.GFunc_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t, [this.gpointer, this.gpointer]).ptr;
-
-  lib.lazy_bind("g_object_unref", ctypes.void_t, this.gpointer);
-  lib.lazy_bind("g_signal_connect_data", this.gulong, this.gpointer, this.gchar.ptr, this.GCallback, this.gpointer, this.GClosureNotify, this.GConnectFlags);
-
-  this.g_signal_connect = function(instance, detailed_signal, handler, data) {
-    return this.g_signal_connect_data(instance, detailed_signal, handler, data, null, 0);
-  };
-  this.g_signal_connect_after = function(instance, detailed_signal, handler, data) {
-    return this.g_signal_connect_data(instance, detailed_signal, handler, data, null, this.G_CONNECT_AFTER);
-  };
-
-  lib.lazy_bind("g_free", ctypes.void_t, this.gpointer);
-  lib.lazy_bind("g_object_unref", ctypes.void_t, this.gpointer);
-  lib.lazy_bind("g_list_free", ctypes.void_t, this.GList.ptr);
-  lib.lazy_bind("g_list_length", this.guint, this.GList.ptr);
-  lib.lazy_bind("g_list_foreach", ctypes.void_t, this.GList.ptr, this.GFunc, this.gpointer);
-  lib.lazy_bind("g_signal_lookup", this.guint, this.gchar.ptr, this.GType);
-  lib.lazy_bind("g_signal_handler_find", this.gulong, this.gpointer, this.GSignalMatchType, this.guint, glib.GQuark, this.GClosure.ptr, this.gpointer, this.gpointer);
-  lib.lazy_bind("g_signal_handler_disconnect", ctypes.void_t, this.gpointer, this.gulong);
-  lib.lazy_bind("g_signal_handler_block", ctypes.void_t, this.gpointer, this.gulong);
-  lib.lazy_bind("g_signal_handler_unblock", ctypes.void_t, this.gpointer, this.gulong);
-
-  /* NOTE: we can't easily work with g_object_get_property() because it uses
-  GValue, which is an opaque struct, and thus can't be initialized by ctypes */
-  this.GValue = ctypes.StructType("GValue");
-  lib.lazy_bind("g_object_get_property", ctypes.void_t, this.GObject.ptr, this.gchar.ptr, this.GValue.ptr);
-  lib.lazy_bind("g_object_get", ctypes.void_t, this.gpointer, this.gchar.ptr, "...");
-}
-
-new ctypes_library(GOBJECT_LIBNAME, GOBJECT_ABIS, gobject_defines, this);
diff --git a/src/modules/ctypes/freebsd/gtk.jsm b/src/modules/ctypes/freebsd/gtk.jsm
deleted file mode 100644
index 267aabb..0000000
--- a/src/modules/ctypes/freebsd/gtk.jsm
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "gtk" ];
-
-const GTK_LIBNAME = "gtk-x11-2.0";
-const GTK_ABIS    = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/gdk.jsm");
-Cu.import("resource://firetray/ctypes/linux/gio.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/pango.jsm");
-
-function gtk_defines(lib) {
-  this.FIRETRAY_REQUIRED_GTK_MAJOR_VERSION = 2;
-  this.FIRETRAY_REQUIRED_GTK_MINOR_VERSION = 20;
-  this.FIRETRAY_REQUIRED_GTK_MICRO_VERSION = 0;
-
-  this.GtkIconSize = ctypes.int; // enum
-  this.GTK_ICON_SIZE_INVALID = 0;
-  this.GTK_ICON_SIZE_MENU = 1;
-  this.GTK_ICON_SIZE_SMALL_TOOLBAR = 2;
-  this.GTK_ICON_SIZE_LARGE_TOOLBAR = 3;
-  this.GTK_ICON_SIZE_BUTTON = 4;
-  this.GTK_ICON_SIZE_DND = 5;
-  this.GTK_ICON_SIZE_DIALOG = 6;
-
-  this.GTK_WINDOW_TOPLEVEL = 0; // enum GtkWindowType
-
-  this.GtkStatusIcon = ctypes.StructType("GtkStatusIcon");
-  this.GtkStyle = ctypes.StructType("GtkStyle");
-  this.GtkRequisition = ctypes.StructType("GtkRequisition", [
-    { width: gobject.gint },
-    { height: gobject.gint }
-  ]);
-  this.GtkAllocation = ctypes.StructType("GtkAllocation", [
-    { x: gobject.gint },
-    { y: gobject.gint },
-    { width: gobject.gint },
-    { height: gobject.gint }
-  ]);
-  /* NOTE: recursive struct needs define() and included structs MUST be
-   * defined ! */
-  this.GtkWidget = ctypes.StructType("GtkWidget");
-  this.GtkWidget.define([
-    { "style": this.GtkStyle.ptr },
-    { "requisition": this.GtkRequisition },
-    { "allocation": this.GtkAllocation },
-    { "window": gdk.GdkWindow.ptr },
-    { "parent": this.GtkWidget.ptr }
-  ]);
-
-  this.GtkIconTheme = ctypes.StructType("GtkIconTheme");
-  this.GtkMenu = ctypes.StructType("GtkMenu");
-  // use ctypes.cast(menu, LibGtkStatusIcon.GtkMenuShell.ptr);
-  this.GtkMenuShell = ctypes.StructType("GtkMenuShell");
-  this.GtkMenuItem = ctypes.StructType("GtkMenuItem");
-  this.GtkImageMenuItem = ctypes.StructType("GtkImageMenuItem");
-  this.GtkWindow = ctypes.StructType("GtkWindow");
-  this.GtkWindowType = ctypes.int; // enum
-  this.GtkSeparatorMenuItem = ctypes.StructType("GtkSeparatorMenuItem");
-  this.GtkIconInfo = ctypes.StructType("GtkIconInfo");
-  this.GtkIconLookupFlags = ctypes.int; // enum
-  this.GTK_ICON_LOOKUP_NO_SVG           = 1 << 0;
-  this.GTK_ICON_LOOKUP_FORCE_SVG        = 1 << 1;
-  this.GTK_ICON_LOOKUP_USE_BUILTIN      = 1 << 2;
-  this.GTK_ICON_LOOKUP_GENERIC_FALLBACK = 1 << 3;
-  this.GTK_ICON_LOOKUP_FORCE_SIZE       = 1 << 4;
-
-  this.GtkMenuPositionFunc_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t,
-    [this.GtkMenu.ptr, gobject.gint.ptr, gobject.gint.ptr,
-     gobject.gboolean.ptr, gobject.gpointer]).ptr;
-  this.GCallbackStatusIconActivate_t = ctypes.FunctionType(
-    ctypes.default_abi, gobject.gboolean,
-    [this.GtkStatusIcon.ptr, gobject.gpointer]).ptr;
-  this.GCallbackMenuPopup_t = ctypes.FunctionType(
-    ctypes.default_abi, ctypes.void_t,
-    [this.GtkStatusIcon.ptr, gobject.guint, gobject.guint,
-     gobject.gpointer]).ptr;
-  this.GCallbackOnScroll_t = ctypes.FunctionType(
-    ctypes.default_abi, gobject.gboolean,
-    [this.GtkStatusIcon.ptr, gdk.GdkEvent.ptr, gobject.gpointer]).ptr;
-  this.GCallbackStatusIconMiddleClick_t = this.GCallbackOnScroll_t;
-  this.GCallbackGenericEvent_t = ctypes.FunctionType(
-    ctypes.default_abi, gobject.gboolean,
-    [this.GtkWidget.ptr, gdk.GdkEvent.ptr, gobject.gpointer]).ptr;
-  this.GCallbackWindowStateEvent_t = ctypes.FunctionType(
-    ctypes.default_abi, gobject.gboolean,
-    [this.GtkWidget.ptr, gdk.GdkEventWindowState.ptr, gobject.gpointer]).ptr;
-  this.GCallbackWidgetFocusEvent_t = ctypes.FunctionType(
-    ctypes.default_abi, gobject.gboolean,
-    [this.GtkWidget.ptr, gdk.GdkEventFocus.ptr, gobject.gpointer]).ptr;
-
-  lib.lazy_bind("gtk_check_version", gobject.gchar.ptr, gobject.guint, gobject.guint, gobject.guint);
-
-  lib.lazy_bind("gtk_icon_theme_get_default", this.GtkIconTheme.ptr);
-  lib.lazy_bind("gtk_icon_theme_get_for_screen", this.GtkIconTheme.ptr, gdk.GdkScreen.ptr);
-  lib.lazy_bind("gtk_icon_theme_get_search_path", ctypes.void_t, this.GtkIconTheme.ptr, gobject.gchar.ptr.ptr.array(), gobject.gint.ptr);
-  lib.lazy_bind("gtk_icon_theme_append_search_path", ctypes.void_t, this.GtkIconTheme.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_icon_theme_prepend_search_path", ctypes.void_t, this.GtkIconTheme.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_icon_theme_choose_icon", this.GtkIconInfo.ptr, this.GtkIconTheme.ptr, gobject.gchar.ptr.array(), gobject.gint, this.GtkIconLookupFlags);
-  lib.lazy_bind("gtk_icon_info_load_icon", gdk.GdkPixbuf.ptr, this.GtkIconInfo.ptr, glib.GError.ptr.ptr);
-  lib.lazy_bind("gtk_icon_info_free", ctypes.void_t, this.GtkIconInfo.ptr);
-
-  lib.lazy_bind("gtk_status_icon_new", this.GtkStatusIcon.ptr);
-  lib.lazy_bind("gtk_status_icon_set_from_file", ctypes.void_t, this.GtkStatusIcon.ptr, ctypes.char.ptr);
-  lib.lazy_bind("gtk_status_icon_set_from_icon_name", ctypes.void_t, this.GtkStatusIcon.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_status_icon_set_from_gicon", ctypes.void_t, this.GtkStatusIcon.ptr, gio.GIcon.ptr);
-  lib.lazy_bind("gtk_status_icon_set_tooltip_text", ctypes.void_t, this.GtkStatusIcon.ptr, ctypes.char.ptr);
-  lib.lazy_bind("gtk_status_icon_set_blinking", ctypes.void_t, this.GtkStatusIcon.ptr, gobject.gboolean); // deprecated in gtk3
-  lib.lazy_bind("gtk_status_icon_set_visible", ctypes.void_t, this.GtkStatusIcon.ptr, gobject.gboolean);
-  lib.lazy_bind("gtk_menu_new", this.GtkMenu.ptr);
-  lib.lazy_bind("gtk_menu_item_set_label", ctypes.void_t, this.GtkMenuItem.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_image_menu_item_new", this.GtkImageMenuItem.ptr);
-  lib.lazy_bind("gtk_image_menu_item_new_with_label", this.GtkImageMenuItem.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_image_new_from_stock", this.GtkWidget.ptr, gobject.gchar.ptr, ctypes.int); // enum
-  lib.lazy_bind("gtk_image_menu_item_set_image", ctypes.void_t, this.GtkImageMenuItem.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_menu_shell_append", ctypes.void_t, this.GtkMenuShell.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_menu_shell_prepend", ctypes.void_t, this.GtkMenuShell.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_menu_shell_insert", ctypes.void_t, this.GtkMenuShell.ptr, this.GtkWidget.ptr, gobject.gint);
-  lib.lazy_bind("gtk_menu_popup", ctypes.void_t, this.GtkMenu.ptr, this.GtkWidget.ptr, this.GtkWidget.ptr, this.GtkMenuPositionFunc_t, gobject.gpointer, gobject.guint, gobject.guint);
-  lib.lazy_bind("gtk_status_icon_position_menu", ctypes.void_t, this.GtkMenu.ptr, gobject.gint.ptr, gobject.gint.ptr, gobject.gboolean.ptr, gobject.gpointer);
-  lib.lazy_bind("gtk_separator_menu_item_new", this.GtkWidget.ptr);
-
-  lib.lazy_bind("gtk_window_new", this.GtkWidget.ptr, this.GtkWindowType);
-  lib.lazy_bind("gtk_widget_create_pango_layout", pango.PangoLayout.ptr, this.GtkWidget.ptr, gobject.gchar.ptr);
-  lib.lazy_bind("gtk_widget_destroy", ctypes.void_t, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_status_icon_set_from_pixbuf", ctypes.void_t, this.GtkStatusIcon.ptr, gdk.GdkPixbuf.ptr);
-  lib.lazy_bind("gtk_status_icon_get_pixbuf", gdk.GdkPixbuf.ptr, this.GtkStatusIcon.ptr);
-  lib.lazy_bind("gtk_status_icon_get_gicon", gio.GIcon.ptr, this.GtkStatusIcon.ptr);
-  lib.lazy_bind("gtk_status_icon_get_storage_type", ctypes.int, this.GtkStatusIcon.ptr); // TEST
-  lib.lazy_bind("gtk_window_list_toplevels", gobject.GList.ptr);
-  lib.lazy_bind("gtk_window_get_title", gobject.gchar.ptr, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_is_active", gobject.gboolean, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_has_toplevel_focus", gobject.gboolean, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_widget_get_has_window", gobject.gboolean, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_get_window", gdk.GdkWindow.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_get_parent_window", gdk.GdkWindow.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_window_set_decorated", ctypes.void_t, this.GtkWindow.ptr, gobject.gboolean);
-  lib.lazy_bind("gtk_window_set_urgency_hint", ctypes.void_t, this.GtkWindow.ptr, gobject.gboolean);
-
-  lib.lazy_bind("gtk_widget_is_focus", gobject.gboolean, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_has_focus", gobject.gboolean, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_get_visible", gobject.gboolean, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_hide_on_delete", gobject.gboolean, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_hide", ctypes.void_t, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_show", ctypes.void_t, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_show_all", ctypes.void_t, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_get_events", gobject.gint, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_get_events", gobject.gint, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_add_events", ctypes.void_t, this.GtkWidget.ptr, gobject.gint);
-  lib.lazy_bind("gtk_widget_get_toplevel", this.GtkWidget.ptr, this.GtkWidget.ptr);
-  lib.lazy_bind("gtk_widget_set_sensitive", ctypes.void_t, this.GtkWidget.ptr, gobject.gboolean);
-  lib.lazy_bind("gtk_window_get_type", gobject.GType);
-  lib.lazy_bind("gtk_window_get_position", ctypes.void_t, this.GtkWindow.ptr, gobject.gint.ptr, gobject.gint.ptr);
-  lib.lazy_bind("gtk_window_move", ctypes.void_t, this.GtkWindow.ptr, gobject.gint, gobject.gint);
-  lib.lazy_bind("gtk_window_get_size", ctypes.void_t, this.GtkWindow.ptr, gobject.gint.ptr, gobject.gint.ptr);
-  lib.lazy_bind("gtk_window_resize", ctypes.void_t, this.GtkWindow.ptr, gobject.gint, gobject.gint);
-  lib.lazy_bind("gtk_window_iconify", ctypes.void_t, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_deiconify", ctypes.void_t, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_stick", ctypes.void_t, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_maximize", ctypes.void_t, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_fullscreen", ctypes.void_t, this.GtkWindow.ptr);
-  lib.lazy_bind("gtk_window_present", ctypes.void_t, this.GtkWindow.ptr);
-
-}
-
-new ctypes_library(GTK_LIBNAME, GTK_ABIS, gtk_defines, this);
diff --git a/src/modules/ctypes/freebsd/libc.jsm b/src/modules/ctypes/freebsd/libc.jsm
deleted file mode 100644
index a50c37a..0000000
--- a/src/modules/ctypes/freebsd/libc.jsm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "libc" ];
-
-const LIBC_LIBNAME = "c";
-const LIBC_ABIS    = [ 6 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-
-function libc_defines(lib) {
-  this.FILE = ctypes.StructType("FILE");
-  // this.stderr = this.fdopen(2, "a");
-  this.pid_t = ctypes.int;
-
-  lib.lazy_bind("fdopen", this.FILE.ptr, ctypes.int, ctypes.char.ptr);
-  lib.lazy_bind("puts", ctypes.int32_t, ctypes.char.ptr);
-  lib.lazy_bind("fputs", ctypes.int32_t, ctypes.char.ptr, this.FILE.ptr);
-  lib.lazy_bind("fflush", ctypes.int32_t, this.FILE.ptr);
-  lib.lazy_bind("getpid", this.pid_t);
-  lib.lazy_bind("strcmp", ctypes.int, ctypes.char.ptr, ctypes.char.ptr);
-  lib.lazy_bind("popen", this.FILE.ptr, ctypes.char.ptr, ctypes.char.ptr);
-  lib.lazy_bind("pclose", ctypes.int, this.FILE.ptr);
-  lib.lazy_bind("fread", ctypes.size_t, ctypes.voidptr_t, ctypes.size_t, ctypes.size_t, this.FILE.ptr);
-};
-
-var libc = new ctypes_library(LIBC_LIBNAME, LIBC_ABIS, libc_defines, this);
diff --git a/src/modules/ctypes/freebsd/pango.jsm b/src/modules/ctypes/freebsd/pango.jsm
deleted file mode 100644
index a19a755..0000000
--- a/src/modules/ctypes/freebsd/pango.jsm
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "pango", "pangocairo" ];
-
-const PANGO_LIBNAME = "pango-1.0";
-const PANGO_ABIS    = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/cairo.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-
-function pango_defines(lib) {
-  this.PANGO_WEIGHT_THIN       = 100;
-  this.PANGO_WEIGHT_ULTRALIGHT = 200;
-  this.PANGO_WEIGHT_LIGHT      = 300;
-  this.PANGO_WEIGHT_BOOK       = 380;
-  this.PANGO_WEIGHT_NORMAL     = 400;
-  this.PANGO_WEIGHT_MEDIUM     = 500;
-  this.PANGO_WEIGHT_SEMIBOLD   = 600;
-  this.PANGO_WEIGHT_BOLD       = 700;
-  this.PANGO_WEIGHT_ULTRABOLD  = 800;
-  this.PANGO_WEIGHT_HEAVY      = 900;
-  this.PANGO_WEIGHT_ULTRAHEAVY = 1000;
-  this.PANGO_SCALE = 1024;
-
-  this.PangoFontDescription = ctypes.StructType("PangoFontDescription");
-  this.PangoLayout = ctypes.StructType("PangoLayout");
-  this.PangoWeight = ctypes.int; // enum
-
-  lib.lazy_bind("pango_font_description_from_string", this.PangoFontDescription.ptr, ctypes.char.ptr);
-  lib.lazy_bind("pango_font_description_set_weight", ctypes.void_t, this.PangoFontDescription.ptr, this.PangoWeight);
-  lib.lazy_bind("pango_layout_set_spacing", ctypes.void_t, this.PangoLayout.ptr, ctypes.int);
-  lib.lazy_bind("pango_layout_set_font_description", ctypes.void_t, this.PangoLayout.ptr, this.PangoFontDescription.ptr);
-  lib.lazy_bind("pango_layout_set_text", ctypes.void_t, this.PangoLayout.ptr, ctypes.char.ptr, ctypes.int);
-  lib.lazy_bind("pango_layout_get_pixel_size", ctypes.void_t, this.PangoLayout.ptr, ctypes.int.ptr, ctypes.int.ptr);
-  lib.lazy_bind("pango_font_description_get_size", gobject.gint, this.PangoFontDescription.ptr);
-  lib.lazy_bind("pango_font_description_set_size", ctypes.void_t, this.PangoFontDescription.ptr, gobject.gint);
-  lib.lazy_bind("pango_font_description_free", ctypes.void_t, this.PangoFontDescription.ptr);
-
-}
-
-new ctypes_library(PANGO_LIBNAME, PANGO_ABIS, pango_defines, this);
diff --git a/src/modules/ctypes/freebsd/pangocairo.jsm b/src/modules/ctypes/freebsd/pangocairo.jsm
deleted file mode 100644
index e763951..0000000
--- a/src/modules/ctypes/freebsd/pangocairo.jsm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "pangocairo" ];
-
-const PANGOCAIRO_LIBNAME = "pangocairo-1.0";
-const PANGOCAIRO_ABIS    = [ 0 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/linux/cairo.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/pango.jsm");
-
-function pangocairo_defines(lib) {
-  lib.lazy_bind("pango_cairo_show_layout", ctypes.void_t, cairo.cairo_t.ptr, pango.PangoLayout.ptr);
-}
-
-new ctypes_library(PANGOCAIRO_LIBNAME, PANGOCAIRO_ABIS, pangocairo_defines, this);
diff --git a/src/modules/ctypes/freebsd/x11.jsm b/src/modules/ctypes/freebsd/x11.jsm
deleted file mode 100644
index 2895f45..0000000
--- a/src/modules/ctypes/freebsd/x11.jsm
+++ /dev/null
@@ -1,255 +0,0 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [
-  "x11",
-  "XATOMS", "XATOMS_ICCCM", "XATOMS_EWMH_GENERAL", "XATOMS_EWMH_WM_STATES",
-  "XPROP_MAX_COUNT", "XPROP_BASE_TYPE", "XPROP_BASE_TYPE_LONG_PROPORTION"
-];
-
-const X11_LIBNAME = "X11";
-const X11_ABIS    = [ 6 ];
-
-const Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-
-const XATOMS_ICCCM = [ "WM_DELETE_WINDOW", "WM_STATE", "WM_CHANGE_STATE" ];
-const XATOMS_EWMH_GENERAL = [ "_NET_CLOSE_WINDOW", "_NET_WM_NAME",
-  "_NET_WM_VISIBLE_NAME", "_NET_WM_ICON_NAME", "_NET_WM_VISIBLE_ICON_NAME",
-  "_NET_WM_DESKTOP", "_NET_WM_WINDOW_TYPE", "_NET_WM_STATE",
-  "_NET_WM_ALLOWED_ACTIONS", "_NET_WM_STRUT", "_NET_WM_STRUT_PARTIAL",
-  "_NET_WM_ICON_GEOMETRY", "_NET_WM_ICON", "_NET_WM_PID",
-  "_NET_WM_HANDLED_ICONS", "_NET_WM_USER_TIME", "_NET_FRAME_EXTENTS"
-];
-const XATOMS_EWMH_WM_STATES =  [
-  "_NET_WM_STATE_MODAL", "_NET_WM_STATE_STICKY",
-  "_NET_WM_STATE_MAXIMIZED_VERT", "_NET_WM_STATE_MAXIMIZED_HORZ",
-  "_NET_WM_STATE_SHADED", "_NET_WM_STATE_SKIP_TASKBAR",
-  "_NET_WM_STATE_SKIP_PAGER", "_NET_WM_STATE_HIDDEN",
-  "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_BELOW",
-  "_NET_WM_STATE_DEMANDS_ATTENTION"
-];
-const XATOMS_EWMH_ROOT = [ "_NET_ACTIVE_WINDOW" ]
-const XATOMS = XATOMS_ICCCM
-  .concat(XATOMS_EWMH_WM_STATES)
-  .concat(XATOMS_EWMH_GENERAL)
-  .concat(XATOMS_EWMH_ROOT)
-  .concat(["CARDINAL"]);
-
-
-function x11_defines(lib) {
-  /* fundamental types need to be guessed :-( */
-  // http://mxr.mozilla.org/mozilla-central/source/configure.in
-  if (/^(Alpha|hppa|ia64|ppc64|s390|x86_64)-/.test(Services.appinfo.XPCOMABI)) {
-    this.CARD32 = ctypes.unsigned_int;
-    this.Atom = ctypes.unsigned_long;
-    this.Window = ctypes.unsigned_long;
-    this.Time = ctypes.unsigned_long;
-    this.XID = ctypes.unsigned_long;
-  } else {
-    this.CARD32 = ctypes.unsigned_long;
-    this.Atom = this.CARD32;
-    this.Window = this.CARD32;
-    this.Time =  this.CARD32;
-    this.XID =  this.CARD32;
-  }
-
-  // X.h
-  this.Success          = 0;
-  this.None             = 0;
-  this.AnyPropertyType  = 0;
-  this.BadValue         = 2;
-  this.BadWindow        = 3;
-  this.BadAtom          = 5;
-  this.BadMatch         = 8;
-  this.BadAlloc         = 11;
-  this.PropertyNewValue = 0;
-  this.PropertyDelete   = 1;
-  this.PropModeReplace  = 0;
-  this.PropModePrepend  = 1;
-  this.PropModeAppend   = 2;
-  // Event names
-  this.KeyPress         = 2;
-  this.KeyRelease       = 3;
-  this.ButtonPress      = 4;
-  this.ButtonRelease    = 5;
-  this.MotionNotify     = 6;
-  this.EnterNotify      = 7;
-  this.LeaveNotify      = 8;
-  this.FocusIn          = 9;
-  this.FocusOut         = 10;
-  this.KeymapNotify     = 11;
-  this.Expose           = 12;
-  this.GraphicsExpose   = 13;
-  this.NoExpose         = 14;
-  this.VisibilityNotify = 15;
-  this.CreateNotify     = 16;
-  this.DestroyNotify    = 17;
-  this.UnmapNotify      = 18;
-  this.MapNotify        = 19;
-  this.MapRequest       = 20;
-  this.ReparentNotify   = 21;
-  this.ConfigureNotify  = 22;
-  this.ConfigureRequest = 23;
-  this.GravityNotify    = 24;
-  this.ResizeRequest    = 25;
-  this.CirculateNotify  = 26;
-  this.CirculateRequest = 27;
-  this.PropertyNotify   = 28;
-  this.SelectionClear   = 29;
-  this.SelectionRequest = 30;
-  this.SelectionNotify  = 31;
-  this.ColormapNotify   = 32;
-  this.ClientMessage    = 33;
-  this.MappingNotify    = 34;
-  this.GenericEvent     = 35;
-  this.LASTEvent        = 36; /* must be bigger than any event # */
-  // Xutils.h: definitions for initial window state
-  this.WithdrawnState = 0;      /* for windows that are not mapped */
-  this.NormalState    = 1;      /* most applications want to start this way */
-  this.IconicState    = 3;      /* application wants to start as an icon */
-  // Xatom
-  this.XA_ATOM     = 4;
-  this.XA_CARDINAL = 6;
-  // Input Event Masks
-  this.VisibilityChangeMask     = 1<<16
-  this.StructureNotifyMask      = 1<<17
-  this.SubstructureNotifyMask   = 1<<19;
-  this.SubstructureRedirectMask = 1<<20;
-  this.FocusChangeMask          = 1<<21
-  this.PropertyChangeMask       = 1<<22
-
-  this.Bool = ctypes.int;
-  this.Status = ctypes.int;
-  this.Pixmap = this.XID;
-  this.Cursor = this.XID;
-  this.Colormap = this.XID;
-  this.GContext = this.XID;
-  this.KeySym = this.XID;
-  this.Visual = ctypes.StructType("Visual");
-  this.Screen = ctypes.StructType("Screen");
-  this.Display = ctypes.StructType("Display");
-  // union not supported by js-ctypes
-  // https://bugzilla.mozilla.org/show_bug.cgi?id=535378 "You can always
-  // typecast pointers, at least as long as you know which type is the biggest"
-  this.XEvent = ctypes.void_t;  // union
-  this.XAnyEvent = ctypes.StructType("XAnyEvent", [
-    { "type": ctypes.int },
-    { "serial": ctypes.unsigned_long },
-    { "send_event": this.Bool },
-    { "display": this.Display.ptr },
-    { "window": this.Window }
-  ]);
-  this.XClientMessageEvent = ctypes.StructType("XClientMessageEvent", [
-    { "type": ctypes.int },
-    { "serial": ctypes.unsigned_long },
-    { "send_event": this.Bool },
-    { "display": this.Display.ptr },
-    { "window": this.Window },
-    { "message_type": this.Atom },
-    { "format": ctypes.int },
-    { "data": ctypes.long.array(5) } // actually a union char b[20]; short s[10]; long l[5];
-  ]);
-  this.XPropertyEvent = ctypes.StructType("XPropertyEvent", [
-    { "type": ctypes.int },
-    { "serial": ctypes.unsigned_long },
-    { "send_event": this.Bool },
-    { "display": this.Display.ptr },
-    { "window": this.Window },
-    { "atom": this.Atom },
-    { "time": this.Time },
-    { "state": ctypes.int }     /* NewValue or Deleted */
-  ]);
-
-  this.XWindowAttributes = ctypes.StructType("XWindowAttributes", [
-    { "x": ctypes.int },
-    { "y": ctypes.int },                        /* location of window */
-    { "width": ctypes.int },
-    { "height": ctypes.int },                   /* width and height of window */
-    { "border_width": ctypes.int },             /* border width of window */
-    { "depth": ctypes.int },                    /* depth of window */
-    { "visual": this.Visual.ptr },              /* the associated visual structure */
-    { "root": this.Window },                    /* root of screen containing window */
-    { "class": ctypes.int },                    /* InputOutput, InputOnly*/
-    { "bit_gravity": ctypes.int },              /* one of bit gravity values */
-    { "win_gravity": ctypes.int },              /* one of the window gravity values */
-    { "backing_store": ctypes.int },            /* NotUseful, WhenMapped, Always */
-    { "backing_planes": ctypes.unsigned_long }, /* planes to be preserved if possible */
-    { "backing_pixel": ctypes.unsigned_long },  /* value to be used when restoring planes */
-    { "save_under": this.Bool },                /* boolean, should bits under be saved? */
-    { "colormap": this.Colormap },              /* color map to be associated with window */
-    { "map_installed": this.Bool },             /* boolean, is color map currently installed*/
-    { "map_state": ctypes.int },                /* IsUnmapped, IsUnviewable, IsViewable */
-    { "all_event_masks": ctypes.long },         /* set of events all people have interest in*/
-    { "your_event_mask": ctypes.long },         /* my event mask */
-    { "do_not_propagate_mask": ctypes.long },   /* set of events that should not propagate */
-    { "override_redirect": this.Bool },         /* boolean value for override-redirect */
-    { "screen": this.Screen.ptr }               /* back pointer to correct screen */
-  ]);
-
-  this.XSetWindowAttributes = ctypes.StructType("XSetWindowAttributes", [
-    { "background_pixmap": this.Pixmap },         /* background or None or ParentRelative */
-    { "background_pixel": ctypes.unsigned_long },	/* background pixel */
-    { "border_pixmap": this.Pixmap },             /* border of the window */
-    { "border_pixel": ctypes.unsigned_long },     /* border pixel value */
-    { "bit_gravity": ctypes.int },                /* one of bit gravity values */
-    { "win_gravity": ctypes.int },                /* one of the window gravity values */
-    { "backing_store": ctypes.int },              /* NotUseful, WhenMapped, Always */
-    { "backing_planes": ctypes.unsigned_long },   /* planes to be preseved if possible */
-    { "backing_pixel": ctypes.unsigned_long },    /* value to use in restoring planes */
-    { "save_under": this.Bool },                  /* should bits under be saved? (popups) */
-    { "event_mask": ctypes.long },                /* set of events that should be saved */
-    { "do_not_propagate_mask": ctypes.long },     /* set of events that should not propagate */
-    { "override_redirect": this.Bool },           /* boolean value for override-redirect */
-    { "colormap": this.Colormap },                /* color map to be associated with window */
-    { "cursor": this.Cursor }                     /* cursor to be displayed (or None) */
-  ]);
-
-  lib.lazy_bind("XFree", ctypes.int, ctypes.void_t.ptr);
-  lib.lazy_bind("XInternAtom", this.Atom, this.Display.ptr, ctypes.char.ptr, this.Bool); // only_if_exsits
-  lib.lazy_bind("XGetWindowProperty", ctypes.int, this.Display.ptr, this.Window, this.Atom, ctypes.long, ctypes.long, this.Bool, this.Atom, this.Atom.ptr, ctypes.int.ptr, ctypes.unsigned_long.ptr, ctypes.unsigned_long.ptr, ctypes.unsigned_char.ptr.ptr);
-  lib.lazy_bind("XChangeProperty", ctypes.int, this.Display.ptr, this.Window, this.Atom, this.Atom, ctypes.int, ctypes.int, ctypes.unsigned_char.ptr, ctypes.int);
-  lib.lazy_bind("XDefaultRootWindow", this.Window, this.Display.ptr);
-  lib.lazy_bind("XSendEvent", this.Status, this.Display.ptr, this.Window, this.Bool, ctypes.long, this.XEvent.ptr);
-  lib.lazy_bind("XRaiseWindow", ctypes.int, this.Display.ptr, this.Window);
-  lib.lazy_bind("XGetWindowAttributes", this.Status, this.Display.ptr, this.Window, this.XWindowAttributes.ptr);
-  lib.lazy_bind("XChangeWindowAttributes", ctypes.int, this.Display.ptr, this.Window, ctypes.unsigned_long, this.XSetWindowAttributes.ptr);
-  lib.lazy_bind("XGetSelectionOwner", this.Window, this.Display.ptr, this.Atom);
-  lib.lazy_bind("XGetAtomName", ctypes.char.ptr, this.Display.ptr, this.Atom);
-  lib.lazy_bind("XOpenDisplay", this.Display.ptr, ctypes.char.ptr);
-  lib.lazy_bind("XCloseDisplay", ctypes.int, this.Display.ptr);
-}
-
-new ctypes_library(X11_LIBNAME, X11_ABIS, x11_defines, this);
-
-
-/* Xorg 1.10.4
-#if defined (_LP64) || \
-    defined(__alpha) || defined(__alpha__) || \
-    defined(__ia64__) || defined(ia64) || \
-    defined(__sparc64__) || \
-    defined(__s390x__) || \
-    (defined(__hppa__) && defined(__LP64__)) || \
-    defined(__amd64__) || defined(amd64) || \
-    defined(__powerpc64__) || \
-    (defined(sgi) && (_MIPS_SZLONG == 64))
-#define LONG64
-#endif
-
-# ifdef LONG64
-typedef unsigned long CARD64;
-typedef unsigned int CARD32;
-# else
-typedef unsigned long CARD32;
-# endif
-
-#  ifndef _XSERVER64
-typedef unsigned long Atom;
-#  else
-typedef CARD32 Atom;
-#  endif
-*/
diff --git a/src/modules/freebsd/FiretrayAppIndicator.jsm b/src/modules/freebsd/FiretrayAppIndicator.jsm
deleted file mode 100644
index b07311c..0000000
--- a/src/modules/freebsd/FiretrayAppIndicator.jsm
+++ /dev/null
@@ -1,157 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-// FIXME: can't subscribeLibsForClosing([appind3])
-// https://bugs.launchpad.net/ubuntu/+source/firefox/+bug/1393256
-Cu.import("resource://firetray/ctypes/linux/appindicator.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gobject, gtk]);
-
-let log = firetray.Logging.getLogger("firetray.AppIndicator");
-
-if ("undefined" == typeof(firetray.StatusIcon))
-  log.error("This module MUST be imported from/after FiretrayStatusIcon !");
-
-
-firetray.AppIndicator = {
-  initialized: false,
-  callbacks: {},
-  indicator: null,
-
-  init: function() {
-    this.indicator = appind3.app_indicator_new(
-      FIRETRAY_APPINDICATOR_ID,
-      firetray.StatusIcon.defaultAppIconName,
-      appind3.APP_INDICATOR_CATEGORY_COMMUNICATIONS
-    );
-    appind3.app_indicator_set_status(this.indicator,
-                                     appind3.APP_INDICATOR_STATUS_ACTIVE);
-    appind3.app_indicator_set_menu(this.indicator,
-                                   firetray.PopupMenu.menu); // mandatory
-    log.debug("indicator="+this.indicator);
-
-    this.addCallbacks();
-
-    for (let item in firetray.PopupMenu.menuItem) {
-      firetray.PopupMenu.showItem(firetray.PopupMenu.menuItem[item]);
-    }
-
-    this.attachMiddleClickCallback();
-    firetray.Handler.setIconTooltipDefault();
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    log.debug("Disabling AppIndicator");
-    gobject.g_object_unref(this.indicator);
-    this.initialized = false;
-  },
-
-  addCallbacks: function() {
-    this.callbacks.connChanged = appind3.ConnectionChangedCb_t(
-      firetray.AppIndicator.onConnectionChanged); // void return, no sentinel
-    gobject.g_signal_connect(this.indicator, "connection-changed",
-                             firetray.AppIndicator.callbacks.connChanged, null);
-
-    this.callbacks.onScroll = appind3.OnScrollCb_t(
-      firetray.AppIndicator.onScroll); // void return, no sentinel
-    gobject.g_signal_connect(this.indicator, "scroll-event",
-                             firetray.AppIndicator.callbacks.onScroll, null);
-  },
-
-  attachMiddleClickCallback: function(pref) {
-    let pref = firetray.Utils.prefService.getIntPref("middle_click");
-    if (pref === FIRETRAY_MIDDLE_CLICK_ACTIVATE_LAST) {
-      item = firetray.PopupMenu.menuItem.activateLast;
-      firetray.PopupMenu.showItem(firetray.PopupMenu.menuItem.activateLast);
-    } else if (pref === FIRETRAY_MIDDLE_CLICK_SHOW_HIDE) {
-      item = firetray.PopupMenu.menuItem.showHide;
-      firetray.PopupMenu.hideItem(firetray.PopupMenu.menuItem.activateLast);
-    } else {
-      log.error("Unknown pref value for 'middle_click': "+pref);
-      return false;
-    }
-    let menuItemShowHideWidget = ctypes.cast(item, gtk.GtkWidget.ptr);
-    appind3.app_indicator_set_secondary_activate_target(
-      this.indicator, menuItemShowHideWidget);
-    return true;
-  },
-
-  onConnectionChanged: function(indicator, connected, data) {
-    log.debug("AppIndicator connection-changed: "+connected);
-  },
-
-  // https://bugs.kde.org/show_bug.cgi?id=340978 broken under KDE4
-  onScroll: function(indicator, delta, direction, data) { // AppIndicator*, gint, GdkScrollDirection, gpointer
-    log.debug("onScroll: "+direction);
-    firetray.StatusIcon.onScroll(direction);
-  },
-
-};  // AppIndicator
-
-firetray.StatusIcon.initImpl =
-  firetray.AppIndicator.init.bind(firetray.AppIndicator);
-
-firetray.StatusIcon.shutdownImpl =
-  firetray.AppIndicator.shutdown.bind(firetray.AppIndicator);
-
-firetray.StatusIcon.middleClickActionChanged = function() {
-  log.debug("middleClickActionChanged");
-  firetray.AppIndicator.attachMiddleClickCallback();
-};
-
-
-firetray.Handler.setIconImageDefault = function() {
-  log.debug("setIconImageDefault");
-  appind3.app_indicator_set_icon(firetray.AppIndicator.indicator,
-                                 firetray.StatusIcon.defaultAppIconName);
-};
-
-firetray.Handler.setIconImageNewMail = function() {
-  log.debug("setIconImageNewMail");
-  appind3.app_indicator_set_icon(firetray.AppIndicator.indicator,
-                                 firetray.StatusIcon.defaultNewMailIconName);
-};
-
-firetray.Handler.setIconImageCustom = function(prefname) {
-  let prefCustomIconPath = firetray.Utils.prefService.getCharPref(prefname);
-  // Undocumented: ok to pass a *path* instead of an icon name! Otherwise we
-  // should be changing the default icons (which is maybe a better
-  // implementation anyway)...
-  appind3.app_indicator_set_icon(firetray.AppIndicator.indicator, prefCustomIconPath);
-};
-
-// No tooltips in AppIndicator
-// https://bugs.launchpad.net/indicator-application/+bug/527458
-firetray.Handler.setIconTooltip = function(toolTipStr) {
-  log.debug("setIconTooltip");
-  if (!firetray.AppIndicator.indicator)
-    return false;
-  firetray.PopupMenu.setItemLabel(firetray.PopupMenu.menuItem.tip,
-                                  toolTipStr);
-  return true;
-};
-
-// AppIndicator doesn't support pixbuf https://bugs.launchpad.net/bugs/812067
-firetray.Handler.setIconText = function(text, color) { };
-
-firetray.Handler.setIconVisibility = function(visible) {
-  if (!firetray.AppIndicator.indicator)
-    return false;
-
-  let status = visible ?
-        appind3.APP_INDICATOR_STATUS_ACTIVE :
-        appind3.APP_INDICATOR_STATUS_PASSIVE;
-  appind3.app_indicator_set_status(firetray.AppIndicator.indicator, status);
-  return true;
-};
diff --git a/src/modules/freebsd/FiretrayChat.jsm b/src/modules/freebsd/FiretrayChat.jsm
deleted file mode 100644
index 539500d..0000000
--- a/src/modules/freebsd/FiretrayChat.jsm
+++ /dev/null
@@ -1,332 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource:///modules/imServices.jsm");
-Cu.import("resource://firetray/commons.js");
-Cu.import("resource://firetray/linux/FiretrayChatStatusIcon.jsm");
-Cu.import("resource://firetray/linux/FiretrayWindow.jsm");
-
-let log = firetray.Logging.getLogger("firetray.Chat");
-
-firetray.Chat = {
-  initialized: false,
-  observedTopics: {},
-  convsToAcknowledge: {
-    ids: {},
-    length: function(){return Object.keys(this.ids).length;}
-  },
-
-  init: function() {
-    if (this.initialized) {
-      log.warn("Chat already initialized");
-      return true;
-    }
-    log.debug("Enabling Chat");
-
-    firetray.Utils.addObservers(firetray.Chat, [
-      // "*", // debugging
-      "account-connected", "account-disconnected", "idle-time-changed",
-      "new-directed-incoming-message", "status-changed",
-      "unread-im-count-changed", "new-text"
-    ]);
-
-    firetray.ChatStatusIcon.init();
-    if (firetray.Utils.prefService.getBoolPref("chat_icon_blink") &&
-        firetray.Chat.convsToAcknowledge.length())
-      this.startGetAttention();
-    this.updateIcon();
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    if (!this.initialized) return false;
-    log.debug("Disabling Chat");
-
-    if (firetray.Chat.convsToAcknowledge.length())
-      this.stopGetAttention();
-
-    firetray.ChatStatusIcon.shutdown();
-    firetray.Utils.removeAllObservers(firetray.Chat);
-
-    this.initialized = false;
-    return true;
-  },
-
-  // FIXME: the listener should probably attached on the conv entry in the
-  // contactlist during startGetAttentionMaybe
-  attachSelectListeners: function(win) {
-    log.debug("attachSelectListeners");
-    ["contactlistbox", "tabmail"].forEach(function(eltId) {
-      win.document.getElementById(eltId)
-        .addEventListener('select', firetray.Chat.onSelect);
-    });
-  },
-
-  detachSelectListeners: function(win) {
-    ["contactlistbox", "tabmail"].forEach(function(eltId) {
-      win.document.getElementById(eltId)
-        .removeEventListener('select', firetray.Chat.onSelect);
-    });
-  },
-
-  observe: function(subject, topic, data) {
-    log.debug("RECEIVED Chat: "+topic+" subject="+subject+" data="+data);
-    let conv = null;
-
-    switch (topic) {
-    case "account-connected":
-    case "account-disconnected":
-    case "idle-time-changed":
-    case "status-changed":
-      this.updateIcon();
-      break;
-
-    case "new-directed-incoming-message": // when PM or cited in channel
-      conv = subject.QueryInterface(Ci.prplIMessage).conversation;
-      log.debug("conversation name="+conv.name); // normalizedName shouldn't be necessary
-      this.startGetAttentionMaybe(conv);
-      break;
-
-    /* Twitter is obviously considered a chatroom, not a private
-     conversation. This is why we need to detect incoming messages and switch
-     to the conversation differently. The actual read should be caught by
-     focus-in-event and 'select' event on tabmail and contactlist */
-    case "new-text":
-      let msg = subject.QueryInterface(Ci.prplIMessage);
-      conv = msg.conversation;
-      log.debug("new-text from "+conv.title);
-      let account = conv.account.QueryInterface(Ci.imIAccount);
-      let proto = account.protocol;
-
-      log.debug("msg from "+msg.who+", alias="+msg.alias+", account.normalizedName="+account.normalizedName);
-      if (msg.who === account.normalizedName) break; // ignore msg from self
-      if (proto.normalizedName !== 'twitter') break;
-      this.startGetAttentionMaybe(conv);
-      break;
-
-    case "unread-im-count-changed":
-      log.debug("unread-im-count-changed");
-      let unreadMsgCount = data;
-      if (unreadMsgCount == 0)
-        this.stopGetAttentionMaybe(firetray.Handler.getActiveWindow());
-
-      let localizedTooltip = PluralForm.get(
-        unreadMsgCount,
-        firetray.Utils.strings.GetStringFromName("tooltip.unread_messages"))
-        .replace("#1", unreadMsgCount);
-      firetray.ChatStatusIcon.setIconTooltip(localizedTooltip);
-      break;
-
-    default:
-      log.warn("unhandled topic: "+topic);
-    }
-  },
-
-  startGetAttentionMaybe: function(conv) {
-    log.debug('startGetAttentionMaybe conv.id='+conv.id);
-
-    let convIsCurrentlyShown =
-          this.isConvCurrentlyShown(conv, firetray.Handler.getActiveWindow());
-    log.debug("convIsCurrentlyShown="+convIsCurrentlyShown);
-    if (convIsCurrentlyShown) return; // don't blink when conv tab already on top
-
-    log.debug("firetray.ChatStatusIcon.isBlinking="+firetray.ChatStatusIcon.isBlinking);
-    if (firetray.Utils.prefService.getBoolPref("chat_icon_blink") &&
-        !firetray.ChatStatusIcon.isBlinking)
-      this.startGetAttention(conv);
-
-    this.convsToAcknowledge.ids[conv.id] = conv;
-    log.debug(conv.id+' added to convsToAcknowledge, length='+this.convsToAcknowledge.length());
-  },
-
-  startGetAttention: function(conv) {
-    log.debug("startGetAttention");
-    if (conv)
-      this.setUrgencyMaybe(conv);
-
-    let blinkStyle = firetray.Utils.prefService.getIntPref("chat_icon_blink_style");
-    log.debug("chat_icon_blink_style="+blinkStyle);
-    if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL)
-      firetray.ChatStatusIcon.startBlinking();
-    else if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE)
-      firetray.ChatStatusIcon.startFading();
-    else
-      throw new Error("Undefined chat icon blink style.");
-  },
-
-  /**
-   * @param xid id of the window that MUST have initiated this event
-   */
-  stopGetAttentionMaybe: function(xid) {
-    log.debug("stopGetAttentionMaybe");
-    log.debug("convsToAcknowledgeLength="+this.convsToAcknowledge.length());
-    if (!firetray.ChatStatusIcon.isBlinking) return;
-
-    let selectedConv = this.getSelectedConv(xid);
-    if (!selectedConv) return;
-
-    for (let convId in this.convsToAcknowledge.ids) {
-      log.debug(convId+" == "+selectedConv.id);
-      if (convId == selectedConv.id) {
-        delete this.convsToAcknowledge.ids[convId];
-        break;
-      }
-    }
-
-    // don't check chat_icon_blink: stopGetAttention even if it was unset
-    log.debug("convsToAcknowledge.length()="+this.convsToAcknowledge.length());
-    if (this.convsToAcknowledge.length() === 0)
-      this.stopGetAttention(xid);
-  },
-
-  stopGetAttention: function(xid) {
-    log.debug("do stop get attention !!!");
-    if (xid)
-      firetray.ChatStatusIcon.setUrgency(xid, false);
-
-    let blinkStyle = firetray.Utils.prefService.getIntPref("chat_icon_blink_style");
-    if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL)
-      firetray.ChatStatusIcon.stopBlinking();
-    else if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE)
-      firetray.ChatStatusIcon.stopFading();
-    else
-      throw new Error("Undefined chat icon blink style.");
-  },
-
-  onSelect: function(event) {
-    log.debug("select event ! ");
-    firetray.Chat.stopGetAttentionMaybe(firetray.Handler.getActiveWindow());
-  },
-
-  isConvCurrentlyShown: function(conv, activeWin) {
-    log.debug("isConvCurrentlyShown");
-    let selectedConv = this.getSelectedConv(activeWin);
-    if (!selectedConv) return false;
-
-    log.debug("conv.title='"+conv.title+"' selectedConv.title='"+selectedConv.title+"'");
-    return (conv.id == selectedConv.id);
-  },
-
-  getSelectedConv: function(activeWin) {
-    if (!firetray.Handler.windows[activeWin]) return null;
-    log.debug("getSelectedConv *");
-
-    let activeChatTab = this.findSelectedChatTab(activeWin);
-    if (!activeChatTab) return null;
-    log.debug("getSelectedConv **");
-
-    /* for now there is only one Chat tab, so we don't need to
-     findSelectedChatTabFromTab(activeChatTab.tabNode). And, as there is only
-     one forlderPaneBox, there will also probably be only one contactlistbox
-     for all Chat tabs anyway */
-    let selectedConv = this.findSelectedConv(activeWin);
-    if (!selectedConv) return null;
-    log.debug("getSelectedConv ***");
-
-    return selectedConv;
-  },
-
-  findSelectedChatTab: function(xid) {
-    let win = firetray.Handler.windows[xid].chromeWin;
-    let tabmail = win.document.getElementById("tabmail");
-    let chatTabs = tabmail.tabModes.chat.tabs;
-    for each (let tab in chatTabs)
-      if (tab.tabNode.selected) return tab;
-    return null;
-  },
-
-  findSelectedConv: function(xid) {
-    let win = firetray.Handler.windows[xid].chromeWin;
-    let selectedItem = win.document.getElementById("contactlistbox").selectedItem;
-    if (!selectedItem || selectedItem.localName != "imconv") return null;
-    return selectedItem.conv;
-  },
-
-  /* there can potentially be multiple windows, each with a Chat tab and the
-   same conv open... so we need to handle urgency for all windows */
-  setUrgencyMaybe: function(conv) {
-    for (let xid in firetray.Handler.windows) {
-      let win = firetray.Handler.windows[xid].chromeWin;
-      let contactlist = win.document.getElementById("contactlistbox");
-      for (let i=0; i<contactlist.itemCount; ++i) {
-        let item = contactlist.getItemAtIndex(i);
-        if (item.localName !== 'imconv')
-          continue;
-        /* item.conv is only initialized if chat tab is open */
-        if (item.hasOwnProperty('conv') && item.conv.target === conv) {
-          firetray.Window.setUrgency(xid, true);
-          break;
-        }
-      }
-    }
-  },
-
-  updateIcon: function() {
-    let globalConnectedStatus = this.globalConnectedStatus();
-    let userStatus;
-    if (globalConnectedStatus)
-      userStatus = Services.core.globalUserStatus.statusType;
-    else
-      userStatus = Ci.imIStatusInfo.STATUS_OFFLINE;
-    log.debug("IM status="+userStatus);
-
-    let iconName;
-    switch (userStatus) {
-    case Ci.imIStatusInfo.STATUS_OFFLINE:     // 1
-      iconName = FIRETRAY_IM_STATUS_OFFLINE;
-      break;
-    case Ci.imIStatusInfo.STATUS_IDLE:        // 4
-    case Ci.imIStatusInfo.STATUS_AWAY:        // 5
-      iconName = FIRETRAY_IM_STATUS_AWAY;
-      break;
-    case Ci.imIStatusInfo.STATUS_AVAILABLE:   // 7
-      iconName = FIRETRAY_IM_STATUS_AVAILABLE;
-      break;
-    case Ci.imIStatusInfo.STATUS_UNAVAILABLE: // 6
-      iconName = FIRETRAY_IM_STATUS_BUSY;
-      break;
-    case Ci.imIStatusInfo.STATUS_UNKNOWN:     // 0
-    case Ci.imIStatusInfo.STATUS_INVISIBLE:   // 2
-    case Ci.imIStatusInfo.STATUS_MOBILE:      // 3
-    default:                                  // ignore
-    }
-
-    log.debug("IM status changed="+iconName);
-    if (iconName)
-      firetray.ChatStatusIcon.setIconImage(iconName);
-  },
-
-  globalConnectedStatus: function() {
-    /* Because we may already be connected during init (for ex. when toggling
-     the chat_icon_enable pref), we need to updateIcon() during init(). But IM
-     accounts' list is not initialized at early stage... */
-    try {
-
-      let accounts = Services.accounts.getAccounts();
-      let globalConnected = false;
-
-      while (accounts.hasMoreElements()) {
-        let account = accounts.getNext().QueryInterface(Ci.imIAccount);
-        log.debug("account="+account+" STATUS="+account.statusInfo.statusType+" connected="+account.connected);
-        globalConnected = globalConnected || account.connected;
-      }
-      log.debug("globalConnected="+globalConnected);
-      return globalConnected;
-
-    } catch (e if e instanceof Components.Exception &&
-             e.result === Components.results.NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS &&
-             /_items is undefined/.test(e.message)) {
-      return false;             // ignore
-    } catch(e) {
-      log.error(e); return false;
-    }
-  }
-
-};
diff --git a/src/modules/freebsd/FiretrayChatStatusIcon.jsm b/src/modules/freebsd/FiretrayChatStatusIcon.jsm
deleted file mode 100644
index 17646d4..0000000
--- a/src/modules/freebsd/FiretrayChatStatusIcon.jsm
+++ /dev/null
@@ -1,301 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypesMap.jsm");
-Cu.import("resource://firetray/ctypes/linux/gdk.jsm");
-Cu.import("resource://firetray/ctypes/linux/gio.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/linux/FiretrayWindow.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gdk, gio, gobject, gtk]);
-
-if ("undefined" == typeof(firetray.Handler))
-  log.error("This module MUST be imported from/after FiretrayHandler !");
-
-let log = firetray.Logging.getLogger("firetray.ChatStatusIcon");
-
-const ALPHA_STEP                       = 5;
-const ALPHA_STEP_SLEEP_MILLISECONDS    = 10;
-const FADE_OVER_SLEEP_MILLISECONDS     = 500;
-const BLINK_TOGGLE_PERIOD_MILLISECONDS = 500;
-
-
-firetray.ChatStatusIcon = {
-  GTK_THEME_ICON_PATH: null,
-
-  initialized: false,
-  trayIcon: null,
-  appId:      (function(){return Services.appinfo.ID;})(),
-  themedIcons: (function(){let o = {};
-    o[FIRETRAY_IM_STATUS_AVAILABLE] = null;
-    o[FIRETRAY_IM_STATUS_AWAY] = null;
-    o[FIRETRAY_IM_STATUS_BUSY] = null;
-    o[FIRETRAY_IM_STATUS_OFFLINE] = null;
-    return o;
-  })(),
-  themedIconNameCurrent: null,
-  timers: {'blink': null, 'fade-step': null, 'fade-loop': null},
-  events: {},
-  generators: {},
-  pixBuffer: {},
-  get isBlinking () {return (firetray.Chat.convsToAcknowledge.length() > 0);},
-
-  init: function() {
-    if (!firetray.Handler.appHasChat) throw "ChatStatusIcon for chat app only";
-    firetray.GtkIcons.init();
-
-    this.trayIcon = gtk.gtk_status_icon_new();
-    this.loadThemedIcons();
-    this.setIconImage(this.themedIconNameCurrent || FIRETRAY_IM_STATUS_OFFLINE); // updated in Chat anyway
-    this.setIconTooltipDefault();
-    this.initTimers();
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    this.destroyTimers();
-    this.destroyIcons();
-    this.initialized = false;
-  },
-
-  loadThemedIcons: function() {
-    for (let name in this.themedIcons)
-      this.themedIcons[name] = gio.g_themed_icon_new(name);
-  },
-
-  destroyIcons: function() {
-    for (let name in this.themedIcons) {
-      let gicon = this.themedIcons[name];
-      gicon = gobject.g_object_unref(gicon);
-    }
-    gobject.g_object_unref(this.trayIcon);
-  },
-
-  setIconImageFromGIcon: function(gicon) {
-    if (!firetray.ChatStatusIcon.trayIcon || !gicon)
-      log.error("Icon missing");
-    gtk.gtk_status_icon_set_from_gicon(firetray.ChatStatusIcon.trayIcon, gicon);
-  },
-
-  setIconImage: function(name) {
-    this.themedIconNameCurrent = name;
-
-    let blinkStyle = firetray.Utils.prefService.getIntPref("chat_icon_blink_style");
-    if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE &&
-        this.isBlinking) {
-      this.events['icon-changed'] = true;
-      return;
-    }
-
-    this.setIconImageFromGIcon(this.themedIcons[name]);
-  },
-
-  setIconVoid: function() {
-    gtk.gtk_status_icon_set_from_pixbuf(this.trayIcon, null);
-  },
-
-  initTimers: function() {
-    for (let tname in this.timers)
-      this.timers[tname] = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
-  },
-
-  destroyTimers: function() {
-    for (let tname in this.timers) {
-      this.timers[tname].cancel();
-      this.timers[tname] = null;
-    }
-    this.events = {};
-  },
-
-  buildPixBuf: function() {
-    let icon_theme = gtk.gtk_icon_theme_get_for_screen(gdk.gdk_screen_get_default());
-
-    // get pixbuf
-    let arry = gobject.gchar.ptr.array()(2);
-    arry[0] = gobject.gchar.array()(firetray.ChatStatusIcon.themedIconNameCurrent);
-    arry[1] = null;
-    log.debug("icon name="+firetray.ChatStatusIcon.themedIconNameCurrent+", theme="+icon_theme+", arry="+arry);
-    let icon_info = gtk.gtk_icon_theme_choose_icon(icon_theme, arry, 22, gtk.GTK_ICON_LOOKUP_FORCE_SIZE);
-
-    // create pixbuf
-    let pixbuf = gdk.gdk_pixbuf_copy(gtk.gtk_icon_info_load_icon(icon_info, null));
-    gtk.gtk_icon_info_free(icon_info);   // gobject.g_object_unref(icon_info) in 3.8
-
-    // checks
-    if (gdk.gdk_pixbuf_get_colorspace(pixbuf) != gdk.GDK_COLORSPACE_RGB)
-      log.error("wrong colorspace for pixbuf");
-    if (gdk.gdk_pixbuf_get_bits_per_sample(pixbuf) != 8)
-      log.error("wrong bits_per_sample for pixbuf");
-    if (!gdk.gdk_pixbuf_get_has_alpha(pixbuf))
-      log.error("pixbuf doesn't have alpha");
-    let n_channels = gdk.gdk_pixbuf_get_n_channels(pixbuf);
-    if (n_channels != 4)
-      log.error("wrong nb of channels for pixbuf");
-
-    // init transform
-    let width = gdk.gdk_pixbuf_get_width(pixbuf);
-    let height = gdk.gdk_pixbuf_get_height(pixbuf);
-    log.debug("width="+width+", height="+height);
-    let length = width*height*n_channels;
-    let pixels = ctypes.cast(gdk.gdk_pixbuf_get_pixels(pixbuf),
-                             gobject.guchar.array(length).ptr);
-    log.debug("pixels="+pixels);
-
-    // backup alpha for later fade-in
-    let buffer = new ArrayBuffer(width*height);
-    let alpha_bak = new Uint8Array(buffer);
-    for (let i=3; i<length; i+=n_channels)
-      alpha_bak[(i-3)/n_channels] = pixels.contents[i];
-
-    log.debug("pixbuf created");
-    this.pixBuffer = {
-      pixbuf: pixbuf,           // TO BE UNREFED WITH to g_object_unref() !!
-      width: width,
-      height: height,
-      length: length,
-      n_channels: n_channels,
-      pixels: pixels,
-      buffer: buffer,
-      alpha_bak: alpha_bak
-    };
-  },
-  dropPixBuf: function() {
-    gobject.g_object_unref(this.pixBuffer.pixbuf);
-    log.debug("pixbuf unref'd");
-    this.pixBuffer = {};
-  },
-
-  fadeGenerator: function() {
-    let pixbuf = firetray.ChatStatusIcon.pixBuffer;
-
-    for (let a=255; a>0; a-=ALPHA_STEP) {
-      for(let i=3; i<pixbuf.length; i+=pixbuf.n_channels)
-        if (pixbuf.pixels.contents[i]-ALPHA_STEP>0)
-          pixbuf.pixels.contents[i] -= ALPHA_STEP;
-      gtk.gtk_status_icon_set_from_pixbuf(firetray.ChatStatusIcon.trayIcon, pixbuf.pixbuf);
-      yield true;
-    }
-
-    for (let a=255; a>0; a-=ALPHA_STEP) {
-      for(let i=3; i<pixbuf.length; i+=pixbuf.n_channels)
-        if (pixbuf.pixels.contents[i]+ALPHA_STEP<=pixbuf.alpha_bak[(i-3)/pixbuf.n_channels]) {
-          pixbuf.pixels.contents[i] += ALPHA_STEP;
-        }
-      gtk.gtk_status_icon_set_from_pixbuf(firetray.ChatStatusIcon.trayIcon, pixbuf.pixbuf);
-      yield true;
-    }
-  },
-
-  fadeStep: function() {
-    try {
-      if (firetray.ChatStatusIcon.generators['fade'].next())
-        firetray.ChatStatusIcon.timers['fade-step'].initWithCallback(
-          { notify: firetray.ChatStatusIcon.fadeStep },
-          ALPHA_STEP_SLEEP_MILLISECONDS, Ci.nsITimer.TYPE_ONE_SHOT);
-
-    } catch (e if e instanceof StopIteration) {
-
-      if (firetray.ChatStatusIcon.events['stop-fade']) {
-        log.debug("stop-fade");
-        delete firetray.ChatStatusIcon.events['stop-fade'];
-        delete firetray.ChatStatusIcon.generators['fade'];
-        firetray.ChatStatusIcon.setIconImage(firetray.ChatStatusIcon.themedIconNameCurrent);
-        firetray.ChatStatusIcon.dropPixBuf();
-        return;
-      }
-
-      if (firetray.ChatStatusIcon.events['icon-changed']) {
-        delete firetray.ChatStatusIcon.events['icon-changed'];
-        firetray.ChatStatusIcon.dropPixBuf();
-        firetray.ChatStatusIcon.buildPixBuf();
-        firetray.ChatStatusIcon.timers['fade-loop'].initWithCallback(
-          { notify: firetray.ChatStatusIcon.fadeLoop },
-          FADE_OVER_SLEEP_MILLISECONDS, Ci.nsITimer.TYPE_ONE_SHOT);
-
-      } else {
-        firetray.ChatStatusIcon.timers['fade-loop'].initWithCallback(
-          { notify: firetray.ChatStatusIcon.fadeLoop },
-          FADE_OVER_SLEEP_MILLISECONDS, Ci.nsITimer.TYPE_ONE_SHOT);
-      }
-    };
-  },
-
-  fadeLoop: function() {
-    firetray.ChatStatusIcon.generators['fade'] = firetray.ChatStatusIcon.fadeGenerator();
-    firetray.ChatStatusIcon.fadeStep();
-  },
-
-  startFading: function() {
-    log.debug("startFading");
-    this.buildPixBuf();
-    this.fadeLoop();
-  },
-
-  stopFading: function() {
-    log.debug("stopFading");
-    this.events['stop-fade'] = true;
-  },
-
-  startBlinking: function() { // gtk_status_icon_set_blinking() deprecated
-    this.on = true;
-    firetray.ChatStatusIcon.timers['blink'].initWithCallback({
-      notify: function() {
-        if (firetray.ChatStatusIcon.on)
-          firetray.ChatStatusIcon.setIconVoid();
-        else
-          firetray.ChatStatusIcon.setIconImage(firetray.ChatStatusIcon.themedIconNameCurrent);
-        firetray.ChatStatusIcon.on = !firetray.ChatStatusIcon.on;
-      }
-    }, BLINK_TOGGLE_PERIOD_MILLISECONDS, Ci.nsITimer.TYPE_REPEATING_SLACK);
-  },
-
-  stopBlinking: function() {
-    log.debug("stopBlinking");
-    this.timers['blink'].cancel();
-    this.setIconImage(firetray.ChatStatusIcon.themedIconNameCurrent);
-    this.on = false;
-  },
-
-  toggleBlinkStyle: function(blinkStyle) {
-    switch (blinkStyle) {
-    case FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL:
-      this.stopFading();
-      this.startBlinking();
-      break;
-    case FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE:
-      this.stopBlinking();
-      this.startFading();
-      break;
-    default:
-      throw new Error("Undefined chat icon blink style.");
-    }
-  },
-
-  setUrgency: function(xid, urgent) {
-    gtk.gtk_window_set_urgency_hint(firetray.Handler.gtkWindows.get(xid), urgent);
-  },
-
-  setIconTooltip: function(txt) {
-    if (!this.trayIcon) return false;
-    gtk.gtk_status_icon_set_tooltip_text(this.trayIcon, txt);
-    return true;
-  },
-
-  setIconTooltipDefault: function() {
-    this.setIconTooltip(firetray.Handler.appName+" Chat");
-  }
-
-  // TODO: onclick/activate -> chatHandler.showCurrentConversation()
-
-}; // firetray.ChatStatusIcon
diff --git a/src/modules/freebsd/FiretrayGtkIcons.jsm b/src/modules/freebsd/FiretrayGtkIcons.jsm
deleted file mode 100644
index ecdd438..0000000
--- a/src/modules/freebsd/FiretrayGtkIcons.jsm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gtk]);
-
-if ("undefined" == typeof(firetray.StatusIcon))
-  log.error("This module MUST be imported from/after StatusIcon !");
-
-let log = firetray.Logging.getLogger("firetray.GtkIcons");
-
-
-firetray.GtkIcons = {
-  initialized: false,
-
-  GTK_THEME_ICON_PATH: null,
-
-  init: function() {
-    try {
-      if (this.initialized) return true;
-
-      this.appendSearchPath();
-      this.initialized = true;
-      return true;
-    } catch (x) {
-      log.error(x);
-      return false;
-    }
-  },
-
-  shutdown: function() {
-    // FIXME: XXX destroy icon here
-    this.initialized = false;
-  },
-
-  appendSearchPath: function() {
-    this.GTK_THEME_ICON_PATH = firetray.Utils.chromeToPath("chrome://firetray/skin/icons/linux");
-    log.debug(this.GTK_THEME_ICON_PATH);
-    let gtkIconTheme = gtk.gtk_icon_theme_get_default();
-    log.debug("gtkIconTheme="+gtkIconTheme);
-    gtk.gtk_icon_theme_append_search_path(gtkIconTheme, this.GTK_THEME_ICON_PATH);
-
-    if (log.level <= firetray.Logging.LogMod.Level.Debug) {
-      Cu.import("resource://firetray/ctypes/linux/glib.jsm");
-      Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-      firetray.Handler.subscribeLibsForClosing([glib, gobject]);
-      let path = new gobject.gchar.ptr.ptr;
-      let n_elements = new gobject.gint;
-      gtk.gtk_icon_theme_get_search_path(gtkIconTheme, path.address(), n_elements.address());
-      log.debug("n_elements="+n_elements+" path="+path);
-      let pathIt = path;
-      for (let i=0, len=n_elements.value; i<len || pathIt.isNull(); ++i) {
-        log.debug("path["+i+"]="+pathIt.contents.readString());
-        pathIt = pathIt.increment();
-      }
-      log.debug("path="+path+" pathIt="+pathIt);
-      glib.g_strfreev(path);
-    }
-  }
-
-};
diff --git a/src/modules/freebsd/FiretrayGtkStatusIcon.jsm b/src/modules/freebsd/FiretrayGtkStatusIcon.jsm
deleted file mode 100644
index 87ceaab..0000000
--- a/src/modules/freebsd/FiretrayGtkStatusIcon.jsm
+++ /dev/null
@@ -1,341 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/linux/cairo.jsm");
-Cu.import("resource://firetray/ctypes/linux/gdk.jsm");
-Cu.import("resource://firetray/ctypes/linux/gio.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/ctypes/linux/pango.jsm");
-Cu.import("resource://firetray/ctypes/linux/pangocairo.jsm");
-Cu.import("resource://firetray/linux/FiretrayGtkIcons.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([cairo, gdk, gio, gobject, gtk, pango,
-  pangocairo]);
-
-let log = firetray.Logging.getLogger("firetray.GtkStatusIcon");
-
-if ("undefined" == typeof(firetray.Handler))
-  log.error("This module MUST be imported from/after FiretrayStatusIcon !");
-
-
-firetray.GtkStatusIcon = {
-  MIN_FONT_SIZE: 4,
-  FILENAME_BLANK: null,
-  GTK_THEME_ICON_PATH: null,
-
-  initialized: false,
-  callbacks: {},
-  trayIcon: null,
-  themedIconApp: null,
-  themedIconNewMail: null,
-
-  init: function() {
-    this.FILENAME_BLANK = firetray.Utils.chromeToPath(
-      "chrome://firetray/skin/icons/blank-icon.png");
-
-    firetray.GtkIcons.init();
-    this.loadThemedIcons();
-
-    this.trayIcon = gtk.gtk_status_icon_new();
-    firetray.Handler.setIconImageDefault();
-    firetray.Handler.setIconTooltipDefault();
-    this.addCallbacks();
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    log.debug("Disabling GtkStatusIcon");
-    firetray.GtkIcons.shutdown();
-    // FIXME: XXX destroy icon here
-    this.initialized = false;
-  },
-
-  loadThemedIcons: function() {
-    if (firetray.Handler.inMailApp) {
-      let newMailIconNames = firetray.StatusIcon.getNewMailIconNames();
-      if (this.themedIconNewMail) gobject.g_object_unref(this.themedIconNewMail);
-      this.themedIconNewMail = this.initThemedIcon(newMailIconNames);
-    }
-    let appIconNames = firetray.StatusIcon.getAppIconNames();
-    if (this.themedIconApp) gobject.g_object_unref(this.themedIconApp);
-    this.themedIconApp = this.initThemedIcon(appIconNames);
-  },
-
-  initThemedIcon: function(names) {
-    if (!firetray.js.isArray(names)) throw new TypeError();
-    log.debug("themedIconNames="+names);
-    let namesLen = names.length;
-    log.debug("themedIconNamesLen="+namesLen);
-    let themedIconNames = ctypes.char.ptr.array(namesLen)();
-    for (let i=0; i<namesLen; ++i)
-      themedIconNames[i] = ctypes.char.array()(names[i]);
-    log.debug("themedIconNames="+themedIconNames);
-    let themedIcon = gio.g_themed_icon_new_from_names(themedIconNames, namesLen);
-    log.debug("themedIcon="+themedIcon);
-    return themedIcon;
-  },
-
-  addCallbacks: function() {
-    Cu.import("resource://firetray/linux/FiretrayPopupMenu.jsm");
-    /* NOTE: here we do use a function handler (instead of a function
-     definition) because we need the args passed to it ! As a consequence, we
-     need to abandon 'this' in PopupMenu.popup() */
-    this.callbacks.menuPopup = gtk.GCallbackMenuPopup_t(firetray.PopupMenu.popup); // void return, no sentinel
-    gobject.g_signal_connect(this.trayIcon, "popup-menu",
-      firetray.GtkStatusIcon.callbacks.menuPopup, firetray.PopupMenu.menu);
-    this.callbacks.onScroll = gtk.GCallbackOnScroll_t(
-      firetray.GtkStatusIcon.onScroll, null, FIRETRAY_CB_SENTINEL);
-    gobject.g_signal_connect(this.trayIcon, "scroll-event",
-      firetray.GtkStatusIcon.callbacks.onScroll, null);
-
-    log.debug("showHideAllWindows: "+firetray.Handler.hasOwnProperty("showHideAllWindows"));
-    this.callbacks.iconActivate = gtk.GCallbackStatusIconActivate_t(
-      firetray.GtkStatusIcon.onClick, null, FIRETRAY_CB_SENTINEL);
-    let handlerId = gobject.g_signal_connect(firetray.GtkStatusIcon.trayIcon,
-      "activate", firetray.GtkStatusIcon.callbacks.iconActivate, null);
-    log.debug("g_connect activate="+handlerId);
-
-    let pref = firetray.Utils.prefService.getIntPref("middle_click");
-    this.attachMiddleClickCallback(pref);
-  },
-
-  attachMiddleClickCallback: function(pref) {
-    log.debug("attachMiddleClickCallback pref="+pref);
-    if (pref === FIRETRAY_MIDDLE_CLICK_ACTIVATE_LAST) {
-      this.callbacks.iconMiddleClick = gtk.GCallbackStatusIconMiddleClick_t(
-        firetray.Handler.activateLastWindowCb, null, FIRETRAY_CB_SENTINEL);
-    } else if (pref === FIRETRAY_MIDDLE_CLICK_SHOW_HIDE) {
-      this.callbacks.iconMiddleClick = gtk.GCallbackStatusIconMiddleClick_t(
-        function(widget, event, data) {firetray.Handler.showHideAllWindows(); return true;},
-        null, FIRETRAY_CB_SENTINEL);
-    } else {
-      log.error("Unknown pref value for 'middle_click': "+pref);
-      return;
-    }
-    this.callbacks.iconMiddleClickId = gobject.g_signal_connect(
-      firetray.GtkStatusIcon.trayIcon,
-      "button-press-event", firetray.GtkStatusIcon.callbacks.iconMiddleClick,
-      null);
-    log.debug("g_connect middleClick="+this.callbacks.iconMiddleClickId);
-  },
-
-  detachMiddleClickCallback: function() {
-    log.debug("detachMiddleClickCallback");
-    gobject.g_signal_handler_disconnect(
-      firetray.GtkStatusIcon.trayIcon,
-      gobject.gulong(this.callbacks.iconMiddleClickId)
-    );
-    delete this.callbacks.iconMiddleClickId;
-  },
-
-  onScroll: function(icon, event, data) {
-    let gdkEventScroll = ctypes.cast(event, gdk.GdkEventScroll.ptr);
-    let direction = gdkEventScroll.contents.direction;
-
-    firetray.StatusIcon.onScroll(direction);
-
-    let stopPropagation = false;
-    return stopPropagation;
-  },
-
-  onClick: function(gtkStatusIcon, userData) {
-    firetray.Handler.showHideAllWindows();
-    let stopPropagation = true;
-    return stopPropagation;
-  },
-
-  setIconImageFromFile: function(filename) {
-    if (!firetray.GtkStatusIcon.trayIcon)
-      log.error("Icon missing");
-    log.debug(filename);
-    gtk.gtk_status_icon_set_from_file(firetray.GtkStatusIcon.trayIcon,
-                                      filename);
-  },
-
-  setIconImageFromGIcon: function(gicon) {
-    if (!firetray.GtkStatusIcon.trayIcon || !gicon)
-      log.error("Icon missing");
-    log.debug(gicon);
-    gtk.gtk_status_icon_set_from_gicon(firetray.GtkStatusIcon.trayIcon, gicon);
-  },
-
-};                              // GtkStatusIcon
-
-firetray.StatusIcon.initImpl =
-  firetray.GtkStatusIcon.init.bind(firetray.GtkStatusIcon);
-
-firetray.StatusIcon.shutdownImpl =
-  firetray.GtkStatusIcon.shutdown.bind(firetray.GtkStatusIcon);
-
-firetray.StatusIcon.middleClickActionChanged = function() {
-  log.debug("middleClickActionChanged");
-  let pref = firetray.Utils.prefService.getIntPref("middle_click");
-  firetray.GtkStatusIcon.detachMiddleClickCallback();
-  firetray.GtkStatusIcon.attachMiddleClickCallback(pref);
-};
-
-
-firetray.Handler.loadIcons = firetray.GtkStatusIcon.loadThemedIcons;
-
-firetray.Handler.setIconImageDefault = function() {
-  log.debug("setIconImageDefault");
-  if (!firetray.GtkStatusIcon.themedIconApp)
-    throw "Default application themed icon not set";
-  let appIconType = firetray.Utils.prefService.getIntPref("app_icon_type");
-  if (appIconType === FIRETRAY_APPLICATION_ICON_TYPE_THEMED) {
-    firetray.GtkStatusIcon.setIconImageFromGIcon(
-      firetray.GtkStatusIcon.themedIconApp);
-  } else if (appIconType === FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM) {
-    firetray.Handler.setIconImageCustom("app_icon_custom");
-  }
-};
-
-firetray.Handler.setIconImageNewMail = function() {
-  firetray.GtkStatusIcon.setIconImageFromGIcon(
-    firetray.GtkStatusIcon.themedIconNewMail);
-};
-
-firetray.Handler.setIconImageCustom = function(prefname) {
-  let prefCustomIconPath = firetray.Utils.prefService.getCharPref(prefname);
-  firetray.GtkStatusIcon.setIconImageFromFile(prefCustomIconPath);
-};
-
-// GTK bug: Gdk-CRITICAL **: IA__gdk_window_get_root_coords: assertion `GDK_IS_WINDOW (window)' failed
-firetray.Handler.setIconTooltip = function(toolTipStr) {
-  if (!firetray.GtkStatusIcon.trayIcon)
-    return false;
-
-  log.debug("setIconTooltip, toolTipStr="+toolTipStr);
-  try {
-    gtk.gtk_status_icon_set_tooltip_text(firetray.GtkStatusIcon.trayIcon,
-                                         toolTipStr);
-  } catch (x) {
-    log.error(x);
-    return false;
-  }
-  return true;
-};
-
-firetray.Handler.setIconText = function(text, color) { // FIXME: function too long
-  log.debug("setIconText, color="+color);
-  if (typeof(text) != "string")
-    throw new TypeError();
-
-  try {
-    // build background from image
-    let specialIcon = gdk.gdk_pixbuf_new_from_file(
-      firetray.GtkStatusIcon.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.debug("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)
-      log.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.debug("layout="+layout);
-    log.debug("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.debug("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.GtkStatusIcon.MIN_FONT_SIZE) {
-        sz = firetray.GtkStatusIcon.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.debug("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.debug("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_BILINEAR,255);
-    gobject.g_object_unref(bufAlpha);
-
-    log.debug("gtk_status_icon_set_from_pixbuf="+dest);
-    gtk.gtk_status_icon_set_from_pixbuf(firetray.GtkStatusIcon.trayIcon, dest);
-  } catch (x) {
-    log.error(x);
-    return false;
-  }
-
-  return true;
-};
-
-firetray.Handler.setIconVisibility = function(visible) {
-  if (!firetray.GtkStatusIcon.trayIcon)
-    return false;
-  gtk.gtk_status_icon_set_visible(firetray.GtkStatusIcon.trayIcon, visible);
-  return true;
-};
diff --git a/src/modules/freebsd/FiretrayPopupMenu.jsm b/src/modules/freebsd/FiretrayPopupMenu.jsm
deleted file mode 100644
index 21f0eec..0000000
--- a/src/modules/freebsd/FiretrayPopupMenu.jsm
+++ /dev/null
@@ -1,262 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gobject, gtk]);
-
-let log = firetray.Logging.getLogger("firetray.PopupMenu");
-
-if ("undefined" == typeof(firetray.StatusIcon))
-  log.error("This module MUST be imported from/after StatusIcon !");
-
-
-firetray.PopupMenu = {
-  MENU_ITEM_WINDOWS_POSITION: 4,
-
-  initialized: false,
-  callbacks: {menuItemWindowActivate: {}}, // FIXME: try to store them into a ctypes array/struct.
-  menu: null,
-  menuShell: null,
-  menuSeparatorWindows: null,
-  menuItem: {tip: null, showHide: null, activateLast: null, sep: null},
-
-  init: function() {
-    this.menu = gtk.gtk_menu_new();
-    this.menuShell = ctypes.cast(this.menu, gtk.GtkMenuShell.ptr);
-    var addMenuSeparator = false;
-
-    if (firetray.Handler.inMailApp) {
-      this.addItem({itemName:"ResetIcon", iconName:"gtk-apply",
-                    action:"activate", callback: firetray.Handler.setIconImageDefault});
-      this.addItem({itemName:"NewMessage", iconName:"gtk-edit",
-                    action:"activate", callback: firetray.Handler.openMailMessage});
-      addMenuSeparator = true;
-    }
-
-    if (firetray.Handler.inBrowserApp) {
-      this.addItem({itemName:"NewWindow", iconName:"gtk-new",
-                    action:"activate", callback: firetray.Handler.openBrowserWindow});
-      addMenuSeparator = true;
-    }
-
-    var menuSeparator;
-    if (addMenuSeparator) {
-      menuSeparator = gtk.gtk_separator_menu_item_new();
-      gtk.gtk_menu_shell_append(this.menuShell, ctypes.cast(menuSeparator,
-                                                            gtk.GtkWidget.ptr));
-    }
-
-    this.addItem({itemName:"Preferences", iconName:"gtk-preferences",
-                  action:"activate", callback: firetray.Handler.openPrefWindow});
-    menuSeparator = gtk.gtk_separator_menu_item_new();
-    gtk.gtk_menu_shell_append(this.menuShell, ctypes.cast(menuSeparator,
-                                                          gtk.GtkWidget.ptr));
-
-    this.addItem({itemName:"Quit", iconName:"gtk-quit",
-                  action:"activate", callback: firetray.Handler.quitApplication});
-
-    var menuWidget = ctypes.cast(this.menu, gtk.GtkWidget.ptr);
-    gtk.gtk_widget_show_all(menuWidget);
-
-    // for hidden windows, not shown otherwise
-    this.menuSeparatorWindows = gtk.gtk_separator_menu_item_new();
-    gtk.gtk_menu_shell_prepend(
-      this.menuShell, ctypes.cast(this.menuSeparatorWindows, gtk.GtkWidget.ptr));
-    // FIXME: we better use a submenu for this: gtk_menu_new(), gtk_menu_item_set_submenu();
-
-    // for AppIndicator, not shown otherwise
-    this.prependAppIndicatorItems();
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    log.debug("Disabling PopupMenu");
-    this.initialized = false;
-  },
-
-  addItem: function(it) {
-    var menuItemLabel = firetray.Utils.strings.GetStringFromName("popupMenu.itemLabel."+it.itemName); // shouldn't need to convert to utf8 later thank to js-ctypes
-    var menuItem = gtk.gtk_image_menu_item_new_with_label(menuItemLabel);
-    var menuItemIcon = gtk.gtk_image_new_from_stock(it.iconName, gtk.GTK_ICON_SIZE_MENU);
-    gtk.gtk_image_menu_item_set_image(menuItem, menuItemIcon);
-    var menuItemWidget = ctypes.cast(menuItem, gtk.GtkWidget.ptr);
-    if (it.inFront)
-      gtk.gtk_menu_shell_prepend(this.menuShell, menuItemWidget);
-    else
-      gtk.gtk_menu_shell_append(this.menuShell, menuItemWidget);
-
-    function capitalizeFirst(str) {
-      return str.charAt(0).toUpperCase() + str.substring(1);
-    }
-
-    let cbName = "menuItem"+capitalizeFirst(it.itemName)+capitalizeFirst(it.action);
-    if (this.callbacks.hasOwnProperty(cbName))
-      log.warn("callback '"+cbName+"' already registered");
-    else
-      log.debug("cbName="+cbName);
-    this.callbacks[cbName] = gobject.GCallback_t(it.callback); // void return, no sentinel
-    gobject.g_signal_connect(menuItem, it.action,
-                             firetray.PopupMenu.callbacks[cbName], null);
-
-    return menuItem;
-  },
-
-  prependAppIndicatorItems: function() {
-    this.menuItem.sep = gtk.gtk_separator_menu_item_new();
-    gtk.gtk_menu_shell_prepend(this.menuShell, ctypes.cast(this.menuItem.sep,
-                                                           gtk.GtkWidget.ptr));
-
-    this.menuItem.activateLast = this.addItem({
-      itemName:"ActivateLast", iconName:null, action:"activate", callback:
-      firetray.Handler.showAllWindowsAndActivate, inFront: true});
-
-    this.menuItem.showHide = this.addItem({
-      itemName:"ShowHide", iconName:"gtk-go-down", action:"activate", callback:
-      firetray.Handler.showHideAllWindows, inFront: true});
-
-    this.menuItem.tip = this.createAndAddItemToMenuAt(0);
-    gtk.gtk_widget_set_sensitive(
-      ctypes.cast(this.menuItem.tip, gtk.GtkWidget.ptr), false);
-  },
-
-  popup: function(icon, button, activateTime, menu) {
-    log.debug("menu-popup");
-    log.debug("ARGS="+icon+", "+button+", "+activateTime+", "+menu);
-
-    var gtkMenuPtr = ctypes.cast(menu, gtk.GtkMenu.ptr);
-    var iconGpointer = ctypes.cast(icon, gobject.gpointer);
-    gtk.gtk_menu_popup(
-      gtkMenuPtr, null, null, gtk.gtk_status_icon_position_menu,
-      iconGpointer, button, activateTime);
-
-    let stopPropagation = false;
-    return stopPropagation;
-  },
-
-  // we'll be creating menuItems for windows (and not showing them) even if
-  // hides_single_window is false, because if hides_single_window becomes true,
-  // we'll just have to show the menuItems
-  addWindowItem: function(xid) { // on registerWindow
-    log.debug("addWindowItem");
-    var menuItemWindow = this.createAndAddItemToMenuAt(
-      this.MENU_ITEM_WINDOWS_POSITION);
-    firetray.Handler.gtkPopupMenuWindowItems.insert(xid, menuItemWindow);
-    this.setItemLabel(menuItemWindow, xid.toString()); // default to xid
-
-    let callback = gobject.GCallback_t(
-      function(){firetray.Handler.showWindow(xid);}); // void return, no sentinel
-    this.callbacks.menuItemWindowActivate[xid] = callback,
-    gobject.g_signal_connect(menuItemWindow, "activate", callback, null);
-
-    log.debug("added gtkPopupMenuWindowItems: "+firetray.Handler.gtkPopupMenuWindowItems.count);
-  },
-
-  createAndAddItemToMenuAt: function(pos) {
-    var menuItem = gtk.gtk_image_menu_item_new();
-    gtk.gtk_menu_shell_insert(this.menuShell,
-                              ctypes.cast(menuItem, gtk.GtkWidget.ptr),
-                              pos);
-    return menuItem;
-  },
-
-  removeWindowItem: function(xid) { // on unregisterWindow
-    let menuItemWindow = firetray.Handler.gtkPopupMenuWindowItems.get(xid);
-    firetray.Handler.gtkPopupMenuWindowItems.remove(xid);
-    this.removeItem(menuItemWindow);
-    log.debug("remove gtkPopupMenuWindowItems: "+firetray.Handler.gtkPopupMenuWindowItems.count);
-  },
-  removeItem: function(item) {
-    gtk.gtk_widget_destroy(ctypes.cast(item, gtk.GtkWidget.ptr));
-  },
-
-  showAllWindowItemsOnlyVisibleWindows: function() {
-    for (let xid in firetray.Handler.windows)
-      if (!firetray.Handler.windows[xid].visible)
-        this.showWindowItem(xid);
-  },
-
-  showWindowItem: function(xid) {
-    if (!this.windowItemsHandled())
-      return;
-
-    log.debug("showWindowItem");
-    let menuItemWindow = firetray.Handler.gtkPopupMenuWindowItems.get(xid);
-    this.showItem(menuItemWindow);
-    this.setItemLabel(menuItemWindow, firetray.Window.getWindowTitle(xid));
-    this.showWindowSeparator();
-  },
-
-  showItem: function(menuItem) {
-    gtk.gtk_widget_show(ctypes.cast(menuItem, gtk.GtkWidget.ptr));
-  },
-
-  setItemLabel: function(menuItem, label) {
-    log.debug("about to set title: "+label);
-    if (label)
-      gtk.gtk_menu_item_set_label(ctypes.cast(menuItem, gtk.GtkMenuItem.ptr), label);
-  },
-
-  hideAllWindowItems: function() {
-    for (let xid in firetray.Handler.windows)
-      this.hideWindowItemAndSeparator(xid);
-  },
-
-  hideWindowItemAndSeparator: function(xid) {
-    this.hideWindowItem(xid);
-    this.hideWindowSeparator();
-  },
-
-  hideWindowItemAndSeparatorMaybe: function(xid) {
-    if (!this.windowItemsHandled()) return;
-
-    this.hideWindowItem(xid);
-    if (firetray.Handler.visibleWindowsCount === firetray.Handler.windowsCount)
-      this.hideWindowSeparator();
-  },
-
-  hideWindowItem: function(xid) {
-    log.debug("hideWindowItem");
-    let menuItemWindow = firetray.Handler.gtkPopupMenuWindowItems.get(xid);
-    this.hideItem(menuItemWindow);
-  },
-
-  hideItem: function(menuItem) {
-    gtk.gtk_widget_hide(ctypes.cast(menuItem, gtk.GtkWidget.ptr));
-  },
-
-  showWindowSeparator: function() {
-    log.debug("showing menuSeparatorWindows");
-    gtk.gtk_widget_show(ctypes.cast(this.menuSeparatorWindows, gtk.GtkWidget.ptr));
-  },
-  hideWindowSeparator: function() {
-    log.debug("hiding menuSeparatorWindows");
-    gtk.gtk_widget_hide(ctypes.cast(this.menuSeparatorWindows, gtk.GtkWidget.ptr));
-  },
-
-  showHideWindowItems: function() {
-    if (this.windowItemsHandled())
-      this.showAllWindowItemsOnlyVisibleWindows();
-    else
-      this.hideAllWindowItems();
-  },
-
-  windowItemsHandled: function() {
-    return firetray.Utils.prefService.getBoolPref('hides_single_window');
-  }
-
-}; // firetray.PopupMenu
-
-firetray.Handler.showHidePopupMenuItems =
-  firetray.PopupMenu.showHideWindowItems.bind(firetray.PopupMenu);
diff --git a/src/modules/freebsd/FiretrayStatusIcon.jsm b/src/modules/freebsd/FiretrayStatusIcon.jsm
deleted file mode 100644
index 642d478..0000000
--- a/src/modules/freebsd/FiretrayStatusIcon.jsm
+++ /dev/null
@@ -1,219 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://firetray/ctypes/linux/gdk.jsm");
-Cu.import("resource://firetray/ctypes/linux/gio.jsm");
-Cu.import("resource://firetray/ctypes/linux/glib.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/libc.jsm");
-Cu.import("resource://firetray/ctypes/linux/x11.jsm");
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gdk, gio, glib, gobject]);
-
-let log = firetray.Logging.getLogger("firetray.StatusIcon");
-
-if ("undefined" == typeof(firetray.Handler))
-  log.error("This module MUST be imported from/after FiretrayHandler !");
-
-
-firetray.StatusIcon = {
-  initialized: false,
-  callbacks: {}, // pointers to JS functions. MUST LIVE DURING ALL THE EXECUTION
-  prefAppIconNames: null,
-  prefNewMailIconNames: null,
-  defaultAppIconName: null,
-  defaultNewMailIconName: null,
-  canAppIndicator: null,
-
-  init: function() {
-    this.defineIconNames();
-
-    // PopupMenu g_connect's some Handler functions. As these are overridden is
-    // StatusIcon implementations, PopupMenu must be initialized *after*
-    // implemenations are imported.
-    Cu.import("resource://firetray/ctypes/linux/appindicator.jsm");
-    this.canAppIndicator =
-      (appind3.available() && this.dbusNotificationWatcherReady());
-    log.info("canAppIndicator="+this.canAppIndicator);
-    /* We can't reliably detect if xembed tray icons are supported, because, for
-     instance, Unity/compiz falsely claims to have support for it through
-     _NET_SYSTEM_TRAY_Sn (compiz). So we end up using the desktop id as a
-     criteria for enabling appindicator. */
-    let desktop = this.getDesktop();
-    log.info("desktop="+JSON.stringify(desktop));
-
-    if (firetray.Utils.prefService.getBoolPref('with_appindicator') &&
-        this.canAppIndicator &&
-        (desktop.name === 'unity' ||
-         (desktop.name === 'kde' && desktop.ver > 4))) {
-      Cu.import("resource://firetray/linux/FiretrayAppIndicator.jsm");
-      /* FIXME: Ubuntu14.04/Unity: successfully closing appind3 crashes FF/TB
-       during exit, in Ubuntu's unity-menubar.patch's code.
-       https://bugs.launchpad.net/ubuntu/+source/firefox/+bug/1393256 */
-      // firetray.Handler.subscribeLibsForClosing([appind3]);
-    } else {
-      Cu.import("resource://firetray/linux/FiretrayGtkStatusIcon.jsm");
-    }
-
-    Cu.import("resource://firetray/linux/FiretrayPopupMenu.jsm");
-    if (!firetray.PopupMenu.init())
-      return false;
-
-    if (!firetray.StatusIcon.initImpl())
-      return false;
-
-    this.initialized = true;
-    return true;
-  },
-
-  shutdown: function() {
-    log.debug("Disabling StatusIcon");
-    firetray.StatusIcon.shutdownImpl();
-    firetray.PopupMenu.shutdown();
-    this.initialized = false;
-  },
-
-  defineIconNames: function() {
-    this.prefAppIconNames = (function() {
-      if (firetray.Handler.inMailApp) {
-        return "app_mail_icon_names";
-      } else if (firetray.Handler.inBrowserApp) {
-        return "app_browser_icon_names";
-      } else {
-        return "app_default_icon_names";
-      }
-    })();
-    this.defaultAppIconName = firetray.Handler.appName.toLowerCase();
-
-    this.prefNewMailIconNames = "new_mail_icon_names";
-    this.defaultNewMailIconName = "mail-unread";
-  },
-
-  getAppIconNames: function() {
-    let appIconNames = firetray.Utils.getArrayPref(
-      firetray.StatusIcon.prefAppIconNames);
-    appIconNames.push(firetray.StatusIcon.defaultAppIconName);
-    return appIconNames;
-  },
-  getNewMailIconNames: function() {
-    let newMailIconNames = firetray.Utils.getArrayPref(
-      firetray.StatusIcon.prefNewMailIconNames);
-    newMailIconNames.push(firetray.StatusIcon.defaultNewMailIconName);
-    return newMailIconNames;
-  },
-
-  loadImageCustom: function() { }, // done in setIconImageCustom
-
-  getDesktop: function() {
-    let env = Cc["@mozilla.org/process/environment;1"]
-          .createInstance(Ci.nsIEnvironment);
-    let XDG_CURRENT_DESKTOP = env.get("XDG_CURRENT_DESKTOP").toLowerCase();
-    let DESKTOP_SESSION = env.get("DESKTOP_SESSION").toLowerCase();
-
-    let desktop = {name:'unknown', ver:null};
-    if (XDG_CURRENT_DESKTOP === 'unity' || DESKTOP_SESSION === 'ubuntu') {
-      desktop.name = 'unity';
-    }
-    else if (XDG_CURRENT_DESKTOP === 'kde') { // DESKTOP_SESSION kde-plasma, plasme, kf5, ...
-      desktop.name = 'kde';
-      let KDE_SESSION_VERSION = env.get("KDE_SESSION_VERSION");
-      if (KDE_SESSION_VERSION) desktop.ver = parseInt(KDE_SESSION_VERSION, 10);
-    }
-    else if (DESKTOP_SESSION) {
-      desktop.name = DESKTOP_SESSION;
-    }
-    else if (XDG_CURRENT_DESKTOP) {
-      desktop.name = XDG_CURRENT_DESKTOP;
-    }
-
-    return desktop;
-  },
-
-  dbusNotificationWatcherReady: function() {
-    let watcherReady = false;
-
-    function error(e) {
-      if (!e.isNull()) {
-        log.error(e.contents.message);
-        glib.g_error_free(e);
-      }
-    }
-
-    let conn = new gio.GDBusConnection.ptr;
-    let err = new glib.GError.ptr(null);
-    conn = gio.g_bus_get_sync(gio.G_BUS_TYPE_SESSION, null, err.address());
-    if (error(err)) return watcherReady;
-
-    if (!conn.isNull()) {
-      let flags = gio.G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
-            gio.G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
-            gio.G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS;
-
-      let proxy = gio.g_dbus_proxy_new_for_bus_sync(
-        gio.G_BUS_TYPE_SESSION,
-        flags,
-        null, /* GDBusInterfaceInfo */
-        appind3.NOTIFICATION_WATCHER_DBUS_ADDR,
-        appind3.NOTIFICATION_WATCHER_DBUS_OBJ,
-        appind3.NOTIFICATION_WATCHER_DBUS_IFACE,
-        null, /* GCancellable */
-        err.address());
-      if (error(err)) return watcherReady;
-
-      if (!proxy.isNull()) {
-        let owner = gio.g_dbus_proxy_get_name_owner(proxy);
-        if (!owner.isNull()) {
-          watcherReady = true;
-        }
-        gobject.g_object_unref(proxy);
-      }
-
-      gobject.g_object_unref(conn);
-    }
-
-    return watcherReady;
-  },
-
-  onScroll: function(direction) {
-    if (!firetray.Utils.prefService.getBoolPref("scroll_hides"))
-      return false;
-
-    let scroll_mode = firetray.Utils.prefService.getCharPref("scroll_mode");
-    switch(direction) {
-    case gdk.GDK_SCROLL_UP:
-      log.debug("SCROLL UP");
-      if (scroll_mode === "down_hides")
-        firetray.Handler.showAllWindows();
-      else if (scroll_mode === "up_hides")
-        firetray.Handler.hideAllWindows();
-      break;
-    case gdk.GDK_SCROLL_DOWN:
-      log.debug("SCROLL DOWN");
-      if (scroll_mode === "down_hides")
-        firetray.Handler.hideAllWindows();
-      else if (scroll_mode === "up_hides")
-        firetray.Handler.showAllWindows();
-      break;
-    default:
-      log.error("SCROLL UNKNOWN");
-    }
-
-    return true;
-  }
-
-}; // firetray.StatusIcon
-
-
-firetray.Handler.setIconTooltipDefault = function() {
-  if (!this.appName)
-    throw "application name not initialized";
-  this.setIconTooltip(this.appName);
-};
-
-firetray.Handler.setIconTooltip = function(toolTipStr) { };
diff --git a/src/modules/freebsd/FiretrayWindow.jsm b/src/modules/freebsd/FiretrayWindow.jsm
deleted file mode 100644
index 1a53252..0000000
--- a/src/modules/freebsd/FiretrayWindow.jsm
+++ /dev/null
@@ -1,761 +0,0 @@
-/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-/* GdkWindow and GtkWindow are totally different things. A GtkWindow is a
- "standalone" window. A GdkWindow is just a region on the screen that can
- capture events and has certain attributes (such as a cursor, and a coordinate
- system). Basically a GdkWindow is an X window, in the Xlib sense, and
- GtkWindow is a widget used for a particular UI effect.
- (http://mail.gnome.org/archives/gtk-app-devel-list/1999-January/msg00138.html) */
-
-var EXPORTED_SYMBOLS = [ "firetray" ];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/ctypes.jsm");
-Cu.import("resource://firetray/ctypes/ctypesMap.jsm");
-Cu.import("resource://firetray/ctypes/linux/gobject.jsm");
-Cu.import("resource://firetray/ctypes/linux/gdk.jsm");
-Cu.import("resource://firetray/ctypes/linux/gtk.jsm");
-Cu.import("resource://firetray/ctypes/linux/libc.jsm");
-Cu.import("resource://firetray/ctypes/linux/x11.jsm");
-Cu.import("resource://firetray/FiretrayWindow.jsm");
-Cu.import("resource://firetray/commons.js");
-firetray.Handler.subscribeLibsForClosing([gobject, gdk, gtk, libc, x11, glib]);
-
-let log = firetray.Logging.getLogger("firetray.Window");
-
-if ("undefined" == typeof(firetray.Handler))
-  log.error("This module MUST be imported from/after FiretrayHandler !");
-
-const Services2 = {};
-XPCOMUtils.defineLazyServiceGetter(
-  Services2,
-  "uuid",
-  "@mozilla.org/uuid-generator;1",
-  "nsIUUIDGenerator"
-);
-
-const FIRETRAY_XWINDOW_HIDDEN    = 1 << 0; // when minimized also
-const FIRETRAY_XWINDOW_MAXIMIZED = 1 << 1;
-
-/**
- * custum type used to pass data in to and out of findGtkWindowByTitleCb
- */
-var _find_data_t = ctypes.StructType("_find_data_t", [
-  { inTitle: ctypes.char.ptr },
-  { outWindow: gtk.GtkWindow.ptr }
-]);
-
-// NOTE: storing ctypes pointers into a JS object doesn't work: pointers are
-// "evolving" after a while (maybe due to back and forth conversion). So we
-// need to store them into a real ctypes array !
-firetray.Handler.gtkWindows              = new ctypesMap(gtk.GtkWindow.ptr);
-firetray.Handler.gdkWindows              = new ctypesMap(gdk.GdkWindow.ptr);
-firetray.Handler.gtkPopupMenuWindowItems = new ctypesMap(gtk.GtkImageMenuItem.ptr);
-
-
-firetray.Window = new FiretrayWindow();
-firetray.Window.signals = {'focus-in': {callback: {}, handler: {}}};
-
-firetray.Window.init = function() {
-  let gtkVersionCheck = gtk.gtk_check_version(
-    gtk.FIRETRAY_REQUIRED_GTK_MAJOR_VERSION,
-    gtk.FIRETRAY_REQUIRED_GTK_MINOR_VERSION,
-    gtk.FIRETRAY_REQUIRED_GTK_MICRO_VERSION
-  );
-  if (!gtkVersionCheck.isNull())
-    log.error("gtk_check_version="+gtkVersionCheck.readString());
-
-  if (firetray.Handler.isChatEnabled()) {
-    Cu.import("resource://firetray/linux/FiretrayChat.jsm");
-    Cu.import("resource://firetray/linux/FiretrayChatStatusIcon.jsm");
-  }
-
-  this.initialized = true;
-};
-
-firetray.Window.shutdown = function() {
-  this.initialized = false;
-};
-
-/**
- * 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.
- *
- * @author Nils Maier (stolen from MiniTrayR), himself inspired by Windows docs
- * @param window nsIDOMWindow from Services.wm
- * @return a gtk.GtkWindow.ptr
- */
-firetray.Window.getGtkWindowFromChromeWindow = function(window) {
-  let baseWindow = window
-        .QueryInterface(Ci.nsIInterfaceRequestor)
-        .getInterface(Ci.nsIWebNavigation)
-        .QueryInterface(Ci.nsIBaseWindow);
-
-  // Tag the base window
-  let oldTitle = baseWindow.title;
-  log.debug("oldTitle="+oldTitle);
-  baseWindow.title = Services2.uuid.generateUUID().toString();
-
-  try {
-    // Search the window by the *temporary* title
-    let widgets = gtk.gtk_window_list_toplevels();
-    let that = this;
-    let findGtkWindowByTitleCb = gobject.GFunc_t(that._findGtkWindowByTitle); // void return, no sentinel
-    var userData = new _find_data_t(
-      ctypes.char.array()(baseWindow.title),
-      null
-    ).address();
-    log.debug("userData="+userData);
-    gobject.g_list_foreach(widgets, findGtkWindowByTitleCb, userData);
-    gobject.g_list_free(widgets);
-
-    if (userData.contents.outWindow.isNull())
-      throw new Error("Window not found!");
-
-    log.debug("found window: "+userData.contents.outWindow);
-  } catch (x) {
-    log.error(x);
-  } finally {
-    // Restore
-    baseWindow.title = oldTitle;
-  }
-
-  return userData.contents.outWindow;
-};
-
-/**
- * compares a GtkWindow's title with a string passed in userData
- * @param gtkWidget: GtkWidget from gtk_window_list_toplevels()
- * @param userData: _find_data_t
- */
-firetray.Window._findGtkWindowByTitle = function(gtkWidget, userData) {
-  let data = ctypes.cast(userData, _find_data_t.ptr);
-  let inTitle = data.contents.inTitle;
-
-  let gtkWin = ctypes.cast(gtkWidget, gtk.GtkWindow.ptr);
-  let winTitle = gtk.gtk_window_get_title(gtkWin);
-
-  if (!winTitle.isNull()) {
-    log.debug(inTitle+" = "+winTitle);
-    if (libc.strcmp(inTitle, winTitle) == 0)
-      data.contents.outWindow = gtkWin;
-  }
-};
-
-firetray.Window.getGdkWindowFromGtkWindow = function(gtkWin) {
-  try {
-    let gtkWid = ctypes.cast(gtkWin, gtk.GtkWidget.ptr);
-    return gtk.gtk_widget_get_window(gtkWid);
-  } catch (x) {
-    log.error(x);
-  }
-  return null;
-};
-
-firetray.Window.getXIDFromGdkWindow = function(gdkWin) {
-  return gdk.gdk_x11_drawable_get_xid(ctypes.cast(gdkWin, gdk.GdkDrawable.ptr));
-};
-
-firetray.Window.getXIDFromGtkWidget = function(gtkWid) {
-  let gdkWin = gtk.gtk_widget_get_window(gtkWid);
-  return gdk.gdk_x11_drawable_get_xid(ctypes.cast(gdkWin, gdk.GdkDrawable.ptr));
-};
-
-firetray.Window.addrPointedByInHex = function(ptr) {
-  return "0x"+ctypes.cast(ptr, ctypes.uintptr_t.ptr).contents.toString(16);
-};
-
-firetray.Window.getGdkWindowFromNativeHandle = function(nativeHandle) {
-  let gdkw = new gdk.GdkWindow.ptr(ctypes.UInt64(nativeHandle)); // a new pointer to the GdkWindow
-  gdkw = gdk.gdk_window_get_toplevel(gdkw);
-  log.debug("gdkw="+gdkw+" *gdkw="+this.addrPointedByInHex(gdkw));
-  return gdkw;
-};
-
-firetray.Window.getGtkWindowFromGdkWindow = function(gdkWin) {
-  let gptr = new gobject.gpointer;
-  gdk.gdk_window_get_user_data(gdkWin, gptr.address());
-  log.debug("gptr="+gptr+" *gptr="+this.addrPointedByInHex(gptr));
-  let gtkw = ctypes.cast(gptr, gtk.GtkWindow.ptr);
-  log.debug("gtkw="+gtkw+" *gtkw="+this.addrPointedByInHex(gtkw));
-  return gtkw;
-};
-
-/* consider using getRegisteredWinIdFromChromeWindow() if you only need the XID */
-firetray.Window.getWindowsFromChromeWindow = function(win) {
-  let baseWin = firetray.Handler.getWindowInterface(win, "nsIBaseWindow");
-  let nativeHandle = baseWin.nativeHandle; // Moz' private pointer to the GdkWindow
-  log.debug("nativeHandle="+nativeHandle);
-  let gtkWin, gdkWin;
-  if (nativeHandle) { // Gecko 17+
-    gdkWin = firetray.Window.getGdkWindowFromNativeHandle(nativeHandle);
-    gtkWin = firetray.Window.getGtkWindowFromGdkWindow(gdkWin);
-  } else {
-    gtkWin = firetray.Window.getGtkWindowFromChromeWindow(win);
-    gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWin);
-  }
-  let xid = firetray.Window.getXIDFromGdkWindow(gdkWin);
-  log.debug("XID="+xid);
-  return [baseWin, gtkWin, gdkWin, xid];
-};
-
-firetray.Window.unregisterWindowByXID = function(xid) {
-  if (!firetray.Handler.windows.hasOwnProperty(xid)) {
-    log.error("can't unregister unknown window "+xid);
-    return false;
-  }
-
-  firetray.Window.detachOnFocusInCallback(xid);
-  if (firetray.Handler.isChatEnabled() && firetray.Chat.initialized) {
-    firetray.Chat.detachSelectListeners(firetray.Handler.windows[xid].chromeWin);
-  }
-
-  if (!delete firetray.Handler.windows[xid])
-    throw new DeleteError();
-  firetray.Handler.gtkWindows.remove(xid);
-  firetray.Handler.gdkWindows.remove(xid);
-
-  firetray.PopupMenu.removeWindowItem(xid);
-
-  log.debug("window "+xid+" unregistered");
-  return true;
-};
-
-firetray.Window.show = function(xid) {
-  log.debug("show xid="+xid);
-
-  // try to restore previous state. TODO: z-order respected ?
-  firetray.Window.restorePositionAndSize(xid);
-  firetray.Window.restoreStates(xid);
-
-  // better visual effect if visibility set after restorePosition, but some
-  // WMs like compiz seem not to honor position setting if window not visible
-  firetray.Window.setVisibility(xid, true);
-
-  // after show
-  firetray.Window.restoreDesktop(xid);
-  if (firetray.Utils.prefService.getBoolPref('show_activates'))
-    firetray.Window.activate(xid);
-
-  firetray.PopupMenu.hideWindowItemAndSeparatorMaybe(xid);
-  firetray.Handler.showHideIcon();
-};
-
-/* FIXME: hiding windows should also hide child windows, like message windows
- in Thunderbird */
-firetray.Window.hide = function(xid) {
-  log.debug("hide");
-
-  firetray.Window.savePositionAndSize(xid);
-  firetray.Window.saveStates(xid);
-  firetray.Window.saveDesktop(xid);
-
-  firetray.Window.setVisibility(xid, false);
-
-  firetray.PopupMenu.showWindowItem(xid);
-  firetray.Handler.showHideIcon();
-};
-
-firetray.Window.startupHide = function(xid) {
-  log.debug('startupHide: '+xid);
-
-  // also it seems cleaner, baseWin.visibility=false removes the possibility
-  // to restore the app by calling it from the command line. Not sure why...
-  firetray.Window.setVisibility(xid, false);
-
-  firetray.PopupMenu.showWindowItem(xid);
-  firetray.Handler.showHideIcon();
-};
-
-firetray.Window.savePositionAndSize = function(xid) {
-  let gx = {}, gy = {}, gwidth = {}, gheight = {};
-  firetray.Handler.windows[xid].baseWin.getPositionAndSize(gx, gy, gwidth, gheight);
-  firetray.Handler.windows[xid].savedX = gx.value;
-  firetray.Handler.windows[xid].savedY = gy.value;
-  firetray.Handler.windows[xid].savedWidth = gwidth.value;
-  firetray.Handler.windows[xid].savedHeight = gheight.value;
-  log.debug("save: gx="+gx.value+", gy="+gy.value+", gwidth="+gwidth.value+", gheight="+gheight.value);
-};
-
-firetray.Window.restorePositionAndSize = function(xid) {
-  if ("undefined" === typeof(firetray.Handler.windows[xid].savedX))
-    return; // windows[xid].saved* may not be initialized
-
-  log.debug("restore: x="+firetray.Handler.windows[xid].savedX+", y="+firetray.Handler.windows[xid].savedY+", w="+firetray.Handler.windows[xid].savedWidth+", h="+firetray.Handler.windows[xid].savedHeight);
-  firetray.Handler.windows[xid].baseWin.setPositionAndSize(
-    firetray.Handler.windows[xid].savedX,
-    firetray.Handler.windows[xid].savedY,
-    firetray.Handler.windows[xid].savedWidth,
-    firetray.Handler.windows[xid].savedHeight,
-    false); // repaint
-
-  ['savedX', 'savedX', 'savedWidth', 'savedHeight'].forEach(function(element) {
-    delete firetray.Handler.windows[xid][element];
-  });
-};
-
-firetray.Window.saveStates = function(xid) {
-  let winStates = firetray.Window.getXWindowStates(x11.Window(xid));
-  firetray.Handler.windows[xid].savedStates = winStates;
-  log.debug("save: windowStates="+winStates);
-};
-
-// NOTE: fluxbox bug probably: if hidden and restored iconified, then
-// switching to desktop de-iconifies it ?!
-firetray.Window.restoreStates = function(xid) {
-  let winStates = firetray.Handler.windows[xid].savedStates;
-  log.debug("restored WindowStates: " + winStates);
-
-  if (winStates & FIRETRAY_XWINDOW_HIDDEN) {
-    firetray.Handler.windows[xid].chromeWin.minimize();
-    log.debug("restored minimized");
-  }
-
-  /* we expect the WM to actually show the window *not* minimized once
-   restored */
-  if (firetray.Utils.prefService.getBoolPref('hides_on_minimize'))
-    // help prevent getting iconify event following show()
-    firetray.Handler.windows[xid].chromeWin.restore(); // nsIDOMChromeWindow.idl
-
-  if (winStates & FIRETRAY_XWINDOW_MAXIMIZED) {
-    firetray.Handler.windows[xid].chromeWin.maximize();
-    log.debug("restored maximized");
-  }
-
-  delete firetray.Handler.windows[xid].savedStates;
-};
-
-firetray.Window.saveDesktop = function(xid) {
-  if (!firetray.Utils.prefService.getBoolPref('remember_desktop'))
-    return;
-
-  let winDesktop = firetray.Window.getXWindowDesktop(x11.Window(xid));
-  firetray.Handler.windows[xid].savedDesktop = winDesktop;
-  log.debug("save: windowDesktop="+winDesktop);
-};
-
-firetray.Window.restoreDesktop = function(xid) {
-  if (!firetray.Utils.prefService.getBoolPref('remember_desktop'))
-    return;
-
-  let desktopDest = firetray.Handler.windows[xid].savedDesktop;
-  if (desktopDest === null || "undefined" === typeof(desktopDest)) return;
-
-  let dataSize = 1;
-  let data = ctypes.long(dataSize);
-  data[0] = desktopDest;
-  this.xSendClientMessgeEvent(xid, x11.current.Atoms._NET_WM_DESKTOP, data, dataSize);
-
-  log.debug("restored to desktop: "+desktopDest);
-  delete firetray.Handler.windows[xid].savedDesktop;
-};
-
-firetray.Window.getVisibility = function(xid) {
-  let gtkWidget = ctypes.cast(firetray.Handler.gtkWindows.get(xid), gtk.GtkWidget.ptr);
-  // nsIBaseWin.visibility always true
-  return gtk.gtk_widget_get_visible(gtkWidget);
-};
-
-firetray.Window.setVisibility = function(xid, visibility) {
-  log.debug("setVisibility="+visibility);
-  let gtkWidget = ctypes.cast(firetray.Handler.gtkWindows.get(xid), gtk.GtkWidget.ptr);
-  if (visibility)
-    gtk.gtk_widget_show_all(gtkWidget);
-  else
-    gtk.gtk_widget_hide(gtkWidget);
-};
-
-firetray.Window.xSendClientMessgeEvent = function(xid, atom, data, dataSize) {
-  let xev = new x11.XClientMessageEvent;
-  xev.type = x11.ClientMessage;
-  xev.window = x11.Window(xid);
-  xev.message_type = atom;
-  xev.format = 32;
-  for (let i=0; i<dataSize; ++i)
-    xev.data[i] = data[i];
-
-  let rootWin = x11.XDefaultRootWindow(x11.current.Display);
-  let propagate = false;
-  let mask = ctypes.long(x11.SubstructureNotifyMask|x11.SubstructureRedirectMask);
-  // fortunately, it's OK not to cast xev. ctypes.cast to a void_t doesn't work (length pb)
-  let status = x11.XSendEvent(x11.current.Display, rootWin, propagate, mask, xev.address());
-  // always returns 1 (BadRequest as a coincidence)
-};
-
-/**
- * raises window on top and give focus.
- */
-firetray.Window.activate = function(xid) {
-  // broken in KDE ?
-  gtk.gtk_window_present(firetray.Handler.gtkWindows.get(xid));
-  log.debug("window raised");
-};
-
-firetray.Window.setUrgency = function(xid, urgent) {
-  log.debug("setUrgency: "+urgent);
-  gtk.gtk_window_set_urgency_hint(firetray.Handler.gtkWindows.get(xid), urgent);
-};
-
-/**
- * YOU MUST x11.XFree() THE VARIABLE RETURNED BY THIS FUNCTION
- * @param xwin: a x11.Window
- * @param prop: a x11.Atom
- */
-firetray.Window.getXWindowProperties = function(xwin, prop) {
-  // infos returned by XGetWindowProperty() - FIXME: should be freed ?
-  let actual_type = new x11.Atom;
-  let actual_format = new ctypes.int;
-  let nitems = new ctypes.unsigned_long;
-  let bytes_after = new ctypes.unsigned_long;
-  let prop_value = new ctypes.unsigned_char.ptr;
-
-  let bufSize = XATOMS_EWMH_WM_STATES.length*ctypes.unsigned_long.size;
-  let offset = 0;
-  let res = x11.XGetWindowProperty(
-    x11.current.Display, xwin, prop, offset, bufSize, 0, x11.AnyPropertyType,
-    actual_type.address(), actual_format.address(), nitems.address(),
-    bytes_after.address(), prop_value.address());
-  log.debug("XGetWindowProperty res="+res+", actual_type="+actual_type.value+", actual_format="+actual_format.value+", bytes_after="+bytes_after.value+", nitems="+nitems.value);
-
-  if (!firetray.js.strEquals(res, x11.Success)) {
-    log.error("XGetWindowProperty failed");
-    return [null, null];
-  }
-  if (firetray.js.strEquals(actual_type.value, x11.None)) {
-    log.debug("property not found");
-    return [null, null];
-  }
-
-  log.debug("prop_value="+prop_value+", size="+prop_value.constructor.size);
-  /* If the returned format is 32, the property data will be stored as an
-   array of longs (which in a 64-bit application will be 64-bit values
-   that are padded in the upper 4 bytes). [man XGetWindowProperty] */
-  if (actual_format.value !== 32) {
-    log.error("unsupported format: "+actual_format.value);
-  }
-  log.debug("format OK");
-  var props = ctypes.cast(prop_value, ctypes.unsigned_long.array(nitems.value).ptr);
-  log.debug("props="+props+", size="+props.constructor.size);
-
-  return [props, nitems];
-};
-
-/**
- * check the state of a window by its EWMH window state. This is more
- * accurate than the chromeWin.windowState or the GdkWindowState which are
- * based on WM_STATE. For instance, WM_STATE becomes 'Iconic' on virtual
- * desktop change...
- */
-firetray.Window.getXWindowStates = function(xwin) {
-  let winStates = 0;
-
-  let [propsFound, nitems] =
-        firetray.Window.getXWindowProperties(xwin, x11.current.Atoms._NET_WM_STATE);
-  log.debug("propsFound, nitems="+propsFound+", "+nitems);
-  if (!propsFound) return 0;
-
-  let maximizedHorz = maximizedVert = false;
-  for (let i=0, len=nitems.value; i<len; ++i) {
-    log.debug("i: "+propsFound.contents[i]);
-    let currentProp = propsFound.contents[i];
-    if (firetray.js.strEquals(currentProp, x11.current.Atoms['_NET_WM_STATE_HIDDEN']))
-      winStates |= FIRETRAY_XWINDOW_HIDDEN;
-    else if (firetray.js.strEquals(currentProp, x11.current.Atoms['_NET_WM_STATE_MAXIMIZED_HORZ']))
-      maximizedHorz = true;
-    else if (firetray.js.strEquals(currentProp, x11.current.Atoms['_NET_WM_STATE_MAXIMIZED_VERT']))
-      maximizedVert = true;
-  }
-
-  if (maximizedHorz && maximizedVert)
-    winStates |= FIRETRAY_XWINDOW_MAXIMIZED;
-
-  x11.XFree(propsFound);
-
-  return winStates;
-};
-
-firetray.Window.getXWindowDesktop = function(xwin) {
-  let desktop = null;
-
-  let [propsFound, nitems] =
-        firetray.Window.getXWindowProperties(xwin, x11.current.Atoms._NET_WM_DESKTOP);
-  log.debug("DESKTOP propsFound, nitems="+propsFound+", "+nitems);
-  if (!propsFound) return null;
-
-  if (firetray.js.strEquals(nitems.value, 0))
-    log.warn("desktop number not found");
-  else if (firetray.js.strEquals(nitems.value, 1))
-    desktop = propsFound.contents[0];
-  else
-    throw new RangeError("more than one desktop found");
-
-  x11.XFree(propsFound);
-
-  return desktop;
-};
-
-firetray.Window.checkSubscribedEventMasks = function(xid) {
-  let xWindowAttributes = new x11.XWindowAttributes;
-  let status = x11.XGetWindowAttributes(x11.current.Display, xid, xWindowAttributes.address());
-  log.debug("xWindowAttributes: "+xWindowAttributes);
-  let xEventMask = xWindowAttributes.your_event_mask;
-  let xEventMaskNeeded = x11.VisibilityChangeMask|x11.StructureNotifyMask|
-        x11.FocusChangeMask|x11.PropertyChangeMask;
-  log.debug("xEventMask="+xEventMask+" xEventMaskNeeded="+xEventMaskNeeded);
-  if ((xEventMask & xEventMaskNeeded) !== xEventMaskNeeded) {
-    log.error("missing mandatory event-masks"); // change with gdk_window_set_events()
-  }
-};
-
-firetray.Window.filterWindow = function(xev, gdkEv, data) {
-  if (!xev)
-    return gdk.GDK_FILTER_CONTINUE;
-
-  let xany = ctypes.cast(xev, x11.XAnyEvent.ptr);
-  let xid = xany.contents.window;
-
-  switch (xany.contents.type) {
-
-  case x11.MapNotify:
-    log.debug("MapNotify");
-    let gdkWinStateOnMap = gdk.gdk_window_get_state(firetray.Handler.gdkWindows.get(xid));
-    log.debug("gdkWinState="+gdkWinStateOnMap+" for xid="+xid);
-    let win = firetray.Handler.windows[xid];
-    if (firetray.Handler.appStarted && !win.visible) {
-      // when app hidden at startup, then called from command line without
-      // any argument (not through FireTray that is)
-      log.warn("window not visible, correcting visibility");
-      log.debug("visibleWindowsCount="+firetray.Handler.visibleWindowsCount);
-    }
-    break;
-
-  case x11.UnmapNotify:       // for catching 'iconify'
-    log.debug("UnmapNotify");
-
-    let winStates = firetray.Window.getXWindowStates(xid);
-    let isHidden =  winStates & FIRETRAY_XWINDOW_HIDDEN;
-    log.debug("winStates="+winStates+", isHidden="+isHidden);
-    // NOTE: Gecko 8.0 provides the 'sizemodechange' event, which comes once
-    // the window is minimized. i.e. preventDefault() or returning false won't
-    // prevent the event.
-    if (isHidden) {
-      log.debug("GOT ICONIFIED");
-      firetray.Handler.onMinimize(xid);
-    }
-    break;
-
-    // default:
-    //   log.debug("xany.type="+xany.contents.type);
-    //   break;
-  }
-
-  return gdk.GDK_FILTER_CONTINUE;
-};
-
-firetray.Window.startupFilter = function(xev, gdkEv, data) {
-  if (!xev)
-    return gdk.GDK_FILTER_CONTINUE;
-
-  let xany = ctypes.cast(xev, x11.XAnyEvent.ptr);
-  let xid = xany.contents.window;
-
-  // MapRequest already taken by window manager. Not sure we could be notified
-  // *before* the window is actually mapped, in order to minimize it before
-  // it's shown.
-  if (xany.contents.type === x11.MapNotify) {
-    gdk.gdk_window_remove_filter(firetray.Handler.gdkWindows.get(xid),
-                                 firetray.Handler.windows[xid].startupFilterCb, null);
-    if (firetray.Utils.prefService.getBoolPref('start_hidden')) {
-      log.debug("start_hidden");
-      firetray.Window.startupHide(xid);
-    }
-  }
-
-  return gdk.GDK_FILTER_CONTINUE;
-};
-
-firetray.Window.showAllWindowsAndActivate = function() {
-  let visibilityRate = firetray.Handler.visibleWindowsCount/firetray.Handler.windowsCount;
-  log.debug("visibilityRate="+visibilityRate);
-  if (visibilityRate < 1)
-    firetray.Handler.showAllWindows();
-
-  for(var key in firetray.Handler.windows); // FIXME: this is not the proper way for finding the last registered window !
-  firetray.Window.activate(key);
-};
-
-firetray.Window.attachOnFocusInCallback = function(xid) {
-  log.debug("attachOnFocusInCallback xid="+xid);
-  let callback = gtk.GCallbackWidgetFocusEvent_t(
-    firetray.Window.onFocusIn, null, FIRETRAY_CB_SENTINEL);
-  this.signals['focus-in'].callback[xid] = callback;
-  let handlerId = gobject.g_signal_connect(
-    firetray.Handler.gtkWindows.get(xid), "focus-in-event", callback, null);
-  log.debug("focus-in handler="+handlerId);
-  this.signals['focus-in'].handler[xid] = handlerId;
-};
-
-firetray.Window.detachOnFocusInCallback = function(xid) {
-  log.debug("detachOnFocusInCallback xid="+xid);
-  let gtkWin = firetray.Handler.gtkWindows.get(xid);
-  gobject.g_signal_handler_disconnect(
-    gtkWin,
-    gobject.gulong(this.signals['focus-in'].handler[xid])
-  );
-  delete this.signals['focus-in'].callback[xid];
-  delete this.signals['focus-in'].handler[xid];
-};
-
-// NOTE: fluxbox issues a FocusIn event when switching workspace
-// by hotkey, which means 2 FocusIn events when switching to a moz app :(
-// (http://sourceforge.net/tracker/index.php?func=detail&aid=3190205&group_id=35398&atid=413960)
-firetray.Window.onFocusIn = function(widget, event, data) {
-  log.debug("onFocusIn");
-  let xid = firetray.Window.getXIDFromGtkWidget(widget);
-  log.debug("xid="+xid);
-
-  firetray.Window.setUrgency(xid, false);
-
-  if (firetray.Handler.isChatEnabled() && firetray.Chat.initialized) {
-    firetray.Chat.stopGetAttentionMaybe(xid);
-  }
-
-  let stopPropagation = false;
-  return stopPropagation;
-};
-
-
-///////////////////////// firetray.Handler overriding /////////////////////////
-
-/** debug facility */
-firetray.Handler.dumpWindows = function() {
-  log.debug(firetray.Handler.windowsCount);
-  for (let winId in firetray.Handler.windows) log.info(winId+"="+firetray.Handler.gtkWindows.get(winId));
-};
-
-firetray.Handler.registerWindow = function(win) {
-  log.debug("register window");
-
-  // register
-  let [baseWin, gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win);
-  this.windows[xid] = {};
-  this.windows[xid].chromeWin = win;
-  this.windows[xid].baseWin = baseWin;
-  Object.defineProperties(this.windows[xid], {
-    "visible": { get: function(){return firetray.Window.getVisibility(xid);} }
-  });
-  firetray.Window.checkSubscribedEventMasks(xid);
-  try {
-    this.gtkWindows.insert(xid, gtkWin);
-    this.gdkWindows.insert(xid, gdkWin);
-    firetray.PopupMenu.addWindowItem(xid);
-  } catch (x) {
-    if (x.name === "RangeError") // instanceof not working :-(
-      win.alert(x+"\n\nYou seem to have more than "+FIRETRAY_WINDOW_COUNT_MAX
-                +" windows open. This breaks FireTray and most probably "
-                +firetray.Handler.appName+".");
-  }
-  log.debug("window "+xid+" registered");
-  // NOTE: shouldn't be necessary to gtk_widget_add_events(gtkWin, gdk.GDK_ALL_EVENTS_MASK);
-
-  try {
-     // NOTE: we could try to catch the "delete-event" here and block
-     // delete_event_cb (in gtk2/nsWindow.cpp), but we prefer to use the
-     // provided 'close' JS event
-
-    this.windows[xid].filterWindowCb = gdk.GdkFilterFunc_t(
-      firetray.Window.filterWindow, null, FIRETRAY_CB_SENTINEL);
-    gdk.gdk_window_add_filter(gdkWin, this.windows[xid].filterWindowCb, null);
-    if (!firetray.Handler.appStarted) {
-      this.windows[xid].startupFilterCb = gdk.GdkFilterFunc_t(
-        firetray.Window.startupFilter, null, FIRETRAY_CB_SENTINEL);
-      gdk.gdk_window_add_filter(gdkWin, this.windows[xid].startupFilterCb, null);
-    }
-
-    firetray.Window.attachOnFocusInCallback(xid);
-    if (firetray.Handler.isChatEnabled() && firetray.Chat.initialized) {
-      firetray.Chat.attachSelectListeners(win);
-    }
-
-  } catch (x) {
-    log.error(x);
-    firetray.Window.unregisterWindowByXID(xid);
-    return null;
-  }
-
-  log.debug("AFTER"); firetray.Handler.dumpWindows();
-  return xid;
-};
-
-firetray.Handler.unregisterWindow = function(win) {
-  log.debug("unregister window");
-  let xid = firetray.Window.getRegisteredWinIdFromChromeWindow(win);
-  return firetray.Window.unregisterWindowByXID(xid);
-};
-
-firetray.Handler.showWindow = firetray.Window.show;
-firetray.Handler.hideWindow = firetray.Window.hide;
-
-firetray.Handler.showAllWindowsAndActivate = firetray.Window.showAllWindowsAndActivate;
-firetray.Handler.activateLastWindowCb = function(gtkStatusIcon, gdkEvent, userData) {
-  log.debug("activateLastWindowCb");
-
-  let gdkEventButton = ctypes.cast(gdkEvent, gdk.GdkEventButton.ptr);
-  if (gdkEventButton.contents.button === 2 && gdkEventButton.contents.type === gdk.GDK_BUTTON_PRESS) {
-    log.debug("MIDDLE CLICK");
-
-    firetray.Window.showAllWindowsAndActivate();
-  }
-
-  let stopPropagation = false;
-  return stopPropagation;
-};
-
-/* NOTE: gtk_window_is_active() not reliable, and _NET_ACTIVE_WINDOW may not
-   always be set before 'focus-in-event' (gnome-shell/mutter 3.4.1). */
-firetray.Handler.getActiveWindow = function() {
-  let gdkActiveWin = gdk.gdk_screen_get_active_window(gdk.gdk_screen_get_default()); // inspects _NET_ACTIVE_WINDOW
-  log.debug("gdkActiveWin="+gdkActiveWin);
-  if (firetray.js.strEquals(gdkActiveWin, 'GdkWindow.ptr(ctypes.UInt64("0x0"))'))
-    return null;
-  let activeWin = firetray.Window.getXIDFromGdkWindow(gdkActiveWin);
-  log.debug("ACTIVE_WINDOW="+activeWin);
-  return activeWin;
-};
-
-firetray.Handler.windowGetAttention = function(winId) {
-  firetray.Window.setUrgency(winId, true);
-};
-
-
-/**
- * init X11 Display and handled XAtoms.
- * Needs to be defined and called outside x11.jsm because: 1. gdk already
- * imports x11, 2. there is no means to get the default Display solely with
- * Xlib without opening one... :-(
- */
-x11.init = function() {
-  if (!firetray.js.isEmpty(this.current))
-    return true; // init only once
-
-  this.current = {};
-  try {
-    let gdkDisplay = gdk.gdk_display_get_default();
-    this.current.Display = gdk.gdk_x11_display_get_xdisplay(gdkDisplay);
-    this.current.Atoms = {};
-    XATOMS.forEach(function(atomName, index, array) {
-      this.current.Atoms[atomName] = x11.XInternAtom(this.current.Display, atomName, 0);
-      log.debug("x11.current.Atoms."+atomName+"="+this.current.Atoms[atomName]);
-    }, this);
-    return true;
-  } catch (x) {
-    log.error(x);
-    return false;
-  }
-};
-x11.init();

-- 
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