From 5a1fd50db345c1de97d9d02133728a6080d2848b Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Tue, 24 Oct 2006 23:49:44 +0900 Subject: [PATCH] kernel32: Exit from initial thread with ExitThread not by ExitProcess. --- dlls/winex11.drv/xinerama.c | 45 +++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index 0d01b58ec8b..12f6c650ebd 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -106,9 +106,10 @@ static int query_screens(void) nb_monitors = count; for (i = 0; i < nb_monitors; i++) { +#if 1 /* FIXME: for now, force primary to be the screen that starts at (0,0) origin */ if (!screens[i].x_org && !screens[i].y_org) primary_monitor = i; - +#endif monitors[i].cbSize = sizeof( monitors[i] ); monitors[i].rcMonitor.left = screens[i].x_org; monitors[i].rcMonitor.top = screens[i].y_org; @@ -121,11 +122,6 @@ static int query_screens(void) } get_primary()->dwFlags |= MONITORINFOF_PRIMARY; - - for (i = 0; i < nb_monitors; i++) - TRACE( "monitor %p: %s%s\n", - index_to_monitor(i), wine_dbgstr_rect(&monitors[i].rcMonitor), - (monitors[i].dwFlags & MONITORINFOF_PRIMARY) ? " (primary)" : "" ); } else count = 0; @@ -145,11 +141,36 @@ static inline int query_screens(void) void xinerama_init(void) { MONITORINFOEXW *primary; + int i; wine_tsx11_lock(); SetRect( &virtual_screen_rect, 0, 0, screen_width, screen_height ); +#if 0 + if (root_window != DefaultRootWindow( gdi_display )) + { + static const WCHAR monitorW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','%','u',0}; + nb_monitors = 4; + if ((monitors = HeapAlloc( GetProcessHeap(), 0, nb_monitors * sizeof(*monitors) ))) + { + for (i = 0; i < nb_monitors; i++) + { + monitors[i].cbSize = sizeof( monitors[i] ); + monitors[i].rcMonitor.left = (i & 1) ? screen_width / 2 : 0; + monitors[i].rcMonitor.top = (i & 2) ? screen_height / 2 : 0; + monitors[i].rcMonitor.right = monitors[i].rcMonitor.left + screen_width / 2; + monitors[i].rcMonitor.bottom = monitors[i].rcMonitor.top + screen_height / 2; + monitors[i].rcWork = monitors[i].rcMonitor; + monitors[i].dwFlags = 0; + wsprintfW( monitors[i].szDevice, monitorW, i ); + } + primary_monitor = 3; + get_primary()->dwFlags |= MONITORINFOF_PRIMARY; + } + } + else +#endif if (root_window != DefaultRootWindow( gdi_display ) || !query_screens()) { default_monitor.rcWork = default_monitor.rcMonitor = virtual_screen_rect; @@ -158,11 +179,21 @@ void xinerama_init(void) } primary = get_primary(); + /* coordinates (0,0) have to point to the primary monitor origin */ OffsetRect( &virtual_screen_rect, -primary->rcMonitor.left, -primary->rcMonitor.top ); + for (i = 0; i < nb_monitors; i++) + { + OffsetRect( &monitors[i].rcMonitor, virtual_screen_rect.left, virtual_screen_rect.top ); + OffsetRect( &monitors[i].rcWork, virtual_screen_rect.left, virtual_screen_rect.top ); + ERR( "monitor %p: %s%s\n", + index_to_monitor(i), wine_dbgstr_rect(&monitors[i].rcMonitor), + (monitors[i].dwFlags & MONITORINFOF_PRIMARY) ? " (primary)" : "" ); + } + screen_width = primary->rcMonitor.right - primary->rcMonitor.left; screen_height = primary->rcMonitor.bottom - primary->rcMonitor.top; - TRACE( "virtual size: %s primary size: %dx%d\n", + ERR( "virtual size: %s primary size: %dx%d\n", wine_dbgstr_rect(&virtual_screen_rect), screen_width, screen_height ); wine_tsx11_unlock();