From c0c1ebf3bbd710c2ada3b150b9de3dbcce50b0b2 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 31 Jan 2011 11:05:58 +0000 Subject: [PATCH] CtrlCore: TopWindow::Urgent (RM #19) git-svn-id: svn://ultimatepp.org/upp/trunk@3131 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlCore/TopWin32.cpp | 29 +++++++++++++++++++++++++++++ uppsrc/CtrlCore/TopWinX11.cpp | 2 ++ uppsrc/CtrlCore/TopWindow.cpp | 12 +++++++++++- uppsrc/CtrlCore/TopWindow.h | 3 +++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/uppsrc/CtrlCore/TopWin32.cpp b/uppsrc/CtrlCore/TopWin32.cpp index 514b27b13..72a3feba2 100644 --- a/uppsrc/CtrlCore/TopWin32.cpp +++ b/uppsrc/CtrlCore/TopWin32.cpp @@ -4,6 +4,26 @@ NAMESPACE_UPP #define LLOG(x) // LOG(x) +#if defined(COMPILER_MINGW) && !defined(FLASHW_ALL) + // MINGW headers don't include this in (some versions of) windows + extern "C"{ + struct FLASHWINFO { + UINT cbSize; + HWND hwnd; + DWORD dwFlags; + UINT uCount; + DWORD dwTimeout; + }; + WINUSERAPI BOOL WINAPI FlashWindowEx(FLASHWINFO*); + } + #define FLASHW_STOP 0 + #define FLASHW_CAPTION 0x00000001 + #define FLASHW_TRAY 0x00000002 + #define FLASHW_ALL (FLASHW_CAPTION | FLASHW_TRAY) + #define FLASHW_TIMER 0x00000004 + #define FLASHW_TIMERNOFG 0x0000000C +#endif + #ifdef PLATFORM_WIN32 void TopWindow::SyncSizeHints() {} @@ -122,6 +142,15 @@ void TopWindow::SyncCaption0() ::SetWindowLong(hwnd, GWL_STYLE, style); ::SetWindowLong(hwnd, GWL_EXSTYLE, exstyle); SyncTitle(); + if(urgent) { + if(IsForeground()) urgent = false; + FLASHWINFO fi; + memset(&fi, 0, sizeof(fi)); + fi.cbSize = sizeof(fi); + fi.hwnd = hwnd; + fi.dwFlags = urgent ? FLASHW_TIMER|FLASHW_ALL : FLASHW_STOP; + FlashWindowEx(&fi); + } } DeleteIco(); #ifndef PLATFORM_WINCE //TODO!!! diff --git a/uppsrc/CtrlCore/TopWinX11.cpp b/uppsrc/CtrlCore/TopWinX11.cpp index 1bcb4651c..af4def4e3 100644 --- a/uppsrc/CtrlCore/TopWinX11.cpp +++ b/uppsrc/CtrlCore/TopWinX11.cpp @@ -145,6 +145,8 @@ void TopWindow::SyncCaption0() // XChangeProperty(Xdisplay, GetWindow(), XAtom("_NET_WM_STATE"), XAtom("ATOM"), 32, // PropModeReplace, (const unsigned char *)wina, n); wm_hints->flags = InputHint|WindowGroupHint|StateHint; + if(IsForeground()) urgent = false; + if(urgent) wm_hints->flags |= XUrgencyHint; wm_hints->initial_state = NormalState; wm_hints->input = XTrue; Ctrl *owner = GetOwner(); diff --git a/uppsrc/CtrlCore/TopWindow.cpp b/uppsrc/CtrlCore/TopWindow.cpp index 52d248a44..e7783d926 100644 --- a/uppsrc/CtrlCore/TopWindow.cpp +++ b/uppsrc/CtrlCore/TopWindow.cpp @@ -34,6 +34,8 @@ void TopWindow::Activate() UsrLogT(3, "ACTIVATE " + Desc(this)); if(activefocus && (HasFocus() || !GetFocusChildDeep()) && IsEnabled()) activefocus->SetWantFocus(); + if(urgent) + SyncCaption(); LLOG("Activate End"); } @@ -410,6 +412,14 @@ TopWindow& TopWindow::ToolWindow(bool b) return *this; } +TopWindow& TopWindow::Urgent(bool b) +{ + GuiLock __; + urgent = b; + SyncCaption(); + return *this; +} + void TopWindow::SerializePlacement(Stream& s, bool reminimize) { GuiLock __; @@ -518,7 +528,7 @@ TopWindow::TopWindow() WhenClose = THISBACK(Close); overlapped.Clear(); dokeys = true; - fullscreen = frameless = false; + fullscreen = frameless = urgent = false; } TopWindow::~TopWindow() diff --git a/uppsrc/CtrlCore/TopWindow.h b/uppsrc/CtrlCore/TopWindow.h index da3076148..75c5db0fe 100644 --- a/uppsrc/CtrlCore/TopWindow.h +++ b/uppsrc/CtrlCore/TopWindow.h @@ -120,6 +120,7 @@ private: bool sizeable:1; bool tool:1; bool frameless:1; + bool urgent:1; byte state; Image icon, largeicon; #ifdef PLATFORM_X11 @@ -203,6 +204,8 @@ public: bool IsFullScreen() const { return fullscreen; } TopWindow& FrameLess(bool b = true) { frameless = b; return *this; } bool IsFrameLess() const { return frameless; } + TopWindow& Urgent(bool b = true); + bool IsUrgent() const { return urgent; } TopWindow& NoAccessKeysDistribution() { dokeys = false; return *this; } TopWindow& NoCloseBox(bool b = true) { noclosebox = b; return *this; }