[Pkg-mozext-commits] [firetray] 06/84: * a step forward: actually create the icon (Shell_NotifyIcon) * cleaning
David Prévot
taffit at moszumanska.debian.org
Sun Jul 20 01:42:41 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 02e849c602ba324731c87cc4464c9ce341fbeaa8
Author: foudfou <foudil.newbie+git at gmail.com>
Date: Sun Nov 17 23:11:17 2013 +0100
* a step forward: actually create the icon (Shell_NotifyIcon)
* cleaning
The icon gets created but GetLastError always returns
ERROR_INVALID_WINDOW_HANDLE, at least under win7.
We should be fine with callbacks' ABI as they are defined outside ctypes-utils.
---
src/modules/ctypes/ctypes-utils.jsm | 2 +-
src/modules/ctypes/winnt/kernel32.jsm | 43 +++---
src/modules/ctypes/winnt/shell32.jsm | 47 +++---
src/modules/ctypes/winnt/user32.jsm | 53 +++++--
src/modules/ctypes/winnt/{types.jsm => win32.jsm} | 22 ++-
src/modules/winnt/FiretrayWindow.jsm | 171 +++++++---------------
6 files changed, 171 insertions(+), 167 deletions(-)
diff --git a/src/modules/ctypes/ctypes-utils.jsm b/src/modules/ctypes/ctypes-utils.jsm
index c6b951e..b9a8c66 100644
--- a/src/modules/ctypes/ctypes-utils.jsm
+++ b/src/modules/ctypes/ctypes-utils.jsm
@@ -36,7 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
-var EXPORTED_SYMBOLS = [ "ctypes_library", "is64bit" ];
+var EXPORTED_SYMBOLS = [ "ctypes_library", "is64bit", "WinCbABI" ];
const Cu = Components.utils;
diff --git a/src/modules/ctypes/winnt/kernel32.jsm b/src/modules/ctypes/winnt/kernel32.jsm
index 4495e19..6fe2cce 100644
--- a/src/modules/ctypes/winnt/kernel32.jsm
+++ b/src/modules/ctypes/winnt/kernel32.jsm
@@ -7,30 +7,39 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/ctypes.jsm");
Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/winnt/types.jsm");
+Cu.import("resource://firetray/ctypes/winnt/win32.jsm");
function kernel32_defines(lib) {
this.OSVERSIONINFOEXW = ctypes.StructType("OSVERSIONINFOEXW", [
- { "dwOSVersionInfoSize": win_t.DWORD },
- { "dwMajorVersion": win_t.DWORD },
- { "dwMinorVersion": win_t.DWORD },
- { "dwBuildNumber": win_t.DWORD },
- { "dwPlatformId": win_t.DWORD },
- { "szCSDVersion": ctypes.ArrayType(win_t.TCHAR, 128) },
- { "wServicePackMajor": win_t.WORD },
- { "wServicePackMinor": win_t.WORD },
- { "wSuiteMask": win_t.WORD },
- { "wProductType": win_t.BYTE },
- { "wReserved": win_t.BYTE }
+ { "dwOSVersionInfoSize": win32.DWORD },
+ { "dwMajorVersion": win32.DWORD },
+ { "dwMinorVersion": win32.DWORD },
+ { "dwBuildNumber": win32.DWORD },
+ { "dwPlatformId": win32.DWORD },
+ { "szCSDVersion": ctypes.ArrayType(win32.TCHAR, 128) },
+ { "wServicePackMajor": win32.WORD },
+ { "wServicePackMinor": win32.WORD },
+ { "wSuiteMask": win32.WORD },
+ { "wProductType": win32.BYTE },
+ { "wReserved": win32.BYTE }
]);
- // lib.lazy_bind("GetLastError", win_t.DWORD); // use ctypes.winLastError instead
- lib.lazy_bind("GetVersionExW", win_t.BOOL, this.OSVERSIONINFOEXW.ptr);
- lib.lazy_bind("GetConsoleWindow", win_t.HWND);
- lib.lazy_bind("GetConsoleTitleW", win_t.DWORD, win_t.LPTSTR, win_t.DWORD);
- lib.lazy_bind("GetModuleHandleW", win_t.HMODULE, win_t.LPCTSTR);
+ // lib.lazy_bind("GetLastError", win32.DWORD); // use ctypes.winLastError instead
+ lib.lazy_bind("GetVersionExW", win32.BOOL, this.OSVERSIONINFOEXW.ptr);
+ lib.lazy_bind("GetConsoleWindow", win32.HWND);
+ lib.lazy_bind("GetConsoleTitleW", win32.DWORD, win32.LPTSTR, win32.DWORD);
+ lib.lazy_bind("GetModuleHandleW", win32.HMODULE, win32.LPCTSTR);
}
new ctypes_library(KERNEL32_LIBNAME, KERNEL32_ABIS, kernel32_defines, this);
+
+
+let osvi = new kernel32.OSVERSIONINFOEXW();
+osvi.dwOSVersionInfoSize = kernel32.OSVERSIONINFOEXW.size;
+if (kernel32.GetVersionExW(osvi.address())) {
+ win32.WINVER = osvi.dwMajorVersion*10 + osvi.dwMinorVersion;
+} else {
+ Cu.ReportError("win version not found");
+}
diff --git a/src/modules/ctypes/winnt/shell32.jsm b/src/modules/ctypes/winnt/shell32.jsm
index a07f0a2..ed7118f 100644
--- a/src/modules/ctypes/winnt/shell32.jsm
+++ b/src/modules/ctypes/winnt/shell32.jsm
@@ -7,10 +7,35 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/ctypes.jsm");
Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/winnt/types.jsm");
+Cu.import("resource://firetray/ctypes/winnt/win32.jsm");
function shell32_defines(lib) {
+ this.NOTIFYICONDATAW = ctypes.StructType("NOTIFYICONDATAW", [
+ { "cbSize": win32.DWORD },
+ { "hWnd": win32.HWND },
+ { "uID": win32.UINT },
+ { "uFlags": win32.UINT },
+ { "uCallbackMessage": win32.UINT },
+ { "hIcon": win32.HICON },
+ { "szTip": ctypes.ArrayType(win32.TCHAR, 64) }, // 128 on win2k+
+ { "dwState": win32.DWORD },
+ { "dwStateMask": win32.DWORD },
+ { "szInfo": ctypes.ArrayType(win32.TCHAR, 256) },
+ { "uTimeoutOrVersion": win32.UINT }, // union
+ { "szInfoTitle": ctypes.ArrayType(win32.TCHAR, 64) },
+ { "dwInfoFlags": win32.DWORD },
+ { "guidItem": win32.GUID },
+ { "hBalloonIcon": win32.HICON }
+ ]);
+ this.NOTIFY_VERSION = 3; // 2K+
+ this.NOTIFYICON_VERSION_4 = 4; // Vista+
+ this.NOTIFYICONDATA_V1_SIZE = 88;
+ this.NOTIFYICONDATA_V2_SIZE = 488; // 2K
+ this.NOTIFYICONDATA_V3_SIZE = 504; // XP
+
+ lib.lazy_bind("Shell_NotifyIconW", win32.BOOL, win32.DWORD, this.NOTIFYICONDATAW.ptr);
+
// notify icon message
this.NIM_ADD = 0x00000000;
this.NIM_MODIFY = 0x00000001;
@@ -28,26 +53,6 @@ function shell32_defines(lib) {
this.NIF_REALTIME = 0x00000040;
this.NIF_SHOWTIP = 0x00000080;
- this.NOTIFYICONDATAW = ctypes.StructType("NOTIFYICONDATAW", [
- { "cbSize": win_t.DWORD },
- { "hWnd": win_t.HWND },
- { "uID": win_t.UINT },
- { "uFlags": win_t.UINT },
- { "uCallbackMessage": win_t.UINT },
- { "hIcon": win_t.HICON },
- { "szTip": ctypes.ArrayType(win_t.TCHAR, 64) }, // 128 on win2k+
- { "dwState": win_t.DWORD },
- { "dwStateMask": win_t.DWORD },
- { "szInfo": ctypes.ArrayType(win_t.TCHAR, 256) },
- { "uTimeoutOrVersion": win_t.UINT }, // union
- { "szInfoTitle[64]": win_t.TCHAR },
- { "dwInfoFlags": win_t.DWORD },
- { "guidItem": win_t.GUID },
- { "hBalloonIcon": win_t.HICON }
- ]);
-
- lib.lazy_bind("Shell_NotifyIconW", win_t.BOOL, win_t.DWORD, this.NOTIFYICONDATAW.ptr);
-
}
new ctypes_library(SHELL32_LIBNAME, SHELL32_ABIS, shell32_defines, this);
diff --git a/src/modules/ctypes/winnt/user32.jsm b/src/modules/ctypes/winnt/user32.jsm
index 9d04b56..6964314 100644
--- a/src/modules/ctypes/winnt/user32.jsm
+++ b/src/modules/ctypes/winnt/user32.jsm
@@ -7,29 +7,47 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/ctypes.jsm");
Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
-Cu.import("resource://firetray/ctypes/winnt/types.jsm");
+Cu.import("resource://firetray/ctypes/winnt/win32.jsm");
function user32_defines(lib) {
- lib.lazy_bind("GetWindowTextW", ctypes.int, win_t.HWND, win_t.LPTSTR, ctypes.int);
- lib.lazy_bind("FindWindowW", win_t.HWND, win_t.LPCTSTR, win_t.LPCTSTR);
+ this.CHANGEFILTERSTRUCT = ctypes.StructType("CHANGEFILTERSTRUCT", [
+ { "cbSize": win32.DWORD },
+ { "ExtStatus": win32.DWORD }
+ ]);
+ this.MSGFLTINFO_NONE = 0;
+ this.MSGFLTINFO_ALLOWED_HIGHER = 3;
+ this.MSGFLTINFO_ALREADYALLOWED_FORWND = 1;
+ this.MSGFLTINFO_ALREADYDISALLOWED_FORWND = 2;
- lib.lazy_bind("SendMessageW", win_t.LRESULT, win_t.HWND, win_t.UINT, win_t.WPARAM, win_t.WPARAM);
+ lib.lazy_bind("ChangeWindowMessageFilter", win32.BOOL, win32.UINT, win32.DWORD);
+ this.MSGFLT_ADD = 1;
+ this.MSGFLT_REMOVE = 2;
+ lib.lazy_bind("ChangeWindowMessageFilterEx", win32.BOOL, win32.HWND, win32.UINT, win32.DWORD, this.CHANGEFILTERSTRUCT.ptr);
+ this.MSGFLT_ALLOW = 1;
+ this.MSGFLT_DISALLOW = 2;
+ this.MSGFLT_RESET = 0;
+
+ lib.lazy_bind("RegisterWindowMessageW", win32.UINT, win32.LPCTSTR);
+ lib.lazy_bind("GetWindowTextW", ctypes.int, win32.HWND, win32.LPTSTR, ctypes.int);
+ lib.lazy_bind("FindWindowW", win32.HWND, win32.LPCTSTR, win32.LPCTSTR);
+
+ lib.lazy_bind("SendMessageW", win32.LRESULT, win32.HWND, win32.UINT, win32.WPARAM, win32.WPARAM);
this.WM_GETICON = 0x007F;
this.ICON_SMALL = 0;
this.ICON_BIG = 1;
this.ICON_SMALL2 = 2;
- lib.lazy_bind("GetClassLongPtrW", win_t.ULONG_PTR, win_t.HWND, ctypes.int);
- lib.lazy_bind("GetClassLongW", win_t.DWORD, win_t.HWND, ctypes.int); // 32-bits
+ lib.lazy_bind("GetClassLongPtrW", win32.ULONG_PTR, win32.HWND, ctypes.int);
+ lib.lazy_bind("GetClassLongW", win32.DWORD, win32.HWND, ctypes.int); // 32-bits
this.GetClassLong = is64bit ? this.GetClassLongPtrW : this.GetClassLongW;
this.GCLP_HICONSM = -34;
- lib.lazy_bind("LoadIconW", win_t.HICON, win_t.HINSTANCE, win_t.LPCTSTR); // superseeded by LoadImage
+ lib.lazy_bind("LoadIconW", win32.HICON, win32.HINSTANCE, win32.LPCTSTR); // superseeded by LoadImage
this.IDI_APPLICATION = 32512;
- lib.lazy_bind("LoadImageW", win_t.HANDLE, win_t.HINSTANCE, win_t.LPCTSTR,
- win_t.UINT, ctypes.int, ctypes.int, win_t.UINT);
+ lib.lazy_bind("LoadImageW", win32.HANDLE, win32.HINSTANCE, win32.LPCTSTR,
+ win32.UINT, ctypes.int, ctypes.int, win32.UINT);
this.LR_CREATEDIBSECTION = 0x00002000;
this.LR_DEFAULTCOLOR = 0x00000000;
this.LR_DEFAULTSIZE = 0x00000040;
@@ -40,6 +58,23 @@ function user32_defines(lib) {
this.LR_SHARED = 0x00008000;
this.LR_VGACOLOR = 0x00000080;
+ lib.lazy_bind("SetWindowLongPtrW", win32.LONG_PTR , win32.HWND, ctypes.int, win32.LONG_PTR);
+ lib.lazy_bind("SetWindowLongW", win32.LONG , win32.HWND, ctypes.int, win32.LONG);
+ this.SetWindowLong = is64bit ? this.SetWindowLongPtrW : this.SetWindowLongW;
+ this.GWL_EXSTYLE = -20;
+ this.GWLP_HINSTANCE = -6;
+ this.GWLP_ID = -12;
+ this.GWL_STYLE = -16;
+ this.GWLP_USERDATA = -21;
+ this.GWLP_WNDPROC = -4;
+
+ this.WNDPROC = ctypes.FunctionType(
+ WinCbABI, win32.LRESULT,
+ [win32.HWND, win32.UINT, win32.WPARAM, win32.LPARAM]).ptr;
+
+ lib.lazy_bind("CallWindowProcW", win32.LRESULT, this.WNDPROC, win32.HWND, win32.UINT, win32.WPARAM, win32.LPARAM);
+ lib.lazy_bind("DefWindowProcW", win32.LRESULT, win32.HWND, win32.UINT, win32.WPARAM, win32.LPARAM);
+
}
new ctypes_library(USER32_LIBNAME, USER32_ABIS, user32_defines, this);
diff --git a/src/modules/ctypes/winnt/types.jsm b/src/modules/ctypes/winnt/win32.jsm
similarity index 73%
rename from src/modules/ctypes/winnt/types.jsm
rename to src/modules/ctypes/winnt/win32.jsm
index 8f89e2b..d9e6b78 100644
--- a/src/modules/ctypes/winnt/types.jsm
+++ b/src/modules/ctypes/winnt/win32.jsm
@@ -1,4 +1,4 @@
-var EXPORTED_SYMBOLS = [ "win_t" ];
+var EXPORTED_SYMBOLS = [ "win32" ];
const Cu = Components.utils;
@@ -8,9 +8,18 @@ Cu.import("resource://firetray/ctypes/ctypes-utils.jsm");
const UINT_PTR_T = is64bit ? ctypes.uint64_t : ctypes.unsigned_int;
const LONG_PTR_T = is64bit ? ctypes.int64_t : ctypes.long;
const ULONG_PTR_T = is64bit ? ctypes.uint64_t : ctypes.unsigned_long;
-const HANDLE_T = ctypes.voidptr_t; // oder ctypes.intptr_t, ctypes.size_t,
+const HANDLE_T = ctypes.voidptr_t; // oder ctypes.intptr_t, ctypes.size_t, ctypes.int32_t ?
-var win_t = {
+var win32 = {
+
+ WIN_VERSIONS: { // maj*10 + min
+ '8': 62, // 2012
+ '7': 61, // 2009
+ 'Vista': 60, // 2007
+ 'XP': 51, // 2001
+ '2K': 50, // 2000
+ },
+ WINVER: null, // initialized in kernel32.jsm
BOOL: ctypes.bool,
BYTE: ctypes.unsigned_char,
@@ -18,6 +27,8 @@ var win_t = {
WORD: ctypes.unsigned_short,
DWORD: ctypes.unsigned_long,
PVOID: ctypes.voidptr_t,
+ LONG: ctypes.long,
+ LONG_PTR: LONG_PTR_T,
ULONG_PTR: ULONG_PTR_T,
SIZE_T: ULONG_PTR_T,
HWND: HANDLE_T,
@@ -46,6 +57,9 @@ var win_t = {
* #define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
* #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
*/
- MAKEINTRESOURCE: function(i) {return this.LPWSTR(i); }
+ MAKEINTRESOURCE: function(i) {return this.LPWSTR(i); },
+
+ ERROR_INVALID_WINDOW_HANDLE: 1400,
+ ERROR_RESOURCE_TYPE_NOT_FOUND: 1813,
};
diff --git a/src/modules/winnt/FiretrayWindow.jsm b/src/modules/winnt/FiretrayWindow.jsm
index eb6b7fe..70d6075 100644
--- a/src/modules/winnt/FiretrayWindow.jsm
+++ b/src/modules/winnt/FiretrayWindow.jsm
@@ -17,7 +17,7 @@ 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/winnt/types.jsm");
+Cu.import("resource://firetray/ctypes/winnt/win32.jsm");
Cu.import("resource://firetray/ctypes/winnt/kernel32.jsm");
Cu.import("resource://firetray/ctypes/winnt/shell32.jsm");
Cu.import("resource://firetray/ctypes/winnt/user32.jsm");
@@ -88,140 +88,81 @@ firetray.Handler.getWindowIdFromChromeWindow = firetray.Window.getXIDFromChromeW
firetray.Handler.registerWindow = function(win) {
log.debug("register window");
- // TESTING
let baseWin = firetray.Handler.getWindowInterface(win, "nsIBaseWindow");
- let nativeHandle = baseWin.nativeHandle; // Moz' private pointer to the GdkWindow
- log.info("nativeHandle="+nativeHandle);
-
- log.info("size="+ctypes.size_t.size);
- log.info("psize="+ctypes.voidptr_t.size);
- log.info("osvi size="+kernel32.OSVERSIONINFOEXW.size);
-
- let osvi = new kernel32.OSVERSIONINFOEXW();
- osvi.dwOSVersionInfoSize = kernel32.OSVERSIONINFOEXW.size;
- if (kernel32.GetVersionExW(osvi.address())) {
- log.debug("osvi.dwMajorVersion="+osvi.dwMajorVersion);
- log.debug("osvi.dwMinorVersion="+osvi.dwMinorVersion);
+ let nativeHandle = baseWin.nativeHandle;
+ let hwnd = nativeHandle ?
+ new ctypes.voidptr_t(ctypes.UInt64(nativeHandle)) :
+ user32.FindWindowW("MozillaWindowClass", win.document.title);
+ log.debug("=== hwnd="+hwnd);
+
+ // Get TaskbarCreated
+ const WM_TASKBARCREATED = user32.RegisterWindowMessageW("TaskbarCreated");
+ // We register this as well, as we cannot know which WM_USER values are already taken
+ const kTrayMessage = "_MINTRAYR_TrayMessageW";
+ const kTrayCallback = "_MINTRAYR_TrayCallbackW";
+ const WM_TRAYMESSAGE = user32.RegisterWindowMessageW(kTrayMessage);
+ const WM_TRAYCALLBACK = user32.RegisterWindowMessageW(kTrayCallback);
+ log.debug("WM_*="+WM_TASKBARCREATED+" "+WM_TRAYMESSAGE+" "+WM_TRAYCALLBACK);
+
+ /* if Administrator, accept messages from applications running in a lower
+ privilege level */
+ let rv;
+ if (win32.WINVER >= win32.WIN_VERSIONS["7"]) {
+ rv = user32.ChangeWindowMessageFilterEx(hwnd, WM_TASKBARCREATED, user32.MSGFLT_ALLOW, null);
+ log.debug("ChangeWindowMessageFilterEx res="+rv+" winLastError="+ctypes.winLastError);
+ } else if (win32.WINVER >= win32.WINVER["Vista"]) {
+ rv = user32.ChangeWindowMessageFilter(WM_TASKBARCREATED, user32.MSGFLT_ADD);
+ log.debug("ChangeWindowMessageFilter res="+rv+" winLastError="+ctypes.winLastError);
+ } else {
+ log.error("Unsupported windoz version "+win32.WINVER);
}
- /*
- * Windows 8 6.2
- * Windows 7 6.1
- * Windows Vista 6.0
- * Windows XP 5.1
- */
- let version = osvi.dwMajorVersion*10 + osvi.dwMinorVersion; // if (version >= 51)
-
let nid = new shell32.NOTIFYICONDATAW();
+ // FIXME: We should check WINVER for NOTIFYICONDATA_*_SIZE
nid.cbSize = shell32.NOTIFYICONDATAW.size;
- let hwnd = user32.FindWindowW("MozillaWindowClass", win.document.title);
- log.debug("hwnd FindWindow="+hwnd);
-
-/*
- let hwnd = new ctypes.voidptr_t(ctypes.UInt64(nativeHandle));
- log.debug("hwnd nativeHandle="+hwnd);
-*/
-
- const BUF_SIZE = 255;
- let buffer_t = ctypes.jschar.array(BUF_SIZE); // LPTSTR
-
- let title = new buffer_t();
- let len = user32.GetWindowTextW(hwnd, title, BUF_SIZE);
- log.error("errno="+ctypes.errno+" winLastError="+ctypes.winLastError);
- if (len) {
- log.info("title="+title.readString());
- }
-
-/*
- let consoleWin = kernel32.GetConsoleWindow();
+ /* string is truncate to size of buffer and null-terminated. nid.szTip is
+ initialized automatically by ctypes */
+ let nMaxCount = 127;
+ let len = user32.GetWindowTextW(hwnd, nid.szTip, nMaxCount);
log.error("errno="+ctypes.errno+" winLastError="+ctypes.winLastError);
- log.info("consoleWin="+consoleWin);
- len = user32.GetWindowTextW(consoleWin, title, 127);
- log.error("errno="+ctypes.errno+" winLastError="+ctypes.winLastError);
- log.debug("len="+len);
- log.info("title="+title.readString());
-
- len = kernel32.GetConsoleTitleW(title, win_t.DWORD(127));
- log.error("errno="+ctypes.errno+" winLastError="+ctypes.winLastError);
- log.debug("len="+len);
- log.debug("len type="+typeof(len)); // "object" ???
- if (len) {
- log.info("consoleTitle="+title.readString());
+ if (len != 0) {
+ log.info("nid.szTip="+nid.szTip.readString());
}
-*/
- let result = user32.SendMessageW(hwnd, user32.WM_GETICON, user32.ICON_SMALL, 0);
+ rv = user32.SendMessageW(hwnd, user32.WM_GETICON, user32.ICON_SMALL, 0);
// result is a ctypes.Int64. So we need to create a CData from it before
- // casting it.
- let icon = ctypes.cast(win_t.LRESULT(result), win_t.HICON);
- let NULL = win_t.HICON(null);
+ // casting it to a HICON.
+ let icon = ctypes.cast(win32.LRESULT(rv), win32.HICON);
+ let NULL = win32.HICON(null); // for comparison only
log.debug("SendMessageW winLastError="+ctypes.winLastError);
- if (firetray.js.strEquals(icon, NULL)) { // OS default icon
- result = user32.GetClassLong(hwnd, user32.GCLP_HICONSM);
- icon = ctypes.cast(win_t.ULONG_PTR(result), win_t.HICON);
+ if (firetray.js.strEquals(icon, NULL)) { // from the window class
+ rv = user32.GetClassLong(hwnd, user32.GCLP_HICONSM);
+ icon = ctypes.cast(win32.ULONG_PTR(rv), win32.HICON);
log.debug("GetClassLong winLastError="+ctypes.winLastError);
}
if (firetray.js.strEquals(icon, NULL)) { // from the first resource -> ERROR_RESOURCE_TYPE_NOT_FOUND(1813)
icon = user32.LoadIconW(kernel32.GetModuleHandleW(null),
- win_t.MAKEINTRESOURCE(0));
+ win32.MAKEINTRESOURCE(0));
log.debug("LoadIconW module winLastError="+ctypes.winLastError);
}
if (firetray.js.strEquals(icon, NULL)) { // OS default icon
- icon = user32.LoadIconW(null, win_t.MAKEINTRESOURCE(user32.IDI_APPLICATION));
+ icon = user32.LoadIconW(null, win32.MAKEINTRESOURCE(user32.IDI_APPLICATION));
log.debug("LoadIconW default winLastError="+ctypes.winLastError);
}
- log.debug("icon="+icon);
-
-// BOOL mintrayr_CreateIcon(void *handle, mouseevent_callback_t callback)
-// {
-// HWND hwnd = (HWND)handle;
-// if (!hwnd) {
-// return FALSE;
-// }
-
-// SetupWnd(hwnd);
-
-// NOTIFYICONDATAW *iconData = new(std::nothrow) NOTIFYICONDATAW;
-// if (!iconData) {
-// return FALSE;
-// }
-// // Init the icon data according to MSDN
-// iconData->cbSize = sizeof(NOTIFYICONDATAW);
-
-// // Copy the title
-// if (GetWindowText(hwnd, iconData->szTip, 127)) {
-// iconData->szTip[127] = '\0'; // Better be safe than sorry :p
-// }
-// else{
-// iconData->szTip[0] = '\0';
-// }
-
-// // Get the window icon
-// HICON icon = reinterpret_cast<HICON>(::SendMessageW(hwnd, WM_GETICON, ICON_SMALL, 0));
-// if (icon == 0) {
-// // Alternative method. Get from the window class
-// icon = reinterpret_cast<HICON>(::GetClassLongPtrW(hwnd, GCLP_HICONSM));
-// }
-// // Alternative method: get the first icon from the main module (executable image of the process)
-// if (icon == 0) {
-// icon = ::LoadIcon(GetModuleHandleW(0), MAKEINTRESOURCE(0));
-// }
-// // Alternative method. Use OS default icon
-// if (icon == 0) {
-// icon = ::LoadIcon(0, IDI_APPLICATION);
-// }
-// iconData->hIcon = icon;
-
-// // Set the rest of the members
-// iconData->hWnd = hwnd;
-// iconData->uCallbackMessage = WM_TRAYMESSAGE;
-// iconData->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
-// iconData->uVersion = 5;
-
-// // Install the icon
-// ::Shell_NotifyIconW(NIM_ADD, iconData);
-// ::Shell_NotifyIconW(NIM_SETVERSION, iconData);
+ log.debug("=== icon="+icon);
+ nid.hIcon = icon;
+
+ nid.hwnd = hwnd;
+ nid.uCallbackMessage = WM_TRAYMESSAGE;
+ nid.uFlags = shell32.NIF_ICON | shell32.NIF_MESSAGE | shell32.NIF_TIP;
+ nid.uVersion = shell32.NOTIFYICON_VERSION_4; // 5 ?! niels
+
+ // Install the icon
+ rv = shell32.Shell_NotifyIconW(shell32.NIM_ADD, nid.address());
+ log.debug("Shell_NotifyIcon ADD="+rv+" winLastError="+ctypes.winLastError); // ERROR_INVALID_WINDOW_HANDLE(1400)
+ shell32.Shell_NotifyIconW(shell32.NIM_SETVERSION, nid.address());
+ log.debug("Shell_NotifyIcon SETVERSION="+rv+" winLastError="+ctypes.winLastError);
// SetupWnd(hwnd);
// ::SetPropW(hwnd, kIconData, reinterpret_cast<HANDLE>(iconData));
--
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