static void clutter_stage_gdk_set_gdk_geometry (ClutterStageGdk *stage) { GdkGeometry geometry; ClutterStage *wrapper = CLUTTER_STAGE_COGL (stage)->wrapper; gboolean resize = clutter_stage_get_user_resizable (wrapper); if (!resize) { geometry.min_width = geometry.max_width = gdk_window_get_width (stage->window); geometry.min_height = geometry.max_height = gdk_window_get_height (stage->window); gdk_window_set_geometry_hints (stage->window, &geometry, GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE); } else { clutter_stage_get_minimum_size (wrapper, (guint *)&geometry.min_width, (guint *)&geometry.min_height); gdk_window_set_geometry_hints (stage->window, &geometry, GDK_HINT_MIN_SIZE); } }
static void clutter_stage_win32_resize (ClutterStageWindow *stage_window, gint width, gint height) { ClutterStageWin32 *stage_win32 = CLUTTER_STAGE_WIN32 (stage_window); gboolean resize; resize = clutter_stage_get_user_resizable (stage_win32->wrapper); if (width != stage_win32->win_width || height != stage_win32->win_height) { /* Ignore size requests if we are in full screen mode */ if (!_clutter_stage_is_fullscreen (stage_win32->wrapper)) { stage_win32->win_width = width; stage_win32->win_height = height; if (stage_win32->hwnd != NULL && !stage_win32->is_foreign_win) { int full_width, full_height; get_full_window_size (stage_win32, width, height, &full_width, &full_height); SetWindowPos (stage_win32->hwnd, NULL, 0, 0, full_width, full_height, SWP_NOZORDER | SWP_NOMOVE); } } } }
static void get_full_window_size (ClutterStageWin32 *stage_win32, int width_in, int height_in, int *width_out, int *height_out) { gboolean resizable = clutter_stage_get_user_resizable (stage_win32->wrapper); /* The window size passed to CreateWindow includes the window decorations */ gint frame_width, frame_height; #if !defined (_MSC_VER) || (_MSC_VER < 1700) frame_width = GetSystemMetrics (resizable ? SM_CXSIZEFRAME : SM_CXFIXEDFRAME); frame_height = GetSystemMetrics (resizable ? SM_CYSIZEFRAME : SM_CYFIXEDFRAME); #else /* MSVC 2012 and later returns wrong values from GetSystemMetrics() * http://connect.microsoft.com/VisualStudio/feedback/details/753224/regression-getsystemmetrics-delivers-different-values * * For AdjustWindowRectEx(), it doesn't matter much whether the Window is resizble. */ RECT cxrect = {0, 0, 0, 0}; AdjustWindowRectEx (&cxrect, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_THICKFRAME | WS_DLGFRAME, FALSE, 0); frame_width = abs (cxrect.bottom); frame_height = abs (cxrect.left); #endif *width_out = width_in + frame_width * 2; *height_out = height_in + frame_height * 2 + GetSystemMetrics (SM_CYCAPTION); }
static void clutter_stage_x11_fix_window_size (ClutterStageX11 *stage_x11, gint new_width, gint new_height) { ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_x11); ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (stage_cogl->backend); if (stage_x11->xwin != None && !stage_x11->is_foreign_xwin) { guint min_width, min_height; XSizeHints *size_hints; gboolean resize; resize = clutter_stage_get_user_resizable (stage_cogl->wrapper); size_hints = XAllocSizeHints(); clutter_stage_get_minimum_size (stage_cogl->wrapper, &min_width, &min_height); if (new_width <= 0) new_width = min_width; if (new_height <= 0) new_height = min_height; size_hints->flags = 0; /* If we are going fullscreen then we don't want any restrictions on the window size */ if (!stage_x11->fullscreening) { if (resize) { size_hints->min_width = min_width; size_hints->min_height = min_height; size_hints->flags = PMinSize; } else { size_hints->min_width = new_width; size_hints->min_height = new_height; size_hints->max_width = new_width; size_hints->max_height = new_height; size_hints->flags = PMinSize | PMaxSize; } } XSetWMNormalHints (backend_x11->xdpy, stage_x11->xwin, size_hints); XFree(size_hints); } }
static void get_full_window_size (ClutterStageWin32 *stage_win32, int width_in, int height_in, int *width_out, int *height_out) { gboolean resizable = clutter_stage_get_user_resizable (stage_win32->wrapper); /* The window size passed to CreateWindow includes the window decorations */ *width_out = width_in + GetSystemMetrics (resizable ? SM_CXSIZEFRAME : SM_CXFIXEDFRAME) * 2; *height_out = height_in + GetSystemMetrics (resizable ? SM_CYSIZEFRAME : SM_CYFIXEDFRAME) * 2 + GetSystemMetrics (SM_CYCAPTION); }
static LONG get_window_style (ClutterStageWin32 *stage_win32) { ClutterStage *wrapper = stage_win32->wrapper; /* Fullscreen mode shouldn't have any borders */ if ((stage_win32->state & CLUTTER_STAGE_STATE_FULLSCREEN)) return WS_POPUP; /* Otherwise it's an overlapped window but if it isn't resizable then it shouldn't have a thick frame */ else if (clutter_stage_get_user_resizable (wrapper)) return WS_OVERLAPPEDWINDOW; else return WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX; }
static LONG get_requested_window_style (ClutterStageWin32 *stage_win32, gboolean want_fullscreen) { ClutterStage *wrapper = stage_win32->wrapper; /* Fullscreen mode shouldn't have any borders */ if (want_fullscreen) return WS_POPUP; /* Otherwise it's an overlapped window but if it isn't resizable then it shouldn't have a thick frame */ else if (clutter_stage_get_user_resizable (wrapper)) return WS_OVERLAPPEDWINDOW; else return WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX; }
void _clutter_stage_win32_get_min_max_info (ClutterStageWin32 *stage_win32, MINMAXINFO *min_max_info) { /* If the window isn't resizable then set the max and min size to the current size */ if (!clutter_stage_get_user_resizable (CLUTTER_STAGE (stage_win32->wrapper))) { int full_width, full_height; get_full_window_size (stage_win32, stage_win32->win_width, stage_win32->win_height, &full_width, &full_height); min_max_info->ptMaxTrackSize.x = full_width; min_max_info->ptMinTrackSize.x = full_width; min_max_info->ptMaxTrackSize.y = full_height; min_max_info->ptMinTrackSize.y = full_height; } }