# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: erikcharlebois@gmail.com-20130411042232-\ # o9fs13w6mjs5p1ox # target_branch: file:///C:/Users/Erik/Source/emacs/trunk/ # testament_sha1: fb9276945e45ab5295c446c677d869c181d0d03d # timestamp: 2013-04-11 00:34:28 -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-11 04:22:32 +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,34 @@ *yptr = rect.top; } +void +w32_monitor_rect (struct frame *f, RECT *rect) +{ +#ifdef HAVE_WINDOW_SYSTEM + if (f) + { + /* If multiple monitor support is available, make the window + fullscreen on the appropriate screen. */ + if (monitor_from_window_fn && get_monitor_info_fn) + { + HWND hwnd = FRAME_W32_WINDOW (f); + struct MONITOR_INFO mi = { sizeof(mi) }; + HMONITOR monitor = + monitor_from_window_fn (hwnd, MONITOR_DEFAULT_TO_NEAREST); + get_monitor_info_fn (monitor, &mi); + *rect = mi.rcMonitor; + } + else + { + rect->left = 0; + rect->right = GetSystemMetrics (SM_CXSCREEN); + rect->top = 0; + rect->bottom = GetSystemMetrics (SM_CYSCREEN); + } + } +#endif +} + DEFUN ("w32-define-rgb-color", Fw32_define_rgb_color, @@ -3691,6 +3722,10 @@ /* Don't restrict the sizing of tip frames. */ if (hwnd == tip_window) return 0; + + f = x_window_to_frame (dpyinfo, hwnd); + if (f && FRAME_PREV_FSMODE (f) == FULLSCREEN_BOTH) + return 0; { WINDOWPLACEMENT wp; LPWINDOWPOS lppos = (WINDOWPOS *) lParam; @@ -3838,9 +3873,13 @@ case WM_EMACS_SETWINDOWPOS: { - WINDOWPOS * pos = (WINDOWPOS *) wParam; - return SetWindowPos (hwnd, pos->hwndInsertAfter, - pos->x, pos->y, pos->cx, pos->cy, pos->flags); + f = x_window_to_frame (dpyinfo, hwnd); + if (!f || FRAME_PREV_FSMODE (f) != FULLSCREEN_BOTH) + { + WINDOWPOS * pos = (WINDOWPOS *) wParam; + return SetWindowPos (hwnd, pos->hwndInsertAfter, + pos->x, pos->y, pos->cx, pos->cy, pos->flags); + } } case WM_EMACS_DESTROYWINDOW: @@ -7635,6 +7674,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-11 04:22:32 +0000 @@ -237,7 +237,7 @@ #endif static void my_set_foreground_window (HWND); static void my_destroy_window (struct frame *, HWND); -static void w32fullscreen_hook (FRAME_PTR); +static void w32_fullscreen_hook (FRAME_PTR); #ifdef GLYPH_DEBUG static void x_check_font (struct frame *, struct font *); @@ -4720,7 +4720,7 @@ sets the WAIT flag. */ if ((msg.msg.message == WM_WINDOWPOSCHANGED || msg.msg.wParam) && (f->want_fullscreen & FULLSCREEN_WAIT)) - w32fullscreen_hook (f); + w32_fullscreen_hook (f); x_check_fullscreen (f); } check_visibility = 1; @@ -5659,92 +5659,63 @@ } static void -w32fullscreen_hook (FRAME_PTR f) +w32_fullscreen_hook (FRAME_PTR f) { 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; + HWND hwnd = FRAME_W32_WINDOW(f); + DWORD dwStyle = GetWindowLong (hwnd, GWL_STYLE); + MONITORINFO mi = { sizeof(mi) }; + int prev_fsmode = FRAME_PREV_FSMODE (f); 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); FRAME_PREV_FSMODE (f) = f->want_fullscreen; switch (f->want_fullscreen) { case FULLSCREEN_BOTH: - PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MAXIMIZE, 0); + if (prev_fsmode == FULLSCREEN_MAXIMIZED) + SendMessage (hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); + + if (prev_fsmode != FULLSCREEN_BOTH) + GetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); + + RECT rect; + w32_monitor_rect (f, &rect); + 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); 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; + if (prev_fsmode == FULLSCREEN_BOTH) + { + SetWindowLong (hwnd, GWL_STYLE, dwStyle | WS_OVERLAPPEDWINDOW); + SetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); + SetWindowPos(hwnd, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + + PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MAXIMIZE, 0); 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); + if (prev_fsmode == FULLSCREEN_BOTH) + { + SetWindowLong (hwnd, GWL_STYLE, dwStyle | WS_OVERLAPPEDWINDOW); + SetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); + SetWindowPos(hwnd, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + else if (prev_fsmode == FULLSCREEN_MAXIMIZED) + SendMessage (hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); break; } - 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 (); } @@ -6439,7 +6410,7 @@ terminal->mouse_position_hook = w32_mouse_position; terminal->frame_rehighlight_hook = w32_frame_rehighlight; terminal->frame_raise_lower_hook = w32_frame_raise_lower; - terminal->fullscreen_hook = w32fullscreen_hook; + terminal->fullscreen_hook = w32_fullscreen_hook; terminal->set_vertical_scroll_bar_hook = w32_set_vertical_scroll_bar; terminal->condemn_scroll_bars_hook = w32_condemn_scroll_bars; terminal->redeem_scroll_bar_hook = w32_redeem_scroll_bar; === modified file 'src/w32term.h' --- src/w32term.h 2013-04-07 04:41:19 +0000 +++ src/w32term.h 2013-04-11 04:22:32 +0000 @@ -71,6 +71,7 @@ }; extern void w32_regenerate_palette (struct frame *f); +extern void w32_monitor_rect (struct frame *f, RECT *rect); /* For each display (currently only one on w32), we have a structure that @@ -362,7 +363,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 +397,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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