Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
8d174d3f
Commit
8d174d3f
authored
Oct 07, 2003
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Store the global shell, progman and taskman windows in the server
(based on a patch by Martin Fuchs).
parent
6fbcacbb
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
259 additions
and
82 deletions
+259
-82
focus.c
dlls/user/focus.c
+131
-0
server_protocol.h
include/wine/server_protocol.h
+27
-1
protocol.def
server/protocol.def
+18
-0
request.h
server/request.h
+2
-0
trace.c
server/trace.c
+20
-0
window.c
server/window.c
+61
-0
winpos.c
windows/winpos.c
+0
-81
No files found.
dlls/user/focus.c
View file @
8d174d3f
...
...
@@ -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
;
}
include/wine/server_protocol.h
View file @
8d174d3f
...
...
@@ -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 12
3
#define SERVER_PROTOCOL_VERSION 12
4
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
server/protocol.def
View file @
8d174d3f
...
...
@@ -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
server/request.h
View file @
8d174d3f
...
...
@@ -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 */
...
...
server/trace.c
View file @
8d174d3f
...
...
@@ -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 ### */
...
...
server/window.c
View file @
8d174d3f
...
...
@@ -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
;
}
windows/winpos.c
View file @
8d174d3f
...
...
@@ -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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment