[Pkg-mozext-commits] [firetray] 25/84: * fix firetray's chat support policy handling * implement windowGetAttention(), setIconImageDefault(), setIconImageNewMail()

David Prévot taffit at moszumanska.debian.org
Sun Jul 20 01:42:43 UTC 2014


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

taffit pushed a commit to branch master
in repository firetray.

commit a10b63a8b2bfdcad4a6bc9b3b38afc3730edddae
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Sat Feb 8 22:41:47 2014 +0100

    * fix firetray's chat support policy handling
    * implement windowGetAttention(), setIconImageDefault(), setIconImageNewMail()
    
    At this stage, we must consider adapting the preferences' UI.
---
 src/modules/FiretrayHandler.jsm          | 12 +++++--
 src/modules/FiretrayMessaging.jsm        |  6 ++--
 src/modules/ctypes/winnt/user32.jsm      | 23 +++++++++++++
 src/modules/linux/FiretrayWindow.jsm     |  4 +++
 src/modules/winnt/FiretrayStatusIcon.jsm | 55 ++++++++++++++++++++++++--------
 src/modules/winnt/FiretrayWindow.jsm     | 24 ++++++++++++++
 6 files changed, 105 insertions(+), 19 deletions(-)

diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index e7abaf8..24f6a2f 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -113,7 +113,7 @@ firetray.Handler = {
     let chatIsProvided = this.isChatProvided();
     log.info('isChatProvided='+chatIsProvided);
     if (chatIsProvided) {
-      if (FIRETRAY_CHAT_SUPPORTED_OS.indexOf(this.runtimeOS) > -1) {
+      if (this.isChatSupported()) {
         Cu.import("resource://firetray/FiretrayMessaging.jsm"); // needed for existsChatAccount
         Cu.import("resource://firetray/"+this.runtimeOS+"/FiretrayChat.jsm");
         firetray.Utils.addObservers(firetray.Handler, [
@@ -163,7 +163,8 @@ firetray.Handler = {
 
   shutdown: function() {
     log.debug("Disabling Handler");
-    if (firetray.Handler.isChatProvided() && firetray.Chat.initialized)
+    if (firetray.Handler.isChatProvided() && firetray.Handler.isChatSupported()
+        && firetray.Chat.initialized)
       firetray.Chat.shutdown();
 
     if (this.inMailApp)
@@ -191,6 +192,10 @@ firetray.Handler = {
     return this.appHasChat && Services.prefs.getBoolPref("mail.chat.enabled");
   },
 
+  isChatSupported: function() {
+    return FIRETRAY_CHAT_SUPPORTED_OS.indexOf(this.runtimeOS) > -1;
+  },
+
   tryCloseLibs: function() {
     try {
       for (let libName in this.ctypesLibs) {
@@ -332,6 +337,7 @@ firetray.Handler = {
   showWindow: function(winId) {},
   activateLastWindowCb: function(gtkStatusIcon, gdkEvent, userData) {},
   getActiveWindow: function() {},
+  windowGetAttention: function(winId) {},
 
   showAllWindows: function() {
     log.debug("showAllWindows");
@@ -565,7 +571,7 @@ firetray.MailChatPrefListener = new PrefListener(
       let enableChatCond =
             (firetray.Handler.appHasChat &&
              firetray.Utils.prefService.getBoolPref("chat_icon_enable") &&
-             FIRETRAY_CHAT_SUPPORTED_OS.indexOf(this.runtimeOS) > -1);
+             firetray.Handler.isChatSupported());
       if (!enableChatCond) return;
 
       if (Services.prefs.getBoolPref("mail.chat.enabled")) {
diff --git a/src/modules/FiretrayMessaging.jsm b/src/modules/FiretrayMessaging.jsm
index dcb1d1f..a8adfaf 100644
--- a/src/modules/FiretrayMessaging.jsm
+++ b/src/modules/FiretrayMessaging.jsm
@@ -183,10 +183,10 @@ firetray.Messaging = {
           if (mailChangeTriggerFile)
             firetray.Messaging.runProcess(mailChangeTriggerFile, [newMsgCount.toString()]);
 
-          let setUrgency = firetray.Utils.prefService.getBoolPref("mail_urgency_hint");
-          if (setUrgency && (newMsgCount > currentMsgCount))
+          let getAttention = firetray.Utils.prefService.getBoolPref("mail_urgency_hint"); // FIXME: rename!
+          if (getAttention && (newMsgCount > currentMsgCount))
             for (let winId in firetray.Handler.windows)
-              firetray.Window.setUrgency(winId, true);
+              firetray.Handler.windowGetAttention(winId);
         }
       };
 
diff --git a/src/modules/ctypes/winnt/user32.jsm b/src/modules/ctypes/winnt/user32.jsm
index 3022040..8b2abbf 100644
--- a/src/modules/ctypes/winnt/user32.jsm
+++ b/src/modules/ctypes/winnt/user32.jsm
@@ -218,6 +218,29 @@ function user32_defines(lib) {
 
   lib.lazy_bind("GetWindowThreadProcessId", win32.DWORD, win32.HWND, win32.LPDWORD);
 
+  this.FLASHWINFO = ctypes.StructType("FLASHWINFO", [
+    { "cbSize": win32.UINT },
+    { "hwnd": win32.HWND },
+    { "dwFlags": win32.DWORD },
+    { "uCount": win32.UINT },
+    { "dwTimeout": win32.DWORD }
+  ]);
+  this.PFLASHWINFO = this.FLASHWINFO.ptr;
+
+  lib.lazy_bind("FlashWindow", win32.BOOL, win32.HWND, win32.BOOL);
+  lib.lazy_bind("FlashWindowEx", win32.BOOL, this.PFLASHWINFO);
+
+  this.FLASHW_STOP      = 0;
+  this.FLASHW_CAPTION   = 0x00000001;
+  this.FLASHW_TRAY      = 0x00000002;
+  this.FLASHW_ALL       =(this.FLASHW_CAPTION | this.FLASHW_TRAY);
+  this.FLASHW_TIMER     = 0x00000004;
+  this.FLASHW_TIMERNOFG = 0x0000000C;
+
+  lib.lazy_bind("SystemParametersInfoW", win32.BOOL, win32.UINT, win32.UINT, win32.PVOID, win32.UINT);
+  this.SPI_GETFOREGROUNDFLASHCOUNT = 0x2004;
+  lib.lazy_bind("GetForegroundWindow", win32.HWND);
+
 }
 
 new ctypes_library(USER32_LIBNAME, USER32_ABIS, user32_defines, this);
diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm
index 55672e6..8ba273a 100644
--- a/src/modules/linux/FiretrayWindow.jsm
+++ b/src/modules/linux/FiretrayWindow.jsm
@@ -736,6 +736,10 @@ firetray.Handler.getActiveWindow = function() {
   return activeWin;
 };
 
+firetray.Handler.windowGetAttention = function(winId) {
+  firetray.Window.setUrgency(winId, true);
+};
+
 
 /**
  * init X11 Display and handled XAtoms.
diff --git a/src/modules/winnt/FiretrayStatusIcon.jsm b/src/modules/winnt/FiretrayStatusIcon.jsm
index a0bf959..1a8f5fa 100644
--- a/src/modules/winnt/FiretrayStatusIcon.jsm
+++ b/src/modules/winnt/FiretrayStatusIcon.jsm
@@ -36,14 +36,13 @@ firetray.StatusIcon = {
   notifyIconData: null,
   hwndProxy: null,
   icons: null,
-  iconsPaths: {},
   WNDCLASS_NAME: "FireTrayHiddenWindowClass",
   WNDCLASS_ATOM: null,
 
   init: function() {
     this.loadIcons();
+    // this.defineIconNames();     // FIXME: linux-only
     this.create();
-    firetray.Handler.setIconImageNewMail(); // TESTING
 
     this.initialized = true;
     return true;
@@ -56,16 +55,37 @@ firetray.StatusIcon = {
     this.destroyIcons();
 
     this.initialized = false;
+    return true;
+  },
+
+  defineIconNames: function() { // FIXME: linux-only
+    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";
   },
 
   loadIcons: function() {
     this.icons = new ctypesMap(win32.HICON);
 
+    // the Mozilla hidden window has the default Mozilla icon
+    let hwnd_hidden_moz = user32.FindWindowW("MozillaHiddenWindowClass", null);
+    log.debug("=== hwnd_hidden_moz="+hwnd_hidden_moz);
+    this.icons.insert('app', this.getIconFromWindow(hwnd_hidden_moz));
+
     /* we'll take the first icon in the .ico file. To get the icon count in the
      file, pass ctypes.cast(ctypes.int(-1), win32.UINT); */
     for (let ico_name in FIRETRAY_ICON_CHROME_PATHS) {
       let path = firetray.Utils.chromeToPath(FIRETRAY_ICON_CHROME_PATHS[ico_name]);
-      this.iconsPaths[ico_name] = path;
       let hicon = shell32.ExtractIconW(null, path, 0);
       // ERROR_INVALID_HANDLE(6) ignored (_Reserved_ HINSTANCE hInst ?)
       this.icons.insert(ico_name, hicon);
@@ -76,6 +96,11 @@ firetray.StatusIcon = {
   destroyIcons: function() {
     let success = true, errors = [];
     let keys = this.icons.keys;
+
+    // 'app' must not get DestroyIcon'd
+    var idx_app = keys.indexOf('app');
+    if (idx_app > -1) keys.splice(idx_app, 1);
+
     for (let i=0, len=keys.length; i<len; ++i) {
       let ico_name = keys[i];
       let res = user32.DestroyIcon(this.icons.get(ico_name));
@@ -85,6 +110,8 @@ firetray.StatusIcon = {
         errors.push(ctypes.winLastError);
       success = success && res;
     }
+    this.icons.remove('app');
+
     if (!success) {
       log.error("Couldn't destroy all icons: "+errors);
     } else {
@@ -95,15 +122,11 @@ firetray.StatusIcon = {
   create: function() {
     let hwnd_hidden = this.createProxyWindow();
 
-    // the Mozilla hidden window has the default Mozilla icon
-    let hwnd_hidden_moz = user32.FindWindowW("MozillaHiddenWindowClass", null);
-    log.debug("=== hwnd_hidden_moz="+hwnd_hidden_moz);
-
     nid = new shell32.NOTIFYICONDATAW();
     nid.cbSize = shell32.NOTIFYICONDATAW_SIZE();
     log.debug("SIZE="+nid.cbSize);
     nid.szTip = firetray.Handler.appName;
-    nid.hIcon = this.getIconFromWindow(hwnd_hidden_moz);
+    nid.hIcon = this.icons.get('app');
     nid.hWnd = hwnd_hidden;
     nid.uCallbackMessage = firetray.Win32.WM_TRAYMESSAGE;
     nid.uFlags = shell32.NIF_ICON | shell32.NIF_MESSAGE | shell32.NIF_TIP;
@@ -167,6 +190,7 @@ firetray.StatusIcon = {
         break;
       case win32.WM_RBUTTONUP:
         log.debug("WM_RBUTTONUP");
+        firetray.Handler.windowGetAttention(); // TESTING
         break;
       case win32.WM_CONTEXTMENU:
         log.debug("WM_CONTEXTMENU");
@@ -221,19 +245,24 @@ firetray.StatusIcon = {
     let rv = shell32.Shell_NotifyIconW(shell32.NIM_DELETE, this.notifyIconData.address());
     log.debug("Shell_NotifyIcon DELETE="+rv+" winLastError="+ctypes.winLastError);
     this.destroyProxyWindow();
+  },
+
+  setImageFromIcon: function(icoName) {
+    let nid = firetray.StatusIcon.notifyIconData;
+    nid.hIcon = firetray.StatusIcon.icons.get(icoName);
+    rv = shell32.Shell_NotifyIconW(shell32.NIM_MODIFY, nid.address());
+    log.debug("Shell_NotifyIcon MODIFY="+rv+" winLastError="+ctypes.winLastError);
   }
 
 }; // firetray.StatusIcon
 
 firetray.Handler.setIconImageDefault = function() {
   log.debug("setIconImageDefault");
+  firetray.StatusIcon.setImageFromIcon('app');
 };
 
 firetray.Handler.setIconImageNewMail = function() {
-  let nid = firetray.StatusIcon.notifyIconData;
-  nid.hIcon = firetray.StatusIcon.icons.get('mail-unread');
-  rv = shell32.Shell_NotifyIconW(shell32.NIM_MODIFY, nid.address());
-  log.debug("Shell_NotifyIcon MODIFY="+rv+" winLastError="+ctypes.winLastError);
+  firetray.StatusIcon.setImageFromIcon('mail-unread');
 };
 
 // firetray.Handler.setIconImageFromFile = firetray.StatusIcon.setIconImageFromFile;
@@ -244,7 +273,7 @@ firetray.Handler.setIconTooltip = function(toolTipStr) {
 firetray.Handler.setIconTooltipDefault = function() {
 };
 
-firetray.Handler.setIconText = function(text, color) { // FIXME: function too long
+firetray.Handler.setIconText = function(text, color) {
 };
 
 firetray.Handler.setIconVisibility = function(visible) {
diff --git a/src/modules/winnt/FiretrayWindow.jsm b/src/modules/winnt/FiretrayWindow.jsm
index 3076ea9..f0c8ee7 100644
--- a/src/modules/winnt/FiretrayWindow.jsm
+++ b/src/modules/winnt/FiretrayWindow.jsm
@@ -183,3 +183,27 @@ firetray.Handler.showWindow = function(wid) {
 firetray.Handler.hideWindow = function(wid) {
   return firetray.Window.setVisibility(wid, false);
 };
+
+firetray.Handler.windowGetAttention = function(wid) { // see nsWindow.cpp
+  for (var first in this.windows) break;
+  wid = wid || first;
+  let hwnd = firetray.Win32.hexStrToHwnd(wid);
+  let fgWnd = user32.GetForegroundWindow();
+  log.debug(hwnd+" === "+fgWnd);
+  if (firetray.js.strEquals(hwnd, fgWnd) ||
+      !this.windows[wid].visible)
+    return;
+
+  let defaultCycleCount = new win32.DWORD;
+  user32.SystemParametersInfoW(user32.SPI_GETFOREGROUNDFLASHCOUNT, 0,
+                               defaultCycleCount.address(), 0);
+  log.debug("defaultCycleCount="+defaultCycleCount);
+
+  let flashInfo = new user32.FLASHWINFO;
+  flashInfo.cbSize = user32.FLASHWINFO.size;
+  flashInfo.hwnd = hwnd;
+  flashInfo.dwFlags = user32.FLASHW_ALL;
+  flashInfo.uCount = defaultCycleCount;
+  flashInfo.dwTimeout = 0;
+  user32.FlashWindowEx(flashInfo.address());
+};

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