Commit cbdf1294 authored by Alexandre Julliard's avatar Alexandre Julliard

winex11: Export a function to dock a window into the system tray, and get rid of…

winex11: Export a function to dock a window into the system tray, and get rid of the WS_EX_TRAYWINDOW style.
parent d147e020
...@@ -79,9 +79,6 @@ BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rect ) ...@@ -79,9 +79,6 @@ BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rect )
{ {
DWORD style, ex_style; DWORD style, ex_style;
/* tray window is always managed */
ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE );
if (ex_style & WS_EX_TRAYWINDOW) return TRUE;
/* child windows are not managed */ /* child windows are not managed */
style = GetWindowLongW( hwnd, GWL_STYLE ); style = GetWindowLongW( hwnd, GWL_STYLE );
if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) return FALSE; if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) return FALSE;
...@@ -91,6 +88,7 @@ BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rect ) ...@@ -91,6 +88,7 @@ BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rect )
/* windows with caption are managed */ /* windows with caption are managed */
if ((style & WS_CAPTION) == WS_CAPTION) return TRUE; if ((style & WS_CAPTION) == WS_CAPTION) return TRUE;
/* tool windows are not managed */ /* tool windows are not managed */
ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE );
if (ex_style & WS_EX_TOOLWINDOW) return FALSE; if (ex_style & WS_EX_TOOLWINDOW) return FALSE;
/* windows with thick frame are managed */ /* windows with thick frame are managed */
if (style & WS_THICKFRAME) return TRUE; if (style & WS_THICKFRAME) return TRUE;
...@@ -642,15 +640,19 @@ static void set_icon_hints( Display *display, struct x11drv_win_data *data, HICO ...@@ -642,15 +640,19 @@ static void set_icon_hints( Display *display, struct x11drv_win_data *data, HICO
} }
/*********************************************************************** /***********************************************************************
* systray_dock_window * wine_make_systray_window (X11DRV.@)
* *
* Docks the given X window with the NETWM system tray. * Docks the given X window with the NETWM system tray.
*/ */
static void systray_dock_window( Display *display, struct x11drv_win_data *data ) void X11DRV_make_systray_window( HWND hwnd )
{ {
static Atom systray_atom; static Atom systray_atom;
Display *display = thread_display();
struct x11drv_win_data *data;
Window systray_window; Window systray_window;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
wine_tsx11_lock(); wine_tsx11_lock();
if (!systray_atom) if (!systray_atom)
{ {
...@@ -1449,12 +1451,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -1449,12 +1451,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
newPos.right, newPos.bottom, swFlag ); newPos.right, newPos.bottom, swFlag );
} }
/* Dock system tray windows. */
/* Dock after the window is created so we don't have problems calling
* SetWindowPos. */
if (GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_TRAYWINDOW)
systray_dock_window( display, data );
return TRUE; return TRUE;
failed: failed:
......
...@@ -128,6 +128,9 @@ ...@@ -128,6 +128,9 @@
# Desktop # Desktop
@ cdecl wine_create_desktop(long long) X11DRV_create_desktop @ cdecl wine_create_desktop(long long) X11DRV_create_desktop
# System tray
@ cdecl wine_make_systray_window(long) X11DRV_make_systray_window
# XIM # XIM
@ cdecl ForceXIMReset(long) X11DRV_ForceXIMReset @ cdecl ForceXIMReset(long) X11DRV_ForceXIMReset
......
...@@ -3217,9 +3217,6 @@ typedef struct tagMINIMIZEDMETRICS { ...@@ -3217,9 +3217,6 @@ typedef struct tagMINIMIZEDMETRICS {
#define WS_EX_OVERLAPPEDWINDOW (WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE) #define WS_EX_OVERLAPPEDWINDOW (WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE)
#define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW|WS_EX_TOPMOST) #define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW|WS_EX_TOPMOST)
/* WINE internal... */
#define WS_EX_TRAYWINDOW 0x80000000L
#endif /* NOWINSTYLES */ #endif /* NOWINSTYLES */
/* Window scrolling */ /* Window scrolling */
......
...@@ -220,6 +220,7 @@ static void modify_icon(NOTIFYICONDATAW *nid, BOOL modify_tooltip) ...@@ -220,6 +220,7 @@ static void modify_icon(NOTIFYICONDATAW *nid, BOOL modify_tooltip)
static void add_icon(NOTIFYICONDATAW *nid) static void add_icon(NOTIFYICONDATAW *nid)
{ {
HMODULE x11drv = GetModuleHandleA( "winex11.drv" );
RECT rect; RECT rect;
struct icon *icon; struct icon *icon;
static const WCHAR adaptor_windowname[] = /* Wine System Tray Adaptor */ {'W','i','n','e',' ','S','y','s','t','e','m',' ','T','r','a','y',' ','A','d','a','p','t','o','r',0}; static const WCHAR adaptor_windowname[] = /* Wine System Tray Adaptor */ {'W','i','n','e',' ','S','y','s','t','e','m',' ','T','r','a','y',' ','A','d','a','p','t','o','r',0};
...@@ -250,13 +251,18 @@ static void add_icon(NOTIFYICONDATAW *nid) ...@@ -250,13 +251,18 @@ static void add_icon(NOTIFYICONDATAW *nid)
AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CAPTION, FALSE); AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CAPTION, FALSE);
/* create the adaptor window */ /* create the adaptor window */
icon->window = CreateWindowEx(WS_EX_TRAYWINDOW, adaptor_classname, icon->window = CreateWindowEx(0, adaptor_classname,
adaptor_windowname, adaptor_windowname,
WS_CLIPSIBLINGS | WS_CAPTION, WS_CLIPSIBLINGS | WS_CAPTION,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
rect.right - rect.left, rect.right - rect.left,
rect.bottom - rect.top, rect.bottom - rect.top,
NULL, NULL, NULL, icon); NULL, NULL, NULL, icon);
if (x11drv)
{
void (*make_systray_window)(HWND) = (void *)GetProcAddress( x11drv, "wine_make_systray_window" );
if (make_systray_window) make_systray_window( icon->window );
}
if (!hide_systray) if (!hide_systray)
ShowWindow(icon->window, SW_SHOWNA); ShowWindow(icon->window, SW_SHOWNA);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment