mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 19:49:50 +00:00
Implemented GetTitleBarInfo.
This commit is contained in:
parent
58c185ecf0
commit
cc09196356
3 changed files with 114 additions and 1 deletions
|
@ -304,7 +304,7 @@
|
|||
@ stdcall GetTabbedTextExtentA(long str long long ptr)
|
||||
@ stdcall GetTabbedTextExtentW(long wstr long long ptr)
|
||||
@ stdcall GetThreadDesktop(long)
|
||||
# @ stub GetTitleBarInfo
|
||||
@ stdcall GetTitleBarInfo(long ptr)
|
||||
@ stdcall GetTopWindow(long)
|
||||
@ stdcall GetUpdateRect(long ptr long)
|
||||
@ stdcall GetUpdateRgn(long long long)
|
||||
|
|
|
@ -3544,6 +3544,16 @@ typedef struct tagWINDOWINFO {
|
|||
WORD wCreatorVersion;
|
||||
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
|
||||
|
||||
/* used for GetTitleBarInfo() */
|
||||
|
||||
#define CCHILDREN_TITLEBAR 5
|
||||
|
||||
typedef struct tagTITLEBARINFO {
|
||||
DWORD cbSize;
|
||||
RECT rcTitleBar;
|
||||
DWORD rgstate[CCHILDREN_TITLEBAR+1];
|
||||
} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;
|
||||
|
||||
/* SetWinEventHook() flags */
|
||||
#define WINEVENT_OUTOFCONTEXT 0x0
|
||||
#define WINEVENT_SKIPOWNTHREAD 0x1
|
||||
|
@ -3663,6 +3673,39 @@ typedef struct tagWINDOWINFO {
|
|||
#define ALERT_SYSTEM_CRITICAL 5
|
||||
#define CALERT_SYSTEM 6
|
||||
|
||||
/* System state flags */
|
||||
#define STATE_SYSTEM_UNAVAILABLE 0x00000001
|
||||
#define STATE_SYSTEM_SELECTED 0x00000002
|
||||
#define STATE_SYSTEM_FOCUSED 0x00000004
|
||||
#define STATE_SYSTEM_PRESSED 0x00000008
|
||||
#define STATE_SYSTEM_CHECKED 0x00000010
|
||||
#define STATE_SYSTEM_MIXED 0x00000020
|
||||
#define STATE_SYSTEM_INDETERMINATE STATE_SYSTEM_MIXED
|
||||
#define STATE_SYSTEM_READONLY 0x00000040
|
||||
#define STATE_SYSTEM_HOTTRACKED 0x00000080
|
||||
#define STATE_SYSTEM_DEFAULT 0x00000100
|
||||
#define STATE_SYSTEM_EXPANDED 0x00000200
|
||||
#define STATE_SYSTEM_COLLAPSED 0x00000400
|
||||
#define STATE_SYSTEM_BUSY 0x00000800
|
||||
#define STATE_SYSTEM_FLOATING 0x00001000
|
||||
#define STATE_SYSTEM_MARQUEED 0x00002000
|
||||
#define STATE_SYSTEM_ANIMATED 0x00004000
|
||||
#define STATE_SYSTEM_INVISIBLE 0x00008000
|
||||
#define STATE_SYSTEM_OFFSCREEN 0x00010000
|
||||
#define STATE_SYSTEM_SIZEABLE 0x00020000
|
||||
#define STATE_SYSTEM_MOVEABLE 0x00040000
|
||||
#define STATE_SYSTEM_SELFVOICING 0x00080000
|
||||
#define STATE_SYSTEM_FOCUSABLE 0x00100000
|
||||
#define STATE_SYSTEM_SELECTABLE 0x00200000
|
||||
#define STATE_SYSTEM_LINKED 0x00400000
|
||||
#define STATE_SYSTEM_TRAVERSED 0x00800000
|
||||
#define STATE_SYSTEM_MULTISELECTABLE 0x01000000
|
||||
#define STATE_SYSTEM_EXTSELECTABLE 0x02000000
|
||||
#define STATE_SYSTEM_ALERT_LOW 0x04000000
|
||||
#define STATE_SYSTEM_ALERT_MEDIUM 0x08000000
|
||||
#define STATE_SYSTEM_ALERT_HIGH 0x10000000
|
||||
#define STATE_SYSTEM_PROTECTED 0x20000000
|
||||
#define STATE_SYSTEM_VALID 0x3FFFFFFF
|
||||
|
||||
#define EnumTaskWindows(handle,proc,lparam) \
|
||||
EnumThreadWindows(handle,proc,lparam)
|
||||
|
@ -4125,6 +4168,7 @@ INT WINAPI GetSystemMetrics(INT);
|
|||
DWORD WINAPI GetTabbedTextExtentA(HDC,LPCSTR,INT,INT,const INT*);
|
||||
DWORD WINAPI GetTabbedTextExtentW(HDC,LPCWSTR,INT,INT,const INT*);
|
||||
#define GetTabbedTextExtent WINELIB_NAME_AW(GetTabbedTextExtent)
|
||||
BOOL WINAPI GetTitleBarInfo(HWND,PTITLEBARINFO);
|
||||
HWND WINAPI GetTopWindow(HWND);
|
||||
BOOL WINAPI GetUpdateRect(HWND,LPRECT,BOOL);
|
||||
INT WINAPI GetUpdateRgn(HWND,HRGN,BOOL);
|
||||
|
|
|
@ -2259,3 +2259,72 @@ BOOL NC_DrawGrayButton(HDC hdc, int x, int y)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* GetTitleBarInfo (USER32.@)
|
||||
* TODO: Handle STATE_SYSTEM_PRESSED
|
||||
*/
|
||||
BOOL WINAPI GetTitleBarInfo(HWND hwnd, PTITLEBARINFO tbi) {
|
||||
DWORD dwStyle;
|
||||
DWORD dwExStyle;
|
||||
RECT wndRect;
|
||||
|
||||
TRACE("(%p %p)\n", hwnd, tbi);
|
||||
|
||||
if(tbi->cbSize != sizeof(TITLEBARINFO)) {
|
||||
TRACE("Invalid TITLEBARINFO size: %ld\n", tbi->cbSize);
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
|
||||
dwExStyle = GetWindowLongW(hwnd, GWL_EXSTYLE);
|
||||
NC_GetInsideRect(hwnd, &tbi->rcTitleBar);
|
||||
|
||||
GetWindowRect(hwnd, &wndRect);
|
||||
|
||||
tbi->rcTitleBar.top += wndRect.top;
|
||||
tbi->rcTitleBar.left += wndRect.left;
|
||||
tbi->rcTitleBar.right += wndRect.left;
|
||||
|
||||
tbi->rcTitleBar.bottom = tbi->rcTitleBar.top;
|
||||
if(dwExStyle & WS_EX_TOOLWINDOW)
|
||||
tbi->rcTitleBar.bottom += GetSystemMetrics(SM_CYSMCAPTION);
|
||||
else {
|
||||
tbi->rcTitleBar.bottom += GetSystemMetrics(SM_CYCAPTION);
|
||||
tbi->rcTitleBar.left += GetSystemMetrics(SM_CXSIZE);
|
||||
}
|
||||
|
||||
ZeroMemory(&tbi->rgstate, sizeof(tbi->rgstate));
|
||||
/* Does the title bar always have STATE_SYSTEM_FOCUSABLE?
|
||||
* Under XP it seems to
|
||||
*/
|
||||
tbi->rgstate[0] = STATE_SYSTEM_FOCUSABLE;
|
||||
if(dwStyle & WS_CAPTION) {
|
||||
tbi->rgstate[1] = STATE_SYSTEM_INVISIBLE;
|
||||
if(dwStyle & WS_SYSMENU) {
|
||||
if(!(dwStyle & (WS_MINIMIZEBOX|WS_MAXIMIZEBOX))) {
|
||||
tbi->rgstate[2] = STATE_SYSTEM_INVISIBLE;
|
||||
tbi->rgstate[3] = STATE_SYSTEM_INVISIBLE;
|
||||
}
|
||||
else {
|
||||
if(!(dwStyle & WS_MINIMIZEBOX))
|
||||
tbi->rgstate[2] = STATE_SYSTEM_UNAVAILABLE;
|
||||
if(!(dwStyle & WS_MAXIMIZEBOX))
|
||||
tbi->rgstate[3] = STATE_SYSTEM_UNAVAILABLE;
|
||||
}
|
||||
if(!(dwExStyle & WS_EX_CONTEXTHELP))
|
||||
tbi->rgstate[4] = STATE_SYSTEM_INVISIBLE;
|
||||
if(GetClassLongW(hwnd, GCL_STYLE) & CS_NOCLOSE)
|
||||
tbi->rgstate[5] = STATE_SYSTEM_UNAVAILABLE;
|
||||
}
|
||||
else {
|
||||
tbi->rgstate[2] = STATE_SYSTEM_INVISIBLE;
|
||||
tbi->rgstate[3] = STATE_SYSTEM_INVISIBLE;
|
||||
tbi->rgstate[4] = STATE_SYSTEM_INVISIBLE;
|
||||
tbi->rgstate[5] = STATE_SYSTEM_INVISIBLE;
|
||||
}
|
||||
}
|
||||
else
|
||||
tbi->rgstate[0] |= STATE_SYSTEM_INVISIBLE;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue