"Roderick Colenbrander" thunderbird2k@gmx.net writes:
- if (data->client_window)
- {
int w = data->client_rect.right - data->client_rect.left;
int h = data->client_rect.bottom - data->client_rect.top;
TRACE("Updating client window 0x%lx to %dx%x,%dx%d\n", data->client_window,
data->client_rect.left, data->client_rect.top, w, h);
if(w>0 && h>0)
{
wine_tsx11_lock();
XMoveResizeWindow(display, data->client_window, data->client_rect.left,
data->client_rect.top, w, h);
wine_tsx11_unlock();
You should do that only when the size has actually changed.
+static Window create_client_window( Display *display, struct x11drv_win_data *data) +{
- XSetWindowAttributes attr;
- attr.event_mask = ExposureMask;
- attr.bit_gravity = NorthWestGravity;
- attr.backing_store = NotUseful;
Using NorthWestGravity is good but you still need to fix the valid rects calculation accordingly.
+static void destroy_client_window( Display *display, struct x11drv_win_data *data ) +{
- if (!data->client_window) return;
- wine_tsx11_lock();
- XDeleteContext( display, data->client_window, winContext );
- XDestroyWindow( display, data->client_window );
- data->client_window = 0;
- XFlush(display);
- wine_tsx11_unlock();
The XFlush shouldn't be needed.
@@ -1569,7 +1648,19 @@ void X11DRV_SetParent( HWND hwnd, HWND parent, HWND old_parent ) if (old_parent == GetDesktopWindow()) { /* destroy the old X windows */
destroy_whole_window( display, data );
/* Don't destroy the X11 window twice in order to prevent a BadWindow error, if the client window is the whole window */
if(data->whole_window == data->client_window)
{
destroy_whole_window( display, data );
data->client_window = 0;
RemovePropA( data->hwnd, client_window_prop );
}
The test is useless, if you are changing the parent of the desktop window something is very wrong...