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
ac4aac74
Commit
ac4aac74
authored
Feb 24, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Make the foreground thread input per-desktop instead of global.
parent
f801abef
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
52 additions
and
26 deletions
+52
-26
queue.c
server/queue.c
+41
-17
user.h
server/user.h
+10
-9
winstation.c
server/winstation.c
+1
-0
No files found.
server/queue.c
View file @
ac4aac74
...
...
@@ -199,7 +199,6 @@ static const struct object_ops thread_input_ops =
};
/* pointer to input structure of foreground thread */
static
struct
thread_input
*
foreground_input
;
static
unsigned
int
last_input_time
;
static
void
free_message
(
struct
message
*
msg
);
...
...
@@ -894,9 +893,12 @@ static void thread_input_destroy( struct object *obj )
{
struct
thread_input
*
input
=
(
struct
thread_input
*
)
obj
;
if
(
foreground_input
==
input
)
foreground_input
=
NULL
;
empty_msg_list
(
&
input
->
msg_list
);
if
(
input
->
desktop
)
release_object
(
input
->
desktop
);
if
(
input
->
desktop
)
{
if
(
input
->
desktop
->
foreground_input
==
input
)
input
->
desktop
->
foreground_input
=
NULL
;
release_object
(
input
->
desktop
);
}
}
/* fix the thread input data when a window is destroyed */
...
...
@@ -1704,8 +1706,9 @@ DECL_HANDLER(send_hardware_message)
{
struct
message
*
msg
;
struct
thread
*
thread
=
NULL
;
struct
desktop
*
desktop
=
NULL
;
struct
hardware_msg_data
*
data
;
struct
thread_input
*
input
=
foreground_input
;
struct
thread_input
*
input
;
if
(
req
->
id
)
{
...
...
@@ -1717,15 +1720,18 @@ DECL_HANDLER(send_hardware_message)
return
;
}
input
=
thread
->
queue
->
input
;
desktop
=
(
struct
desktop
*
)
grab_object
(
input
->
desktop
);
reply
->
cursor
=
input
->
cursor
;
reply
->
count
=
input
->
cursor_count
;
}
if
(
!
req
->
msg
||
!
(
data
=
mem_alloc
(
sizeof
(
*
data
)
)))
else
{
if
(
thread
)
release_object
(
thread
)
;
return
;
if
(
!
(
desktop
=
get_thread_desktop
(
current
,
0
)))
return
;
input
=
desktop
->
foreground_input
;
}
if
(
!
req
->
msg
||
!
(
data
=
mem_alloc
(
sizeof
(
*
data
)
)))
goto
done
;
memset
(
data
,
0
,
sizeof
(
*
data
)
);
data
->
x
=
req
->
x
;
data
->
y
=
req
->
y
;
...
...
@@ -1746,7 +1752,9 @@ DECL_HANDLER(send_hardware_message)
}
else
free
(
data
);
done
:
if
(
thread
)
release_object
(
thread
);
release_object
(
desktop
);
}
/* post a quit message to the current queue */
...
...
@@ -2035,14 +2043,24 @@ DECL_HANDLER(attach_thread_input)
DECL_HANDLER
(
get_thread_input
)
{
struct
thread
*
thread
=
NULL
;
struct
desktop
*
desktop
;
struct
thread_input
*
input
;
if
(
req
->
tid
)
{
if
(
!
(
thread
=
get_thread_from_id
(
req
->
tid
)))
return
;
if
(
!
(
desktop
=
get_thread_desktop
(
thread
,
0
)))
{
release_object
(
thread
);
return
;
}
input
=
thread
->
queue
?
thread
->
queue
->
input
:
NULL
;
}
else
input
=
foreground_input
;
/* get the foreground thread info */
else
{
if
(
!
(
desktop
=
get_thread_desktop
(
current
,
0
)))
return
;
input
=
desktop
->
foreground_input
;
/* get the foreground thread info */
}
if
(
input
)
{
...
...
@@ -2058,8 +2076,9 @@ DECL_HANDLER(get_thread_input)
}
/* foreground window is active window of foreground thread */
reply
->
foreground
=
foreground_input
?
foreground_input
->
active
:
0
;
reply
->
foreground
=
desktop
->
foreground_input
?
desktop
->
foreground_input
->
active
:
0
;
if
(
thread
)
release_object
(
thread
);
release_object
(
desktop
);
}
...
...
@@ -2100,21 +2119,26 @@ DECL_HANDLER(set_key_state)
/* set the system foreground window */
DECL_HANDLER
(
set_foreground_window
)
{
struct
thread
*
thread
;
struct
thread
*
thread
=
NULL
;
struct
desktop
*
desktop
;
struct
msg_queue
*
queue
=
get_current_queue
();
reply
->
previous
=
foreground_input
?
foreground_input
->
active
:
0
;
reply
->
send_msg_old
=
(
reply
->
previous
&&
foreground_input
!=
queue
->
input
);
if
(
!
(
desktop
=
get_thread_desktop
(
current
,
0
)))
return
;
reply
->
previous
=
desktop
->
foreground_input
?
desktop
->
foreground_input
->
active
:
0
;
reply
->
send_msg_old
=
(
reply
->
previous
&&
desktop
->
foreground_input
!=
queue
->
input
);
reply
->
send_msg_new
=
FALSE
;
if
(
is_top_level_window
(
req
->
handle
)
&&
((
thread
=
get_window_thread
(
req
->
handle
))))
((
thread
=
get_window_thread
(
req
->
handle
)))
&&
(
thread
->
queue
->
input
->
desktop
==
desktop
))
{
foreground_input
=
thread
->
queue
->
input
;
reply
->
send_msg_new
=
(
foreground_input
!=
queue
->
input
);
release_object
(
thread
);
desktop
->
foreground_input
=
thread
->
queue
->
input
;
reply
->
send_msg_new
=
(
desktop
->
foreground_input
!=
queue
->
input
);
}
else
set_win32_error
(
ERROR_INVALID_WINDOW_HANDLE
);
if
(
thread
)
release_object
(
thread
);
release_object
(
desktop
);
}
...
...
server/user.h
View file @
ac4aac74
...
...
@@ -53,15 +53,16 @@ struct winstation
struct
desktop
{
struct
object
obj
;
/* object header */
unsigned
int
flags
;
/* desktop flags */
struct
winstation
*
winstation
;
/* winstation this desktop belongs to */
struct
list
entry
;
/* entry in winstation list of desktops */
struct
window
*
top_window
;
/* desktop window for this desktop */
struct
window
*
msg_window
;
/* HWND_MESSAGE top window */
struct
hook_table
*
global_hooks
;
/* table of global hooks on this desktop */
struct
timeout_user
*
close_timeout
;
/* timeout before closing the desktop */
unsigned
int
users
;
/* processes and threads using this desktop */
struct
object
obj
;
/* object header */
unsigned
int
flags
;
/* desktop flags */
struct
winstation
*
winstation
;
/* winstation this desktop belongs to */
struct
list
entry
;
/* entry in winstation list of desktops */
struct
window
*
top_window
;
/* desktop window for this desktop */
struct
window
*
msg_window
;
/* HWND_MESSAGE top window */
struct
hook_table
*
global_hooks
;
/* table of global hooks on this desktop */
struct
timeout_user
*
close_timeout
;
/* timeout before closing the desktop */
struct
thread_input
*
foreground_input
;
/* thread input of foreground thread */
unsigned
int
users
;
/* processes and threads using this desktop */
};
/* user handles functions */
...
...
server/winstation.c
View file @
ac4aac74
...
...
@@ -230,6 +230,7 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned
desktop
->
msg_window
=
NULL
;
desktop
->
global_hooks
=
NULL
;
desktop
->
close_timeout
=
NULL
;
desktop
->
foreground_input
=
NULL
;
desktop
->
users
=
0
;
list_add_tail
(
&
winstation
->
desktops
,
&
desktop
->
entry
);
}
...
...
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