# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: erikcharlebois@gmail.com-20130414005845-\ # watpsk8w1701j22x # target_branch: file:///C:/Users/Erik/Source/emacs/trunk/ # testament_sha1: 9d1bc31821b315ab0286031e20ed7c9d457a6e98 # timestamp: 2013-04-13 20:59:05 -0400 # base_revision_id: rgm@gnu.org-20130410012215-0alg9spmwpmibi45 # # Begin patch === modified file 'src/w32fns.c' --- src/w32fns.c 2013-04-07 04:41:19 +0000 +++ src/w32fns.c 2013-04-14 00:58:45 +0000 @@ -157,6 +157,8 @@ typedef HMONITOR (WINAPI * MonitorFromPoint_Proc) (IN POINT pt, IN DWORD flags); typedef BOOL (WINAPI * GetMonitorInfo_Proc) (IN HMONITOR monitor, OUT struct MONITOR_INFO* info); +typedef HMONITOR (WINAPI * MonitorFromWindow_Proc) + (IN HWND hwnd, IN DWORD dwFlags); TrackMouseEvent_Proc track_mouse_event_fn = NULL; ImmGetCompositionString_Proc get_composition_string_fn = NULL; @@ -165,6 +167,7 @@ ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL; MonitorFromPoint_Proc monitor_from_point_fn = NULL; GetMonitorInfo_Proc get_monitor_info_fn = NULL; +MonitorFromWindow_Proc monitor_from_window_fn = NULL; #ifdef NTGUI_UNICODE #define unicode_append_menu AppendMenuW @@ -336,6 +339,66 @@ *yptr = rect.top; } +/* Returns the window rectangle appropriate for the given fullscreen mode. + The normal rect parameter was the window's rectangle prior to entering + fullscreen mode. If multiple monitor support is available, the nearest + monitor to the window is chosen. */ + +void +w32_fullscreen_rect (HWND hwnd, int fsmode, RECT normal, RECT *rect) +{ + struct MONITOR_INFO mi = { sizeof(mi) }; + if (monitor_from_window_fn && get_monitor_info_fn) + { + HMONITOR monitor = + monitor_from_window_fn (hwnd, MONITOR_DEFAULT_TO_NEAREST); + get_monitor_info_fn (monitor, &mi); + } + else + { + mi.rcMonitor.left = 0; + mi.rcMonitor.top = 0; + mi.rcMonitor.right = GetSystemMetrics (SM_CXSCREEN); + mi.rcMonitor.bottom = GetSystemMetrics (SM_CYSCREEN); + mi.rcWork.left = 0; + mi.rcWork.top = 0; + mi.rcWork.right = GetSystemMetrics (SM_CXMAXIMIZED); + mi.rcWork.bottom = GetSystemMetrics (SM_CYMAXIMIZED); + } + + switch (fsmode) + { + case FULLSCREEN_BOTH: + rect->left = mi.rcMonitor.left; + rect->top = mi.rcMonitor.top; + rect->right = mi.rcMonitor.right; + rect->bottom = mi.rcMonitor.bottom; + break; + case FULLSCREEN_MAXIMIZED: + rect->left = mi.rcWork.left; + rect->top = mi.rcWork.top; + rect->right = mi.rcWork.right; + rect->bottom = mi.rcWork.bottom; + break; + case FULLSCREEN_WIDTH: + rect->left = mi.rcWork.left; + rect->top = normal.top; + rect->right = mi.rcWork.right; + rect->bottom = normal.bottom; + break; + case FULLSCREEN_HEIGHT: + rect->left = normal.left; + rect->top = mi.rcWork.top; + rect->right = normal.right; + rect->bottom = mi.rcWork.bottom; + break; + case FULLSCREEN_NONE: + default: + *rect = normal; + break; + } +} + DEFUN ("w32-define-rgb-color", Fw32_define_rgb_color, @@ -3691,6 +3754,13 @@ /* Don't restrict the sizing of tip frames. */ if (hwnd == tip_window) return 0; + + /* Don't restrict the sizing of fullscreened frames, allowing them to be + flush with the sides of the screen. */ + f = x_window_to_frame (dpyinfo, hwnd); + if (f && FRAME_PREV_FSMODE (f) != FULLSCREEN_NONE) + return 0; + { WINDOWPLACEMENT wp; LPWINDOWPOS lppos = (WINDOWPOS *) lParam; @@ -7635,6 +7705,8 @@ GetProcAddress (user32_lib, "MonitorFromPoint"); get_monitor_info_fn = (GetMonitorInfo_Proc) GetProcAddress (user32_lib, "GetMonitorInfoA"); + monitor_from_window_fn = (MonitorFromWindow_Proc) + GetProcAddress (user32_lib, "MonitorFromWindow"); { HMODULE imm32_lib = GetModuleHandle ("imm32.dll"); === modified file 'src/w32term.c' --- src/w32term.c 2013-04-01 07:58:04 +0000 +++ src/w32term.c 2013-04-14 00:58:45 +0000 @@ -5663,88 +5663,40 @@ { if (FRAME_VISIBLE_P (f)) { - int width, height, top_pos, left_pos, pixel_height, pixel_width; - int cur_w = FRAME_COLS (f), cur_h = FRAME_LINES (f); - RECT workarea_rect; - - block_input (); - /* Record current "normal" dimensions for restoring later. */ - if (!( FRAME_PREV_FSMODE (f) == FULLSCREEN_BOTH - || FRAME_PREV_FSMODE (f) == FULLSCREEN_MAXIMIZED)) - { - if (FRAME_PREV_FSMODE (f) != FULLSCREEN_HEIGHT) - { - FRAME_NORMAL_HEIGHT (f) = cur_h; - FRAME_NORMAL_TOP (f) = f->top_pos; - } - if (FRAME_PREV_FSMODE (f) != FULLSCREEN_WIDTH) - { - FRAME_NORMAL_WIDTH (f) = cur_w; - FRAME_NORMAL_LEFT (f) = f->left_pos; - } - } - eassert (FRAME_NORMAL_HEIGHT (f) > 0); - eassert (FRAME_NORMAL_WIDTH (f) > 0); - x_real_positions (f, &f->left_pos, &f->top_pos); - x_fullscreen_adjust (f, &width, &height, &top_pos, &left_pos); - - SystemParametersInfo (SPI_GETWORKAREA, 0, &workarea_rect, 0); - pixel_height = workarea_rect.bottom - workarea_rect.top; - pixel_width = workarea_rect.right - workarea_rect.left; - /* Need to send SC_RESTORE to the window, in case we are - resizing from FULLSCREEN_MAXIMIZED. Otherwise, the mouse - resize hints will not be shown by the window manager when the - mouse pointer hovers over the window edges, because the WM - will still think the window is maximized. */ - if (f->want_fullscreen != FULLSCREEN_BOTH) - SendMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_RESTORE, 0); - + HWND hwnd = FRAME_W32_WINDOW(f); + DWORD dwStyle = GetWindowLong (hwnd, GWL_STYLE); + RECT rect; + + block_input(); + f->want_fullscreen &= ~FULLSCREEN_WAIT; + + if (FRAME_PREV_FSMODE (f) == FULLSCREEN_NONE) + GetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); + + if (FRAME_PREV_FSMODE (f) == FULLSCREEN_BOTH) + { + SetWindowLong (hwnd, GWL_STYLE, dwStyle | WS_OVERLAPPEDWINDOW); + SetWindowPos (hwnd, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + + w32_fullscreen_rect (hwnd, f->want_fullscreen, + FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); FRAME_PREV_FSMODE (f) = f->want_fullscreen; - switch (f->want_fullscreen) - { - case FULLSCREEN_BOTH: - PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MAXIMIZE, 0); - break; - case FULLSCREEN_MAXIMIZED: - height = - FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixel_height) - - XINT (Ftool_bar_lines_needed (selected_frame)) - + (NILP (Vmenu_bar_mode) ? 1 : 0); - width = - FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixel_width) - - FRAME_SCROLL_BAR_COLS (f); - left_pos = workarea_rect.left; - top_pos = workarea_rect.top; - break; - case FULLSCREEN_WIDTH: - width = - FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixel_width) - - FRAME_SCROLL_BAR_COLS (f); - height = FRAME_NORMAL_HEIGHT (f); - left_pos = workarea_rect.left; - break; - case FULLSCREEN_HEIGHT: - height = - FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixel_height) - - XINT (Ftool_bar_lines_needed (selected_frame)) - + (NILP (Vmenu_bar_mode) ? 1 : 0); - width = FRAME_NORMAL_WIDTH (f); - top_pos = workarea_rect.top; - break; - case FULLSCREEN_NONE: - height = FRAME_NORMAL_HEIGHT (f); - width = FRAME_NORMAL_WIDTH (f); - left_pos = FRAME_NORMAL_LEFT (f); - top_pos = FRAME_NORMAL_TOP (f); - break; - } + if (f->want_fullscreen == FULLSCREEN_BOTH) + { + SetWindowLong (hwnd, GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); + SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + else + { + SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, 0); + } - if (cur_w != width || cur_h != height) - { - x_set_offset (f, left_pos, top_pos, 1); - x_set_window_size (f, 1, width, height); - do_pending_window_change (0); - } f->want_fullscreen = FULLSCREEN_NONE; unblock_input (); } === modified file 'src/w32term.h' --- src/w32term.h 2013-04-07 04:41:19 +0000 +++ src/w32term.h 2013-04-14 00:58:45 +0000 @@ -71,6 +71,8 @@ }; extern void w32_regenerate_palette (struct frame *f); +extern void w32_fullscreen_rect (HWND hwnd, int fsmode, RECT normal, + RECT *rect); /* For each display (currently only one on w32), we have a structure that @@ -362,7 +364,7 @@ /* Frame geometry and full-screen mode before it was resized by specifying the 'fullscreen' frame parameter. Used to restore the geometry when 'fullscreen' is reset to nil. */ - int normal_width, normal_height, normal_top, normal_left; + WINDOWPLACEMENT normal_placement; int prev_fsmode; }; @@ -396,11 +398,8 @@ #define FRAME_SMALLEST_FONT_HEIGHT(F) \ FRAME_W32_DISPLAY_INFO(F)->smallest_font_height -#define FRAME_NORMAL_WIDTH(F) ((F)->output_data.w32->normal_width) -#define FRAME_NORMAL_HEIGHT(F) ((F)->output_data.w32->normal_height) -#define FRAME_NORMAL_TOP(F) ((F)->output_data.w32->normal_top) -#define FRAME_NORMAL_LEFT(F) ((F)->output_data.w32->normal_left) -#define FRAME_PREV_FSMODE(F) ((F)->output_data.w32->prev_fsmode) +#define FRAME_NORMAL_PLACEMENT(F) ((F)->output_data.w32->normal_placement) +#define FRAME_PREV_FSMODE(F) ((F)->output_data.w32->prev_fsmode) /* W32-specific scroll bar stuff. */ # Begin bundle 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