[Pkg-mozext-commits] [firetray] 15/399: * add LibC for logging to stderr * try different approaches for hiding windows: - gather toplevel windows from nsIWindowMediator, but then unable to get NativeParentWindow (GdkWindow) in order to apply gdk_window_hide - damn it ! - gather toplevel GdkWindows, but don't know exactly how to find out which belong to the application... - gather toplevel GtkWindows, but seem to get too many windows from gtk_window_list_toplevels()... * problems understanding js-ctypes: - arguments passed to callbacks (see FunctionType), for ex: implementation of GFunc - definition of recursive structures, for ex: GtkWidget

David Prévot taffit at alioth.debian.org
Tue Oct 29 18:23:05 UTC 2013


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

taffit pushed a commit to branch dfsg-clean
in repository firetray.

commit f2245d1ca017d3d3a0a69cad36dfe58f3c56d1f1
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Mon Jul 18 00:58:03 2011 +0200

    * add LibC for logging to stderr
    * try different approaches for hiding windows:
      - gather toplevel windows from nsIWindowMediator, but then unable to get
        NativeParentWindow (GdkWindow) in order to apply gdk_window_hide - damn it !
      - gather toplevel GdkWindows, but don't know exactly how to find out which
        belong to the application...
      - gather toplevel GtkWindows, but seem to get too many windows from
        gtk_window_list_toplevels()...
    * problems understanding js-ctypes:
      - arguments passed to callbacks (see FunctionType), for ex: implementation of
        GFunc
      - definition of recursive structures, for ex: GtkWidget
---
 src/chrome/content/overlay.js   |  155 +++++++++++++++++++++++++++---
 src/chrome/content/overlay.xul  |    2 +-
 src/modules/LibC.js             |   19 ++++
 src/modules/LibGObject.js       |   76 ++++++++++++++-
 src/modules/LibGdkWindow.js     |  201 +++++++++++++++++++++++++++++++++++++++
 src/modules/LibGtkStatusIcon.js |   41 +++++++-
 src/modules/commons.js          |   30 +++++-
 7 files changed, 503 insertions(+), 21 deletions(-)

diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js
index 903888e..6d622e5 100644
--- a/src/chrome/content/overlay.js
+++ b/src/chrome/content/overlay.js
@@ -1,24 +1,130 @@
 /* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 
 // TODO: Components.utils.import("resource://gre/modules/Services.jsm");
-Components.utils.import("resource://moztray/commons.js");
-Components.utils.import("resource://moztray/LibGtkStatusIcon.js");
+Components.utils.import("resource://gre/modules/ctypes.jsm");
+Components.utils.import("resource://moztray/LibC.js");
 Components.utils.import("resource://moztray/LibGObject.js");
+Components.utils.import("resource://moztray/LibGdkWindow.js");
+Components.utils.import("resource://moztray/LibGtkStatusIcon.js");
+Components.utils.import("resource://moztray/commons.js");
 
 const MOZT_ICON_DIR = "chrome/skin/";
 const MOZT_ICON_SUFFIX = "32.png";
 
 
-var mozt_hideWinCb;
-/* NOTE: arguments come obviously from the GCallbackFunction definition:
- * [gpointer, guint, gpointer]
- */
-var mozt_hideWinJs = function(aInstance, aTimestamp, aUserData) {
+
+var mozt_getBaseWindow = function(win) {
+  var bw;
+  try {
+    bw = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+      .getInterface(Components.interfaces.nsIWebNavigation)
+      .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+      .treeOwner
+      .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+      .getInterface(Components.interfaces.nsIXULWindow)
+      .docShell
+      .QueryInterface(Components.interfaces.nsIBaseWindow);
+  } catch (ex) {
+    bw = null;
+    setTimeout(function() {throw ex; }, 0);
+    // ignore no-interface exception
+  }
+  return bw;
+};
+
+var mozt_getAllWindows = function() {
   try {
-    alert("Hide");
-  } catch(e) {Cu.reportError(ex);}
+    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+      .getService(Components.interfaces.nsIWindowMediator);
+  } catch (err) {
+    alert(err);
+    return;
+  }
+
+  var baseWindows = new Array();
+  var e = wm.getEnumerator(null);
+  while (e.hasMoreElements()) {
+    var w = e.getNext();
+    baseWindows[baseWindows.length] = mozt_getBaseWindow(w);
+  }
+
+  return baseWindows;
 };
 
+var mozt_hideToTray = function() {
+  mozt.Debug.debug("mozt_hideToTray");
+/*
+  var toto = gBrowser.getBrowserForDocument(content.document)
+    .docShell
+    .QueryInterface(Components.interfaces.nsIBaseWindow)
+    .parentNativeWindow;
+  mozt.Debug.debug("toto: " + toto);
+*/
+  var baseWindows = mozt_getAllWindows();
+  mozt.Debug.dump("baseWindows: " + baseWindows.length);
+  for(var i=0; i<baseWindows.length; i++) {
+    var bw = baseWindows[i];
+    // bw.visibility = false;
+    // mozt.Debug.dumpObj(bw);
+    if (bw instanceof Ci.nsIBaseWindow) {
+      mozt.Debug.debug("bw.visibility: " + bw.visibility);
+      mozt.Debug.debug("bw.title: " + bw.title);
+      mozt.Debug.debug("bw.parentNativeWindow: " + bw.parentNativeWindow);
+
+      // try {
+      //   bw.visibility = false;
+      //   // bw.parentNativeWindow = null;
+      // } catch (x) {
+      //   mozt.Debug.debug(x);
+      // }
+
+    }
+
+    // var parentWin = bw.parentNativeWindow;
+    // var gdkWin = new LibGdkWindow.GdkWindow.ptr;
+    // try {
+    //   // gdkWin = ctypes.cast(tmp, LibGdkWindow.GdkWindow.ptr);
+    // } catch (x) {
+    //   mozt.Debug.debug(x);
+    // }
+    // if (!gdkWin) mozt.Debug.debug("gdkWin undefined");
+    // mozt.Debug.dumpObj(gdkWin);
+    // LibGdkWindow.GdkWindowHide(gdkWin);
+  }
+
+}
+
+var mozt_trayCb;
+var mozt_isHidden = false;
+var mozt_trayCbJS = function() {
+  if (mozt_isHidden) {
+    mozt_isHidden = false;
+    mozt_restoreFromTray();
+  } else {
+    mozt_isHidden = true;
+    mozt_hideToTray();
+  }
+};
+
+var mozt_func;
+var mozt_funcGdkJS = function(a1, a2, a3) {
+  try {
+    mozt.Debug.debug("GDK Window");
+    mozt.Debug.debug(a1);
+    // mozt.Debug.debug(a2);
+    // mozt.Debug.debug(a3);
+  } catch(e) {mozt.Debug.debug(ex);}
+};
+
+var mozt_funcGtkJS = function(win) {
+  try {
+    ctypes.cast(win, LibGtkStatusIcon.GtkWidget.ptr);
+    mozt.Debug.debug("GTK Window " + win);
+    LibGtkStatusIcon.gtk_widget_hide(win);
+  } catch(e) {mozt.Debug.debug(ex);}
+};
+
+
 mozt.Main = {
 
   onLoad: function() {
@@ -46,13 +152,38 @@ mozt.Main = {
         //                             "Example Tray Icon");
         // gtk_status_icon_set_visible(tray_icon, TRUE);
 
-    mozt_hideWinCb = LibGObject.GCallbackFunction(mozt_hideWinJs);
+    mozt_trayCb = LibGObject.GCallbackFunction(mozt_trayCbJS);
 
     LibGObject.g_signal_connect(this.tray_icon, "activate",
-                                mozt_hideWinCb, null);
+                                mozt_trayCb, null);
 
+    try {
+      // Experimental stuff...
+
+      var gdkScreen = LibGdkWindow.GdkScreenGetDefault();
+      var tl = LibGdkWindow.GdkScreenGetToplevelWindows(gdkScreen);
+      mozt.Debug.debug(tl);
+
+      // gboolean            gdk_window_is_visible               (GdkWindow *window);
+      mozt_func = LibGObject.GFunc_t(mozt_funcGdkJS);
+      LibGObject.g_list_foreach(tl, mozt_func, null);
+      var gdkWinCount = LibGObject.g_list_length(tl);
+      mozt.Debug.debug('gdkWinCount: ' + gdkWinCount);
+
+      var pid = LibC.getpid();
+      mozt.Debug.debug(pid);
+
+      tl = LibGtkStatusIcon.gtk_window_list_toplevels();
+      mozt_func = LibGObject.GFunc_t(mozt_funcGtkJS);
+      LibGObject.g_list_foreach(tl, mozt_func, null);
+      var gtkWinCount = LibGObject.g_list_length(tl);
+      mozt.Debug.debug('gtkWinCount: ' + gtkWinCount);
+
+    } catch (x) {
+      mozt.Debug.debug(x);
+    }
 
-    mozt.Debug.dump('Moztray LOADED !');
+    mozt.Debug.debug('Moztray LOADED !');
     this.initialized = true;
     return true;
   },
diff --git a/src/chrome/content/overlay.xul b/src/chrome/content/overlay.xul
index f8ff78a..ca04a59 100644
--- a/src/chrome/content/overlay.xul
+++ b/src/chrome/content/overlay.xul
@@ -2,7 +2,7 @@
 <?xml-stylesheet href="chrome://moztray/skin/overlay.css" type="text/css"?>
 <!DOCTYPE overlay SYSTEM "chrome://moztray/locale/overlay.dtd">
 <overlay id="moztray-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script src="overlay.js"/>
+  <script type="application/javascript;version=1.7" src="overlay.js"/>
 
   <stringbundleset id="stringbundleset">
     <stringbundle id="moztray-strings" src="chrome://moztray/locale/overlay.properties"/>
diff --git a/src/modules/LibC.js b/src/modules/LibC.js
index a21261c..41319b3 100644
--- a/src/modules/LibC.js
+++ b/src/modules/LibC.js
@@ -23,6 +23,10 @@ XPCOMUtils.defineLazyGetter(this, "FILE", function() {
   return ctypes.StructType("FILE");
 });
 
+XPCOMUtils.defineLazyGetter(this, "pid_t", function() {
+  return ctypes.int;
+});
+
 XPCOMUtils.defineLazyGetter(this, "fdopen", function() {
   var fdopen = libc.declare(
     "fdopen", ctypes.default_abi, FILE.ptr,
@@ -74,12 +78,27 @@ XPCOMUtils.defineLazyGetter(this, "fflush", function() {
   return fflush;
 });
 
+// pid_t getpid(void);
+XPCOMUtils.defineLazyGetter(this, "getpid", function() {
+  var getpid = libc.declare(
+    "getpid", ctypes.default_abi, pid_t
+  );
+
+  if (!getpid)
+    throw "getpid is unavailable";
+
+  return getpid;
+});
+
 var LibC = {
   stderr: this.fdopen(2, "a"),
 
   FILE: FILE,
+  pid_t: pid_t,
+
   fdopen: fdopen,
   puts: puts,
   fputs: fputs,
   fflush: fflush,
+  getpid: getpid,
 }
diff --git a/src/modules/LibGObject.js b/src/modules/LibGObject.js
index 0c3c8af..787ccf2 100644
--- a/src/modules/LibGObject.js
+++ b/src/modules/LibGObject.js
@@ -56,11 +56,11 @@ XPCOMUtils.defineLazyGetter(this, "libgobject", function() {
 });
 
 XPCOMUtils.defineLazyGetter(this, "GCallback", function() {
-  return ctypes.voidptr_t;
+  return ctypes.void_t.ptr;
 });
 
 XPCOMUtils.defineLazyGetter(this, "gpointer", function() {
-  return ctypes.voidptr_t;
+  return ctypes.void_t.ptr;
 });
 
 XPCOMUtils.defineLazyGetter(this, "gulong", function() {
@@ -139,6 +139,69 @@ XPCOMUtils.defineLazyGetter(this, "g_object_unref", function() {
   return g_object_unref;
 });
 
+
+XPCOMUtils.defineLazyGetter(this, "GFunc", function() {
+  return ctypes.void_t.ptr;
+});
+
+// intended for g_list_foreach.
+/* NOTE: if we needed more/different args, we'd need to implement another
+   FunctionType */
+XPCOMUtils.defineLazyGetter(this, "GFunc_t", function() {
+  var GFunc_t = ctypes.FunctionType(
+    ctypes.default_abi, ctypes.void_t,
+    [gpointer]
+  ).ptr;
+  if (!GFunc_t)
+    throw "GFunc_t is unavailable";
+
+  return GFunc_t;
+});
+
+XPCOMUtils.defineLazyGetter(this, "GList", function() {
+  return ctypes.StructType("GList");
+});
+
+// void                g_list_free                         (GList *list);
+XPCOMUtils.defineLazyGetter(this, "g_list_free", function() {
+  var g_list_free = libgobject.declare(
+    "g_list_free", ctypes.default_abi, ctypes.void_t,
+    GList.ptr
+  );
+
+  if (!g_list_free)
+    throw "g_list_free is unavailable";
+
+  return g_list_free;
+});
+
+// guint               g_list_length                       (GList *list);
+XPCOMUtils.defineLazyGetter(this, "g_list_length", function() {
+  var g_list_length = libgobject.declare(
+    "g_list_length", ctypes.default_abi, guint,
+    GList.ptr
+  );
+
+  if (!g_list_length)
+    throw "g_list_length is unavailable";
+
+  return g_list_length;
+});
+
+XPCOMUtils.defineLazyGetter(this, "g_list_foreach", function() {
+  var g_list_foreach = libgobject.declare(
+    "g_list_foreach", ctypes.default_abi, ctypes.void_t,
+    GList.ptr,
+    GFunc, // func
+    gpointer // user_data
+  );
+
+  if (!g_list_foreach)
+    throw "g_list_foreach is unavailable";
+
+  return g_list_foreach;
+});
+
 var LibGObject = {
   GCallback: GCallback,
   GCallbackFunction: GCallbackFunction,
@@ -156,5 +219,12 @@ var LibGObject = {
   g_signal_connect: function(instance, detailed_signal, handler, data) {
       return g_signal_connect_data(instance, detailed_signal,
                                    handler, data, null, 0);
-  }
+  },
+
+  GList: GList,
+  GFunc: GFunc,
+  GFunc_t: GFunc_t,
+  g_list_free: g_list_free,
+  g_list_length: g_list_length,
+  g_list_foreach: g_list_foreach,
 };
diff --git a/src/modules/LibGdkWindow.js b/src/modules/LibGdkWindow.js
new file mode 100644
index 0000000..900a234
--- /dev/null
+++ b/src/modules/LibGdkWindow.js
@@ -0,0 +1,201 @@
+/* -*- 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 messagingmenu-extension
+ *
+ * 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>
+ *
+ * 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 = ["LibGdkWindow"];
+
+const LIB_GDKWINDOW = "libgdk-x11-2.0.so.0";
+
+const Cu = Components.utils;
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+Cu.import("resource://gre/modules/ctypes.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://moztray/LibGObject.js");
+
+XPCOMUtils.defineLazyGetter(this, "libgdkwindow", function() {
+  var libgdkwindow = ctypes.open(LIB_GDKWINDOW);
+  if (!libgdkwindow)
+    throw "libgdkwindow is unavailable";
+
+  return libgdkwindow;
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkWindow", function() {
+  return ctypes.StructType("GdkWindow");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkVisual", function() {
+  return ctypes.StructType("GdkVisual");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkColormap", function() {
+  return ctypes.StructType("GdkColormap");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkWindowType", function() {
+  return ctypes.StructType("GdkWindowType");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkCursor", function() {
+  return ctypes.StructType("GdkCursor");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkWindowTypeHint", function() {
+  return ctypes.StructType("GdkWindowTypeHint");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkWindowClass", function() {
+  return ctypes.StructType("GdkWindowClass");
+});
+
+XPCOMUtils.defineLazyGetter(this, "GdkWindowAttributes", function() {
+  return ctypes.StructType("GdkWindowAttributes",
+                           [ { "title": LibGObject.gchar },
+                             { "event_mask": LibGObject.gint },
+                             { "x": LibGObject.gint },
+                             { "y": LibGObject.gint },
+                             { "width": LibGObject.gint },
+                             { "height": LibGObject.gint },
+                             { "wclass": LibGObject.gint },
+                             { "visual": GdkVisual.ptr },
+                             { "colormap": GdkColormap.ptr },
+                             { "window_type": LibGObject.gint },
+                             { "cursor": GdkCursor.ptr },
+                             { "wmclass_name": LibGObject.gchar },
+                             { "wmclass_class": LibGObject.gchar },
+                             { "override_redirect": LibGObject.gboolean },
+                             { "type_hint": LibGObject.gint }]);
+});
+
+XPCOMUtils.defineLazyGetter(this, "gdk_window_new", function() {
+  var gdk_window_new =
+    libgdkwindow.declare("gdk_window_new",
+                         ctypes.default_abi,
+                         GdkWindow.ptr,
+                         GdkWindow.ptr,
+                         GdkWindowAttributes.ptr,
+                         LibGObject.gint);
+
+  if (!gdk_window_new)
+    throw "gdk_window_new is unavailable";
+
+  return gdk_window_new;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gdk_window_destroy", function() {
+  var gdk_window_destroy =
+    libgdkwindow.declare("gdk_window_destroy",
+                         ctypes.default_abi,
+                         ctypes.void_t,
+                         GdkWindow.ptr);
+
+  if (!gdk_window_destroy)
+    throw "gdk_window_destroy is unavailable";
+
+  return gdk_window_destroy;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gdk_x11_window_set_user_time", function() {
+  var gdk_x11_window_set_user_time =
+    libgdkwindow.declare("gdk_x11_window_set_user_time",
+                         ctypes.default_abi,
+                         ctypes.void_t,
+                         GdkWindow.ptr,
+                         LibGObject.guint32);
+
+  if (!gdk_x11_window_set_user_time)
+    throw "gdk_x11_window_set_user_time is unavailable";
+
+  return gdk_x11_window_set_user_time;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gdk_window_hide", function() {
+  var gdk_window_hide =
+    libgdkwindow.declare("gdk_window_hide",
+                         ctypes.default_abi,
+                         ctypes.void_t,
+                         GdkWindow.ptr);
+
+  if (!gdk_window_hide)
+    throw "gdk_window_hide is unavailable";
+
+  return gdk_window_hide;
+});
+
+
+XPCOMUtils.defineLazyGetter(this, "GdkScreen", function() {
+  return ctypes.StructType("GdkScreen");
+});
+
+// GdkScreen *         gdk_screen_get_default              (void);
+XPCOMUtils.defineLazyGetter(this, "gdk_screen_get_default", function() {
+  var gdk_screen_get_default =
+    libgdkwindow.declare("gdk_screen_get_default", ctypes.default_abi, GdkScreen.ptr);
+
+  if (!gdk_screen_get_default)
+    throw "gdk_screen_get_default is unavailable";
+
+  return gdk_screen_get_default;
+});
+
+// GList *             gdk_screen_get_toplevel_windows     (GdkScreen *screen);
+XPCOMUtils.defineLazyGetter(this, "gdk_screen_get_toplevel_windows", function() {
+  var gdk_screen_get_toplevel_windows = libgdkwindow.declare(
+    "gdk_screen_get_toplevel_windows", ctypes.default_abi, LibGObject.GList.ptr,
+    GdkScreen.ptr
+  );
+
+  if (!gdk_screen_get_toplevel_windows)
+    throw "gdk_screen_get_toplevel_windows is unavailable";
+
+  return gdk_screen_get_toplevel_windows;
+});
+
+var LibGdkWindow = {
+  GdkWindow: GdkWindow,
+  GdkWindowAttributes: GdkWindowAttributes,
+  GdkX11WindowSetUserTime: gdk_x11_window_set_user_time,
+  GdkWindowNew: gdk_window_new,
+  GdkWindowDestroy: gdk_window_destroy,
+  GdkWindowHide: gdk_window_hide,
+
+  GdkScreen: GdkScreen,
+  GdkScreenGetDefault: gdk_screen_get_default,
+  GdkScreenGetToplevelWindows: gdk_screen_get_toplevel_windows,
+}
diff --git a/src/modules/LibGtkStatusIcon.js b/src/modules/LibGtkStatusIcon.js
index bc46245..0d05ae9 100644
--- a/src/modules/LibGtkStatusIcon.js
+++ b/src/modules/LibGtkStatusIcon.js
@@ -15,14 +15,17 @@ var LibGtkStatusIcon = {
   init: function() {
     // If ctypes doesn't exist, try to get it
     Cu.import("resource://gre/modules/ctypes.jsm");
-      // If we still don't have ctypes, this isn't going to work...
+    // If we still don't have ctypes, this isn't going to work...
     if (typeof(ctypes) == "undefined") {
       throw ("Could not load JS-Ctypes");
     }
 
+    Cu.import("resource://moztray/LibGObject.js");
+    Cu.import("resource://moztray/LibGdkWindow.js");
+
     try {
       // Try to start up dependencies - if they fail, they'll throw
-      // exceptions. ex: GObjectLib.init();
+      // exceptions. ex: LibGObject.init();
 
       this._lib = ctypes.open(LIB_GTK);
       if (!this._lib)
@@ -47,8 +50,24 @@ var LibGtkStatusIcon = {
     // Types
     this.GtkStatusIcon = ctypes.StructType("GtkStatusIcon");
     this.GtkStatusIconRef = ctypes.PointerType(this.GtkStatusIcon);
-    this.GdkPixbuf = ctypes.StructType("GdkPixbuf");
-    this.GdkPixbufRef = ctypes.PointerType(this.GdkPixbuf);
+
+    this.GtkWindow = ctypes.StructType(
+      "GtkWindow", [
+      ]);
+
+    this.GtkStyle = ctypes.StructType("GtkStyle");
+    this.GtkRequisition = ctypes.StructType("GtkRequisition");
+    this.GtkAllocation = ctypes.StructType("GtkAllocation");
+    this.GtkWidget = ctypes.StructType("GtkWidget");
+    /* FIXME: unable to fix "struct field types must have defined and nonzero
+     * size" */
+    // this.GtkWidget.define([
+    //     { "style": this.GtkStyle.ptr },
+    //     { "requisition": this.GtkRequisition },
+    //     { "allocation": this.GtkAllocation },
+    //     { "window": LibGdkWindow.GdkWindow.ptr },
+    //     { "parent": ctypes.PointerType(ctypes.void_t) } // this.GtkWidget.ptr
+    //   ]);
 
     // Consts
     // this.INDICATOR_MESSAGES_SERVER_TYPE = "message";
@@ -69,6 +88,20 @@ var LibGtkStatusIcon = {
       ctypes.char.ptr
     );
 
+    this.gtk_window_list_toplevels = this._lib.declare(
+      "gtk_window_list_toplevels", ctypes.default_abi, LibGObject.GList.ptr
+    );
+
+    this.gtk_widget_show = this._lib.declare(
+      "gtk_widget_show", ctypes.default_abi, ctypes.void_t,
+      this.GtkWidget.ptr
+    );
+
+    this.gtk_widget_hide = this._lib.declare(
+      "gtk_widget_hide", ctypes.default_abi, ctypes.void_t,
+      this.GtkWidget.ptr
+    );
+
   }
 
 };
diff --git a/src/modules/commons.js b/src/modules/commons.js
index 45278a8..2a32eb2 100644
--- a/src/modules/commons.js
+++ b/src/modules/commons.js
@@ -6,7 +6,7 @@
  * http://developer.mozilla.org/en/XUL_School/JavaScript_Object_Management.html
  */
 
-var EXPORTED_SYMBOLS = [ "mozt", "Cc", "Ci" ];
+var EXPORTED_SYMBOLS = [ "mozt", "Cc", "Ci", "Cu" ];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
@@ -84,4 +84,32 @@ mozt.Utils = {
 
   appInfoService: Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo), // appInfoService.name.toLower
 
+  observerService: Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),
+
 };
+
+
+// var xpcomShutdownObserver = {
+// 	observe: function(subject, topic, data) {
+// 		if (topic == "xpcom-will-shutdown") {
+// 			mozt.Debug.debug('event: '
+//                        + 'subj: ' + subject
+//                        + 'topic ' + topic
+//                        + 'data ' + data);
+// 		}
+// 	},
+
+// 	get observerService() {
+// 		return Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
+// 	},
+
+// 	register: function() {
+// 		this.observerService.addObserver(this, "xpcom-will-shutdown", false);
+// 	},
+
+// 	unregister: function() {
+// 		this.observerService.removeObserver(this, "xpcom-will-shutdown");
+// 	},
+// };
+
+// xpcomShutdownObserver.register();

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