From: Rémi Bernon rbernon@codeweavers.com
--- server/class.c | 5 +++-- server/protocol.def | 13 +++++++------ server/user.h | 4 ++-- server/window.c | 4 +++- 4 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/server/class.c b/server/class.c index 0e336bab897..5a10238ecb8 100644 --- a/server/class.c +++ b/server/class.c @@ -129,14 +129,15 @@ static struct window_class *find_class( struct process *process, atom_t atom, mo return NULL; }
-struct window_class *grab_class( struct process *process, atom_t atom, - mod_handle_t instance, int *extra_bytes ) +struct window_class *grab_class( struct process *process, atom_t atom, mod_handle_t instance, + int *extra_bytes, struct obj_locator *locator ) { struct window_class *class = find_class( process, atom, instance ); if (class) { class->count++; *extra_bytes = class->win_extra; + *locator = get_shared_object_locator( class->shared ); } else set_error( STATUS_INVALID_HANDLE ); return class; diff --git a/server/protocol.def b/server/protocol.def index 4e6f08d1d4a..b750b151474 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -971,6 +971,12 @@ union udp_endpoint /****************************************************************/ /* shared session mapping structures */
+struct obj_locator +{ + object_id_t id; /* object unique id, object data is valid if != 0 */ + mem_size_t offset; /* offset of the object in session shared memory */ +}; + #define MAX_ATOM_LEN 255
struct shared_cursor @@ -1025,6 +1031,7 @@ typedef volatile struct
typedef volatile struct { + struct obj_locator class; /* object locator for the window class shared object */ unsigned int dpi_context; /* DPI awareness context */ } window_shm_t;
@@ -1049,12 +1056,6 @@ typedef volatile struct struct user_entry user_entries[MAX_USER_HANDLES]; } session_shm_t;
-struct obj_locator -{ - object_id_t id; /* object unique id, object data is valid if != 0 */ - mem_size_t offset; /* offset of the object in session shared memory */ -}; - /****************************************************************/ /* Request declarations */
diff --git a/server/user.h b/server/user.h index 0ebda06b49b..73b10aaf5ac 100644 --- a/server/user.h +++ b/server/user.h @@ -188,8 +188,8 @@ extern struct window_class *get_window_class( user_handle_t window ); /* window class functions */
extern void destroy_process_classes( struct process *process ); -extern struct window_class *grab_class( struct process *process, atom_t atom, - mod_handle_t instance, int *extra_bytes ); +extern struct window_class *grab_class( struct process *process, atom_t atom, mod_handle_t instance, + int *extra_bytes, struct obj_locator *locator ); extern void release_class( struct window_class *class ); extern int is_desktop_class( struct window_class *class ); extern int is_message_class( struct window_class *class ); diff --git a/server/window.c b/server/window.c index e237d40a153..9f871ed9494 100644 --- a/server/window.c +++ b/server/window.c @@ -618,10 +618,11 @@ static struct window *create_window( struct window *parent, struct window *owner struct window *win = NULL; struct desktop *desktop; struct window_class *class; + struct obj_locator class_locator;
if (!(desktop = get_thread_desktop( current, DESKTOP_CREATEWINDOW ))) return NULL;
- if (!(class = grab_class( current->process, atom, class_instance, &extra_bytes ))) + if (!(class = grab_class( current->process, atom, class_instance, &extra_bytes, &class_locator ))) { release_object( desktop ); return NULL; @@ -683,6 +684,7 @@ static struct window *create_window( struct window *parent, struct window *owner if (!(win->shared = alloc_shared_object())) goto failed; SHARED_WRITE_BEGIN( win->shared, window_shm_t ) { + shared->class = class_locator; shared->dpi_context = NTUSER_DPI_PER_MONITOR_AWARE; } SHARED_WRITE_END;