[Pkg-mozext-commits] [firetray] 281/399: * fix non-import of IM stuff in Firefox * add minimal tooltip for Chat icon * fix findActiveWindow() — gtk_window_is_active() not reliable

David Prévot taffit at alioth.debian.org
Tue Oct 29 18:23:59 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 5c12abb1ee5c3eb55905e11aa3a1d47dcd1d2f92
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Sat Aug 25 19:02:14 2012 +0200

    * fix non-import of IM stuff in Firefox
    * add minimal tooltip for Chat icon
    * fix findActiveWindow() — gtk_window_is_active() not reliable
---
 src/modules/FiretrayHandler.jsm            |    2 --
 src/modules/FiretrayInstantMessaging.jsm   |   28 ++++++++++----------------
 src/modules/FiretrayMessaging.jsm          |    7 +------
 src/modules/ctypes/linux/gobject.jsm       |    4 +++-
 src/modules/ctypes/linux/gtk.jsm           |    2 ++
 src/modules/linux/FiretrayIMStatusIcon.jsm |   12 ++++++++++-
 src/modules/linux/FiretrayWindow.jsm       |   30 ++++++++++++++++++----------
 7 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index 36ef9a1..de531ad 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -31,7 +31,6 @@ firetray.Handler = {
   initialized: false,
   inBrowserApp: false,
   inMailApp: false,
-  isIMEnabled: false,
   appStarted: false,
   windows: {},
   windowsCount: 0,
@@ -39,7 +38,6 @@ firetray.Handler = {
   observedTopics: {},
   ctypesLibs: {},               // {"lib1": lib1, "lib2": lib2}
 
-
   appId:      (function(){return Services.appinfo.ID;})(),
   appName:    (function(){return Services.appinfo.name;})(),
   appStartupTopic: null,
diff --git a/src/modules/FiretrayInstantMessaging.jsm b/src/modules/FiretrayInstantMessaging.jsm
index 41730b7..57b3795 100644
--- a/src/modules/FiretrayInstantMessaging.jsm
+++ b/src/modules/FiretrayInstantMessaging.jsm
@@ -60,8 +60,6 @@ firetray.InstantMessaging = {
 
       let convIsActiveTabInActiveWin = this.isConvActiveTabInActiveWindow(conv);
       F.LOG("convIsActiveTabInActiveWin="+convIsActiveTabInActiveWin);
-      let [unreadTargettedCount, unreadTotalCount] = this.countUnreadMessages();
-      F.LOG("unreadTotalCount="+unreadTotalCount);
       if (!convIsActiveTabInActiveWin) { // don't blink when conv tab already on top
         this.acknowledgeOnFocus.must = true;
         this.acknowledgeOnFocus.conv = conv;
@@ -73,7 +71,12 @@ firetray.InstantMessaging = {
       let unreadMsgCount = data;
       if (unreadMsgCount == 0)
         this.stopIconBlinkingMaybe();
-      // FIXME: setToolTip
+
+      let localizedTooltip = PluralForm.get(
+        unreadMsgCount,
+        firetray.Utils.strings.GetStringFromName("tooltip.unread_messages"))
+        .replace("#1", unreadMsgCount);
+      firetray.IMStatusIcon.setIconTooltip(localizedTooltip);
       break;
 
     default:
@@ -82,9 +85,12 @@ firetray.InstantMessaging = {
   },
 
   stopIconBlinkingMaybe: function() {
-    F.WARN("acknowledgeOnFocus.must="+this.acknowledgeOnFocus.must);
+    F.LOG("acknowledgeOnFocus.must="+this.acknowledgeOnFocus.must);
+    // if (!this.acknowledgeOnFocus.must) return;
+
     let convIsActiveTabInActiveWin = this.isConvActiveTabInActiveWindow(
       this.acknowledgeOnFocus.conv);
+    F.LOG("convIsActiveTabInActiveWin="+convIsActiveTabInActiveWin);
 
     if (this.acknowledgeOnFocus.must && convIsActiveTabInActiveWin) {
       firetray.IMStatusIcon.setIconBlinking(false);
@@ -95,7 +101,7 @@ firetray.InstantMessaging = {
   isConvActiveTabInActiveWindow: function(conv) {
     let activeWin = firetray.Handler.findActiveWindow(),
         activeChatTab = null;
-    if (!activeWin) return false;
+    if (!firetray.Handler.windows[activeWin]) return false;
 
     activeChatTab = this.findActiveChatTab(activeWin);
     let convNameRegex = new RegExp(" - "+conv.name+"$");
@@ -111,18 +117,6 @@ firetray.InstantMessaging = {
     return null;
   },
 
-  // lifted from chat-messenger-overlay.js
-  countUnreadMessages: function() {
-    let convs = Services.conversations.getUIConversations();
-    let unreadTargettedCount = 0;
-    let unreadTotalCount = 0;
-    for each (let conv in convs) {
-      unreadTargettedCount += conv.unreadTargetedMessageCount;
-      unreadTotalCount += conv.unreadIncomingMessageCount;
-    }
-    return [unreadTargettedCount, unreadTotalCount];
-  },
-
   updateIcon: function() {
     let userStatus = Services.core.globalUserStatus.statusType;
     F.LOG("IM status="+userStatus);
diff --git a/src/modules/FiretrayMessaging.jsm b/src/modules/FiretrayMessaging.jsm
index e6c05d3..effb594 100644
--- a/src/modules/FiretrayMessaging.jsm
+++ b/src/modules/FiretrayMessaging.jsm
@@ -44,11 +44,8 @@ firetray.Messaging = {
                                                that.mailSessionListener.notificationFlags);
 
     // FIXME: add im-icon pref
-    // FIXME: watch out account-added !!
-    if (Services.prefs.getBoolPref("mail.chat.enabled") && this.existsIMAccount()) {
+    if (Services.prefs.getBoolPref("mail.chat.enabled") && this.existsIMAccount())
       firetray.InstantMessaging.init();
-      firetray.Handler.isIMEnabled = true;
-    }
 
     this.initialized = true;
   },
@@ -89,12 +86,10 @@ firetray.Messaging = {
       this.cleanExcludedAccounts();
       if (subject.QueryInterface(Ci.imIAccount) && !this.existsIMAccount())
         firetray.InstantMessaging.shutdown();
-      // FIXME: clean InstantMessaging.accounts or just update (?)
       break;
     case "account-added":
       if (subject.QueryInterface(Ci.imIAccount) && !firetray.InstantMessaging.initialized)
         firetray.InstantMessaging.init();
-      // FIXME: clean InstantMessaging.accounts or just update (?)
       break;
     default:
       F.WARN("unhandled topic: "+topic);
diff --git a/src/modules/ctypes/linux/gobject.jsm b/src/modules/ctypes/linux/gobject.jsm
index ddd3be3..6362c20 100644
--- a/src/modules/ctypes/linux/gobject.jsm
+++ b/src/modules/ctypes/linux/gobject.jsm
@@ -1,4 +1,4 @@
-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* -*- 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
  *
@@ -152,6 +152,8 @@ function gobject_defines(lib) {
   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 */
 }
 
 new ctypes_library(GOBJECT_LIBNAME, GOBJECT_ABIS, gobject_defines, this);
diff --git a/src/modules/ctypes/linux/gtk.jsm b/src/modules/ctypes/linux/gtk.jsm
index 60f3670..962c183 100644
--- a/src/modules/ctypes/linux/gtk.jsm
+++ b/src/modules/ctypes/linux/gtk.jsm
@@ -116,6 +116,8 @@ function gtk_defines(lib) {
   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_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_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);
diff --git a/src/modules/linux/FiretrayIMStatusIcon.jsm b/src/modules/linux/FiretrayIMStatusIcon.jsm
index 008c7d3..9e10547 100644
--- a/src/modules/linux/FiretrayIMStatusIcon.jsm
+++ b/src/modules/linux/FiretrayIMStatusIcon.jsm
@@ -43,6 +43,7 @@ firetray.IMStatusIcon = {
     this.trayIcon = gtk.gtk_status_icon_new();
     this.loadThemedIcons();
     this.setIconImage(FIRETRAY_IM_STATUS_OFFLINE);
+    this.setIconTooltipDefault();
 
     this.initialized = true;
     return true;
@@ -81,7 +82,16 @@ firetray.IMStatusIcon = {
     gtk.gtk_status_icon_set_blinking(this.trayIcon, blink);
   },
 
-  /* we could also use x11.FocusIn... just wanted to try a different method */
+  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");
+  },
+
   attachOnFocusInCallback: function(xid) {
     F.LOG("attachOnFocusInCallback xid="+xid);
     this.callbacks.onFocusIn[xid] = gtk.GCallbackWidgetFocuEvent_t(firetray.IMStatusIcon.onFocusIn);
diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm
index 2c54ddc..090ddc0 100644
--- a/src/modules/linux/FiretrayWindow.jsm
+++ b/src/modules/linux/FiretrayWindow.jsm
@@ -595,8 +595,7 @@ firetray.Handler.registerWindow = function(win) {
     this.windows[xid].filterWindowCb = gdk.GdkFilterFunc_t(firetray.Window.filterWindow);
     gdk.gdk_window_add_filter(gdkWin, this.windows[xid].filterWindowCb, null);
 
-    // FIXME: isn't it (c)leaner to do it in x11 window filter ?
-    if (firetray.Handler.isIMEnabled) {
+    if (firetray.Handler.inMailApp && firetray.InstantMessaging.initialized) { // missing import ok
       Cu.import("resource://firetray/linux/FiretrayIMStatusIcon.jsm");
       firetray.IMStatusIcon.attachOnFocusInCallback(xid);
     }
@@ -662,17 +661,26 @@ firetray.Handler.activateLastWindow = function(gtkStatusIcon, gdkEvent, userData
   return stopPropagation;
 };
 
+/* gtk_window_is_active() not reliable */
 firetray.Handler.findActiveWindow = function() {
+  let rootWin = x11.XDefaultRootWindow(x11.current.Display);
+  let [propsFound, nitems] =
+    firetray.Window.getXWindowProperties(rootWin, x11.current.Atoms._NET_ACTIVE_WINDOW);
+
+  F.LOG("ACTIVE_WINDOW propsFound, nitems="+propsFound+", "+nitems);
+  if (!propsFound) return null;
+
   let activeWin = null;
-  for (let xid in firetray.Handler.windows) {
-    let gtkWin = firetray.Handler.gtkWindows.get(xid);
-    let isActive = gtk.gtk_window_is_active(gtkWin);
-    F.LOG(xid+" is active="+isActive);
-    if (isActive) {
-      activeWin = xid;
-      break;
-    }
-  }
+  if (firetray.js.strEquals(nitems.value, 0))
+    F.WARN("active window not found");
+  else if (firetray.js.strEquals(nitems.value, 1))
+    activeWin = propsFound.contents[0];
+  else
+    throw new RangeError("more than one active window found");
+
+  x11.XFree(propsFound);
+
+  F.LOG("ACTIVE_WINDOW="+activeWin);
   return activeWin;
 };
 

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