aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKaroly Lorentey2004-07-22 22:01:29 +0000
committerKaroly Lorentey2004-07-22 22:01:29 +0000
commit407e382d35ede779a23b974d7ac40a7d3d0fa5ff (patch)
tree4a9e97dd58011b0ce2d6223626554765860fd6db /src
parent31d7e9bc5a474c2da8c40f4812ea3e09cd5fb82c (diff)
parentbb6a9650da7971581f2ddf625c172b58a6806e7a (diff)
downloademacs-407e382d35ede779a23b974d7ac40a7d3d0fa5ff.tar.gz
emacs-407e382d35ede779a23b974d7ac40a7d3d0fa5ff.zip
Merged in changes from CVS trunk.
Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-461 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-462 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-463 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-220
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog73
-rw-r--r--src/atimer.c6
-rw-r--r--src/dispnew.c10
-rw-r--r--src/eval.c3
-rw-r--r--src/keyboard.c2
-rw-r--r--src/mac.c145
-rw-r--r--src/macterm.c4
-rw-r--r--src/process.c7
-rw-r--r--src/s/gnu-linux.h2
-rw-r--r--src/sysdep.c4
-rw-r--r--src/w32fns.c4
-rw-r--r--src/widget.c1
-rw-r--r--src/window.c54
-rw-r--r--src/window.h5
-rw-r--r--src/xdisp.c32
15 files changed, 242 insertions, 110 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 9765ec9403c..e51cdf554ce 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,76 @@
12004-07-22 Barry Fishman <barry_fishman@att.net> (tiny change)
2
3 * s/gnu-linux.h: Use GC_MARK_STACK if __amd64__ is defined.
4
52004-07-21 Kim F. Storm <storm@cua.dk>
6
7 * window.h (struct glyph_matrix): New members nrows_scale_factor
8 and ncols_scale_factor.
9
10 * window.c (make_window): Initialize nrows_scale_factor and
11 ncols_scale_factor members.
12
13 * dispnew.c (margin_glyphs_to_reserve): Apply ncols_scale_factor.
14 (allocate_matrices_for_frame_redisplay): Fix left/right margin mix-up.
15 (required_matrix_height): Apply nrows_scale_factor.
16 (required_matrix_width): Apply ncols_scale_factor.
17
18 * xdisp.c (display_line): Increment nrows_scale_factor and set
19 fonts_changed_p if past last allocated row.
20 (append_glyph, append_composite_glyph, produce_image_glyph)
21 (append_stretch_glyph): Increment ncols_scale_factor and set
22 fonts_changed_p if current area is full.
23
242004-07-21 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
25
26 * widget.c (EmacsFrameDestroy): Don't abort if normal_gc is 0.
27
282004-07-19 Luc Teirlinck <teirllm@auburn.edu>
29
30 * window.c (Fpos_visible_in_window_p, Fset_window_hscroll)
31 (Fwindow_inside_pixel_edges, Fwindow_end, Fset_window_point)
32 (Fset_window_start, Fscroll_up, Fscroll_down)
33 (Fother_window_for_scrolling, Fscroll_other_window)
34 (Fsave_window_excursion, Fset_window_vscroll)
35 (syms_of_window) <window-size-fixed>: Doc fixes.
36
372004-07-19 KOBAYASHI Yasuhiro <kobayays@otsukakj.co.jp> (tiny change)
38
39 * w32fns.c (Fx_file_dialog): Use ENCODE_FILE instead of
40 ENCODE_SYSTEM for filenames.
41
422004-07-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
43
44 * mac.c (sys_select): Block input around call to
45 ReceiveNextEvent to prevent breakage. Correctly handle
46 blocking on event queue only by calling ReceiveNextEvent
47 instead of select (since GUI events aren't on an fd).
48 (sys_read): Remove function
49 * sysdep.c: Remove redefine of read to sys_read if HAVE_CARBON
50
512004-07-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
52
53 * mac.c (sys_select): Redo sys_select to use alarm-based
54 polling instead of 1 sec timeouts (like solaris).
55
56 * macterm.c (x_make_frame_visible): Comment in polling on
57 frame creation.
58
59 * keyboard.c: Undef SIGIO on Carbon
60
61 * atimer.c (alarm_signal_handler): Call alarm handlers after
62 scheduling.
63
64 * eval.c (Feval): Remove quit_char test
65
66 * process.c (wait_reading_process_input): Remove clearing
67 stdin for select call on process input.
68
692004-07-18 Luc Teirlinck <teirllm@auburn.edu>
70
71 * xdisp.c (syms_of_xdisp) <window-scroll-functions>: Correct
72 capitalization error in docstring.
73
12004-07-17 Juanma Barranquero <lektu@terra.es> 742004-07-17 Juanma Barranquero <lektu@terra.es>
2 75
3 * keyboard.c (not_single_kboard_state): Do nothing unless 76 * keyboard.c (not_single_kboard_state): Do nothing unless
diff --git a/src/atimer.c b/src/atimer.c
index 7e78bdad9c0..9ec0238ff28 100644
--- a/src/atimer.c
+++ b/src/atimer.c
@@ -375,7 +375,9 @@ alarm_signal_handler (signo)
375 375
376 t = atimers; 376 t = atimers;
377 atimers = atimers->next; 377 atimers = atimers->next;
378#ifndef MAC_OSX
378 t->fn (t); 379 t->fn (t);
380#endif
379 381
380 if (t->type == ATIMER_CONTINUOUS) 382 if (t->type == ATIMER_CONTINUOUS)
381 { 383 {
@@ -387,6 +389,10 @@ alarm_signal_handler (signo)
387 t->next = free_atimers; 389 t->next = free_atimers;
388 free_atimers = t; 390 free_atimers = t;
389 } 391 }
392#ifdef MAC_OSX
393 /* Fix for Ctrl-G. Perhaps this should apply to all platforms. */
394 t->fn (t);
395#endif
390 396
391 EMACS_GET_TIME (now); 397 EMACS_GET_TIME (now);
392 } 398 }
diff --git a/src/dispnew.c b/src/dispnew.c
index b519dfa0752..a89bb0a9bcc 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -566,7 +566,7 @@ margin_glyphs_to_reserve (w, total_glyphs, margin)
566 int width = XFASTINT (w->total_cols); 566 int width = XFASTINT (w->total_cols);
567 double d = max (0, XFLOATINT (margin)); 567 double d = max (0, XFLOATINT (margin));
568 d = min (width / 2 - 1, d); 568 d = min (width / 2 - 1, d);
569 n = (int) ((double) total_glyphs / width * d); 569 n = (int) ((double) total_glyphs / width * d) * w->ncols_scale_factor;
570 } 570 }
571 else 571 else
572 n = 0; 572 n = 0;
@@ -1900,10 +1900,10 @@ allocate_matrices_for_frame_redisplay (window, x, y, dim_only_p,
1900 || dim.width != w->desired_matrix->matrix_w 1900 || dim.width != w->desired_matrix->matrix_w
1901 || dim.height != w->desired_matrix->matrix_h 1901 || dim.height != w->desired_matrix->matrix_h
1902 || (margin_glyphs_to_reserve (w, dim.width, 1902 || (margin_glyphs_to_reserve (w, dim.width,
1903 w->right_margin_cols) 1903 w->left_margin_cols)
1904 != w->desired_matrix->left_margin_glyphs) 1904 != w->desired_matrix->left_margin_glyphs)
1905 || (margin_glyphs_to_reserve (w, dim.width, 1905 || (margin_glyphs_to_reserve (w, dim.width,
1906 w->left_margin_cols) 1906 w->right_margin_cols)
1907 != w->desired_matrix->right_margin_glyphs)) 1907 != w->desired_matrix->right_margin_glyphs))
1908 *window_change_flags |= CHANGED_LEAF_MATRIX; 1908 *window_change_flags |= CHANGED_LEAF_MATRIX;
1909 1909
@@ -1971,7 +1971,7 @@ required_matrix_height (w)
1971 int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f); 1971 int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f);
1972 int window_pixel_height = window_box_height (w) + abs (w->vscroll); 1972 int window_pixel_height = window_box_height (w) + abs (w->vscroll);
1973 return (((window_pixel_height + ch_height - 1) 1973 return (((window_pixel_height + ch_height - 1)
1974 / ch_height) 1974 / ch_height) * w->nrows_scale_factor
1975 /* One partially visible line at the top and 1975 /* One partially visible line at the top and
1976 bottom of the window. */ 1976 bottom of the window. */
1977 + 2 1977 + 2
@@ -1999,7 +1999,7 @@ required_matrix_width (w)
1999 1999
2000 /* Compute number of glyphs needed in a glyph row. */ 2000 /* Compute number of glyphs needed in a glyph row. */
2001 return (((window_pixel_width + ch_width - 1) 2001 return (((window_pixel_width + ch_width - 1)
2002 / ch_width) 2002 / ch_width) * w->ncols_scale_factor
2003 /* 2 partially visible columns in the text area. */ 2003 /* 2 partially visible columns in the text area. */
2004 + 2 2004 + 2
2005 /* One partially visible column at the right 2005 /* One partially visible column at the right
diff --git a/src/eval.c b/src/eval.c
index d7cfe959158..f28105ac987 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2145,9 +2145,6 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2145 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil))); 2145 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
2146 backtrace_list = backtrace.next; 2146 backtrace_list = backtrace.next;
2147 2147
2148#ifdef HAVE_CARBON
2149 mac_check_for_quit_char();
2150#endif
2151 return val; 2148 return val;
2152} 2149}
2153 2150
diff --git a/src/keyboard.c b/src/keyboard.c
index 40a545180fe..4d18435e17d 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -595,7 +595,7 @@ int interrupts_deferred;
595 595
596/* We are unable to use interrupts if FIONREAD is not available, 596/* We are unable to use interrupts if FIONREAD is not available,
597 so flush SIGIO so we won't try. */ 597 so flush SIGIO so we won't try. */
598#ifndef FIONREAD 598#if !defined (FIONREAD) || defined(HAVE_CARBON)
599#ifdef SIGIO 599#ifdef SIGIO
600#undef SIGIO 600#undef SIGIO
601#endif 601#endif
diff --git a/src/mac.c b/src/mac.c
index 9f3455ab5dc..9740b3bf3f4 100644
--- a/src/mac.c
+++ b/src/mac.c
@@ -2769,6 +2769,8 @@ and t is the same as `SECONDARY'. */)
2769extern int inhibit_window_system; 2769extern int inhibit_window_system;
2770extern int noninteractive; 2770extern int noninteractive;
2771 2771
2772#include "blockinput.h"
2773
2772/* When Emacs is started from the Finder, SELECT always immediately 2774/* When Emacs is started from the Finder, SELECT always immediately
2773 returns as if input is present when file descriptor 0 is polled for 2775 returns as if input is present when file descriptor 0 is polled for
2774 input. Strangely, when Emacs is run as a GUI application from the 2776 input. Strangely, when Emacs is run as a GUI application from the
@@ -2776,85 +2778,100 @@ extern int noninteractive;
2776 the system call SELECT corrects this discrepancy. */ 2778 the system call SELECT corrects this discrepancy. */
2777int 2779int
2778sys_select (n, rfds, wfds, efds, timeout) 2780sys_select (n, rfds, wfds, efds, timeout)
2779 int n; 2781 int n;
2780 SELECT_TYPE *rfds; 2782 SELECT_TYPE *rfds;
2781 SELECT_TYPE *wfds; 2783 SELECT_TYPE *wfds;
2782 SELECT_TYPE *efds; 2784 SELECT_TYPE *efds;
2783 struct timeval *timeout; 2785 struct timeval *timeout;
2784{ 2786{
2785 if (!inhibit_window_system && rfds && FD_ISSET (0, rfds)) 2787 OSErr err;
2786 return 1; 2788 EMACS_TIME end_time, now, remaining_time;
2787 else if (inhibit_window_system || noninteractive || 2789
2788 (timeout && (EMACS_SECS(*timeout)==0) && 2790 if (inhibit_window_system || noninteractive
2789 (EMACS_USECS(*timeout)==0))) 2791 || rfds == NULL || !FD_ISSET (0, rfds))
2790 return select(n, rfds, wfds, efds, timeout); 2792 return select (n, rfds, wfds, efds, timeout);
2791 else 2793
2792 { 2794 if (wfds == NULL && efds == NULL)
2793 EMACS_TIME end_time, now; 2795 {
2794 2796 int i;
2795 EMACS_GET_TIME (end_time); 2797
2796 if (timeout) 2798 for (i = 1; i < n; i++)
2797 EMACS_ADD_TIME (end_time, end_time, *timeout); 2799 if (FD_ISSET (i, rfds))
2798 2800 break;
2799 do 2801 if (i == n)
2800 { 2802 {
2801 int r; 2803 EventTimeout timeout_sec =
2802 EMACS_TIME one_second; 2804 (timeout
2803 SELECT_TYPE orfds; 2805 ? (EMACS_SECS (*timeout) * kEventDurationSecond
2804 2806 + EMACS_USECS (*timeout) * kEventDurationMicrosecond)
2805 FD_ZERO (&orfds); 2807 : kEventDurationForever);
2806 if (rfds) 2808
2809 BLOCK_INPUT;
2810 err = ReceiveNextEvent (0, NULL, timeout_sec,
2811 kEventLeaveInQueue, NULL);
2812 UNBLOCK_INPUT;
2813 if (err == noErr)
2807 { 2814 {
2808 orfds = *rfds; 2815 FD_ZERO (rfds);
2816 FD_SET (0, rfds);
2817 return 1;
2809 } 2818 }
2819 else
2820 return 0;
2821 }
2822 }
2810 2823
2811 EMACS_SET_SECS (one_second, 1); 2824 if (timeout)
2812 EMACS_SET_USECS (one_second, 0); 2825 {
2826 remaining_time = *timeout;
2827 EMACS_GET_TIME (now);
2828 EMACS_ADD_TIME (end_time, now, remaining_time);
2829 }
2830 FD_CLR (0, rfds);
2831 do
2832 {
2833 EMACS_TIME select_timeout;
2834 SELECT_TYPE orfds = *rfds;
2835 int r;
2813 2836
2814 if (timeout && EMACS_TIME_LT(*timeout, one_second)) 2837 EMACS_SET_SECS_USECS (select_timeout, 0, 20000);
2815 one_second = *timeout;
2816 2838
2817 if ((r = select (n, &orfds, wfds, efds, &one_second)) > 0) 2839 if (timeout && EMACS_TIME_LT (remaining_time, select_timeout))
2840 select_timeout = remaining_time;
2841
2842 r = select (n, &orfds, wfds, efds, &select_timeout);
2843 BLOCK_INPUT;
2844 err = ReceiveNextEvent (0, NULL, kEventDurationNoWait,
2845 kEventLeaveInQueue, NULL);
2846 UNBLOCK_INPUT;
2847 if (r > 0)
2848 {
2849 *rfds = orfds;
2850 if (err == noErr)
2818 { 2851 {
2819 *rfds = orfds; 2852 FD_SET (0, rfds);
2820 return r; 2853 r++;
2821 } 2854 }
2855 return r;
2856 }
2857 else if (err == noErr)
2858 {
2859 FD_ZERO (rfds);
2860 FD_SET (0, rfds);
2861 return 1;
2862 }
2822 2863
2823 mac_check_for_quit_char(); 2864 if (timeout)
2824 2865 {
2825 EMACS_GET_TIME (now); 2866 EMACS_GET_TIME (now);
2826 EMACS_SUB_TIME (now, end_time, now); 2867 EMACS_SUB_TIME (remaining_time, end_time, now);
2827 } 2868 }
2828 while (!timeout || !EMACS_TIME_NEG_P (now));
2829
2830 return 0;
2831 }
2832}
2833
2834#undef read
2835int sys_read (fds, buf, nbyte)
2836 int fds;
2837 char *buf;
2838 unsigned int nbyte;
2839{
2840 SELECT_TYPE rfds;
2841 EMACS_TIME one_second;
2842 int r;
2843
2844 /* Use select to block on IO while still checking for quit_char */
2845 if (!inhibit_window_system && !noninteractive &&
2846 ! (fcntl(fds, F_GETFL, 0) & O_NONBLOCK))
2847 {
2848 FD_ZERO (&rfds);
2849 FD_SET (fds, &rfds);
2850 if (sys_select (fds+1, &rfds, 0, 0, NULL) < 0)
2851 return -1;
2852 } 2869 }
2870 while (!timeout || EMACS_TIME_LT (now, end_time));
2853 2871
2854 return read (fds, buf, nbyte); 2872 return 0;
2855} 2873}
2856 2874
2857
2858/* Set up environment variables so that Emacs can correctly find its 2875/* Set up environment variables so that Emacs can correctly find its
2859 support files when packaged as an application bundle. Directories 2876 support files when packaged as an application bundle. Directories
2860 placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin, 2877 placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin,
diff --git a/src/macterm.c b/src/macterm.c
index efe3d166d11..eaf7517d71a 100644
--- a/src/macterm.c
+++ b/src/macterm.c
@@ -5321,7 +5321,6 @@ x_make_frame_visible (f)
5321 5321
5322 XFlush (FRAME_MAC_DISPLAY (f)); 5322 XFlush (FRAME_MAC_DISPLAY (f));
5323 5323
5324#if 0 /* MAC_TODO */
5325 /* Synchronize to ensure Emacs knows the frame is visible 5324 /* Synchronize to ensure Emacs knows the frame is visible
5326 before we do anything else. We do this loop with input not blocked 5325 before we do anything else. We do this loop with input not blocked
5327 so that incoming events are handled. */ 5326 so that incoming events are handled. */
@@ -5365,9 +5364,6 @@ x_make_frame_visible (f)
5365 FRAME_SAMPLE_VISIBILITY (f); 5364 FRAME_SAMPLE_VISIBILITY (f);
5366 } 5365 }
5367 } 5366 }
5368#else
5369 UNBLOCK_INPUT;
5370#endif /* MAC_TODO */
5371} 5367}
5372 5368
5373/* Change from mapped state to withdrawn state. */ 5369/* Change from mapped state to withdrawn state. */
diff --git a/src/process.c b/src/process.c
index 71f38afc776..9e77123bee7 100644
--- a/src/process.c
+++ b/src/process.c
@@ -4190,12 +4190,13 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
4190 SELECT_TYPE Atemp, Ctemp; 4190 SELECT_TYPE Atemp, Ctemp;
4191 4191
4192 Atemp = input_wait_mask; 4192 Atemp = input_wait_mask;
4193#ifdef MAC_OSX 4193#if 0
4194 /* On Mac OS X, the SELECT system call always says input is 4194 /* On Mac OS X 10.0, the SELECT system call always says input is
4195 present (for reading) at stdin, even when none is. This 4195 present (for reading) at stdin, even when none is. This
4196 causes the call to SELECT below to return 1 and 4196 causes the call to SELECT below to return 1 and
4197 status_notify not to be called. As a result output of 4197 status_notify not to be called. As a result output of
4198 subprocesses are incorrectly discarded. */ 4198 subprocesses are incorrectly discarded.
4199 */
4199 FD_CLR (0, &Atemp); 4200 FD_CLR (0, &Atemp);
4200#endif 4201#endif
4201 Ctemp = connect_wait_mask; 4202 Ctemp = connect_wait_mask;
diff --git a/src/s/gnu-linux.h b/src/s/gnu-linux.h
index efdc2bc00ef..033ce49293a 100644
--- a/src/s/gnu-linux.h
+++ b/src/s/gnu-linux.h
@@ -355,7 +355,7 @@ Boston, MA 02111-1307, USA. */
355 355
356#if defined __i386__ || defined __sparc__ || defined __mc68000__ \ 356#if defined __i386__ || defined __sparc__ || defined __mc68000__ \
357 || defined __alpha__ || defined __mips__ || defined __s390__ \ 357 || defined __alpha__ || defined __mips__ || defined __s390__ \
358 || defined __arm__ || defined __powerpc__ 358 || defined __arm__ || defined __powerpc__ || defined __amd64__
359#define GC_SETJMP_WORKS 1 359#define GC_SETJMP_WORKS 1
360#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS 360#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
361#ifdef __mc68000__ 361#ifdef __mc68000__
diff --git a/src/sysdep.c b/src/sysdep.c
index 20d57b6a6a3..018fdc1fd57 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -72,10 +72,6 @@ static int delete_exited_processes;
72#endif 72#endif
73#endif /* not WINDOWSNT */ 73#endif /* not WINDOWSNT */
74 74
75#ifdef HAVE_CARBON
76#define read sys_read
77#endif
78
79/* Does anyone other than VMS need this? */ 75/* Does anyone other than VMS need this? */
80#ifndef fwrite 76#ifndef fwrite
81#define sys_fwrite fwrite 77#define sys_fwrite fwrite
diff --git a/src/w32fns.c b/src/w32fns.c
index d5ba6e9b078..0cb3abe91cd 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -7735,14 +7735,14 @@ specified. Ensure that file exists if MUSTMATCH is non-nil. */)
7735 /* Create the dialog with PROMPT as title, using DIR as initial 7735 /* Create the dialog with PROMPT as title, using DIR as initial
7736 directory and using "*" as pattern. */ 7736 directory and using "*" as pattern. */
7737 dir = Fexpand_file_name (dir, Qnil); 7737 dir = Fexpand_file_name (dir, Qnil);
7738 strncpy (init_dir, SDATA (ENCODE_SYSTEM (dir)), MAX_PATH); 7738 strncpy (init_dir, SDATA (ENCODE_FILE (dir)), MAX_PATH);
7739 init_dir[MAX_PATH] = '\0'; 7739 init_dir[MAX_PATH] = '\0';
7740 unixtodos_filename (init_dir); 7740 unixtodos_filename (init_dir);
7741 7741
7742 if (STRINGP (default_filename)) 7742 if (STRINGP (default_filename))
7743 { 7743 {
7744 char *file_name_only; 7744 char *file_name_only;
7745 char *full_path_name = SDATA (ENCODE_SYSTEM (default_filename)); 7745 char *full_path_name = SDATA (ENCODE_FILE (default_filename));
7746 7746
7747 unixtodos_filename (full_path_name); 7747 unixtodos_filename (full_path_name);
7748 7748
diff --git a/src/widget.c b/src/widget.c
index dbf55a34d9c..57eef4059e6 100644
--- a/src/widget.c
+++ b/src/widget.c
@@ -758,7 +758,6 @@ EmacsFrameDestroy (widget)
758 758
759 if (! s) abort (); 759 if (! s) abort ();
760 if (! s->output_data.x) abort (); 760 if (! s->output_data.x) abort ();
761 if (! s->output_data.x->normal_gc) abort ();
762 761
763 BLOCK_INPUT; 762 BLOCK_INPUT;
764 x_free_gcs (s); 763 x_free_gcs (s);
diff --git a/src/window.c b/src/window.c
index 0e318b039a4..2ab9957153f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -262,6 +262,7 @@ make_window ()
262 bzero (&p->last_cursor, sizeof (p->last_cursor)); 262 bzero (&p->last_cursor, sizeof (p->last_cursor));
263 bzero (&p->phys_cursor, sizeof (p->phys_cursor)); 263 bzero (&p->phys_cursor, sizeof (p->phys_cursor));
264 p->desired_matrix = p->current_matrix = 0; 264 p->desired_matrix = p->current_matrix = 0;
265 p->nrows_scale_factor = p->ncols_scale_factor = 1;
265 p->phys_cursor_type = -1; 266 p->phys_cursor_type = -1;
266 p->phys_cursor_width = -1; 267 p->phys_cursor_width = -1;
267 p->must_be_updated_p = 0; 268 p->must_be_updated_p = 0;
@@ -320,15 +321,17 @@ WINDOW defaults to the selected window. */)
320 321
321DEFUN ("pos-visible-in-window-p", Fpos_visible_in_window_p, 322DEFUN ("pos-visible-in-window-p", Fpos_visible_in_window_p,
322 Spos_visible_in_window_p, 0, 3, 0, 323 Spos_visible_in_window_p, 0, 3, 0,
323 doc: /* Return t if position POS is currently on the frame in WINDOW. 324 doc: /* Return non-nil if position POS is currently on the frame in WINDOW.
324Return nil if that position is scrolled vertically out of view. 325Return nil if that position is scrolled vertically out of view.
325If a character is only partially visible, nil is returned, unless the 326If a character is only partially visible, nil is returned, unless the
326optional argument PARTIALLY is non-nil. 327optional argument PARTIALLY is non-nil.
328If POS is only out of view because of horizontal scrolling, return non-nil.
327POS defaults to point in WINDOW; WINDOW defaults to the selected window. 329POS defaults to point in WINDOW; WINDOW defaults to the selected window.
328 330
329If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil, 331If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil,
330return value is a list (X Y PARTIAL) where X and Y are the pixel relative 332return value is a list (X Y FULLY) where X and Y are the pixel coordinates
331coordinate */) 333relative to the top left corner of the window, and FULLY is t if the
334character after POS is fully visible and nil otherwise. */)
332 (pos, window, partially) 335 (pos, window, partially)
333 Lisp_Object pos, window, partially; 336 Lisp_Object pos, window, partially;
334{ 337{
@@ -432,7 +435,7 @@ DEFUN ("window-hscroll", Fwindow_hscroll, Swindow_hscroll, 0, 1, 0,
432 435
433DEFUN ("set-window-hscroll", Fset_window_hscroll, Sset_window_hscroll, 2, 2, 0, 436DEFUN ("set-window-hscroll", Fset_window_hscroll, Sset_window_hscroll, 2, 2, 0,
434 doc: /* Set number of columns WINDOW is scrolled from left margin to NCOL. 437 doc: /* Set number of columns WINDOW is scrolled from left margin to NCOL.
435NCOL should be zero or positive. 438Return NCOL. NCOL should be zero or positive.
436 439
437Note that if `automatic-hscrolling' is non-nil, you cannot scroll the 440Note that if `automatic-hscrolling' is non-nil, you cannot scroll the
438window so that the location of point becomes invisible. */) 441window so that the location of point becomes invisible. */)
@@ -546,7 +549,7 @@ display margins, fringes, header line, and/or mode line. */)
546} 549}
547 550
548DEFUN ("window-inside-pixel-edges", Fwindow_inside_pixel_edges, Swindow_inside_pixel_edges, 0, 1, 0, 551DEFUN ("window-inside-pixel-edges", Fwindow_inside_pixel_edges, Swindow_inside_pixel_edges, 0, 1, 0,
549 doc: /* Return a list of the edge coordinates of WINDOW. 552 doc: /* Return a list of the edge pixel coordinates of WINDOW.
550\(LEFT TOP RIGHT BOTTOM), all relative to 0, 0 at top left corner of frame. 553\(LEFT TOP RIGHT BOTTOM), all relative to 0, 0 at top left corner of frame.
551RIGHT is one more than the rightmost x position used by text in WINDOW, 554RIGHT is one more than the rightmost x position used by text in WINDOW,
552and BOTTOM is one more than the bottommost y position used by text in WINDOW. 555and BOTTOM is one more than the bottommost y position used by text in WINDOW.
@@ -988,6 +991,8 @@ DEFUN ("window-end", Fwindow_end, Swindow_end, 0, 2, 0,
988This is updated by redisplay, when it runs to completion. 991This is updated by redisplay, when it runs to completion.
989Simply changing the buffer text or setting `window-start' 992Simply changing the buffer text or setting `window-start'
990does not update this value. 993does not update this value.
994Return nil if there is no recorded value. \(This can happen if the
995last redisplay of WINDOW was preempted, and did not finish.)
991If UPDATE is non-nil, compute the up-to-date position 996If UPDATE is non-nil, compute the up-to-date position
992if it isn't already recorded. */) 997if it isn't already recorded. */)
993 (window, update) 998 (window, update)
@@ -1053,7 +1058,8 @@ if it isn't already recorded. */)
1053} 1058}
1054 1059
1055DEFUN ("set-window-point", Fset_window_point, Sset_window_point, 2, 2, 0, 1060DEFUN ("set-window-point", Fset_window_point, Sset_window_point, 2, 2, 0,
1056 doc: /* Make point value in WINDOW be at position POS in WINDOW's buffer. */) 1061 doc: /* Make point value in WINDOW be at position POS in WINDOW's buffer.
1062Return POS. */)
1057 (window, pos) 1063 (window, pos)
1058 Lisp_Object window, pos; 1064 Lisp_Object window, pos;
1059{ 1065{
@@ -1076,6 +1082,7 @@ DEFUN ("set-window-point", Fset_window_point, Sset_window_point, 2, 2, 0,
1076 1082
1077DEFUN ("set-window-start", Fset_window_start, Sset_window_start, 2, 3, 0, 1083DEFUN ("set-window-start", Fset_window_start, Sset_window_start, 2, 3, 0,
1078 doc: /* Make display in WINDOW start at position POS in WINDOW's buffer. 1084 doc: /* Make display in WINDOW start at position POS in WINDOW's buffer.
1085Return POS.
1079Optional third arg NOFORCE non-nil inhibits next redisplay 1086Optional third arg NOFORCE non-nil inhibits next redisplay
1080from overriding motion of point in order to display at this exact start. */) 1087from overriding motion of point in order to display at this exact start. */)
1081 (window, pos, noforce) 1088 (window, pos, noforce)
@@ -4850,7 +4857,8 @@ scroll_command (n, direction)
4850} 4857}
4851 4858
4852DEFUN ("scroll-up", Fscroll_up, Sscroll_up, 0, 1, "P", 4859DEFUN ("scroll-up", Fscroll_up, Sscroll_up, 0, 1, "P",
4853 doc: /* Scroll text of current window upward ARG lines; or near full screen if no ARG. 4860 doc: /* Scroll text of current window upward ARG lines.
4861If ARG is omitted or nil, scroll upward by a near full screen.
4854A near full screen is `next-screen-context-lines' less than a full screen. 4862A near full screen is `next-screen-context-lines' less than a full screen.
4855Negative ARG means scroll downward. 4863Negative ARG means scroll downward.
4856If ARG is the atom `-', scroll downward by nearly full screen. 4864If ARG is the atom `-', scroll downward by nearly full screen.
@@ -4863,7 +4871,8 @@ When calling from a program, supply as argument a number, nil, or `-'. */)
4863} 4871}
4864 4872
4865DEFUN ("scroll-down", Fscroll_down, Sscroll_down, 0, 1, "P", 4873DEFUN ("scroll-down", Fscroll_down, Sscroll_down, 0, 1, "P",
4866 doc: /* Scroll text of current window down ARG lines; or near full screen if no ARG. 4874 doc: /* Scroll text of current window down ARG lines.
4875If ARG is omitted or nil, scroll down by a near full screen.
4867A near full screen is `next-screen-context-lines' less than a full screen. 4876A near full screen is `next-screen-context-lines' less than a full screen.
4868Negative ARG means scroll upward. 4877Negative ARG means scroll upward.
4869If ARG is the atom `-', scroll upward by nearly full screen. 4878If ARG is the atom `-', scroll upward by nearly full screen.
@@ -4877,10 +4886,11 @@ When calling from a program, supply as argument a number, nil, or `-'. */)
4877 4886
4878DEFUN ("other-window-for-scrolling", Fother_window_for_scrolling, Sother_window_for_scrolling, 0, 0, 0, 4887DEFUN ("other-window-for-scrolling", Fother_window_for_scrolling, Sother_window_for_scrolling, 0, 0, 0,
4879 doc: /* Return the other window for \"other window scroll\" commands. 4888 doc: /* Return the other window for \"other window scroll\" commands.
4880If in the minibuffer, `minibuffer-scroll-window' if non-nil
4881specifies the window.
4882If `other-window-scroll-buffer' is non-nil, a window 4889If `other-window-scroll-buffer' is non-nil, a window
4883showing that buffer is used. */) 4890showing that buffer is used.
4891If in the minibuffer, `minibuffer-scroll-window' if non-nil
4892specifies the window. This takes precedence over
4893`other-window-scroll-buffer'. */)
4884 () 4894 ()
4885{ 4895{
4886 Lisp_Object window; 4896 Lisp_Object window;
@@ -4926,10 +4936,11 @@ if the current one is at the bottom. Negative ARG means scroll downward.
4926If ARG is the atom `-', scroll downward by nearly full screen. 4936If ARG is the atom `-', scroll downward by nearly full screen.
4927When calling from a program, supply as argument a number, nil, or `-'. 4937When calling from a program, supply as argument a number, nil, or `-'.
4928 4938
4929If in the minibuffer, `minibuffer-scroll-window' if non-nil
4930specifies the window to scroll.
4931If `other-window-scroll-buffer' is non-nil, scroll the window 4939If `other-window-scroll-buffer' is non-nil, scroll the window
4932showing that buffer, popping the buffer up if necessary. */) 4940showing that buffer, popping the buffer up if necessary.
4941If in the minibuffer, `minibuffer-scroll-window' if non-nil
4942specifies the window to scroll. This takes precedence over
4943`other-window-scroll-buffer'. */)
4933 (arg) 4944 (arg)
4934 Lisp_Object arg; 4945 Lisp_Object arg;
4935{ 4946{
@@ -5905,7 +5916,8 @@ redirection (see `redirect-frame-focus'). */)
5905 5916
5906DEFUN ("save-window-excursion", Fsave_window_excursion, Ssave_window_excursion, 5917DEFUN ("save-window-excursion", Fsave_window_excursion, Ssave_window_excursion,
5907 0, UNEVALLED, 0, 5918 0, UNEVALLED, 0,
5908 doc: /* Execute body, preserving window sizes and contents. 5919 doc: /* Execute BODY, preserving window sizes and contents.
5920Return the value of the last form in BODY.
5909Restore which buffer appears in which window, where display starts, 5921Restore which buffer appears in which window, where display starts,
5910and the value of point and mark for each window. 5922and the value of point and mark for each window.
5911Also restore the choice of selected window. 5923Also restore the choice of selected window.
@@ -6165,7 +6177,11 @@ DEFUN ("set-window-vscroll", Fset_window_vscroll, Sset_window_vscroll,
6165 doc: /* Set amount by which WINDOW should be scrolled vertically to VSCROLL. 6177 doc: /* Set amount by which WINDOW should be scrolled vertically to VSCROLL.
6166WINDOW nil means use the selected window. Normally, VSCROLL is a 6178WINDOW nil means use the selected window. Normally, VSCROLL is a
6167non-negative multiple of the canonical character height of WINDOW; 6179non-negative multiple of the canonical character height of WINDOW;
6168optional third arg PIXELS_P non-nil means that VSCROLL is in pixels. */) 6180optional third arg PIXELS_P non-nil means that VSCROLL is in pixels.
6181If PIXELS-P is nil, VSCROLL may have to be rounded so that it
6182corresponds to an integral number of pixels. The return value is the
6183result of this rounding.
6184If PIXELS-P is non-nil, the return value is VSCROLL. */)
6169 (window, vscroll, pixels_p) 6185 (window, vscroll, pixels_p)
6170 Lisp_Object window, vscroll, pixels_p; 6186 Lisp_Object window, vscroll, pixels_p;
6171{ 6187{
@@ -6649,9 +6665,11 @@ The selected frame is the one whose configuration has changed. */);
6649 6665
6650 DEFVAR_BOOL ("window-size-fixed", &window_size_fixed, 6666 DEFVAR_BOOL ("window-size-fixed", &window_size_fixed,
6651 doc: /* Non-nil in a buffer means windows displaying the buffer are fixed-size. 6667 doc: /* Non-nil in a buffer means windows displaying the buffer are fixed-size.
6668If the value is`height', then only the window's height is fixed.
6669If the value is `width', then only the window's width is fixed.
6670Any other non-nil value fixes both the width and the height.
6652Emacs won't change the size of any window displaying that buffer, 6671Emacs won't change the size of any window displaying that buffer,
6653unless you explicitly change the size, or Emacs has no other choice. 6672unless you explicitly change the size, or Emacs has no other choice. */);
6654This variable automatically becomes buffer-local when set. */);
6655 Fmake_variable_buffer_local (Qwindow_size_fixed); 6673 Fmake_variable_buffer_local (Qwindow_size_fixed);
6656 window_size_fixed = 0; 6674 window_size_fixed = 0;
6657 6675
diff --git a/src/window.h b/src/window.h
index 63a19cc4b0d..8df0b6bb3eb 100644
--- a/src/window.h
+++ b/src/window.h
@@ -236,6 +236,11 @@ struct window
236 struct glyph_matrix *current_matrix; 236 struct glyph_matrix *current_matrix;
237 struct glyph_matrix *desired_matrix; 237 struct glyph_matrix *desired_matrix;
238 238
239 /* Scaling factor for the glyph_matrix size calculation in this window.
240 Used if window contains many small images or uses proportional fonts,
241 as the normal may yield a matrix which is too small. */
242 int nrows_scale_factor, ncols_scale_factor;
243
239 /* Cursor position as of last update that completed without 244 /* Cursor position as of last update that completed without
240 pause. This is the position of last_point. */ 245 pause. This is the position of last_point. */
241 struct cursor_pos last_cursor; 246 struct cursor_pos last_cursor;
diff --git a/src/xdisp.c b/src/xdisp.c
index b04eb7ab7b7..02f020ed57a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -14461,9 +14461,13 @@ display_line (it)
14461 /* We always start displaying at hpos zero even if hscrolled. */ 14461 /* We always start displaying at hpos zero even if hscrolled. */
14462 xassert (it->hpos == 0 && it->current_x == 0); 14462 xassert (it->hpos == 0 && it->current_x == 0);
14463 14463
14464 /* We must not display in a row that's not a text row. */ 14464 if (MATRIX_ROW_VPOS (row, it->w->desired_matrix)
14465 xassert (MATRIX_ROW_VPOS (row, it->w->desired_matrix) 14465 >= it->w->desired_matrix->nrows)
14466 < it->w->desired_matrix->nrows); 14466 {
14467 it->w->nrows_scale_factor++;
14468 fonts_changed_p = 1;
14469 return 0;
14470 }
14467 14471
14468 /* Is IT->w showing the region? */ 14472 /* Is IT->w showing the region? */
14469 it->w->region_showing = it->region_beg_charpos > 0 ? Qt : Qnil; 14473 it->w->region_showing = it->region_beg_charpos > 0 ? Qt : Qnil;
@@ -18134,6 +18138,11 @@ append_glyph (it)
18134 glyph->font_type = FONT_TYPE_UNKNOWN; 18138 glyph->font_type = FONT_TYPE_UNKNOWN;
18135 ++it->glyph_row->used[area]; 18139 ++it->glyph_row->used[area];
18136 } 18140 }
18141 else if (!fonts_changed_p)
18142 {
18143 it->w->ncols_scale_factor++;
18144 fonts_changed_p = 1;
18145 }
18137} 18146}
18138 18147
18139/* Store one glyph for the composition IT->cmp_id in IT->glyph_row. 18148/* Store one glyph for the composition IT->cmp_id in IT->glyph_row.
@@ -18171,6 +18180,11 @@ append_composite_glyph (it)
18171 glyph->font_type = FONT_TYPE_UNKNOWN; 18180 glyph->font_type = FONT_TYPE_UNKNOWN;
18172 ++it->glyph_row->used[area]; 18181 ++it->glyph_row->used[area];
18173 } 18182 }
18183 else if (!fonts_changed_p)
18184 {
18185 it->w->ncols_scale_factor++;
18186 fonts_changed_p = 1;
18187 }
18174} 18188}
18175 18189
18176 18190
@@ -18340,6 +18354,11 @@ produce_image_glyph (it)
18340 glyph->font_type = FONT_TYPE_UNKNOWN; 18354 glyph->font_type = FONT_TYPE_UNKNOWN;
18341 ++it->glyph_row->used[area]; 18355 ++it->glyph_row->used[area];
18342 } 18356 }
18357 else if (!fonts_changed_p)
18358 {
18359 it->w->ncols_scale_factor++;
18360 fonts_changed_p = 1;
18361 }
18343 } 18362 }
18344} 18363}
18345 18364
@@ -18383,6 +18402,11 @@ append_stretch_glyph (it, object, width, height, ascent)
18383 glyph->font_type = FONT_TYPE_UNKNOWN; 18402 glyph->font_type = FONT_TYPE_UNKNOWN;
18384 ++it->glyph_row->used[area]; 18403 ++it->glyph_row->used[area];
18385 } 18404 }
18405 else if (!fonts_changed_p)
18406 {
18407 it->w->ncols_scale_factor++;
18408 fonts_changed_p = 1;
18409 }
18386} 18410}
18387 18411
18388 18412
@@ -22178,7 +22202,7 @@ all the functions in the list are called, with the frame as argument. */);
22178 Vwindow_size_change_functions = Qnil; 22202 Vwindow_size_change_functions = Qnil;
22179 22203
22180 DEFVAR_LISP ("window-scroll-functions", &Vwindow_scroll_functions, 22204 DEFVAR_LISP ("window-scroll-functions", &Vwindow_scroll_functions,
22181 doc: /* List of Functions to call before redisplaying a window with scrolling. 22205 doc: /* List of functions to call before redisplaying a window with scrolling.
22182Each function is called with two arguments, the window 22206Each function is called with two arguments, the window
22183and its new display-start position. Note that the value of `window-end' 22207and its new display-start position. Note that the value of `window-end'
22184is not valid when these functions are called. */); 22208is not valid when these functions are called. */);