Commit 8d174d3f authored by Alexandre Julliard's avatar Alexandre Julliard

Store the global shell, progman and taskman windows in the server

(based on a patch by Martin Fuchs).
parent 6fbcacbb
......@@ -344,3 +344,134 @@ HWND WINAPI GetForegroundWindow(void)
SERVER_END_REQ;
return ret;
}
/***********************************************************************
* SetShellWindowEx (USER32.@)
* hwndShell = Progman[Program Manager]
* |-> SHELLDLL_DefView
* hwndListView = | |-> SysListView32
* | | |-> tooltips_class32
* | |
* | |-> SysHeader32
* |
* |-> ProxyTarget
*/
BOOL WINAPI SetShellWindowEx(HWND hwndShell, HWND hwndListView)
{
BOOL ret;
SERVER_START_REQ(set_global_windows)
{
req->flags = SET_GLOBAL_SHELL_WINDOWS;
req->shell_window = hwndShell;
req->shell_listview = hwndListView;
ret = !wine_server_call_err(req);
}
SERVER_END_REQ;
if (ret)
{
if (hwndListView && hwndListView!=hwndShell)
SetWindowPos(hwndListView, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
SetWindowPos(hwndShell, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}
return ret;
}
/*******************************************************************
* SetShellWindow (USER32.@)
*/
BOOL WINAPI SetShellWindow(HWND hwndShell)
{
return SetShellWindowEx(hwndShell, hwndShell);
}
/*******************************************************************
* GetShellWindow (USER32.@)
*/
HWND WINAPI GetShellWindow(void)
{
HWND hwndShell = 0;
SERVER_START_REQ(set_global_windows)
{
req->flags = 0;
if (!wine_server_call_err(req))
hwndShell = reply->old_shell_window;
}
SERVER_END_REQ;
return hwndShell;
}
/***********************************************************************
* SetProgmanWindow (USER32.@)
*/
HWND WINAPI SetProgmanWindow ( HWND hwnd )
{
SERVER_START_REQ(set_global_windows)
{
req->flags = SET_GLOBAL_PROGMAN_WINDOW;
req->progman_window = hwnd;
if (wine_server_call_err( req )) hwnd = 0;
}
SERVER_END_REQ;
return hwnd;
}
/***********************************************************************
* GetProgmanWindow (USER32.@)
*/
HWND WINAPI GetProgmanWindow(void)
{
HWND ret = 0;
SERVER_START_REQ(set_global_windows)
{
req->flags = 0;
if (!wine_server_call_err(req)) ret = reply->old_progman_window;
}
SERVER_END_REQ;
return ret;
}
/***********************************************************************
* SetTaskmanWindow (USER32.@)
* NOTES
* hwnd = MSTaskSwWClass
* |-> SysTabControl32
*/
HWND WINAPI SetTaskmanWindow ( HWND hwnd )
{
SERVER_START_REQ(set_global_windows)
{
req->flags = SET_GLOBAL_TASKMAN_WINDOW;
req->taskman_window = hwnd;
if (wine_server_call_err( req )) hwnd = 0;
}
SERVER_END_REQ;
return hwnd;
}
/***********************************************************************
* GetTaskmanWindow (USER32.@)
*/
HWND WINAPI GetTaskmanWindow(void)
{
HWND ret = 0;
SERVER_START_REQ(set_global_windows)
{
req->flags = 0;
if (!wine_server_call_err(req)) ret = reply->old_taskman_window;
}
SERVER_END_REQ;
return ret;
}
......@@ -3092,6 +3092,29 @@ struct open_token_reply
#define OPEN_TOKEN_AS_SELF 2
struct set_global_windows_request
{
struct request_header __header;
unsigned int flags;
user_handle_t shell_window;
user_handle_t shell_listview;
user_handle_t progman_window;
user_handle_t taskman_window;
};
struct set_global_windows_reply
{
struct reply_header __header;
user_handle_t old_shell_window;
user_handle_t old_shell_listview;
user_handle_t old_progman_window;
user_handle_t old_taskman_window;
};
#define SET_GLOBAL_SHELL_WINDOWS 0x01
#define SET_GLOBAL_PROGMAN_WINDOW 0x02
#define SET_GLOBAL_TASKMAN_WINDOW 0x04
enum request
{
REQ_new_process,
......@@ -3272,6 +3295,7 @@ enum request
REQ_get_next_hook,
REQ_set_clipboard_info,
REQ_open_token,
REQ_set_global_windows,
REQ_NB_REQUESTS
};
......@@ -3457,6 +3481,7 @@ union generic_request
struct get_next_hook_request get_next_hook_request;
struct set_clipboard_info_request set_clipboard_info_request;
struct open_token_request open_token_request;
struct set_global_windows_request set_global_windows_request;
};
union generic_reply
{
......@@ -3640,8 +3665,9 @@ union generic_reply
struct get_next_hook_reply get_next_hook_reply;
struct set_clipboard_info_reply set_clipboard_info_reply;
struct open_token_reply open_token_reply;
struct set_global_windows_reply set_global_windows_reply;
};
#define SERVER_PROTOCOL_VERSION 123
#define SERVER_PROTOCOL_VERSION 124
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
......@@ -2159,3 +2159,21 @@ enum message_type
@END
#define OPEN_TOKEN_THREAD 1
#define OPEN_TOKEN_AS_SELF 2
/* Set/get the global windows */
@REQ(set_global_windows)
unsigned int flags; /* flags for fields to set (see below) */
user_handle_t shell_window; /* handle to the new shell window */
user_handle_t shell_listview; /* handle to the new shell listview window */
user_handle_t progman_window; /* handle to the new program manager window */
user_handle_t taskman_window; /* handle to the new task manager window */
@REPLY
user_handle_t old_shell_window; /* handle to the shell window */
user_handle_t old_shell_listview; /* handle to the shell listview window */
user_handle_t old_progman_window; /* handle to the new program manager window */
user_handle_t old_taskman_window; /* handle to the new task manager window */
@END
#define SET_GLOBAL_SHELL_WINDOWS 0x01 /* set both main shell and listview windows */
#define SET_GLOBAL_PROGMAN_WINDOW 0x02
#define SET_GLOBAL_TASKMAN_WINDOW 0x04
......@@ -281,6 +281,7 @@ DECL_HANDLER(finish_hook_chain);
DECL_HANDLER(get_next_hook);
DECL_HANDLER(set_clipboard_info);
DECL_HANDLER(open_token);
DECL_HANDLER(set_global_windows);
#ifdef WANT_REQUEST_HANDLERS
......@@ -465,6 +466,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(req_handler)req_get_next_hook,
(req_handler)req_set_clipboard_info,
(req_handler)req_open_token,
(req_handler)req_set_global_windows,
};
#endif /* WANT_REQUEST_HANDLERS */
......
......@@ -2532,6 +2532,23 @@ static void dump_open_token_reply( const struct open_token_reply *req )
fprintf( stderr, " token=%p", req->token );
}
static void dump_set_global_windows_request( const struct set_global_windows_request *req )
{
fprintf( stderr, " flags=%08x,", req->flags );
fprintf( stderr, " shell_window=%p,", req->shell_window );
fprintf( stderr, " shell_listview=%p,", req->shell_listview );
fprintf( stderr, " progman_window=%p,", req->progman_window );
fprintf( stderr, " taskman_window=%p", req->taskman_window );
}
static void dump_set_global_windows_reply( const struct set_global_windows_reply *req )
{
fprintf( stderr, " old_shell_window=%p,", req->old_shell_window );
fprintf( stderr, " old_shell_listview=%p,", req->old_shell_listview );
fprintf( stderr, " old_progman_window=%p,", req->old_progman_window );
fprintf( stderr, " old_taskman_window=%p", req->old_taskman_window );
}
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
......@@ -2711,6 +2728,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_get_next_hook_request,
(dump_func)dump_set_clipboard_info_request,
(dump_func)dump_open_token_request,
(dump_func)dump_set_global_windows_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
......@@ -2892,6 +2910,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_get_next_hook_reply,
(dump_func)dump_set_clipboard_info_reply,
(dump_func)dump_open_token_reply,
(dump_func)dump_set_global_windows_reply,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
......@@ -3073,6 +3092,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"get_next_hook",
"set_clipboard_info",
"open_token",
"set_global_windows",
};
/* ### make_requests end ### */
......
......@@ -81,6 +81,11 @@ struct window
static struct window *top_window; /* top-level (desktop) window */
/* global window pointers */
static struct window *shell_window;
static struct window *shell_listview;
static struct window *progman_window;
static struct window *taskman_window;
/* retrieve a pointer to a window from its handle */
inline static struct window *get_window( user_handle_t handle )
......@@ -245,6 +250,11 @@ static void destroy_window( struct window *win )
if (win->paint_count) inc_queue_paint_count( win->thread, -win->paint_count );
queue_cleanup_window( win->thread, win->handle );
}
/* reset global window pointers, if the corresponding window is destroyed */
if (win == shell_window) shell_window = NULL;
if (win == shell_listview) shell_listview = NULL;
if (win == progman_window) progman_window = NULL;
if (win == taskman_window) taskman_window = NULL;
free_user_handle( win->handle );
destroy_properties( win );
unlink_window( win );
......@@ -820,3 +830,54 @@ DECL_HANDLER(get_window_properties)
count--;
}
}
/* get the new window pointer for a global window, checking permissions */
/* helper for set_global_windows request */
static int get_new_global_window( struct window **win, user_handle_t handle )
{
if (*win && (*win)->thread != current)
{
set_error( STATUS_ACCESS_DENIED );
return 0;
}
if (!handle)
{
*win = NULL;
return 1;
}
*win = get_window( handle );
return (*win != NULL);
}
/* Set/get the global windows */
DECL_HANDLER(set_global_windows)
{
struct window *new_shell_window = shell_window;
struct window *new_shell_listview = shell_listview;
struct window *new_progman_window = progman_window;
struct window *new_taskman_window = taskman_window;
reply->old_shell_window = shell_window ? shell_window->handle : 0;
reply->old_shell_listview = shell_listview ? shell_listview->handle : 0;
reply->old_progman_window = progman_window ? progman_window->handle : 0;
reply->old_taskman_window = taskman_window ? taskman_window->handle : 0;
if (req->flags & SET_GLOBAL_SHELL_WINDOWS)
{
if (!get_new_global_window( &new_shell_window, req->shell_window )) return;
if (!get_new_global_window( &new_shell_listview, req->shell_listview )) return;
}
if (req->flags & SET_GLOBAL_PROGMAN_WINDOW)
{
if (!get_new_global_window( &new_progman_window, req->progman_window )) return;
}
if (req->flags & SET_GLOBAL_TASKMAN_WINDOW)
{
if (!get_new_global_window( &new_taskman_window, req->taskman_window )) return;
}
shell_window = new_shell_window;
shell_listview = new_shell_listview;
progman_window = new_progman_window;
taskman_window = new_taskman_window;
}
......@@ -67,10 +67,6 @@ typedef struct
/* ----- internal variables ----- */
static HWND hGlobalShellWindow=0; /*the shell*/
static HWND hGlobalTaskmanWindow=0;
static HWND hGlobalProgmanWindow=0;
static LPCSTR atomInternalPos;
......@@ -632,27 +628,6 @@ BOOL WINAPI LockSetForegroundWindow( UINT lockcode )
}
/*******************************************************************
* SetShellWindow (USER32.@)
*/
HWND WINAPI SetShellWindow(HWND hwndshell)
{ WARN("(hWnd=%p) semi stub\n",hwndshell );
hGlobalShellWindow = WIN_GetFullHandle( hwndshell );
return hGlobalShellWindow;
}
/*******************************************************************
* GetShellWindow (USER32.@)
*/
HWND WINAPI GetShellWindow(void)
{ WARN("(hWnd=%p) semi stub\n",hGlobalShellWindow );
return hGlobalShellWindow;
}
/***********************************************************************
* BringWindowToTop (USER32.@)
*/
......@@ -1346,59 +1321,3 @@ void WINAPI CascadeChildWindows16( HWND16 parent, WORD action )
{
FIXME("(%04x, %d): stub\n", parent, action);
}
/***********************************************************************
* SetProgmanWindow (USER32.@)
*/
HWND WINAPI SetProgmanWindow ( HWND hwnd )
{
hGlobalProgmanWindow = hwnd;
return hGlobalProgmanWindow;
}
/***********************************************************************
* GetProgmanWindow (USER32.@)
*/
HWND WINAPI GetProgmanWindow(void)
{
return hGlobalProgmanWindow;
}
/***********************************************************************
* SetShellWindowEx (USER32.@)
* hwndProgman = Progman[Program Manager]
* |-> SHELLDLL_DefView
* hwndListView = | |-> SysListView32
* | | |-> tooltips_class32
* | |
* | |-> SysHeader32
* |
* |-> ProxyTarget
*/
HWND WINAPI SetShellWindowEx ( HWND hwndProgman, HWND hwndListView )
{
FIXME("%p %p stub\n",hwndProgman ,hwndListView );
hGlobalShellWindow = hwndProgman;
return hGlobalShellWindow;
}
/***********************************************************************
* SetTaskmanWindow (USER32.@)
* NOTES
* hwnd = MSTaskSwWClass
* |-> SysTabControl32
*/
HWND WINAPI SetTaskmanWindow ( HWND hwnd )
{
hGlobalTaskmanWindow = hwnd;
return hGlobalTaskmanWindow;
}
/***********************************************************************
* GetTaskmanWindow (USER32.@)
*/
HWND WINAPI GetTaskmanWindow(void)
{
return hGlobalTaskmanWindow;
}
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