A couple of optimizations.
This commit is contained in:
parent
b517b764b8
commit
55557319a7
|
@ -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 )
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue