[Pkg-mozext-commits] [firetray] 03/10: Winnt: fix start_hidden when startup minimized or maximized.
David Prévot
taffit at moszumanska.debian.org
Fri Nov 14 20:51:00 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 bd3f894a15f3961217e741fb30060e829b341141
Author: foudfou <foudil.newbie+git at gmail.com>
Date: Sun Nov 9 20:28:16 2014 +0100
Winnt: fix start_hidden when startup minimized or maximized.
---
src/modules/ctypes/winnt/kernel32.jsm | 24 +++++++++++++++++
src/modules/ctypes/winnt/user32.jsm | 17 ++++++++++++
src/modules/ctypes/winnt/win32.jsm | 1 +
src/modules/winnt/FiretrayWindow.jsm | 50 +++++++++++++++++++++++++++++------
4 files changed, 84 insertions(+), 8 deletions(-)
diff --git a/src/modules/ctypes/winnt/kernel32.jsm b/src/modules/ctypes/winnt/kernel32.jsm
index f6c6b02..70daa2b 100644
--- a/src/modules/ctypes/winnt/kernel32.jsm
+++ b/src/modules/ctypes/winnt/kernel32.jsm
@@ -35,6 +35,30 @@ function kernel32_defines(lib) {
lib.lazy_bind("GetProcAddress", win32.FARPROC, win32.HMODULE, win32.LPCSTR);
lib.lazy_bind("GetCurrentThreadId", win32.DWORD);
+ this.STARTUPINFO = ctypes.StructType("STARTUPINFO", [
+ { "cb": win32.DWORD },
+ { "lpReserved": win32.LPTSTR },
+ { "lpDesktop": win32.LPTSTR },
+ { "lpTitle": win32.LPTSTR },
+ { "dwX": win32.DWORD },
+ { "dwY": win32.DWORD },
+ { "dwXSize": win32.DWORD },
+ { "dwYSize": win32.DWORD },
+ { "dwXCountChars": win32.DWORD },
+ { "dwYCountChars": win32.DWORD },
+ { "dwFillAttribute": win32.DWORD },
+ { "dwFlags": win32.DWORD },
+ { "wShowWindow": win32.WORD },
+ { "cbReserved2": win32.WORD },
+ { "lpReserved2": win32.LPBYTE },
+ { "hStdInput": win32.HANDLE },
+ { "hStdOutput": win32.HANDLE },
+ { "hStdError": win32.HANDLE }
+ ]);
+ this.LPSTARTUPINFO = ctypes.PointerType(this.STARTUPINFO);
+
+ lib.lazy_bind("GetStartupInfoW", ctypes.void_t, this.LPSTARTUPINFO);
+
}
new ctypes_library(KERNEL32_LIBNAME, KERNEL32_ABIS, kernel32_defines, this);
diff --git a/src/modules/ctypes/winnt/user32.jsm b/src/modules/ctypes/winnt/user32.jsm
index d29022e..e5f6ad4 100644
--- a/src/modules/ctypes/winnt/user32.jsm
+++ b/src/modules/ctypes/winnt/user32.jsm
@@ -372,6 +372,22 @@ function user32_defines(lib) {
lib.lazy_bind("GetCursorPos", win32.BOOL, win32.LPPOINT);
lib.lazy_bind("GetMessagePos", win32.DWORD);
+ this.WINDOWINFO = ctypes.StructType("WINDOWINFO", [
+ { "cbSize": win32.DWORD },
+ { "rcWindow": win32.RECT },
+ { "rcClient": win32.RECT },
+ { "dwStyle": win32.DWORD },
+ { "dwExStyle": win32.DWORD },
+ { "dwWindowStatus": win32.DWORD },
+ { "cxWindowBorders": win32.UINT },
+ { "cyWindowBorders": win32.UINT },
+ { "atomWindowType": win32.ATOM },
+ { "wCreatorVersion": win32.WORD }
+ ]);
+ this.PWINDOWINFO = this.LPWINDOWINFO = this.WINDOWINFO.ptr;
+
+ lib.lazy_bind("GetWindowInfo", win32.BOOL, win32.HWND, this.WINDOWINFO.ptr);
+
this.WINDOWPLACEMENT = ctypes.StructType("WINDOWPLACEMENT", [
{ "length": win32.UINT },
{ "flags": win32.UINT },
@@ -411,6 +427,7 @@ function user32_defines(lib) {
this.SWP_NOREPOSITION = this.SWP_NOOWNERZORDER;
this.SWP_DEFERERASE = 0x2000;
this.SWP_ASYNCWINDOWPOS = 0x4000;
+ this.SWP_STATECHANGED = 0x8000; /* Undocumented */
lib.lazy_bind("GetSysColor", win32.DWORD, ctypes.int);
this.COLOR_MENU = 4;
diff --git a/src/modules/ctypes/winnt/win32.jsm b/src/modules/ctypes/winnt/win32.jsm
index ca5e17b..8f269a1 100644
--- a/src/modules/ctypes/winnt/win32.jsm
+++ b/src/modules/ctypes/winnt/win32.jsm
@@ -21,6 +21,7 @@ var win32 = new function() {
this.BOOL = ctypes.bool;
this.BYTE = ctypes.unsigned_char;
+ this.LPBYTE = this.BYTE.ptr;
this.INT_PTR = is64bit ? ctypes.int64_t : ctypes.int;
this.UINT = ctypes.unsigned_int;
this.UINT_PTR = is64bit ? ctypes.uint64_t : ctypes.unsigned_int;
diff --git a/src/modules/winnt/FiretrayWindow.jsm b/src/modules/winnt/FiretrayWindow.jsm
index 931e3b0..331e9d5 100644
--- a/src/modules/winnt/FiretrayWindow.jsm
+++ b/src/modules/winnt/FiretrayWindow.jsm
@@ -70,7 +70,8 @@ firetray.Window.wndProc = function(hWnd, uMsg, wParam, lParam) { // filterWindow
}
let procPrev = firetray.Handler.wndProcsOrig.get(wid);
- return user32.CallWindowProcW(user32.WNDPROC(procPrev), hWnd, uMsg, wParam, lParam); // or DefWindowProcW
+ return user32.CallWindowProcW(
+ user32.WNDPROC(procPrev), hWnd, uMsg, wParam, lParam); // or DefWindowProcW
};
/*
@@ -81,22 +82,39 @@ firetray.Window.wndProc = function(hWnd, uMsg, wParam, lParam) { // filterWindow
* - a WH_CALLWNDPROC hook doesn't catch SWP_SHOWWINDOW
* - chaining WNDPROCs crashes the app (UserCallWinProcCheckWow or ffi_call)
*/
-firetray.Window.startupShowCount = 0;
firetray.Window.wndProcStartup = function(hWnd, uMsg, wParam, lParam) {
let wid = firetray.Win32.hwndToHexStr(hWnd);
if (uMsg === win32.WM_WINDOWPOSCHANGING) {
- let posStruct = ctypes.cast(win32.LPARAM(lParam), user32.WINDOWPOS.ptr).contents;
+ let posStruct = ctypes.cast(win32.LPARAM(lParam),
+ user32.WINDOWPOS.ptr).contents;
+
+ // let stateChanged = ((posStruct.flags & user32.SWP_STATECHANGED) != 0);
+ // if (!firetray.Window.startup.minimized && stateChanged) { // run minimized/maximized
+ // Cu.reportError(" stateChanged");
+ // let info = new user32.WINDOWINFO;
+ // let ret = user32.GetWindowInfo(hWnd, info.address());
+ // Cu.reportError(" hWnd="+hWnd+" uMsg="+uMsg+" dwStyle="+info.dwStyle);
+ // firetray.Window.startup.minimized = ((info.dwStyle & user32.WS_MINIMIZE) != 0);
+ // Cu.reportError(" minimized="+firetray.Window.startup.minimized);
+ // posStruct.flags &= user32.SWP_NOSIZE|user32.SWP_NOMOVE;
+ // // return 1;
+ // }
+
let isShowing = ((posStruct.flags & user32.SWP_SHOWWINDOW) != 0);
if (isShowing) {
log.debug("wndProcStartup CALLED with WM_WINDOWPOSCHANGING/SWP_SHOWWINDOW");
- firetray.Window.startupShowCount += 1;
+ firetray.Window.startup.showCount += 1;
- if (firetray.Window.startupShowCount < 2) { // hide
+ if (firetray.Window.startup.showCount < 2) { // hide
log.debug("start_hidden");
- // Modifying a JS posStruct field does really modify the WINDOWPOS C
- // struct behind lParam !
- posStruct.flags &= ~user32.SWP_SHOWWINDOW;
+ // Modifying posStruct is modifying lParam, which is passed onwards!
+ if (firetray.Window.startup.showSpecial) {
+ posStruct.flags &= user32.SWP_NOSIZE|user32.SWP_NOMOVE;
+ }
+ else {
+ posStruct.flags &= ~user32.SWP_SHOWWINDOW;
+ }
let force = true;
firetray.Handler.addPopupMenuWindowItemAndSeparatorMaybe(wid, force);
}
@@ -108,7 +126,16 @@ firetray.Window.wndProcStartup = function(hWnd, uMsg, wParam, lParam) {
mapBak: null
});
firetray.Handler.wndProcsStartup.remove(wid);
+
+ if (firetray.Window.startup.showSpecial) {
+ let placement = new user32.WINDOWPLACEMENT;
+ let ret = user32.GetWindowPlacement(hWnd, placement.address());
+ firetray.js.assert(ret, "GetWindowPlacement failed.");
+ placement.showCmd = firetray.Window.startup.showSpecial;
+ user32.SetWindowPlacement(hWnd, placement.address());
+ }
}
+
}
}
@@ -197,6 +224,13 @@ firetray.Handler.registerWindow = function(win) {
let proc, map;
if (!firetray.Handler.appStarted &&
firetray.Utils.prefService.getBoolPref('start_hidden')) {
+ let startupInfo = new kernel32.STARTUPINFO;
+ kernel32.GetStartupInfoW(startupInfo.address());
+ let showSpecial = ([
+ user32.SW_SHOWMINNOACTIVE, user32.SW_SHOWMINIMIZED,
+ user32.SW_SHOWMAXIMIZED
+ ].indexOf(startupInfo.wShowWindow) > -1) ? startupInfo.wShowWindow : 0;
+ firetray.Window.startup = {showCount: 0, showSpecial: showSpecial};
proc = firetray.Window.wndProcStartup; map = firetray.Handler.wndProcsStartup;
} else {
proc = firetray.Window.wndProc; map = firetray.Handler.wndProcs;
--
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