Commit 55557319 authored by Alexandre Julliard's avatar Alexandre Julliard

A couple of optimizations.

parent b517b764
...@@ -1871,9 +1871,13 @@ static LONG WIN_SetWindowLong( HWND hwnd, INT offset, LONG newval, ...@@ -1871,9 +1871,13 @@ static LONG WIN_SetWindowLong( HWND hwnd, INT offset, LONG newval,
TRACE( "%x %d %lx %x\n", hwnd, offset, newval, type ); TRACE( "%x %d %lx %x\n", hwnd, offset, newval, type );
if (!WIN_IsCurrentThread( hwnd )) if (!WIN_IsCurrentProcess( hwnd ))
{ {
ERR("set %x %d %x\n", hwnd, offset, newval ); if (offset == GWL_WNDPROC)
{
SetLastError( ERROR_ACCESS_DENIED );
return 0;
}
return SendMessageW( hwnd, WM_WINE_SETWINDOWLONG, offset, newval ); return SendMessageW( hwnd, WM_WINE_SETWINDOWLONG, offset, newval );
} }
...@@ -2702,24 +2706,62 @@ HWND WINAPI GetLastActivePopup( HWND hwnd ) ...@@ -2702,24 +2706,62 @@ HWND WINAPI GetLastActivePopup( HWND hwnd )
*/ */
HWND *WIN_ListParents( HWND hwnd ) HWND *WIN_ListParents( HWND hwnd )
{ {
HWND *list = NULL; WND *win;
HWND current, *list;
int pos = 0, size = 16, count;
if (!(list = HeapAlloc( GetProcessHeap(), 0, size * sizeof(HWND) ))) return NULL;
current = hwnd;
for (;;)
{
if (!(win = WIN_GetPtr( current ))) goto empty;
if (win == WND_OTHER_PROCESS) break; /* need to do it the hard way */
list[pos] = win->parent;
WIN_ReleasePtr( win );
if (!(current = list[pos]))
{
if (!pos) goto empty;
return list;
}
if (++pos == size - 1)
{
/* need to grow the list */
HWND *new_list = HeapReAlloc( GetProcessHeap(), 0, list, (size+16) * sizeof(HWND) );
if (!new_list) goto empty;
list = new_list;
size += 16;
}
}
/* at least one parent belongs to another process, have to query the server */
SERVER_START_VAR_REQ( get_window_parents, REQUEST_MAX_VAR_SIZE ) SERVER_START_VAR_REQ( get_window_parents, REQUEST_MAX_VAR_SIZE )
{ {
req->handle = hwnd; req->handle = hwnd;
if (!SERVER_CALL()) if (!SERVER_CALL())
{ {
user_handle_t *data = server_data_ptr(req); user_handle_t *data = server_data_ptr(req);
int i, count = server_data_size(req) / sizeof(*data); count = server_data_size(req) / sizeof(*data);
if (count && ((list = HeapAlloc( GetProcessHeap(), 0, (count + 1) * sizeof(HWND) )))) if (count)
{ {
for (i = 0; i < count; i++) list[i] = data[i]; HWND *new_list = HeapReAlloc( GetProcessHeap(), 0,
list[i] = 0; list, (count + 1) * sizeof(HWND) );
if (new_list)
{
list = new_list;
for (pos = 0; pos < count; pos++) list[pos] = data[pos];
list[pos] = 0;
}
else count = 0;
} }
} }
} }
SERVER_END_VAR_REQ; SERVER_END_VAR_REQ;
return list; if (count) return list;
empty:
HeapFree( GetProcessHeap(), 0, list );
return NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment