From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57504 --- server/protocol.def | 4 ++++ server/user.h | 1 + server/winstation.c | 21 +++++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/server/protocol.def b/server/protocol.def index 4b9c4dc8e5c..37e7cffa748 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -979,6 +979,7 @@ typedef volatile struct unsigned int flags; /* desktop flags */ struct shared_cursor cursor; /* global cursor information */ unsigned char keystate[256]; /* asynchronous key state */ + unsigned __int64 monitor_serial; /* winstation monitor update counter */ } desktop_shm_t;
typedef volatile struct @@ -2882,7 +2883,10 @@ enum coords_relative
/* Update the process current window station monitors */ @REQ(set_winstation_monitors) + int increment; /* force increment the monitor update counter */ VARARG(infos,monitor_infos); /* window station monitors */ +@REPLY + unsigned __int64 serial; /* winstation monitor update counter */ @END
diff --git a/server/user.h b/server/user.h index 892f746739a..ce463b9395d 100644 --- a/server/user.h +++ b/server/user.h @@ -57,6 +57,7 @@ struct winstation struct namespace *desktop_names; /* namespace for desktops of this winstation */ unsigned int monitor_count; /* number of monitors */ struct monitor_info *monitors; /* window station monitors */ + unsigned __int64 monitor_serial; /* winstation monitor update counter */ };
struct key_repeat diff --git a/server/winstation.c b/server/winstation.c index 8611c893cde..b3746090ccf 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -149,6 +149,7 @@ static struct winstation *create_winstation( struct object *root, const struct u winstation->atom_table = NULL; winstation->monitors = NULL; winstation->monitor_count = 0; + winstation->monitor_serial = 1; list_add_tail( &winstation_list, &winstation->entry ); list_init( &winstation->desktops ); if (!(winstation->desktop_names = create_namespace( 7 ))) @@ -322,6 +323,7 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned shared->cursor.clip.right = 0; shared->cursor.clip.bottom = 0; memset( (void *)shared->keystate, 0, sizeof(shared->keystate) ); + shared->monitor_serial = winstation->monitor_serial; } SHARED_WRITE_END; } @@ -643,19 +645,34 @@ DECL_HANDLER(close_winstation) DECL_HANDLER(set_winstation_monitors) { struct winstation *winstation; - unsigned int size; + struct desktop *desktop; + unsigned int size = get_req_data_size();
if (!(winstation = (struct winstation *)get_handle_obj( current->process, current->process->winstation, 0, &winstation_ops ))) return;
+ if (req->increment || winstation->monitor_count != size / sizeof(*winstation->monitors) || + !winstation->monitors || memcmp( winstation->monitors, get_req_data(), size )) + winstation->monitor_serial++; + free( winstation->monitors ); winstation->monitors = NULL; winstation->monitor_count = 0;
- if ((size = get_req_data_size()) && (winstation->monitors = memdup( get_req_data(), size ))) + LIST_FOR_EACH_ENTRY(desktop, &winstation->desktops, struct desktop, entry) + { + SHARED_WRITE_BEGIN( desktop->shared, desktop_shm_t ) + { + shared->monitor_serial = winstation->monitor_serial; + } + SHARED_WRITE_END; + } + + if (size && (winstation->monitors = memdup( get_req_data(), size ))) winstation->monitor_count = size / sizeof(*winstation->monitors);
+ reply->serial = winstation->monitor_serial; release_object( winstation ); }