"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.
Is it enough to check if the dimensions changed or should I also care about the position? (I don't think it changes)
+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.
What's the problem in X11DRV_SetWindowPos? I have checked valid_rects there but the contents of the two rects stored in it look ok to me. They seem to contain the current and previous location of the whole window (the location of where the window starts ignoring the border added by the WM). What should be done in this part of the code?
+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.
When destroying the client window when code to recreate the client window is there, this was needed. I guess because events hadn't arrived yet for the destroyed window. But I can remove it for now as perhaps something else was wrong.
Thanks, Roderick