]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crashes in a text-mode session on Windows.
authorEli Zaretskii <eliz@gnu.org>
Mon, 3 Jun 2013 19:28:13 +0000 (22:28 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 3 Jun 2013 19:28:13 +0000 (22:28 +0300)
 src/w32console.c (initialize_w32_display): Return the dimensions of
 the console window via 2 additional arguments, not via the current
 frame.  This avoids crashes due to overrunning the bounds of
 frame's decode_mode_spec_buffer, which is not resized following
 the change of the frame dimensions from the initial 10x10.
 src/w32term.h (w32_initialize_display_info): Adjust prototype.
 src/term.c (init_tty): Take dimensions of the frame from the values
 returned by initialize_w32_display.

src/ChangeLog
src/term.c
src/w32console.c
src/w32term.h

index 491e5c38617bc711c754d4515b3544156c9dd5bc..7fdd456c9a7644853db3135baa2b28aebab26849 100644 (file)
@@ -1,5 +1,16 @@
 2013-06-03  Eli Zaretskii  <eliz@gnu.org>
 
+       * w32console.c (initialize_w32_display): Return the dimensions of
+       the console window via 2 additional arguments, not via the current
+       frame.  This avoids crashes due to overrunning the bounds of
+       frame's decode_mode_spec_buffer, which is not resized following
+       the change of the frame dimensions from the initial 10x10.
+
+       * w32term.h (w32_initialize_display_info): Adjust prototype.
+
+       * term.c (init_tty): Take dimensions of the frame from the values
+       returned by initialize_w32_display.
+
        * Makefile.in (GFILENOTIFY_CFLAGS, GFILENOTIFY_LIBS): New variables.
        (ALL_CFLAGS): Add $(GFILENOTIFY_CFLAGS).
        (LIBES): Add $(GFILENOTIFY_LIBS).
index 28b944c6436ef5663d1d34f5b69293f6517c0f41..0bcef55947a85f6b374c54c79d148e38f0ab55f8 100644 (file)
@@ -3189,12 +3189,13 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
 #ifdef WINDOWSNT
   {
     struct frame *f = XFRAME (selected_frame);
+    int height, width;
 
-    initialize_w32_display (terminal);
+    initialize_w32_display (terminal, &width, &height);
 
-    FrameRows (tty) = FRAME_LINES (f);
-    FrameCols (tty) = FRAME_COLS (f);
-    tty->specified_window = FRAME_LINES (f);
+    FrameRows (tty) = height;
+    FrameCols (tty) = width;
+    tty->specified_window = height;
 
     FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_none;
     terminal->char_ins_del_ok = 1;
index 06b2c7aa24e3a78b10f59af56672a7555c5f3c13..ee92a593301aae3100a8daa75a2aad760d05a8c1 100644 (file)
@@ -601,7 +601,7 @@ w32_face_attributes (struct frame *f, int face_id)
 }
 
 void
-initialize_w32_display (struct terminal *term)
+initialize_w32_display (struct terminal *term, int *width, int *height)
 {
   CONSOLE_SCREEN_BUFFER_INFO   info;
   Mouse_HLInfo *hlinfo;
@@ -722,23 +722,21 @@ initialize_w32_display (struct terminal *term)
              || info.srWindow.Right - info.srWindow.Left < 40
              || info.srWindow.Right - info.srWindow.Left > 100)))
     {
-      FRAME_LINES (SELECTED_FRAME ()) = 25;
-      SET_FRAME_COLS (SELECTED_FRAME (), 80);
+      *height = 25;
+      *width = 80;
     }
 
   else if (w32_use_full_screen_buffer)
     {
-      FRAME_LINES (SELECTED_FRAME ()) = info.dwSize.Y; /* lines per page */
-      SET_FRAME_COLS (SELECTED_FRAME (), info.dwSize.X);  /* characters per line */
+      *height = info.dwSize.Y; /* lines per page */
+      *width = info.dwSize.X;  /* characters per line */
     }
   else
     {
       /* Lines per page.  Use buffer coords instead of buffer size.  */
-      FRAME_LINES (SELECTED_FRAME ()) = 1 + info.srWindow.Bottom -
-       info.srWindow.Top;
+      *height = 1 + info.srWindow.Bottom - info.srWindow.Top;
       /* Characters per line.  Use buffer coords instead of buffer size.  */
-      SET_FRAME_COLS (SELECTED_FRAME (), 1 + info.srWindow.Right -
-                      info.srWindow.Left);
+      *width = 1 + info.srWindow.Right - info.srWindow.Left;
     }
 
   if (os_subtype == OS_NT)
index 9c27c09d03d00189d3381661d74ff75978cd58d8..be0b4a6f350d01bc89619559e425a846e5fa6c53 100644 (file)
@@ -683,7 +683,7 @@ extern Lisp_Object w32_get_watch_object (void *);
 extern Lisp_Object lispy_file_action (DWORD);
 
 extern void w32_initialize_display_info (Lisp_Object);
-extern void initialize_w32_display (struct terminal *);
+extern void initialize_w32_display (struct terminal *, int *, int *);
 
 /* Keypad command key support.  W32 doesn't have virtual keys defined
    for the function keys on the keypad (they are mapped to the standard