fixed fullscreen toggle positioning, smartsizing

Also: added maximum window size
This commit is contained in:
Benoit LeBlanc 2013-04-25 17:18:14 -04:00
parent a5bcb8bc21
commit b91a7cd3a8
4 changed files with 60 additions and 33 deletions

View File

@ -160,6 +160,9 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam
rdpInput* input;
BOOL processed;
RECT windowRect, clientRect;
MINMAXINFO *minmax;
processed = TRUE;
ptr = GetWindowLongPtr(hWnd, GWLP_USERDATA);
wfi = (wfInfo*) ptr;
@ -171,7 +174,7 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam
switch (Msg)
{
case WM_MOVE:
if (!wfi->fullscreen)
if (!wfi->disablewindowtracking)
{
int x = LOWORD(lParam);
int y = HIWORD(lParam);
@ -180,6 +183,20 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam
}
break;
case WM_GETMINMAXINFO:
// Set maximum window size for resizing
minmax = (MINMAXINFO*) lParam;
wf_update_canvas_diff(wfi);
if (!wfi->fullscreen)
{
// add window decoration
minmax->ptMaxTrackSize.x = wfi->width + wfi->diff.x;
minmax->ptMaxTrackSize.y = wfi->height + wfi->diff.y;
}
break;
case WM_SIZE:
{
int dwStyle = GetWindowLongPtr(wfi->hwnd, GWL_STYLE);
@ -189,23 +206,6 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam
if (!wfi->fullscreen)
{
//if (width > wfi->width || height > wfi->height)
//{
// // Calculate decoration size
// RECT decoration;
// GetWindowRect(wfi->hwnd, &decoration);
// decoration.right = decoration.right - decoration.left - width;
// decoration.left = 0;
// decoration.bottom = decoration.bottom - decoration.top - height;
// decoration.top = 0;
// width = min(wfi->width + decoration.right, width + decoration.right);
// height = min(wfi->height + decoration.bottom, height + decoration.bottom);
// SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, width, height, SWP_NOMOVE | SWP_FRAMECHANGED);
//}
((wfContext*) wfi->instance->context)->wfi->client_width = width;
((wfContext*) wfi->instance->context)->wfi->client_height = height;
}

View File

@ -37,6 +37,7 @@
#include "wf_interface.h"
#include "wf_graphics.h"
#include "wf_gdi.h"
const BYTE wf_rop2_table[] =
{
@ -280,12 +281,8 @@ void wf_resize_window(wfInfo* wfi)
/* Now resize to get full canvas size and room for caption and borders */
SetWindowPos(wfi->hwnd, HWND_TOP, 0, 0, wfi->width, wfi->height, SWP_FRAMECHANGED);
GetClientRect(wfi->hwnd, &rc_client);
GetWindowRect(wfi->hwnd, &rc_wnd);
wfi->diff.x = (rc_wnd.right - rc_wnd.left) - rc_client.right;
wfi->diff.y = (rc_wnd.bottom - rc_wnd.top) - rc_client.bottom;
wf_update_canvas_diff(wfi);
SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, wfi->width + wfi->diff.x, wfi->height + wfi->diff.y, SWP_NOMOVE | SWP_FRAMECHANGED);
}
else
@ -293,7 +290,7 @@ void wf_resize_window(wfInfo* wfi)
RECT rc_wnd;
RECT rc_client;
SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX);
SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX | WS_MAXIMIZEBOX);
if (!wfi->client_height)
wfi->client_height = wfi->height;
@ -307,15 +304,10 @@ void wf_resize_window(wfInfo* wfi)
if (!wfi->client_y)
wfi->client_y = 10;
/* Now resize to get full canvas size and room for caption and borders */
SetWindowPos(wfi->hwnd, HWND_TOP, wfi->client_x, wfi->client_y, wfi->client_width, wfi->client_height, SWP_FRAMECHANGED);
GetClientRect(wfi->hwnd, &rc_client);
GetWindowRect(wfi->hwnd, &rc_wnd);
wf_update_canvas_diff(wfi);
wfi->diff.x = (rc_wnd.right - rc_wnd.left) - rc_client.right;
wfi->diff.y = (rc_wnd.bottom - rc_wnd.top) - rc_client.bottom;
SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, wfi->client_width + wfi->diff.x, wfi->client_height + wfi->diff.y, SWP_NOMOVE | SWP_FRAMECHANGED);
/* Now resize to get full canvas size and room for caption and borders */
SetWindowPos(wfi->hwnd, HWND_TOP, wfi->client_x, wfi->client_y, wfi->client_width + wfi->diff.x, wfi->client_height + wfi->diff.y, SWP_FRAMECHANGED);
}
wf_update_offset(wfi);
}
@ -324,10 +316,22 @@ void wf_toggle_fullscreen(wfInfo* wfi)
{
ShowWindow(wfi->hwnd, SW_HIDE);
wfi->fullscreen = !wfi->fullscreen;
if (wfi->fullscreen)
{
wfi->disablewindowtracking = TRUE;
}
SetParent(wfi->hwnd, wfi->fullscreen ? NULL : wfi->hWndParent);
wf_resize_window(wfi);
ShowWindow(wfi->hwnd, SW_SHOW);
SetForegroundWindow(wfi->hwnd);
if (!wfi->fullscreen)
{
// Reenable window tracking AFTER resizing it back, otherwise it can lean to repositioning errors.
wfi->disablewindowtracking = FALSE;
}
}
void wf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette)
@ -694,3 +698,21 @@ void wf_gdi_register_update_callbacks(rdpUpdate* update)
update->SurfaceBits = wf_gdi_surface_bits;
update->SurfaceFrameMarker = wf_gdi_surface_frame_marker;
}
void wf_update_canvas_diff(wfInfo* wfi)
{
RECT rc_client, rc_wnd;
int dx, dy;
GetClientRect(wfi->hwnd, &rc_client);
GetWindowRect(wfi->hwnd, &rc_wnd);
dx = (rc_wnd.right - rc_wnd.left) - rc_client.right;
dy = (rc_wnd.bottom - rc_wnd.top) - rc_client.bottom;
if (!wfi->disablewindowtracking)
{
wfi->diff.x = dx;
wfi->diff.y = dy;
}
}

View File

@ -33,4 +33,6 @@ void wf_toggle_fullscreen(wfInfo* wfi);
void wf_gdi_register_update_callbacks(rdpUpdate* update);
void wf_update_canvas_diff(wfInfo* wfi);
#endif /* __WF_GDI_H */

View File

@ -129,6 +129,9 @@ struct wf_info
callbackFunc client_callback_func;
rdpFile* connectionRdpFile;
// Keep track of window size and position, disable when in fullscreen mode.
BOOL disablewindowtracking;
};
/**