unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#14180: PATCH Better fullscreen frame support on Windows
@ 2013-04-11  4:59 Erik Charlebois
  2013-04-12  9:28 ` martin rudalics
  2013-04-13 10:09 ` Eli Zaretskii
  0 siblings, 2 replies; 12+ messages in thread
From: Erik Charlebois @ 2013-04-11  4:59 UTC (permalink / raw)
  To: 14180


[-- Attachment #1.1: Type: text/plain, Size: 1520 bytes --]

Description

This change improves the 'fullscreen' frame support on Windows. When going
to
fullscreen, the frame gets fullscreened with no window decorations (which
causes the
Windows task bar to also disappear) on the nearest monitor.

The old fullscreen functionality was actually 'maximize' behavior so I've
moved that to
'maximize'. 'fullwidth' and 'fullheight' are now ignored because they were
buggy (at least in
Windows 8, they were not being sized correctly) and are not common Windows
idioms.
While they could be supported, I'd do it as follow on work and get it
working right on
multiple monitors as well.

I've tested corner cases such as resolution changes and disconnect
monitors; in both
cases the fullscreen window stays fullscreen (and moves to a different
monitor for the
disconnect case).

I've modified the response to WM_WINDOWPOSCHANGED to do nothing when the
frame is fullscreen. Otherwise, the size gets tuned to a multiple of the
character cells and
the fullscreen isn't perfectly matching the screen. When this happens,
Windows' special
behavior to hide the taskbar doesn't kick in.

Changelog

2013-04-11  Erik Charlebois  <erikcharlebois@gmail.com>

* src/w32fns.c (monitor_from_window_fn): New Windows API import.
(w32_monitor_rect): New function to get nearest monitor rect.
* src/w32term.c (w32_fullscreen_hook): Renamed from w32fullscreen_hook
for consistency. Rewritten for improved fullscreen support.


(I signed the FSF copyright assignment papers in January so I'm ok on that
front.)

[-- Attachment #1.2: Type: text/html, Size: 2566 bytes --]

[-- Attachment #2: W32_FULLSCREEN.txt --]
[-- Type: text/plain, Size: 14729 bytes --]

# 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
+}
+
 \f
 
 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);
 
 \f
 /* 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)
 
 \f
 /* W32-specific scroll bar stuff.  */

# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWZwBSbsABa5/gFdwBIJ59///
f+ff8L////9gC65r0Y4PvQAeh7OPeaKXurm9uHisOxrm60WgkkIBNT0DTQm0lPxU80mp+I1Mp6J6
ZQ09TRobU9QaGmagSiEyYjSp7JlJtENA9QaBoaNDIAMj1GgAAcaGgaNMjTRpkBiYIAAaA0BpkBgT
IEpoiaFMnpJp5TE0zBTRo9IGgAaAA00BoaaAiUjSNNRk02kp+pkj1GntU09T0QaB6nppD1HpqAA0
HqPSBJEAgBCMmSmamxJ6SD1GmTI9QPUAGT1DJoYlAIUsuTytb51lDNaa4KZw4jyuZkvH4Es+nTTK
TfKeRovPmXRVD3OciLKDqt3vl6JoK0mfRECIEG4H9FK7wYXxXlE79s2qnifq6FXhlsDfXltYC1Cm
+qm4kNc6yxYNmx9Vb2Ofog8e5zdfsu/X1nF0ps47/jgIICVo1RgBbWup8cMUlvtOrjJWbfIe15FD
gPe3DZD4Q2QtwXlN+zMNxqr6DHs/A48DeL+Hnb3lZISKEhwqaDCcY2NbSLa+bDS1SRlWRTaKk8Mq
suTLVVSpyFVY+kVu9LB4ZRKCasVtdImpIKlFbk1OvWla/Jc/7uxZx8UVRj6BcZqglw+iN7g2ITBz
wTWlIOnje/DlVriTSRKQOm5HDjMvlz0GMxqcaWbiwu23cNiqdaKZPgWxljPJthYLdmtg+c64e8x5
EZaX33dJPx1K0fawz3Z8nRTReg9fUqrOcKoAxO2dgZIy3m54CUjySb73RpU/GurWXnc3Gy5dZ1y5
TOGRG8JSWctwHs2bubdt58mMiUPqUu3ozYRRcDhLiC6PAuYra2ghmO2zTiIIR1MkcIwZRhKZ2JvC
hjmGIU4W90jNy7xwPNcke3RdtvaZyqBLywxcpvux43x0TlwpMy7cgvWx1F4r/y8nU31ELxIkEDgV
LyNbDPt42idi/Zq9F82L4rh4kuQeupbxDhTzruZ27CM4eUum3IJCNvXAenNqt4u93DpdhnNmTGSR
/x1E0W5+sYpM5fHsdG/wuzMz4OGGQTph3osjjFK1oDWjrNaFIRcooRAGKlSc/OMP9/2AFBHSJZBe
P+TMexiVZBX2RRjIM1L5VAuPw1uul2loMlZpZuEWaFr6p5F2CjfcOIt5sDOJ0zXuuEaFyCaDmdRI
tdTfiFn4Pw2LTAMcUEjWC6CM0aWPVnY9XHRZKhqNhF5MN+hu+xyLIHInJ+wbRcTgcqbCLqYo4ycj
BsJcdgWPBAnQWjst1FURIIiL6Ma5kuI5kRlJt1rhWEnyNxgRSNrUs8YQwzhdCs6PJAYcdLHykxE0
HV61FGrAGV7JcDGFSLMosZDQvnOJI5kzCOi7Wh9pIRLg166rr1J6lqQbqHLIZCiZU5kBERGrX9FK
sUit2JxUsts5jkCOMDkViOHQciVN0KW1hhOUFcZGc2I5kiN84QuRFt7AUEF66BX66y8TFHKwWm0M
aGChpltRYQKRqSxLYDanN4BVidXs8isdtUUuNjkIptdg973hgNdtGkVvYjUoMQrGxB2jBnwJ1eRG
dJdQ64aaIvJGHGaDXSdsWydowwbSzZvXChtS8wHUi6hdk2cZEyITNILEnNmN1Eib66RNkEa6FsjY
eHvF6hGbZLfNtLrZYPMxcNkPyENtOqlhhYxmdmaLGC4Ck9VzhJ2FPAzzCsalasDrrdo7GdMelG2n
RIRNaENsb4IDxcQgcY1KbLOaG2whJJTY3e42R3YDftUsfSYp2B0AEel6LXn6bavt4aeAkjCdyZf4
SPYDGwo45zO1SPnC61LBLWvzWU+d7TuKastko3bultana9TYhl+vtTOZUi2puODkWqJ/d7AkjLy/
BXkRJh4Ml2cwRp4eLL+LqLqee0sc3f+T4+1I354o5nBU3/A/NYIsvsD7BEUm8wYh1hyoGCzU1FDI
XuXnWgd5w0IkTBejY9J4fD48rsTMmZ0NBKb0aFjnS1GqXMWeE3w9V4iiR9ZwPFDqAMdBz9iJl68R
YpgkUhRZTVzMOnE4LmB3QXGlW1Q+gBBBqU1QX2MAnZMDJijHmDu86UVEvDqKUYsE19Z9bDhANl3m
nYDScxDE1uJJOM0phxFhGmssDHAyOK8F6TUFBvXBlxVdox8givfCioMsQX3SId25IZQDFbugVTtv
RU71uR7w/UvUD1kTkjgDBZdYQFxVCAXPFqz5HoZqLz6YR5g91bk8gFz7zUg22EDrOaobnG8SZshq
IxqPIQAUmedg/ft9vrkJq3yXd3vTfgGEUx+daRY1jF5fpZKKIGHN5t7D/AyzEK/dyWZMFEkEEQSc
iBS1rmeKuC1Hhh7ImjiNfZJNOHiNoyohqLUbQCh4e/Q/OggY0ha5njlYnAxQchafqVFmBr8RPbX3
bkd2e3BIjAlqkb513P4CVD7ZBVQdJXt1kILHxeQzMRGQD7HkYX+JSiIoZ0mDJvYanzbxTXHDYu/h
XfMoLpCdBoInjOe4lS1BiBfVjtfLSKKSkg0i7NHWm1im0RTDPdrbGiCljhkM+0HOHuwIpmlZZLHb
mDYqwrzKMQWmGyEXeT9nfVB6e7380G2bZJxLMcBExdWe8SX+erzNd43Ent75chYiNC7ew1v4QrZl
xJkZyBMVv1Pxc7/A6gZZPKRBNqk1Qc+rPUdieOO8MKZhRkIiJJfZQTpceRSUbWQZvjjN33N+7HRK
C95qJOjZt2IPOMeg9J0l+QOlBI8NCsV1Um3rFcDzoqbc1SxIGkSLlfk/uvdQq4TCZi27BfA+J3Xl
IvtV8mTRqb3oUpG3K7TnkPiPGBOuKZvLcO/podRX4da6nOG0CQdnfBOZMszG7teAz1a2bIHhfRoV
dqe7cSts2xtaDvREFBeg4FmBa0E56hiK90dwqnrVgwMps6jEu14auLm478bvBIk8sb9+6Silo7xz
BG4qzI6OImHj6HGaUEjjuFynWMkj2nMKik4SJz9q8j+vPv6E1LOB3xFmC8PInis9nOvBJayBMM6m
/KMEK5Kj+lRHAdI7JHMZP8NEFEN26O0jzH+n4K3SZ8QjI6JRpJrH9nOAo4Yh8101iuappuKYYBO4
8O4kCZlKposxLITdnYBxlIljSwVl1BgQs8VgJk4OKg5UOsrgGfBwg4EaRMzRrcezQ3FCHCaE1rM5
mORw4wcF5b+9C/kUgENGG5KT7KL9X2hUPoSKW3mC5qMIEGQi7F93guLm9TlzBl8A7DCaRusT5kzD
vVDwlEHziXunpE9Q9iMSwOWvMchwa3vu8GZPTKm0NWuDBXcoqnqyGAwpHb+JxltBUz3M4YGQhzxN
mhDCjPE9iDVL7Rm2dYVrxZfNMaBKZBC+x6d1iWPfILKC0lpxDbs/pNIrkCdJ0N2jeKua3L4gYMJK
sohMi8UZ21RGvlyRjeBFYtaZvDuNOZkYs0xH3CLJGGAeQcRgLMbzje7h696uFV0x13nay4ErnrX5
KQejAzreY4BQNPKRqHTZhTG69U55SxlI+uHXKcohQYHYTNWpyzErE05+cUzKYzPByNuHT9Yq0q4u
nM7IAR1bPeUH01lHUhzLZjdXh3GaQcEmssCnAlFlk6J6Ejz/xDt61wsOKyhjFevuv7El6E1QYTHX
g28ZlnCtKTegfNfUIhYZyNPZF8hD/qXapPB8NxKE6EuyMa1oTTM4JgzX5NqJsYyM4MOrQPxqULk6
BwtOnCPUg1weItpdHJD627zhMqNBxFGpBR/e8zby3AHkwhz4RDo4l/4u5IpwoSE4ApN2

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-04-20 14:34 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-11  4:59 bug#14180: PATCH Better fullscreen frame support on Windows Erik Charlebois
2013-04-12  9:28 ` martin rudalics
2013-04-12 19:32   ` Erik Charlebois
2013-04-13  8:03     ` martin rudalics
2013-04-13 10:09 ` Eli Zaretskii
2013-04-13 11:33   ` Jan Djärv
2013-04-13 11:56     ` Eli Zaretskii
2013-04-14  1:23       ` Erik Charlebois
2013-04-14  6:41         ` Eli Zaretskii
2013-04-20  0:42           ` Erik Charlebois
2013-04-20  7:36             ` Eli Zaretskii
2013-04-20 14:34               ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).