Mercurial > emacs
annotate src/xterm.c @ 1880:36ec0bfbb2c2
* informat.el (Info-tagify): Correct the regular expression which
recognizes node names to work properly with Emacs 19 regex.
| author | Jim Blandy <jimb@redhat.com> |
|---|---|
| date | Tue, 16 Feb 1993 00:23:06 +0000 |
| parents | f569bc4e9b8f |
| children | 047e196658fa |
| rev | line source |
|---|---|
| 286 | 1 /* X Communication module for terminals which understand the X protocol. |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2 Copyright (C) 1989, 1992, 1993 Free Software Foundation, Inc. |
| 286 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
| 621 | 8 the Free Software Foundation; either version 2, or (at your option) |
| 286 | 9 any later version. |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
| 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
| 19 | |
| 20 /* Serious problems: | |
| 21 | |
| 22 Kludge: dup2 is used to put the X-connection socket into desc # 0 | |
| 23 so that wait_reading_process_input will wait for it in place of | |
| 24 actual terminal input. | |
| 25 | |
| 26 */ | |
| 27 | |
| 28 #include "config.h" | |
| 29 | |
| 30 #ifdef HAVE_X_WINDOWS | |
| 31 | |
| 32 #include "lisp.h" | |
| 33 | |
|
1389
517c3893ec5b
* xterm.c, xrdb.c: #include <stdio.h> before "xterm.h", to avoid
Jim Blandy <jimb@redhat.com>
parents:
1324
diff
changeset
|
34 /* On 4.3 these lose if they come after xterm.h. */ |
|
517c3893ec5b
* xterm.c, xrdb.c: #include <stdio.h> before "xterm.h", to avoid
Jim Blandy <jimb@redhat.com>
parents:
1324
diff
changeset
|
35 #include <stdio.h> |
| 286 | 36 #include <signal.h> |
| 37 | |
| 38 /* This may include sys/types.h, and that somehow loses | |
| 39 if this is not done before the other system files. */ | |
| 40 #include "xterm.h" | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
41 #include <X11/cursorfont.h> |
| 286 | 42 |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
43 #ifndef USG |
| 286 | 44 /* Load sys/types.h if not already loaded. |
| 45 In some systems loading it twice is suicidal. */ | |
| 46 #ifndef makedev | |
| 47 #include <sys/types.h> | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
48 #endif /* makedev */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
49 #endif /* USG */ |
| 286 | 50 |
| 51 #ifdef BSD | |
| 52 #include <sys/ioctl.h> | |
| 53 #include <strings.h> | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
54 #else /* ! defined (BSD) */ |
| 286 | 55 #include <sys/termio.h> |
| 56 #include <string.h> | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
57 #endif /* ! defined (BSD) */ |
| 286 | 58 |
| 59 /* Allow m- file to inhibit use of FIONREAD. */ | |
| 60 #ifdef BROKEN_FIONREAD | |
| 61 #undef FIONREAD | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
62 #endif /* ! defined (BROKEN_FIONREAD) */ |
| 286 | 63 |
| 64 /* We are unable to use interrupts if FIONREAD is not available, | |
| 65 so flush SIGIO so we won't try. */ | |
| 66 #ifndef FIONREAD | |
| 67 #ifdef SIGIO | |
| 68 #undef SIGIO | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
69 #endif /* ! defined (SIGIO) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
70 #endif /* FIONREAD */ |
| 286 | 71 |
| 555 | 72 #include "systime.h" |
| 286 | 73 |
| 74 #include <fcntl.h> | |
| 75 #include <ctype.h> | |
| 76 #include <errno.h> | |
| 77 #include <setjmp.h> | |
| 78 #include <sys/stat.h> | |
| 79 #include <sys/param.h> | |
| 80 | |
| 81 #include "dispextern.h" | |
| 82 #include "termhooks.h" | |
| 83 #include "termopts.h" | |
| 84 #include "termchar.h" | |
| 85 #if 0 | |
| 86 #include "sink.h" | |
| 87 #include "sinkmask.h" | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
88 #endif /* ! 0 */ |
| 286 | 89 #include "gnu.h" |
| 771 | 90 #include "frame.h" |
| 286 | 91 #include "disptab.h" |
| 92 #include "buffer.h" | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
93 #include "window.h" |
| 286 | 94 |
| 95 #ifdef HAVE_X11 | |
| 96 #define XMapWindow XMapRaised /* Raise them when mapping. */ | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
97 #else /* ! defined (HAVE_X11) */ |
| 286 | 98 #include <X/Xkeyboard.h> |
| 99 /*#include <X/Xproto.h> */ | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
100 #endif /* ! defined (HAVE_X11) */ |
| 286 | 101 |
| 102 /* For sending Meta-characters. Do we need this? */ | |
| 103 #define METABIT 0200 | |
| 104 | |
| 105 #define min(a,b) ((a)<(b) ? (a) : (b)) | |
| 106 #define max(a,b) ((a)>(b) ? (a) : (b)) | |
| 107 | |
| 108 /* Nonzero means we must reprint all windows | |
| 109 because 1) we received an ExposeWindow event | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
110 or 2) we received too many ExposeRegion events to record. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
111 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
112 This is never needed under X11. */ |
| 286 | 113 static int expose_all_windows; |
| 114 | |
| 115 /* Nonzero means we must reprint all icon windows. */ | |
| 116 | |
| 117 static int expose_all_icons; | |
| 118 | |
| 119 #ifndef HAVE_X11 | |
| 120 /* ExposeRegion events, when received, are copied into this queue | |
| 121 for later processing. */ | |
| 122 | |
| 123 static struct event_queue x_expose_queue; | |
| 124 | |
| 125 /* ButtonPressed and ButtonReleased events, when received, | |
| 126 are copied into this queue for later processing. */ | |
| 127 | |
| 128 struct event_queue x_mouse_queue; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
129 #endif /* HAVE_X11 */ |
| 286 | 130 |
| 131 /* Nonzero after BLOCK_INPUT; prevents input events from being | |
| 132 processed until later. */ | |
| 133 | |
| 134 int x_input_blocked; | |
| 135 | |
| 136 #if defined (SIGIO) && defined (FIONREAD) | |
| 137 int BLOCK_INPUT_mask; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
138 #endif /* ! defined (SIGIO) && defined (FIONREAD) */ |
| 286 | 139 |
| 140 /* Nonzero if input events came in while x_input_blocked was nonzero. | |
| 141 UNBLOCK_INPUT checks for this. */ | |
| 142 | |
| 143 int x_pending_input; | |
| 144 | |
| 145 /* The id of a bitmap used for icon windows. | |
| 146 One such map is shared by all Emacs icon windows. | |
| 147 This is zero if we have not yet had a need to create the bitmap. */ | |
| 148 | |
| 149 static Bitmap icon_bitmap; | |
| 150 | |
| 151 /* Font used for text icons. */ | |
| 152 | |
| 153 static FONT_TYPE *icon_font_info; | |
| 154 | |
| 155 /* Stuff for dealing with the main icon title. */ | |
| 156 | |
| 157 extern Lisp_Object Vcommand_line_args; | |
| 398 | 158 char *hostname, *x_id_name; |
| 395 | 159 Lisp_Object invocation_name; |
| 286 | 160 |
| 161 /* This is the X connection that we are using. */ | |
| 162 | |
| 163 Display *x_current_display; | |
| 164 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
165 /* The cursor to use for vertical scrollbars on x_current_display. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
166 static Cursor x_vertical_scrollbar_cursor; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
167 |
| 771 | 168 /* Frame being updated by update_frame. */ |
| 286 | 169 /* This is set by XTupdate_begin and looked at by all the |
| 170 XT functions. It is zero while not inside an update. | |
| 771 | 171 In that case, the XT functions assume that `selected_frame' |
| 172 is the frame to apply to. */ | |
| 173 | |
| 174 static struct frame *updating_frame; | |
| 175 | |
| 176 /* The frame (if any) which has the X window that has keyboard focus. | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
177 Zero if none. This is examined by Ffocus_frame in frame.c. Note |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
178 that a mere EnterNotify event can set this; if you need to know the |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
179 last frame specified in a FocusIn or FocusOut event, use |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
180 x_focus_event_frame. */ |
| 771 | 181 struct frame *x_focus_frame; |
| 182 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
183 /* The last frame mentioned in a FocusIn or FocusOut event. This is |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
184 separate from x_focus_frame, because whether or not LeaveNotify |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
185 events cause us to lose focus depends on whether or not we have |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
186 received a FocusIn event for it. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
187 struct frame *x_focus_event_frame; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
188 |
| 771 | 189 /* The frame which currently has the visual highlight, and should get |
| 190 keyboard input (other sorts of input have the frame encoded in the | |
| 191 event). It points to the X focus frame's selected window's | |
| 192 frame. It differs from x_focus_frame when we're using a global | |
| 369 | 193 minibuffer. */ |
| 771 | 194 static struct frame *x_highlight_frame; |
| 369 | 195 |
| 286 | 196 /* From .Xdefaults, the value of "emacs.WarpMouse". If non-zero, |
| 771 | 197 mouse is moved to inside of frame when frame is de-iconified. */ |
| 286 | 198 |
| 199 static int warp_mouse_on_deiconify; | |
| 200 | |
| 201 /* During an update, maximum vpos for ins/del line operations to affect. */ | |
| 202 | |
| 203 static int flexlines; | |
| 204 | |
| 205 /* During an update, nonzero if chars output now should be highlighted. */ | |
| 206 | |
| 207 static int highlight; | |
| 208 | |
| 209 /* Nominal cursor position -- where to draw output. | |
| 210 During an update, these are different from the cursor-box position. */ | |
| 211 | |
| 212 static int curs_x; | |
| 213 static int curs_y; | |
| 214 | |
| 215 #ifdef HAVE_X11 | |
| 216 /* `t' if a mouse button is depressed. */ | |
| 217 | |
| 218 extern Lisp_Object Vmouse_depressed; | |
| 219 | |
| 220 /* Tells if a window manager is present or not. */ | |
| 221 | |
| 222 extern Lisp_Object Vx_no_window_manager; | |
| 223 | |
| 224 /* Timestamp that we requested selection data was made. */ | |
| 225 extern Time requestor_time; | |
| 226 | |
| 227 /* ID of the window requesting selection data. */ | |
| 228 extern Window requestor_window; | |
| 229 | |
| 230 /* Nonzero enables some debugging for the X interface code. */ | |
| 231 extern int _Xdebug; | |
| 232 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
233 #else /* ! defined (HAVE_X11) */ |
| 286 | 234 |
| 235 /* Bit patterns for the mouse cursor. */ | |
| 236 | |
| 237 short MouseCursor[] = { | |
| 238 0x0000, 0x0008, 0x0018, 0x0038, | |
| 239 0x0078, 0x00f8, 0x01f8, 0x03f8, | |
| 240 0x07f8, 0x00f8, 0x00d8, 0x0188, | |
| 241 0x0180, 0x0300, 0x0300, 0x0000}; | |
| 242 | |
| 243 short MouseMask[] = { | |
| 244 0x000c, 0x001c, 0x003c, 0x007c, | |
| 245 0x00fc, 0x01fc, 0x03fc, 0x07fc, | |
| 246 0x0ffc, 0x0ffc, 0x01fc, 0x03dc, | |
| 247 0x03cc, 0x0780, 0x0780, 0x0300}; | |
| 248 | |
| 249 static short grey_bits[] = { | |
| 250 0x0005, 0x000a, 0x0005, 0x000a}; | |
| 251 | |
| 252 static Pixmap GreyPixmap = 0; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
253 #endif /* ! defined (HAVE_X11) */ |
| 286 | 254 |
| 255 /* From time to time we get info on an Emacs window, here. */ | |
| 256 | |
| 257 static WINDOWINFO_TYPE windowinfo; | |
| 258 | |
| 259 extern int errno; | |
| 260 | |
|
1841
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
261 /* See keyboard.c. */ |
|
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
262 extern int extra_keyboard_modifiers; |
|
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
263 |
| 286 | 264 extern Display *XOpenDisplay (); |
| 265 extern Window XCreateWindow (); | |
| 266 | |
| 267 extern Cursor XCreateCursor (); | |
| 268 extern FONT_TYPE *XOpenFont (); | |
| 269 | |
| 270 static void flashback (); | |
| 271 | |
| 272 #ifndef HAVE_X11 | |
| 273 static void dumpqueue (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
274 #endif /* HAVE_X11 */ |
| 286 | 275 |
| 276 void dumpborder (); | |
| 621 | 277 static int XTcursor_to (); |
| 278 static int XTclear_end_of_line (); | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
279 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
280 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
281 /* Starting and ending updates. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
282 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
283 These hooks are called by update_frame at the beginning and end |
| 771 | 284 of a frame update. We record in `updating_frame' the identity |
| 285 of the frame being updated, so that the XT... functions do not | |
| 286 need to take a frame as argument. Most of the XT... functions | |
| 286 | 287 should never be called except during an update, the only exceptions |
| 288 being XTcursor_to, XTwrite_char and XTreassert_line_highlight. */ | |
| 289 | |
| 290 extern int mouse_track_top, mouse_track_left, mouse_track_width; | |
| 291 | |
| 292 static | |
| 771 | 293 XTupdate_begin (f) |
| 294 struct frame *f; | |
| 286 | 295 { |
| 296 int mask; | |
| 297 | |
| 771 | 298 if (f == 0) |
| 286 | 299 abort (); |
| 300 | |
| 771 | 301 updating_frame = f; |
| 302 flexlines = f->height; | |
| 286 | 303 highlight = 0; |
| 304 | |
| 305 BLOCK_INPUT; | |
| 306 #ifndef HAVE_X11 | |
| 307 dumpqueue (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
308 #endif /* HAVE_X11 */ |
| 286 | 309 UNBLOCK_INPUT; |
| 310 } | |
| 311 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
312 #ifndef HAVE_X11 |
| 286 | 313 static void x_do_pending_expose (); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
314 #endif |
| 286 | 315 |
| 316 static | |
| 771 | 317 XTupdate_end (f) |
| 318 struct frame *f; | |
| 286 | 319 { |
| 320 int mask; | |
| 321 | |
| 771 | 322 if (updating_frame == 0 |
| 323 || updating_frame != f) | |
| 286 | 324 abort (); |
| 325 | |
| 326 BLOCK_INPUT; | |
| 327 #ifndef HAVE_X11 | |
| 328 dumpqueue (); | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
329 x_do_pending_expose (); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
330 #endif /* HAVE_X11 */ |
| 286 | 331 |
| 771 | 332 x_display_cursor (f, 1); |
| 333 | |
| 334 updating_frame = 0; | |
| 286 | 335 XFlushQueue (); |
| 336 UNBLOCK_INPUT; | |
| 337 } | |
| 338 | |
| 339 /* External interface to control of standout mode. | |
| 340 Call this when about to modify line at position VPOS | |
| 341 and not change whether it is highlighted. */ | |
| 342 | |
| 343 XTreassert_line_highlight (new, vpos) | |
| 344 int new, vpos; | |
| 345 { | |
| 346 highlight = new; | |
| 347 } | |
| 348 | |
| 349 /* Call this when about to modify line at position VPOS | |
| 350 and change whether it is highlighted. */ | |
| 351 | |
| 352 static | |
| 353 XTchange_line_highlight (new_highlight, vpos, first_unused_hpos) | |
| 354 int new_highlight, vpos, first_unused_hpos; | |
| 355 { | |
| 356 highlight = new_highlight; | |
| 357 XTcursor_to (vpos, 0); | |
| 771 | 358 XTclear_end_of_line (updating_frame->width); |
| 286 | 359 } |
| 360 | |
| 361 /* This is used when starting Emacs and when restarting after suspend. | |
| 362 When starting Emacs, no X window is mapped. And nothing must be done | |
| 363 to Emacs's own window if it is suspended (though that rarely happens). */ | |
| 364 | |
| 365 static | |
| 366 XTset_terminal_modes () | |
| 367 { | |
| 368 } | |
| 369 | |
| 370 /* This is called when exiting or suspending Emacs. | |
| 371 Exiting will make the X-windows go away, and suspending | |
| 372 requires no action. */ | |
| 373 | |
| 374 static | |
| 375 XTreset_terminal_modes () | |
| 376 { | |
| 771 | 377 /* XTclear_frame (); */ |
| 286 | 378 } |
| 379 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
380 /* Set the nominal cursor position of the frame. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
381 This is where display update commands will take effect. |
| 286 | 382 This does not affect the place where the cursor-box is displayed. */ |
| 383 | |
| 621 | 384 static int |
| 286 | 385 XTcursor_to (row, col) |
| 386 register int row, col; | |
| 387 { | |
| 388 int mask; | |
| 389 int orow = row; | |
| 390 | |
| 391 curs_x = col; | |
| 392 curs_y = row; | |
| 393 | |
| 771 | 394 if (updating_frame == 0) |
| 286 | 395 { |
| 396 BLOCK_INPUT; | |
| 771 | 397 x_display_cursor (selected_frame, 1); |
| 286 | 398 XFlushQueue (); |
| 399 UNBLOCK_INPUT; | |
| 400 } | |
| 401 } | |
| 402 | |
| 403 /* Display a sequence of N glyphs found at GP. | |
| 404 WINDOW is the x-window to output to. LEFT and TOP are starting coords. | |
| 405 HL is 1 if this text is highlighted, 2 if the cursor is on it. | |
| 406 | |
| 407 FONT is the default font to use (for glyphs whose font-code is 0). */ | |
| 408 | |
| 409 static void | |
| 771 | 410 dumpglyphs (f, left, top, gp, n, hl, font) |
| 411 struct frame *f; | |
| 286 | 412 int left, top; |
| 413 register GLYPH *gp; /* Points to first GLYPH. */ | |
| 414 register int n; /* Number of glyphs to display. */ | |
| 415 int hl; | |
| 416 FONT_TYPE *font; | |
| 417 { | |
| 418 register int len; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
419 Window window = FRAME_X_WINDOW (f); |
| 771 | 420 GC drawing_gc = (hl == 2 ? f->display.x->cursor_gc |
| 421 : (hl ? f->display.x->reverse_gc | |
| 422 : f->display.x->normal_gc)); | |
| 286 | 423 |
| 313 | 424 if (sizeof (GLYPH) == sizeof (XChar2b)) |
| 425 XDrawImageString16 (x_current_display, window, drawing_gc, | |
| 426 left, top + FONT_BASE (font), (XChar2b *) gp, n); | |
| 427 else if (sizeof (GLYPH) == sizeof (unsigned char)) | |
| 428 XDrawImageString (x_current_display, window, drawing_gc, | |
| 429 left, top + FONT_BASE (font), (char *) gp, n); | |
| 430 else | |
| 431 /* What size of glyph ARE you using? And does X have a function to | |
| 432 draw them? */ | |
| 433 abort (); | |
| 286 | 434 } |
| 435 | |
| 436 #if 0 | |
| 437 static void | |
| 771 | 438 dumpglyphs (f, left, top, gp, n, hl, font) |
| 439 struct frame *f; | |
| 286 | 440 int left, top; |
| 441 register GLYPH *gp; /* Points to first GLYPH. */ | |
| 442 register int n; /* Number of glyphs to display. */ | |
| 443 int hl; | |
| 444 FONT_TYPE *font; | |
| 445 { | |
| 771 | 446 char buf[f->width]; /* Holds characters to be displayed. */ |
| 286 | 447 register char *cp; /* Steps through buf[]. */ |
| 448 register int tlen = GLYPH_TABLE_LENGTH; | |
| 449 register Lisp_Object *tbase = GLYPH_TABLE_BASE; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
450 Window window = FRAME_X_WINDOW (f); |
| 771 | 451 int cursor_pixel = f->display.x->cursor_pixel; |
| 452 int fg_pixel = f->display.x->foreground_pixel; | |
| 453 int bg_pixel = f->display.x->background_pixel; | |
| 454 int intborder = f->display.x->internal_border_width; | |
| 286 | 455 |
| 456 while (n) | |
| 457 { | |
| 458 /* Get the face-code of the next GLYPH. */ | |
| 459 int cf, len; | |
| 460 int g = *gp; | |
| 461 | |
| 462 while (GLYPH_ALIAS_P (tbase, tlen, g)) | |
| 463 g = GLYPH_ALIAS (tbase, g); | |
| 464 | |
| 465 cf = g >> 8; | |
| 466 | |
| 467 /* Find the run of consecutive glyphs with the same face-code. | |
| 468 Extract their character codes into BUF. */ | |
| 469 cp = buf; | |
| 470 while (n > 0) | |
| 471 { | |
| 472 g = *gp; | |
| 473 while (GLYPH_ALIAS_P (tbase, tlen, g)) | |
| 474 g = GLYPH_ALIAS (tbase, g); | |
| 475 if ((g >> 8) != cf) | |
| 476 break; | |
| 477 | |
| 478 *cp++ = 0377 & g; | |
| 479 --n; | |
| 480 ++gp; | |
| 481 } | |
| 482 | |
| 483 /* LEN gets the length of the run. */ | |
| 484 len = cp - buf; | |
| 485 | |
| 486 /* Now output this run of chars, with the font and pixel values | |
| 487 determined by the face code CF. */ | |
| 488 if (cf == 0) | |
| 489 { | |
| 490 #ifdef HAVE_X11 | |
| 771 | 491 GC GC_cursor = f->display.x->cursor_gc; |
| 492 GC GC_reverse = f->display.x->reverse_gc; | |
| 493 GC GC_normal = f->display.x->normal_gc; | |
| 286 | 494 |
| 495 XDrawImageString (x_current_display, window, | |
| 496 (hl == 2 | |
| 497 ? GC_cursor | |
| 498 : (hl ? GC_reverse : GC_normal)), | |
| 499 left, top + FONT_BASE (font), buf, len); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
500 #else /* ! defined (HAVE_X11) */ |
| 286 | 501 XText (window, left, top, |
| 502 buf, | |
| 503 len, | |
| 504 font->id, | |
| 505 (hl == 2 | |
| 506 ? (cursor_pixel == fg_pixel ? bg_pixel : fg_pixel) | |
| 507 : hl ? bg_pixel : fg_pixel), | |
| 508 (hl == 2 ? cursor_pixel | |
| 509 : hl ? fg_pixel : bg_pixel)); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
510 #endif /* ! defined (HAVE_X11) */ |
| 286 | 511 } |
| 512 else | |
| 513 { | |
| 514 #ifdef HAVE_X11 | |
| 515 if (FACE_IS_FONT (cf)) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
516 XDrawImageString (x_current_display, FRAME_X_WINDOW (f), |
| 286 | 517 FACE_GC (cf), |
| 518 left, top + FONT_BASE (FACE_FONT (cf)), | |
| 519 buf, len); | |
| 520 else if (FACE_IS_IMAGE (cf)) | |
| 521 XCopyPlane (x_current_display, FACE_IMAGE (cf), | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
522 FRAME_X_WINDOW (f), |
| 771 | 523 f->display.x->normal_gc, |
| 286 | 524 0, 0, |
| 525 FACE_IMAGE_WIDTH (cf), | |
| 526 FACE_IMAGE_HEIGHT (cf), left, top); | |
| 527 else | |
| 528 abort (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
529 #else /* ! defined (HAVE_X11) */ |
| 286 | 530 register struct face *fp = x_face_table[cf]; |
| 531 | |
| 532 XText (window, left, top, | |
| 533 buf, | |
| 534 len, | |
| 535 fp->font->id, | |
| 536 (hl == 2 | |
| 537 ? (cursor_pixel == fp->fg ? fp->bg : fp->fg) | |
| 538 : hl ? fp->bg : fp->fg), | |
| 539 (hl == 2 ? cursor_pixel | |
| 540 : hl ? fp->fg : fp->bg)); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
541 #endif /* ! defined (HAVE_X11) */ |
| 286 | 542 } |
| 543 left += len * FONT_WIDTH (font); | |
| 544 } | |
| 545 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
546 #endif /* ! 0 */ |
| 286 | 547 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
548 /* Output some text at the nominal frame cursor position. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
549 Advance the cursor over the text. |
| 286 | 550 Output LEN glyphs at START. |
| 551 | |
| 552 `highlight', set up by XTreassert_line_highlight or XTchange_line_highlight, | |
| 553 controls the pixel values used for foreground and background. */ | |
| 554 | |
| 555 static | |
| 556 XTwrite_glyphs (start, len) | |
| 557 register GLYPH *start; | |
| 558 int len; | |
| 559 { | |
| 560 register int temp_length; | |
| 561 int mask; | |
| 771 | 562 struct frame *f; |
| 286 | 563 |
| 564 BLOCK_INPUT; | |
| 565 | |
| 771 | 566 f = updating_frame; |
| 567 if (f == 0) | |
| 286 | 568 { |
| 771 | 569 f = selected_frame; |
| 286 | 570 /* If not within an update, |
| 771 | 571 output at the frame's visible cursor. */ |
| 572 curs_x = f->cursor_x; | |
| 573 curs_y = f->cursor_y; | |
| 286 | 574 } |
| 575 | |
| 771 | 576 dumpglyphs (f, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
577 CHAR_TO_PIXEL_COL (f, curs_x), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
578 CHAR_TO_PIXEL_ROW (f, curs_y), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
579 start, len, highlight, f->display.x->font); |
| 429 | 580 |
| 581 /* If we drew on top of the cursor, note that it is turned off. */ | |
| 771 | 582 if (curs_y == f->phys_cursor_y |
| 583 && curs_x <= f->phys_cursor_x | |
| 584 && curs_x + len > f->phys_cursor_x) | |
| 585 f->phys_cursor_x = -1; | |
| 286 | 586 |
| 771 | 587 if (updating_frame == 0) |
| 286 | 588 { |
| 771 | 589 f->cursor_x += len; |
| 590 x_display_cursor (f, 1); | |
| 591 f->cursor_x -= len; | |
| 286 | 592 } |
| 593 else | |
| 594 curs_x += len; | |
| 595 | |
| 596 UNBLOCK_INPUT; | |
| 597 } | |
| 598 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
599 /* Clear to the end of the line. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
600 Erase the current text line from the nominal cursor position (inclusive) |
| 286 | 601 to column FIRST_UNUSED (exclusive). The idea is that everything |
| 602 from FIRST_UNUSED onward is already erased. */ | |
| 603 | |
| 621 | 604 static int |
| 286 | 605 XTclear_end_of_line (first_unused) |
| 606 register int first_unused; | |
| 607 { | |
| 771 | 608 struct frame *f = updating_frame; |
| 286 | 609 int mask; |
| 610 | |
| 771 | 611 if (f == 0) |
| 286 | 612 abort (); |
| 613 | |
| 771 | 614 if (curs_y < 0 || curs_y >= f->height) |
| 286 | 615 return; |
| 616 if (first_unused <= 0) | |
| 617 return; | |
| 618 | |
| 771 | 619 if (first_unused >= f->width) |
| 620 first_unused = f->width; | |
| 286 | 621 |
| 622 BLOCK_INPUT; | |
| 623 | |
| 429 | 624 /* Notice if the cursor will be cleared by this operation. */ |
| 771 | 625 if (curs_y == f->phys_cursor_y |
| 626 && curs_x <= f->phys_cursor_x | |
| 627 && f->phys_cursor_x < first_unused) | |
| 628 f->phys_cursor_x = -1; | |
| 286 | 629 |
| 630 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
631 XClearArea (x_current_display, FRAME_X_WINDOW (f), |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
632 CHAR_TO_PIXEL_COL (f, curs_x), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
633 CHAR_TO_PIXEL_ROW (f, curs_y), |
| 771 | 634 FONT_WIDTH (f->display.x->font) * (first_unused - curs_x), |
| 635 FONT_HEIGHT (f->display.x->font), False); | |
| 286 | 636 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
637 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
638 XPixSet (FRAME_X_WINDOW (f), |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
639 CHAR_TO_PIXEL_COL (f, curs_x), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
640 CHAR_TO_PIXEL_ROW (f, curs_y), |
| 771 | 641 FONT_WIDTH (f->display.x->font) * (first_unused - curs_x), |
| 642 FONT_HEIGHT (f->display.x->font), | |
| 643 f->display.x->background_pixel); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
644 #endif /* ! defined (HAVE_X11) */ |
| 286 | 645 |
| 646 UNBLOCK_INPUT; | |
| 647 } | |
| 648 | |
| 649 static | |
| 771 | 650 XTclear_frame () |
| 286 | 651 { |
| 652 int mask; | |
| 771 | 653 struct frame *f = updating_frame; |
| 654 | |
| 655 if (f == 0) | |
| 656 f = selected_frame; | |
| 657 | |
| 658 f->phys_cursor_x = -1; /* Cursor not visible. */ | |
| 286 | 659 curs_x = 0; /* Nominal cursor position is top left. */ |
| 660 curs_y = 0; | |
| 661 | |
| 662 BLOCK_INPUT; | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
663 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
664 XClear (FRAME_X_WINDOW (f)); |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
665 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
666 /* We have to clear the scrollbars, too. If we have changed |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
667 colors or something like that, then they should be notified. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
668 x_scrollbar_clear (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
669 |
| 286 | 670 #ifndef HAVE_X11 |
| 771 | 671 dumpborder (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
672 #endif /* HAVE_X11 */ |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
673 |
| 286 | 674 XFlushQueue (); |
| 675 UNBLOCK_INPUT; | |
| 676 } | |
| 677 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
678 /* Invert the middle quarter of the frame for .15 sec. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
679 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
680 /* We use the select system call to do the waiting, so we have to make sure |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
681 it's avaliable. If it isn't, we just won't do visual bells. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
682 #if defined (HAVE_TIMEVAL) && defined (HAVE_SELECT) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
683 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
684 /* Subtract the `struct timeval' values X and Y, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
685 storing the result in RESULT. |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
686 Return 1 if the difference is negative, otherwise 0. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
687 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
688 static int |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
689 timeval_subtract (result, x, y) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
690 struct timeval *result, x, y; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
691 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
692 /* Perform the carry for the later subtraction by updating y. |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
693 This is safer because on some systems |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
694 the tv_sec member is unsigned. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
695 if (x.tv_usec < y.tv_usec) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
696 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
697 int nsec = (y.tv_usec - x.tv_usec) / 1000000 + 1; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
698 y.tv_usec -= 1000000 * nsec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
699 y.tv_sec += nsec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
700 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
701 if (x.tv_usec - y.tv_usec > 1000000) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
702 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
703 int nsec = (y.tv_usec - x.tv_usec) / 1000000; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
704 y.tv_usec += 1000000 * nsec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
705 y.tv_sec -= nsec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
706 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
707 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
708 /* Compute the time remaining to wait. tv_usec is certainly positive. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
709 result->tv_sec = x.tv_sec - y.tv_sec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
710 result->tv_usec = x.tv_usec - y.tv_usec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
711 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
712 /* Return indication of whether the result should be considered negative. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
713 return x.tv_sec < y.tv_sec; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
714 } |
| 286 | 715 |
| 771 | 716 XTflash (f) |
| 717 struct frame *f; | |
| 286 | 718 { |
| 719 BLOCK_INPUT; | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
720 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
721 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
722 GC gc; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
723 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
724 /* Create a GC that will use the GXxor function to flip foreground pixels |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
725 into background pixels. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
726 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
727 XGCValues values; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
728 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
729 values.function = GXxor; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
730 values.foreground = (f->display.x->foreground_pixel |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
731 ^ f->display.x->background_pixel); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
732 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
733 gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f), |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
734 GCFunction | GCForeground, &values); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
735 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
736 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
737 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
738 int width = PIXEL_WIDTH (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
739 int height = PIXEL_HEIGHT (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
740 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
741 XFillRectangle (x_current_display, FRAME_X_WINDOW (f), gc, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
742 width/4, height/4, width/2, height/2); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
743 XFlush (x_current_display); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
744 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
745 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
746 struct timeval wakeup, now; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
747 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
748 gettimeofday (&wakeup, (struct timezone *) 0); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
749 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
750 /* Compute time to wait until, propagating carry from usecs. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
751 wakeup.tv_usec += 150000; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
752 wakeup.tv_sec += (wakeup.tv_usec / 1000000); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
753 wakeup.tv_usec %= 1000000; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
754 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
755 /* Keep waiting until past the time wakeup. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
756 while (1) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
757 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
758 struct timeval timeout; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
759 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
760 gettimeofday (&timeout, (struct timezone *)0); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
761 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
762 /* In effect, timeout = wakeup - timeout. |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
763 Break if result would be negative. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
764 if (timeval_subtract (&timeout, wakeup, timeout)) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
765 break; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
766 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
767 /* Try to wait that long--but we might wake up sooner. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
768 select (0, 0, 0, 0, &timeout); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
769 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
770 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
771 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
772 XFillRectangle (x_current_display, FRAME_X_WINDOW (f), gc, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
773 width/4, height/4, width/2, height/2); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
774 XFreeGC (x_current_display, gc); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
775 XFlush (x_current_display); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
776 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
777 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
778 |
| 286 | 779 UNBLOCK_INPUT; |
| 780 } | |
| 781 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
782 #endif |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
783 |
| 286 | 784 |
| 785 /* Make audible bell. */ | |
| 786 | |
| 787 #ifdef HAVE_X11 | |
| 788 #define XRINGBELL XBell(x_current_display, 0) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
789 #else /* ! defined (HAVE_X11) */ |
| 286 | 790 #define XRINGBELL XFeep(0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
791 #endif /* ! defined (HAVE_X11) */ |
| 286 | 792 |
| 793 XTring_bell () | |
| 794 { | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
795 #if defined (HAVE_TIMEVAL) && defined (HAVE_SELECT) |
| 286 | 796 if (visible_bell) |
| 771 | 797 XTflash (selected_frame); |
| 286 | 798 else |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
799 #endif |
| 286 | 800 { |
| 801 BLOCK_INPUT; | |
| 802 XRINGBELL; | |
| 803 XFlushQueue (); | |
| 804 UNBLOCK_INPUT; | |
| 805 } | |
| 806 } | |
| 807 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
808 /* Insert and delete character. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
809 These are not supposed to be used because we are supposed to turn |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
810 off the feature of using them. */ |
| 286 | 811 |
| 812 static | |
| 813 XTinsert_glyphs (start, len) | |
| 814 register char *start; | |
| 815 register int len; | |
| 816 { | |
| 817 abort (); | |
| 818 } | |
| 819 | |
| 820 static | |
| 821 XTdelete_glyphs (n) | |
| 822 register int n; | |
| 823 { | |
| 824 abort (); | |
| 825 } | |
| 826 | |
| 827 /* Specify how many text lines, from the top of the window, | |
| 828 should be affected by insert-lines and delete-lines operations. | |
| 829 This, and those operations, are used only within an update | |
| 830 that is bounded by calls to XTupdate_begin and XTupdate_end. */ | |
| 831 | |
| 832 static | |
| 833 XTset_terminal_window (n) | |
| 834 register int n; | |
| 835 { | |
| 771 | 836 if (updating_frame == 0) |
| 286 | 837 abort (); |
| 838 | |
| 771 | 839 if ((n <= 0) || (n > updating_frame->height)) |
| 840 flexlines = updating_frame->height; | |
| 286 | 841 else |
| 842 flexlines = n; | |
| 843 } | |
| 844 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
845 /* Perform an insert-lines operation. |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
846 Insert N lines at a vertical position curs_y. */ |
| 286 | 847 |
| 848 static void | |
| 849 stufflines (n) | |
| 850 register int n; | |
| 851 { | |
| 852 register int topregion, bottomregion; | |
| 853 register int length, newtop, mask; | |
| 771 | 854 register struct frame *f = updating_frame; |
| 855 int intborder = f->display.x->internal_border_width; | |
| 286 | 856 |
| 857 if (curs_y >= flexlines) | |
| 858 return; | |
| 859 | |
| 860 topregion = curs_y; | |
| 861 bottomregion = flexlines - (n + 1); | |
| 862 newtop = topregion + n; | |
| 863 length = (bottomregion - topregion) + 1; | |
| 864 | |
| 865 #ifndef HAVE_X11 | |
| 866 dumpqueue (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
867 #endif /* HAVE_X11 */ |
| 286 | 868 |
| 869 if ((length > 0) && (newtop <= flexlines)) | |
| 870 { | |
| 871 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
872 XCopyArea (x_current_display, FRAME_X_WINDOW (f), |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
873 FRAME_X_WINDOW (f), f->display.x->normal_gc, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
874 intborder, CHAR_TO_PIXEL_ROW (f, topregion), |
| 771 | 875 f->width * FONT_WIDTH (f->display.x->font), |
| 876 length * FONT_HEIGHT (f->display.x->font), intborder, | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
877 CHAR_TO_PIXEL_ROW (f, newtop)); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
878 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
879 XMoveArea (FRAME_X_WINDOW (f), |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
880 intborder, CHAR_TO_PIXEL_ROW (f, topregion), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
881 intborder, CHAR_TO_PIXEL_ROW (f, newtop), |
| 771 | 882 f->width * FONT_WIDTH (f->display.x->font), |
| 883 length * FONT_HEIGHT (f->display.x->font)); | |
| 286 | 884 /* Now we must process any ExposeRegion events that occur |
| 885 if the area being copied from is obscured. | |
| 886 We can't let it wait because further i/d operations | |
| 887 may want to copy this area to another area. */ | |
| 888 x_read_exposes (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
889 #endif /* ! defined (HAVE_X11) */ |
| 286 | 890 } |
| 891 | |
| 892 newtop = min (newtop, (flexlines - 1)); | |
| 893 length = newtop - topregion; | |
| 894 if (length > 0) | |
| 895 { | |
| 896 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
897 XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
898 CHAR_TO_PIXEL_ROW (f, topregion), |
| 771 | 899 f->width * FONT_WIDTH (f->display.x->font), |
| 900 n * FONT_HEIGHT (f->display.x->font), False); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
901 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
902 XPixSet (FRAME_X_WINDOW (f), |
| 286 | 903 intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
904 CHAR_TO_PIXEL_ROW (f, topregion), |
| 771 | 905 f->width * FONT_WIDTH (f->display.x->font), |
| 906 n * FONT_HEIGHT (f->display.x->font), | |
| 907 f->display.x->background_pixel); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
908 #endif /* ! defined (HAVE_X11) */ |
| 286 | 909 } |
| 910 } | |
| 911 | |
| 912 /* Perform a delete-lines operation, deleting N lines | |
| 913 at a vertical position curs_y. */ | |
| 914 | |
| 915 static void | |
| 916 scraplines (n) | |
| 917 register int n; | |
| 918 { | |
| 919 int mask; | |
| 771 | 920 register struct frame *f = updating_frame; |
| 921 int intborder = f->display.x->internal_border_width; | |
| 286 | 922 |
| 923 if (curs_y >= flexlines) | |
| 924 return; | |
| 925 | |
| 926 #ifndef HAVE_X11 | |
| 927 dumpqueue (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
928 #endif /* HAVE_X11 */ |
| 286 | 929 |
| 930 if ((curs_y + n) >= flexlines) | |
| 931 { | |
| 932 if (flexlines >= (curs_y + 1)) | |
| 933 { | |
| 934 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
935 XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
936 CHAR_TO_PIXEL_ROW (f, curs_y), |
| 771 | 937 f->width * FONT_WIDTH (f->display.x->font), |
| 938 (flexlines - curs_y) * FONT_HEIGHT (f->display.x->font), False); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
939 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
940 XPixSet (FRAME_X_WINDOW (f), |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
941 intborder, CHAR_TO_PIXEL_ROW (f, curs_y), |
| 771 | 942 f->width * FONT_WIDTH (f->display.x->font), |
| 943 (flexlines - curs_y) * FONT_HEIGHT (f->display.x->font), | |
| 944 f->display.x->background_pixel); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
945 #endif /* ! defined (HAVE_X11) */ |
| 286 | 946 } |
| 947 } | |
| 948 else | |
| 949 { | |
| 950 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
951 XCopyArea (x_current_display, FRAME_X_WINDOW (f), |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
952 FRAME_X_WINDOW (f), f->display.x->normal_gc, |
| 286 | 953 intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
954 CHAR_TO_PIXEL_ROW (f, curs_y + n), |
| 771 | 955 f->width * FONT_WIDTH (f->display.x->font), |
| 956 (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font), | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
957 intborder, CHAR_TO_PIXEL_ROW (f, curs_y)); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
958 XClearArea (x_current_display, FRAME_X_WINDOW (f), |
| 286 | 959 intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
960 CHAR_TO_PIXEL_ROW (f, flexlines - n), |
| 771 | 961 f->width * FONT_WIDTH (f->display.x->font), |
| 962 n * FONT_HEIGHT (f->display.x->font), False); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
963 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
964 XMoveArea (FRAME_X_WINDOW (f), |
| 286 | 965 intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
966 CHAR_TO_PIXEL_ROW (f, curs_y + n), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
967 intborder, CHAR_TO_PIXEL_ROW (f, curs_y), |
| 771 | 968 f->width * FONT_WIDTH (f->display.x->font), |
| 969 (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font)); | |
| 286 | 970 /* Now we must process any ExposeRegion events that occur |
| 971 if the area being copied from is obscured. | |
| 972 We can't let it wait because further i/d operations | |
| 973 may want to copy this area to another area. */ | |
| 974 x_read_exposes (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
975 XPixSet (FRAME_X_WINDOW (f), intborder, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
976 CHAR_TO_PIXEL_ROW (f, flexlines - n), |
| 771 | 977 f->width * FONT_WIDTH (f->display.x->font), |
| 978 n * FONT_HEIGHT (f->display.x->font), f->display.x->background_pixel); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
979 #endif /* ! defined (HAVE_X11) */ |
| 286 | 980 } |
| 981 } | |
| 982 | |
| 983 /* Perform an insert-lines or delete-lines operation, | |
| 984 inserting N lines or deleting -N lines at vertical position VPOS. */ | |
| 985 | |
| 986 XTins_del_lines (vpos, n) | |
| 987 int vpos, n; | |
| 988 { | |
| 771 | 989 if (updating_frame == 0) |
| 286 | 990 abort (); |
| 991 | |
| 429 | 992 /* Hide the cursor. */ |
| 771 | 993 x_display_cursor (updating_frame, 0); |
| 286 | 994 |
| 995 XTcursor_to (vpos, 0); | |
| 996 | |
| 997 BLOCK_INPUT; | |
| 998 if (n >= 0) | |
| 999 stufflines (n); | |
| 1000 else | |
| 1001 scraplines (-n); | |
| 1002 XFlushQueue (); | |
| 1003 UNBLOCK_INPUT; | |
| 1004 } | |
| 1005 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1006 /* Support routines for exposure events. */ |
| 286 | 1007 static void clear_cursor (); |
| 1008 | |
| 771 | 1009 /* Output into a rectangle of an X-window (for frame F) |
| 1010 the characters in f->phys_lines that overlap that rectangle. | |
| 286 | 1011 TOP and LEFT are the position of the upper left corner of the rectangle. |
| 1012 ROWS and COLS are the size of the rectangle. */ | |
| 1013 | |
| 1014 static void | |
| 771 | 1015 dumprectangle (f, left, top, cols, rows) |
| 1016 struct frame *f; | |
| 286 | 1017 register int left, top, cols, rows; |
| 1018 { | |
| 771 | 1019 register struct frame_glyphs *active_frame = FRAME_CURRENT_GLYPHS (f); |
| 286 | 1020 int cursor_cleared = 0; |
| 1021 int bottom, right; | |
| 1022 register int y; | |
| 1023 | |
| 771 | 1024 if (FRAME_GARBAGED_P (f)) |
| 286 | 1025 return; |
| 1026 | |
| 1027 /* Express rectangle as four edges, instead of position-and-size. */ | |
| 1028 bottom = top + rows; | |
| 1029 right = left + cols; | |
| 1030 | |
| 1031 #ifndef HAVE_X11 /* Window manger does this for X11. */ | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1032 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1033 int intborder = f->display.x->internal_border_width; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1034 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1035 /* If the rectangle includes any of the internal border area, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1036 redisplay the border emphasis. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1037 if (top < intborder || left < intborder |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1038 || bottom > intborder + f->height * FONT_HEIGHT (f->display.x->font) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1039 || right > intborder + f->width * FONT_WIDTH (f->display.x->font)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1040 dumpborder (f, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1041 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1042 #endif /* HAVE_X11 /* Window manger does this for X11. */ */ |
| 286 | 1043 |
| 1044 /* Convert rectangle edges in pixels to edges in chars. | |
| 1045 Round down for left and top, up for right and bottom. */ | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1046 top = PIXEL_TO_CHAR_ROW (f, top); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1047 left = PIXEL_TO_CHAR_COL (f, left); |
| 771 | 1048 bottom += (FONT_HEIGHT (f->display.x->font) - 1); |
| 1049 right += (FONT_WIDTH (f->display.x->font) - 1); | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1050 bottom = PIXEL_TO_CHAR_ROW (f, bottom); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1051 right = PIXEL_TO_CHAR_COL (f, right); |
| 286 | 1052 |
| 1053 /* Clip the rectangle to what can be visible. */ | |
| 1054 if (left < 0) | |
| 1055 left = 0; | |
| 1056 if (top < 0) | |
| 1057 top = 0; | |
| 771 | 1058 if (right > f->width) |
| 1059 right = f->width; | |
| 1060 if (bottom > f->height) | |
| 1061 bottom = f->height; | |
| 286 | 1062 |
| 1063 /* Get size in chars of the rectangle. */ | |
| 1064 cols = right - left; | |
| 1065 rows = bottom - top; | |
| 1066 | |
| 1067 /* If rectangle has zero area, return. */ | |
| 1068 if (rows <= 0) return; | |
| 1069 if (cols <= 0) return; | |
| 1070 | |
| 1071 /* Turn off the cursor if it is in the rectangle. | |
| 1072 We will turn it back on afterward. */ | |
| 771 | 1073 if ((f->phys_cursor_x >= left) && (f->phys_cursor_x < right) |
| 1074 && (f->phys_cursor_y >= top) && (f->phys_cursor_y < bottom)) | |
| 286 | 1075 { |
| 771 | 1076 clear_cursor (f); |
| 286 | 1077 cursor_cleared = 1; |
| 1078 } | |
| 1079 | |
| 1080 /* Display the text in the rectangle, one text line at a time. */ | |
| 1081 | |
| 1082 for (y = top; y < bottom; y++) | |
| 1083 { | |
| 771 | 1084 GLYPH *line = &active_frame->glyphs[y][left]; |
| 1085 | |
| 1086 if (! active_frame->enable[y] || left > active_frame->used[y]) | |
| 286 | 1087 continue; |
| 1088 | |
| 771 | 1089 dumpglyphs (f, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1090 CHAR_TO_PIXEL_COL (f, left), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1091 CHAR_TO_PIXEL_ROW (f, y), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1092 line, min (cols, active_frame->used[y] - left), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1093 active_frame->highlight[y], f->display.x->font); |
| 286 | 1094 } |
| 1095 | |
| 1096 /* Turn the cursor on if we turned it off. */ | |
| 1097 | |
| 1098 if (cursor_cleared) | |
| 771 | 1099 x_display_cursor (f, 1); |
| 286 | 1100 } |
| 1101 | |
| 1102 #ifndef HAVE_X11 | |
| 1103 /* Process all queued ExposeRegion events. */ | |
| 1104 | |
| 1105 static void | |
| 1106 dumpqueue () | |
| 1107 { | |
| 1108 register int i; | |
| 1109 XExposeRegionEvent r; | |
| 1110 | |
| 1111 while (dequeue_event (&r, &x_expose_queue)) | |
| 1112 { | |
| 771 | 1113 struct frame *f = x_window_to_frame (r.window); |
| 1114 if (f->display.x->icon_desc == r.window) | |
| 1115 refreshicon (f); | |
| 286 | 1116 else |
| 771 | 1117 dumprectangle (f, r.x, r.y, r.width, r.height); |
| 286 | 1118 } |
| 1119 XFlushQueue (); | |
| 1120 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1121 #endif /* HAVE_X11 */ |
| 286 | 1122 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1123 /* Process all expose events that are pending, for X10. |
| 771 | 1124 Redraws the cursor if necessary on any frame that |
| 1125 is not in the process of being updated with update_frame. */ | |
| 286 | 1126 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1127 #ifndef HAVE_X11 |
| 286 | 1128 static void |
| 1129 x_do_pending_expose () | |
| 1130 { | |
| 1131 int mask; | |
| 771 | 1132 struct frame *f; |
| 1133 Lisp_Object tail, frame; | |
| 286 | 1134 |
| 1135 if (expose_all_windows) | |
| 1136 { | |
| 1137 expose_all_windows = 0; | |
| 771 | 1138 for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr) |
| 286 | 1139 { |
| 1140 register int temp_width, temp_height; | |
| 1141 int intborder; | |
| 1142 | |
| 771 | 1143 frame = XCONS (tail)->car; |
| 1144 if (XTYPE (frame) != Lisp_Frame) | |
| 286 | 1145 continue; |
| 771 | 1146 f = XFRAME (frame); |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
1147 if (! FRAME_X_P (f)) |
| 286 | 1148 continue; |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
1149 if (!f->async_visible) |
| 286 | 1150 continue; |
| 771 | 1151 if (!f->display.x->needs_exposure) |
| 286 | 1152 continue; |
| 1153 | |
| 771 | 1154 intborder = f->display.x->internal_border_width; |
| 1155 | |
| 1156 clear_cursor (f); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1157 XGetWindowInfo (FRAME_X_WINDOW (f), &windowinfo); |
| 286 | 1158 temp_width = ((windowinfo.width - 2 * intborder |
| 771 | 1159 - f->display.x->v_scrollbar_width) |
| 1160 / FONT_WIDTH (f->display.x->font)); | |
| 286 | 1161 temp_height = ((windowinfo.height- 2 * intborder |
| 771 | 1162 - f->display.x->h_scrollbar_height) |
| 1163 / FONT_HEIGHT (f->display.x->font)); | |
| 1164 if (temp_width != f->width || temp_height != f->height) | |
| 286 | 1165 { |
| 771 | 1166 change_frame_size (f, max (1, temp_height), |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
1167 max (1, temp_width), 0, 1); |
| 771 | 1168 x_resize_scrollbars (f); |
| 286 | 1169 } |
| 771 | 1170 f->display.x->left_pos = windowinfo.x; |
| 1171 f->display.x->top_pos = windowinfo.y; | |
| 1172 dumprectangle (f, 0, 0, PIXEL_WIDTH (f), PIXEL_HEIGHT (f)); | |
| 286 | 1173 #if 0 |
| 771 | 1174 dumpborder (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1175 #endif /* ! 0 */ |
| 771 | 1176 f->display.x->needs_exposure = 0; |
| 1177 if (updating_frame != f) | |
| 1178 x_display_cursor (f, 1); | |
| 286 | 1179 XFlushQueue (); |
| 1180 } | |
| 1181 } | |
| 1182 else | |
| 1183 /* Handle any individual-rectangle expose events queued | |
| 1184 for various windows. */ | |
| 1185 #ifdef HAVE_X11 | |
| 1186 ; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1187 #else /* ! defined (HAVE_X11) */ |
| 286 | 1188 dumpqueue (); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1189 #endif /* ! defined (HAVE_X11) */ |
| 286 | 1190 } |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1191 #endif |
| 286 | 1192 |
| 1193 #ifdef HAVE_X11 | |
| 1194 static void | |
| 771 | 1195 frame_highlight (frame) |
| 1196 struct frame *frame; | |
| 286 | 1197 { |
| 1198 if (! EQ (Vx_no_window_manager, Qnil)) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1199 XSetWindowBorder (x_current_display, FRAME_X_WINDOW (frame), |
| 771 | 1200 frame->display.x->border_pixel); |
| 1201 x_display_cursor (frame, 1); | |
| 286 | 1202 } |
| 1203 | |
| 1204 static void | |
| 771 | 1205 frame_unhighlight (frame) |
| 1206 struct frame *frame; | |
| 286 | 1207 { |
| 1208 if (! EQ (Vx_no_window_manager, Qnil)) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1209 XSetWindowBorderPixmap (x_current_display, FRAME_X_WINDOW (frame), |
| 771 | 1210 frame->display.x->border_tile); |
| 1211 x_display_cursor (frame, 1); | |
| 286 | 1212 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1213 #else /* ! defined (HAVE_X11) */ |
| 771 | 1214 /* Dump the border-emphasis of frame F. |
| 1215 If F is selected, this is a lining of the same color as the border, | |
| 286 | 1216 just within the border, occupying a portion of the internal border. |
| 771 | 1217 If F is not selected, it is background in the same place. |
| 286 | 1218 If ALWAYS is 0, don't bother explicitly drawing if it's background. |
| 1219 | |
| 771 | 1220 ALWAYS = 1 is used when a frame becomes selected or deselected. |
| 286 | 1221 In that case, we also turn the cursor off and on again |
| 1222 so it will appear in the proper shape (solid if selected; else hollow.) */ | |
| 1223 | |
| 1224 static void | |
| 771 | 1225 dumpborder (f, always) |
| 1226 struct frame *f; | |
| 286 | 1227 int always; |
| 1228 { | |
| 771 | 1229 int thickness = f->display.x->internal_border_width / 2; |
| 1230 int width = PIXEL_WIDTH (f); | |
| 1231 int height = PIXEL_HEIGHT (f); | |
| 286 | 1232 int pixel; |
| 1233 | |
| 771 | 1234 if (f != selected_frame) |
| 286 | 1235 { |
| 1236 if (!always) | |
| 1237 return; | |
| 1238 | |
| 771 | 1239 pixel = f->display.x->background_pixel; |
| 286 | 1240 } |
| 1241 else | |
| 1242 { | |
| 771 | 1243 pixel = f->display.x->border_pixel; |
| 286 | 1244 } |
| 1245 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1246 XPixSet (FRAME_X_WINDOW (f), 0, 0, width, thickness, pixel); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1247 XPixSet (FRAME_X_WINDOW (f), 0, 0, thickness, height, pixel); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1248 XPixSet (FRAME_X_WINDOW (f), 0, height - thickness, width, |
| 286 | 1249 thickness, pixel); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1250 XPixSet (FRAME_X_WINDOW (f), width - thickness, 0, thickness, |
| 286 | 1251 height, pixel); |
| 1252 | |
| 1253 if (always) | |
| 771 | 1254 x_display_cursor (f, 1); |
| 286 | 1255 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1256 #endif /* ! defined (HAVE_X11) */ |
| 286 | 1257 |
| 771 | 1258 static void XTframe_rehighlight (); |
| 1259 | |
| 1260 /* The focus has changed. Update the frames as necessary to reflect | |
| 1261 the new situation. Note that we can't change the selected frame | |
| 286 | 1262 here, because the lisp code we are interrupting might become confused. |
| 771 | 1263 Each event gets marked with the frame in which it occured, so the |
| 369 | 1264 lisp code can tell when the switch took place by examining the events. */ |
| 1265 | |
| 1266 static void | |
| 771 | 1267 x_new_focus_frame (frame) |
| 1268 struct frame *frame; | |
| 286 | 1269 { |
| 771 | 1270 struct frame *old_focus = x_focus_frame; |
| 286 | 1271 int events_enqueued = 0; |
| 1272 | |
| 771 | 1273 if (frame != x_focus_frame) |
| 286 | 1274 { |
| 369 | 1275 /* Set this before calling other routines, so that they see |
| 771 | 1276 the correct value of x_focus_frame. */ |
| 1277 x_focus_frame = frame; | |
| 369 | 1278 |
| 1279 if (old_focus && old_focus->auto_lower) | |
| 771 | 1280 x_lower_frame (old_focus); |
| 286 | 1281 |
| 1282 #if 0 | |
| 771 | 1283 selected_frame = frame; |
| 1284 XSET (XWINDOW (selected_frame->selected_window)->frame, | |
| 1285 Lisp_Frame, selected_frame); | |
| 1286 Fselect_window (selected_frame->selected_window); | |
| 1287 choose_minibuf_frame (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1288 #endif /* ! 0 */ |
| 286 | 1289 |
| 771 | 1290 if (x_focus_frame && x_focus_frame->auto_raise) |
| 1291 x_raise_frame (x_focus_frame); | |
| 369 | 1292 } |
| 1293 | |
| 771 | 1294 XTframe_rehighlight (); |
| 369 | 1295 } |
| 1296 | |
| 1297 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1298 /* The focus has changed, or we have redirected a frame's focus to |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1299 another frame (this happens when a frame uses a surrogate |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1300 minibuffer frame). Shift the highlight as appropriate. */ |
| 369 | 1301 static void |
| 771 | 1302 XTframe_rehighlight () |
| 369 | 1303 { |
| 771 | 1304 struct frame *old_highlight = x_highlight_frame; |
| 1305 | |
| 1306 if (x_focus_frame) | |
| 286 | 1307 { |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1308 x_highlight_frame = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1309 ((XTYPE (FRAME_FOCUS_FRAME (x_focus_frame)) == Lisp_Frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1310 ? XFRAME (FRAME_FOCUS_FRAME (x_focus_frame)) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1311 : x_focus_frame); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1312 if (! FRAME_LIVE_P (x_highlight_frame)) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1313 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1314 FRAME_FOCUS_FRAME (x_focus_frame) = Qnil; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1315 x_highlight_frame = x_focus_frame; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1316 } |
| 286 | 1317 } |
| 369 | 1318 else |
| 771 | 1319 x_highlight_frame = 0; |
| 1320 | |
| 1321 if (x_highlight_frame != old_highlight) | |
| 369 | 1322 { |
| 1323 if (old_highlight) | |
| 771 | 1324 frame_unhighlight (old_highlight); |
| 1325 if (x_highlight_frame) | |
| 1326 frame_highlight (x_highlight_frame); | |
| 369 | 1327 } |
| 286 | 1328 } |
| 1329 | |
| 429 | 1330 /* Mouse clicks and mouse movement. Rah. */ |
| 1331 #ifdef HAVE_X11 | |
| 1332 | |
| 771 | 1333 /* Given a pixel position (PIX_X, PIX_Y) on the frame F, return |
| 429 | 1334 glyph co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle |
| 1335 that the glyph at X, Y occupies, if BOUNDS != 0. */ | |
| 1336 static void | |
| 771 | 1337 pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds) |
| 1338 FRAME_PTR f; | |
| 286 | 1339 register unsigned int pix_x, pix_y; |
| 1340 register int *x, *y; | |
| 429 | 1341 XRectangle *bounds; |
| 286 | 1342 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1343 pix_x = PIXEL_TO_CHAR_COL (f, pix_x); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1344 pix_y = PIXEL_TO_CHAR_ROW (f, pix_y); |
| 429 | 1345 |
| 1346 if (bounds) | |
| 1347 { | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1348 bounds->width = FONT_WIDTH (f->display.x->font); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1349 bounds->height = FONT_HEIGHT (f->display.x->font); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1350 bounds->x = CHAR_TO_PIXEL_COL (f, pix_x); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1351 bounds->y = CHAR_TO_PIXEL_ROW (f, pix_y); |
| 429 | 1352 } |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1353 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1354 if (pix_x < 0) pix_x = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1355 else if (pix_x > f->width) pix_x = f->width; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1356 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1357 if (pix_y < 0) pix_y = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1358 else if (pix_y > f->height) pix_y = f->height; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1359 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1360 *x = pix_x; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1361 *y = pix_y; |
| 286 | 1362 } |
| 1363 | |
| 1364 /* Any buttons grabbed. */ | |
| 1365 unsigned int x_mouse_grabbed; | |
| 1366 | |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1367 /* Which modifier keys are on which modifier bits? |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1368 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1369 With each keystroke, X returns eight bits indicating which modifier |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1370 keys were held down when the key was pressed. The interpretation |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1371 of the top five modifier bits depends on what keys are attached |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1372 to them. If the Meta_L and Meta_R keysyms are on mod5, then mod5 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1373 is the meta bit. |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1374 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1375 x_meta_mod_mask is a mask containing the bits used for the meta key. |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1376 It may have more than one bit set, if more than one modifier bit |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1377 has meta keys on it. Basically, if EVENT is a KeyPress event, |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1378 the meta key is pressed if (EVENT.state & x_meta_mod_mask) != 0. |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1379 |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1380 x_shift_lock_mask is LockMask if the XK_Shift_Lock keysym is on the |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1381 lock modifier bit, or zero otherwise. Non-alphabetic keys should |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1382 only be affected by the lock modifier bit if XK_Shift_Lock is in |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1383 use; XK_Caps_Lock should only affect alphabetic keys. With this |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1384 arrangement, the lock modifier should shift the character if |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1385 (EVENT.state & x_shift_lock_mask) != 0. */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1386 static int x_meta_mod_mask, x_shift_lock_mask; |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1387 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1388 /* Initialize mode_switch_bit and modifier_meaning. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1389 static void |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1390 x_find_modifier_meanings () |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1391 { |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1392 int min_code, max_code; |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1393 KeySym *syms; |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1394 int syms_per_code; |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1395 XModifierKeymap *mods; |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1396 int alt_mod_mask = 0; |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1397 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1398 x_meta_mod_mask = 0; |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1399 x_shift_lock_mask = 0; |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1400 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1401 XDisplayKeycodes (x_current_display, &min_code, &max_code); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1402 syms = XGetKeyboardMapping (x_current_display, |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1403 min_code, max_code - min_code + 1, |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1404 &syms_per_code); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1405 mods = XGetModifierMapping (x_current_display); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1406 |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1407 /* Scan the modifier table to see which modifier bits the Meta and |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1408 Alt keysyms are on. */ |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1409 { |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1410 int row, col; /* The row and column in the modifier table. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1411 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1412 for (row = 3; row < 8; row++) |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1413 for (col = 0; col < mods->max_keypermod; col++) |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1414 { |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1415 KeyCode code = |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1416 mods->modifiermap[(row * mods->max_keypermod) + col]; |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1417 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1418 /* Are any of this keycode's keysyms a meta key? */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1419 { |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1420 int code_col; |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1421 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1422 for (code_col = 0; code_col < syms_per_code; code_col++) |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1423 { |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1424 int sym = syms[((code - min_code) * syms_per_code) + code_col]; |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1425 |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1426 switch (sym) |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1427 { |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1428 case XK_Meta_L: |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1429 case XK_Meta_R: |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1430 x_meta_mod_mask |= (1 << row); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1431 break; |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1432 |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1433 case XK_Alt_L: |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1434 case XK_Alt_R: |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1435 alt_mod_mask |= (1 << row); |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1436 break; |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1437 |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1438 case XK_Shift_Lock: |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1439 /* Ignore this if it's not on the lock modifier. */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1440 if ((1 << row) == LockMask) |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1441 x_shift_lock_mask = LockMask; |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1442 break; |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1443 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1444 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1445 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1446 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1447 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1448 |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1449 /* If we couldn't find any meta keys, accept any alt keys as meta keys. */ |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1450 if (! x_meta_mod_mask) |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1451 x_meta_mod_mask = alt_mod_mask; |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1452 |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1453 XFree ((char *) syms); |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1454 XFreeModifiermap (mods); |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1455 } |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1456 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1457 |
| 286 | 1458 /* Convert a set of X modifier bits to the proper form for a |
| 1459 struct input_event modifiers value. */ | |
| 1460 | |
|
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
1461 static unsigned int |
| 286 | 1462 x_convert_modifiers (state) |
| 1463 unsigned int state; | |
| 1464 { | |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1465 return ( ((state & (ShiftMask | x_shift_lock_mask)) ? shift_modifier : 0) |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1466 | ((state & ControlMask) ? ctrl_modifier : 0) |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1467 | ((state & x_meta_mod_mask) ? meta_modifier : 0)); |
| 286 | 1468 } |
| 1469 | |
| 1470 /* Prepare a mouse-event in *RESULT for placement in the input queue. | |
| 1471 | |
| 1472 If the event is a button press, then note that we have grabbed | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1473 the mouse. */ |
| 286 | 1474 |
| 1475 static Lisp_Object | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1476 construct_mouse_click (result, event, f) |
| 286 | 1477 struct input_event *result; |
| 1478 XButtonEvent *event; | |
| 771 | 1479 struct frame *f; |
| 286 | 1480 { |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1481 /* Make the event type no_event; we'll change that when we decide |
| 286 | 1482 otherwise. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1483 result->kind = mouse_click; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1484 XSET (result->code, Lisp_Int, event->button - Button1); |
| 708 | 1485 result->timestamp = event->time; |
| 286 | 1486 result->modifiers = (x_convert_modifiers (event->state) |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1487 | (event->type == ButtonRelease |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1488 ? up_modifier |
|
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1489 : down_modifier)); |
| 286 | 1490 |
| 1491 /* Notice if the mouse is still grabbed. */ | |
| 1492 if (event->type == ButtonPress) | |
| 1493 { | |
| 1494 if (! x_mouse_grabbed) | |
| 1495 Vmouse_depressed = Qt; | |
| 429 | 1496 x_mouse_grabbed |= (1 << event->button); |
| 286 | 1497 } |
| 1498 else if (event->type == ButtonRelease) | |
| 1499 { | |
| 429 | 1500 x_mouse_grabbed &= ~(1 << event->button); |
| 286 | 1501 if (!x_mouse_grabbed) |
| 1502 Vmouse_depressed = Qnil; | |
| 1503 } | |
| 1504 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1505 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1506 int row, column; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1507 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1508 pixel_to_glyph_coords (f, event->x, event->y, &column, &row, NULL); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1509 XFASTINT (result->x) = column; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1510 XFASTINT (result->y) = row; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1511 XSET (result->frame_or_window, Lisp_Frame, f); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1512 } |
| 286 | 1513 } |
| 1514 | |
| 1515 | |
| 429 | 1516 /* Mouse movement. Rah. |
| 1517 | |
| 1518 In order to avoid asking for motion events and then throwing most | |
| 1519 of them away or busy-polling the server for mouse positions, we ask | |
| 1520 the server for pointer motion hints. This means that we get only | |
| 1521 one event per group of mouse movements. "Groups" are delimited by | |
| 1522 other kinds of events (focus changes and button clicks, for | |
| 1523 example), or by XQueryPointer calls; when one of these happens, we | |
| 1524 get another MotionNotify event the next time the mouse moves. This | |
| 732 | 1525 is at least as efficient as getting motion events when mouse |
| 429 | 1526 tracking is on, and I suspect only negligibly worse when tracking |
| 1527 is off. | |
| 1528 | |
| 1529 The silly O'Reilly & Associates Nutshell guides barely document | |
| 1530 pointer motion hints at all (I think you have to infer how they | |
| 1531 work from an example), and the description of XQueryPointer doesn't | |
| 1532 mention that calling it causes you to get another motion hint from | |
| 1533 the server, which is very important. */ | |
| 1534 | |
| 1535 /* Where the mouse was last time we reported a mouse event. */ | |
| 771 | 1536 static FRAME_PTR last_mouse_frame; |
| 429 | 1537 static XRectangle last_mouse_glyph; |
| 1538 | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1539 /* The scrollbar in which the last X motion event occurred. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1540 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1541 If the last X motion event occured in a scrollbar, we set this |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1542 so XTmouse_position can know whether to report a scrollbar motion or |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1543 an ordinary motion. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1544 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1545 If the last X motion event didn't occur in a scrollbar, we set this |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1546 to Qnil, to tell XTmouse_position to return an ordinary motion event. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1547 static Lisp_Object last_mouse_scrollbar; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1548 |
| 732 | 1549 /* This is a hack. We would really prefer that XTmouse_position would |
| 1550 return the time associated with the position it returns, but there | |
| 1551 doesn't seem to be any way to wrest the timestamp from the server | |
| 1552 along with the position query. So, we just keep track of the time | |
| 1553 of the last movement we received, and return that in hopes that | |
| 1554 it's somewhat accurate. */ | |
| 1555 static Time last_mouse_movement_time; | |
| 1556 | |
| 429 | 1557 /* Function to report a mouse movement to the mainstream Emacs code. |
| 1558 The input handler calls this. | |
| 1559 | |
| 1560 We have received a mouse movement event, which is given in *event. | |
| 1561 If the mouse is over a different glyph than it was last time, tell | |
| 1562 the mainstream emacs code by setting mouse_moved. If not, ask for | |
| 1563 another motion event, so we can check again the next time it moves. */ | |
| 1564 static void | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1565 note_mouse_movement (frame, event) |
| 771 | 1566 FRAME_PTR frame; |
| 429 | 1567 XMotionEvent *event; |
| 1568 | |
| 1569 { | |
| 732 | 1570 last_mouse_movement_time = event->time; |
| 1571 | |
| 429 | 1572 /* Has the mouse moved off the glyph it was on at the last sighting? */ |
| 1573 if (event->x < last_mouse_glyph.x | |
| 1574 || event->x >= last_mouse_glyph.x + last_mouse_glyph.width | |
| 1575 || event->y < last_mouse_glyph.y | |
| 1576 || event->y >= last_mouse_glyph.y + last_mouse_glyph.height) | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1577 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1578 mouse_moved = 1; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1579 last_mouse_scrollbar = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1580 } |
| 429 | 1581 else |
| 1582 { | |
| 1583 /* It's on the same glyph. Call XQueryPointer so we'll get an | |
| 1584 event the next time the mouse moves and we can see if it's | |
| 1585 *still* on the same glyph. */ | |
| 1586 int dummy; | |
| 1587 | |
| 1588 XQueryPointer (event->display, event->window, | |
| 1589 (Window *) &dummy, (Window *) &dummy, | |
| 1590 &dummy, &dummy, &dummy, &dummy, | |
| 1591 (unsigned int *) &dummy); | |
| 1592 } | |
| 1593 } | |
| 1594 | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1595 static struct scrollbar *x_window_to_scrollbar (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1596 static void x_scrollbar_report_motion (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1597 |
| 429 | 1598 /* Return the current position of the mouse. |
| 1599 | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1600 If the mouse movement started in a scrollbar, set *f, *bar_window, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1601 and *part to the frame, window, and scrollbar part that the mouse |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1602 is over. Set *x and *y to the portion and whole of the mouse's |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1603 position on the scrollbar. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1604 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1605 If the mouse movement started elsewhere, set *f to the frame the |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1606 mouse is on, *bar_window to nil, and *x and *y to the character cell |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1607 the mouse is over. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1608 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1609 Set *time to the server timestamp for the time at which the mouse |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1610 was at this position. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1611 |
| 429 | 1612 This clears the mouse_moved flag, so we can wait for the next mouse |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1613 movement. This also calls XQueryPointer, which will cause the |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1614 server to give us another MotionNotify when the mouse moves |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1615 again. */ |
| 429 | 1616 |
| 1617 static void | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1618 XTmouse_position (f, bar_window, part, x, y, time) |
| 771 | 1619 FRAME_PTR *f; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1620 Lisp_Object *bar_window; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1621 enum scrollbar_part *part; |
| 429 | 1622 Lisp_Object *x, *y; |
| 732 | 1623 unsigned long *time; |
| 429 | 1624 { |
| 1625 BLOCK_INPUT; | |
| 1626 | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1627 if (! NILP (last_mouse_scrollbar)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1628 x_scrollbar_report_motion (f, bar_window, part, x, y, time); |
| 429 | 1629 else |
| 1630 { | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1631 Window root; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1632 int root_x, root_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1633 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1634 Window dummy_window; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1635 int dummy; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1636 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1637 mouse_moved = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1638 last_mouse_scrollbar = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1639 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1640 /* Figure out which root window we're on. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1641 XQueryPointer (x_current_display, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1642 DefaultRootWindow (x_current_display), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1643 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1644 /* The root window which contains the pointer. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1645 &root, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1646 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1647 /* Trash which we can't trust if the pointer is on |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1648 a different screen. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1649 &dummy_window, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1650 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1651 /* The position on that root window. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1652 &root_x, &root_y, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1653 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1654 /* More trash we can't trust. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1655 &dummy, &dummy, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1656 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1657 /* Modifier keys and pointer buttons, about which |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1658 we don't care. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1659 (unsigned int *) &dummy); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1660 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1661 /* Now we have a position on the root; find the innermost window |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1662 containing the pointer. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1663 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1664 Window win, child; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1665 int win_x, win_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1666 int parent_x, parent_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1667 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1668 win = root; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1669 for (;;) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1670 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1671 XTranslateCoordinates (x_current_display, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1672 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1673 /* From-window, to-window. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1674 root, win, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1675 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1676 /* From-position, to-position. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1677 root_x, root_y, &win_x, &win_y, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1678 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1679 /* Child of win. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1680 &child); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1681 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1682 if (child == None) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1683 break; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1684 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1685 win = child; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1686 parent_x = win_x; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1687 parent_y = win_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1688 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1689 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1690 /* Now we know that: |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1691 win is the innermost window containing the pointer |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1692 (XTC says it has no child containing the pointer), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1693 win_x and win_y are the pointer's position in it |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1694 (XTC did this the last time through), and |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1695 parent_x and parent_y are the pointer's position in win's parent. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1696 (They are what win_x and win_y were when win was child. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1697 If win is the root window, it has no parent, and |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1698 parent_{x,y} are invalid, but that's okay, because we'll |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1699 never use them in that case.) */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1700 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1701 /* Is win one of our frames? */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1702 *f = x_window_to_frame (win); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1703 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1704 /* If not, is it one of our scrollbars? */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1705 if (! *f) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1706 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1707 struct scrollbar *bar = x_window_to_scrollbar (win); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1708 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1709 if (bar) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1710 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1711 *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1712 win_x = parent_x; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1713 win_y = parent_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1714 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1715 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1716 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1717 if (*f) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1718 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1719 pixel_to_glyph_coords (*f, win_x, win_y, &win_x, &win_y, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1720 &last_mouse_glyph); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1721 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1722 *bar_window = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1723 *part = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1724 XSET (*x, Lisp_Int, win_x); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1725 XSET (*y, Lisp_Int, win_y); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1726 *time = last_mouse_movement_time; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1727 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1728 } |
| 429 | 1729 } |
| 1730 | |
| 1731 UNBLOCK_INPUT; | |
| 1732 } | |
| 1733 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1734 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1735 #define XEvent XKeyPressedEvent |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1736 #endif /* ! defined (HAVE_X11) */ |
| 429 | 1737 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1738 /* Scrollbar support. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1739 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1740 /* Given an X window ID, find the struct scrollbar which manages it. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1741 static struct scrollbar * |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1742 x_window_to_scrollbar (window_id) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1743 Window window_id; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1744 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1745 Lisp_Object tail, frame; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1746 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1747 for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1748 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1749 Lisp_Object frame = XCONS (tail)->car; |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
1750 Lisp_Object bar, condemned; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1751 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1752 /* All elements of Vframe_list should be frames. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1753 if (XTYPE (frame) != Lisp_Frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1754 abort (); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1755 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1756 /* Scan this frame's scrollbar list for a scrollbar with the |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1757 right window ID. */ |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
1758 condemned = FRAME_CONDEMNED_SCROLLBARS (XFRAME (frame)); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1759 for (bar = FRAME_SCROLLBARS (XFRAME (frame)); |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
1760 /* This trick allows us to search both the ordinary and |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
1761 condemned scrollbar lists with one loop. */ |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
1762 ! NILP (bar) || (bar = condemned, condemned = Qnil, ! NILP (bar)); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1763 bar = XSCROLLBAR(bar)->next) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1764 if (SCROLLBAR_X_WINDOW (XSCROLLBAR (bar)) == window_id) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1765 return XSCROLLBAR (bar); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1766 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1767 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1768 return 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1769 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1770 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1771 /* Open a new X window to serve as a scrollbar, and return the |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1772 scrollbar vector for it. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1773 static struct scrollbar * |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1774 x_scrollbar_create (window, top, left, width, height) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1775 struct window *window; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1776 int top, left, width, height; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1777 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1778 FRAME_PTR frame = XFRAME (WINDOW_FRAME (window)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1779 struct scrollbar *bar = |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1780 XSCROLLBAR (Fmake_vector (make_number (SCROLLBAR_VEC_SIZE), Qnil)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1781 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1782 BLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1783 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1784 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1785 XSetWindowAttributes a; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1786 unsigned long mask; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1787 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1788 a.background_pixel = frame->display.x->background_pixel; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1789 a.event_mask = (ButtonPressMask | ButtonReleaseMask |
|
1793
cf4c3f01ddb9
* xterm.c (x_scrollbar_create): Include PointerMotionHintMask in
Jim Blandy <jimb@redhat.com>
parents:
1787
diff
changeset
|
1790 | ButtonMotionMask | PointerMotionHintMask |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1791 | ExposureMask); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1792 a.cursor = x_vertical_scrollbar_cursor; |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
1793 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
1794 mask = (CWBackPixel | CWEventMask | CWCursor); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1795 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1796 SET_SCROLLBAR_X_WINDOW |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1797 (bar, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1798 XCreateWindow (x_current_display, FRAME_X_WINDOW (frame), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1799 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1800 /* Position and size of scrollbar. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1801 left, top, width, height, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1802 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1803 /* Border width, depth, class, and visual. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1804 0, CopyFromParent, CopyFromParent, CopyFromParent, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1805 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1806 /* Attributes. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1807 mask, &a)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1808 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1809 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1810 XSET (bar->window, Lisp_Window, window); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1811 XSET (bar->top, Lisp_Int, top); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1812 XSET (bar->left, Lisp_Int, left); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1813 XSET (bar->width, Lisp_Int, width); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1814 XSET (bar->height, Lisp_Int, height); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1815 XSET (bar->start, Lisp_Int, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1816 XSET (bar->end, Lisp_Int, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1817 bar->dragging = Qnil; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1818 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1819 /* Add bar to its frame's list of scroll bars. */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1820 bar->next = FRAME_SCROLLBARS (frame); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1821 bar->prev = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1822 XSET (FRAME_SCROLLBARS (frame), Lisp_Vector, bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1823 if (! NILP (bar->next)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1824 XSET (XSCROLLBAR (bar->next)->prev, Lisp_Vector, bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1825 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1826 XMapWindow (x_current_display, SCROLLBAR_X_WINDOW (bar)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1827 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1828 UNBLOCK_INPUT; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1829 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1830 return bar; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1831 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1832 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1833 /* Draw BAR's handle in the proper position. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1834 If the handle is already drawn from START to END, don't bother |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1835 redrawing it, unless REBUILD is non-zero; in that case, always |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1836 redraw it. (REBUILD is handy for drawing the handle after expose |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1837 events.) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1838 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1839 Normally, we want to constrain the start and end of the handle to |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1840 fit inside its rectangle, but if the user is dragging the scrollbar |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1841 handle, we want to let them drag it down all the way, so that the |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1842 bar's top is as far down as it goes; otherwise, there's no way to |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1843 move to the very end of the buffer. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1844 static void |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1845 x_scrollbar_set_handle (bar, start, end, rebuild) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1846 struct scrollbar *bar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1847 int start, end; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1848 int rebuild; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1849 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1850 int dragging = ! NILP (bar->dragging); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1851 Window w = SCROLLBAR_X_WINDOW (bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1852 GC gc = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)))->display.x->normal_gc; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1853 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1854 /* If the display is already accurate, do nothing. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1855 if (! rebuild |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1856 && start == XINT (bar->start) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1857 && end == XINT (bar->end)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1858 return; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1859 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1860 BLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1861 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1862 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1863 int inside_width = VERTICAL_SCROLLBAR_INSIDE_WIDTH (XINT (bar->width)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1864 int inside_height = VERTICAL_SCROLLBAR_INSIDE_HEIGHT (XINT (bar->height)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1865 int top_range = VERTICAL_SCROLLBAR_TOP_RANGE (XINT (bar->height)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1866 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1867 /* Make sure the values are reasonable, and try to preserve |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1868 the distance between start and end. */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1869 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1870 int length = end - start; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1871 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1872 if (start < 0) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1873 start = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1874 else if (start > top_range) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1875 start = top_range; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1876 end = start + length; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1877 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1878 if (end < start) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1879 end = start; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1880 else if (end > top_range && ! dragging) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1881 end = top_range; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1882 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1883 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1884 /* Store the adjusted setting in the scrollbar. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1885 XSET (bar->start, Lisp_Int, start); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1886 XSET (bar->end, Lisp_Int, end); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1887 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1888 /* Clip the end position, just for display. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1889 if (end > top_range) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1890 end = top_range; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1891 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1892 /* Draw bottom positions VERTICAL_SCROLLBAR_MIN_HANDLE pixels |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1893 below top positions, to make sure the handle is always at least |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1894 that many pixels tall. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1895 end += VERTICAL_SCROLLBAR_MIN_HANDLE; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1896 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1897 /* Draw the empty space above the handle. Note that we can't clear |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1898 zero-height areas; that means "clear to end of window." */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1899 if (0 < start) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1900 XClearArea (x_current_display, w, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1901 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1902 /* x, y, width, height, and exposures. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1903 VERTICAL_SCROLLBAR_LEFT_BORDER, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1904 VERTICAL_SCROLLBAR_TOP_BORDER, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1905 inside_width, start, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1906 False); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1907 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1908 /* Draw the handle itself. */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1909 XFillRectangle (x_current_display, w, gc, |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1910 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1911 /* x, y, width, height */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1912 VERTICAL_SCROLLBAR_LEFT_BORDER, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1913 VERTICAL_SCROLLBAR_TOP_BORDER + start, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1914 inside_width, end - start); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1915 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1916 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1917 /* Draw the empty space below the handle. Note that we can't |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1918 clear zero-height areas; that means "clear to end of window." */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1919 if (end < inside_height) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1920 XClearArea (x_current_display, w, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1921 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1922 /* x, y, width, height, and exposures. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1923 VERTICAL_SCROLLBAR_LEFT_BORDER, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1924 VERTICAL_SCROLLBAR_TOP_BORDER + end, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1925 inside_width, inside_height - end, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1926 False); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1927 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1928 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1929 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1930 UNBLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1931 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1932 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1933 /* Move a scrollbar around on the screen, to accomodate changing |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1934 window configurations. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1935 static void |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1936 x_scrollbar_move (bar, top, left, width, height) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1937 struct scrollbar *bar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1938 int top, left, width, height; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1939 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1940 BLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1941 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1942 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1943 XWindowChanges wc; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1944 unsigned int mask = 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1945 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1946 wc.x = left; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1947 wc.y = top; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1948 wc.width = width; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1949 wc.height = height; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1950 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1951 if (left != XINT (bar->left)) mask |= CWX; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1952 if (top != XINT (bar->top)) mask |= CWY; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1953 if (width != XINT (bar->width)) mask |= CWWidth; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1954 if (height != XINT (bar->height)) mask |= CWHeight; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1955 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1956 if (mask) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1957 XConfigureWindow (x_current_display, SCROLLBAR_X_WINDOW (bar), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1958 mask, &wc); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1959 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1960 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1961 XSET (bar->left, Lisp_Int, left); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1962 XSET (bar->top, Lisp_Int, top); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1963 XSET (bar->width, Lisp_Int, width); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1964 XSET (bar->height, Lisp_Int, height); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1965 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1966 UNBLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1967 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1968 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1969 /* Destroy the X window for BAR, and set its Emacs window's scrollbar |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1970 to nil. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1971 static void |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1972 x_scrollbar_remove (bar) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1973 struct scrollbar *bar; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1974 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1975 FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1976 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1977 BLOCK_INPUT; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1978 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1979 /* Destroy the window. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1980 XDestroyWindow (x_current_display, SCROLLBAR_X_WINDOW (bar)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1981 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1982 /* Disassociate this scrollbar from its window. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1983 XWINDOW (bar->window)->vertical_scrollbar = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1984 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1985 UNBLOCK_INPUT; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1986 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1987 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1988 /* Set the handle of the vertical scroll bar for WINDOW to indicate |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1989 that we are displaying PORTION characters out of a total of WHOLE |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1990 characters, starting at POSITION. If WINDOW has no scrollbar, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1991 create one. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1992 static void |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
1993 XTset_vertical_scrollbar (window, portion, whole, position) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1994 struct window *window; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1995 int portion, whole, position; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1996 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1997 FRAME_PTR f = XFRAME (WINDOW_FRAME (window)); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1998 int top = XINT (window->top); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1999 int left = WINDOW_VERTICAL_SCROLLBAR_COLUMN (window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2000 int height = WINDOW_VERTICAL_SCROLLBAR_HEIGHT (window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2001 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2002 /* Where should this scrollbar be, pixelwise? */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2003 int pixel_top = CHAR_TO_PIXEL_ROW (f, top); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2004 int pixel_left = CHAR_TO_PIXEL_COL (f, left); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2005 int pixel_width = VERTICAL_SCROLLBAR_PIXEL_WIDTH (f); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2006 int pixel_height = VERTICAL_SCROLLBAR_PIXEL_HEIGHT (f, height); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2007 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2008 struct scrollbar *bar; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2009 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2010 /* Does the scrollbar exist yet? */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2011 if (NILP (window->vertical_scrollbar)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2012 bar = x_scrollbar_create (window, |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2013 pixel_top, pixel_left, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2014 pixel_width, pixel_height); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2015 else |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2016 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2017 /* It may just need to be moved and resized. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2018 bar = XSCROLLBAR (window->vertical_scrollbar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2019 x_scrollbar_move (bar, pixel_top, pixel_left, pixel_width, pixel_height); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2020 } |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2021 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2022 /* Set the scrollbar's current state, unless we're currently being |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2023 dragged. */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2024 if (NILP (bar->dragging)) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2025 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2026 int top_range = |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2027 VERTICAL_SCROLLBAR_TOP_RANGE (pixel_height); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2028 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2029 if (whole == 0) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2030 x_scrollbar_set_handle (bar, 0, top_range, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2031 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2032 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2033 int start = (position * top_range) / whole; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2034 int end = ((position + portion) * top_range) / whole; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2035 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2036 x_scrollbar_set_handle (bar, start, end, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2037 } |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2038 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2039 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2040 XSET (window->vertical_scrollbar, Lisp_Vector, bar); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2041 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2042 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2043 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2044 /* The following three hooks are used when we're doing a thorough |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2045 redisplay of the frame. We don't explicitly know which scrollbars |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2046 are going to be deleted, because keeping track of when windows go |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2047 away is a real pain - "Can you say set-window-configuration, boys |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2048 and girls?" Instead, we just assert at the beginning of redisplay |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2049 that *all* scrollbars are to be removed, and then save a scrollbar |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2050 from the fiery pit when we actually redisplay its window. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2051 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2052 /* Arrange for all scrollbars on FRAME to be removed at the next call |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2053 to `*judge_scrollbars_hook'. A scrollbar may be spared if |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2054 `*redeem_scrollbar_hook' is applied to its window before the judgement. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2055 static void |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2056 XTcondemn_scrollbars (frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2057 FRAME_PTR frame; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2058 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2059 /* The condemned list should be empty at this point; if it's not, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2060 then the rest of Emacs isn't using the condemn/redeem/judge |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2061 protocol correctly. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2062 if (! NILP (FRAME_CONDEMNED_SCROLLBARS (frame))) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2063 abort (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2064 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2065 /* Move them all to the "condemned" list. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2066 FRAME_CONDEMNED_SCROLLBARS (frame) = FRAME_SCROLLBARS (frame); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2067 FRAME_SCROLLBARS (frame) = Qnil; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2068 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2069 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2070 /* Unmark WINDOW's scrollbar for deletion in this judgement cycle. |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2071 Note that WINDOW isn't necessarily condemned at all. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2072 static void |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2073 XTredeem_scrollbar (window) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2074 struct window *window; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2075 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2076 struct scrollbar *bar; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2077 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2078 /* We can't redeem this window's scrollbar if it doesn't have one. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2079 if (NILP (window->vertical_scrollbar)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2080 abort (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2081 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2082 bar = XSCROLLBAR (window->vertical_scrollbar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2083 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2084 /* Unlink it from the condemned list. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2085 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2086 FRAME_PTR f = XFRAME (WINDOW_FRAME (window)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2087 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2088 if (NILP (bar->prev)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2089 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2090 /* If the prev pointer is nil, it must be the first in one of |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2091 the lists. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2092 if (EQ (FRAME_SCROLLBARS (f), window->vertical_scrollbar)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2093 /* It's not condemned. Everything's fine. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2094 return; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2095 else if (EQ (FRAME_CONDEMNED_SCROLLBARS (f), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2096 window->vertical_scrollbar)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2097 FRAME_CONDEMNED_SCROLLBARS (f) = bar->next; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2098 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2099 /* If its prev pointer is nil, it must be at the front of |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2100 one or the other! */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2101 abort (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2102 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2103 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2104 XSCROLLBAR (bar->prev)->next = bar->next; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2105 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2106 if (! NILP (bar->next)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2107 XSCROLLBAR (bar->next)->prev = bar->prev; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2108 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2109 bar->next = FRAME_SCROLLBARS (f); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2110 bar->prev = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2111 XSET (FRAME_SCROLLBARS (f), Lisp_Vector, bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2112 if (! NILP (bar->next)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2113 XSET (XSCROLLBAR (bar->next)->prev, Lisp_Vector, bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2114 } |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2115 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2116 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2117 /* Remove all scrollbars on FRAME that haven't been saved since the |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2118 last call to `*condemn_scrollbars_hook'. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2119 static void |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2120 XTjudge_scrollbars (f) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2121 FRAME_PTR f; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2122 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2123 Lisp_Object bar, next; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2124 |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2125 bar = FRAME_CONDEMNED_SCROLLBARS (f); |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2126 |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2127 /* Clear out the condemned list now so we won't try to process any |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2128 more events on the hapless scrollbars. */ |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2129 FRAME_CONDEMNED_SCROLLBARS (f) = Qnil; |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2130 |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2131 for (; ! NILP (bar); bar = next) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2132 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2133 struct scrollbar *b = XSCROLLBAR (bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2134 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2135 x_scrollbar_remove (b); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2136 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2137 next = b->next; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2138 b->next = b->prev = Qnil; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2139 } |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2140 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2141 /* Now there should be no references to the condemned scrollbars, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2142 and they should get garbage-collected. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2143 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2144 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2145 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2146 /* Handle an Expose or GraphicsExpose event on a scrollbar. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2147 static void |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2148 x_scrollbar_expose (bar, event) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2149 struct scrollbar *bar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2150 XEvent *event; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2151 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2152 Window w = SCROLLBAR_X_WINDOW (bar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2153 GC gc = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)))->display.x->normal_gc; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2154 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2155 BLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2156 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2157 x_scrollbar_set_handle (bar, XINT (bar->start), XINT (bar->end), 1); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2158 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2159 /* Draw a one-pixel border just inside the edges of the scrollbar. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2160 XDrawRectangle (x_current_display, w, gc, |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2161 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2162 /* x, y, width, height */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2163 0, 0, XINT (bar->width) - 1, XINT (bar->height) - 1); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2164 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2165 /* Draw another line to make the extra-thick border on the right. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2166 XFillRectangle (x_current_display, w, gc, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2167 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2168 /* x, y, width, height */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2169 XINT (bar->width) - 2, 1, 1, XINT (bar->height) - 2); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2170 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2171 UNBLOCK_INPUT; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2172 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2173 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2174 /* Handle a mouse click on the scrollbar BAR. If *EMACS_EVENT's kind |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2175 is set to something other than no_event, it is enqueued. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2176 static void |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2177 x_scrollbar_handle_click (bar, event, emacs_event) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2178 struct scrollbar *bar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2179 XEvent *event; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2180 struct input_event *emacs_event; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2181 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2182 if (XTYPE (bar->window) != Lisp_Window) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2183 abort (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2184 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2185 emacs_event->kind = scrollbar_click; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2186 XSET (emacs_event->code, Lisp_Int, event->xbutton.button - Button1); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2187 emacs_event->modifiers = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2188 (x_convert_modifiers (event->xbutton.state) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2189 | (event->type == ButtonRelease |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2190 ? up_modifier |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2191 : down_modifier)); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2192 emacs_event->frame_or_window = bar->window; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2193 emacs_event->timestamp = event->xbutton.time; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2194 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2195 int internal_height = |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2196 VERTICAL_SCROLLBAR_INSIDE_HEIGHT (XINT (bar->height)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2197 int top_range = |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2198 VERTICAL_SCROLLBAR_TOP_RANGE (XINT (bar->height)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2199 int y = event->xbutton.y - VERTICAL_SCROLLBAR_TOP_BORDER; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2200 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2201 if (y < 0) y = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2202 if (y > top_range) y = top_range; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2203 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2204 if (y < XINT (bar->start)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2205 emacs_event->part = scrollbar_above_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2206 else if (y < XINT (bar->end) + VERTICAL_SCROLLBAR_MIN_HANDLE) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2207 emacs_event->part = scrollbar_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2208 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2209 emacs_event->part = scrollbar_below_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2210 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2211 /* If the user has just clicked on the handle, record where they're |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2212 holding it. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2213 if (event->type == ButtonPress |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2214 && emacs_event->part == scrollbar_handle) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2215 XSET (bar->dragging, Lisp_Int, y - XINT (bar->start)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2216 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2217 /* If the user has released the handle, set it to its final position. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2218 if (event->type == ButtonRelease |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2219 && ! NILP (bar->dragging)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2220 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2221 int new_start = y - XINT (bar->dragging); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2222 int new_end = new_start + (XINT (bar->end) - XINT (bar->start)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2223 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2224 x_scrollbar_set_handle (bar, new_start, new_end, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2225 bar->dragging = Qnil; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2226 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2227 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2228 /* Clicks on the handle are always reported as occuring at the top of |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2229 the handle. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2230 if (emacs_event->part == scrollbar_handle) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2231 emacs_event->x = bar->start; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2232 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2233 XSET (emacs_event->x, Lisp_Int, y); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2234 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2235 XSET (emacs_event->y, Lisp_Int, top_range); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2236 } |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2237 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2238 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2239 /* Handle some mouse motion while someone is dragging the scrollbar. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2240 static void |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2241 x_scrollbar_note_movement (bar, event) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2242 struct scrollbar *bar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2243 XEvent *event; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2244 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2245 last_mouse_movement_time = event->xmotion.time; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2246 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2247 mouse_moved = 1; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2248 XSET (last_mouse_scrollbar, Lisp_Vector, bar); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2249 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2250 /* If we're dragging the bar, display it. */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2251 if (! NILP (bar->dragging)) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2252 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2253 /* Where should the handle be now? */ |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2254 int new_start = event->xmotion.y - XINT (bar->dragging); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2255 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2256 if (new_start != XINT (bar->start)) |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2257 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2258 int new_end = new_start + (XINT (bar->end) - XINT (bar->start)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2259 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2260 x_scrollbar_set_handle (bar, new_start, new_end, 0); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2261 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2262 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2263 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2264 /* Call XQueryPointer so we'll get an event the next time the mouse |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2265 moves and we can see *still* on the same position. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2266 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2267 int dummy; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2268 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2269 XQueryPointer (event->xmotion.display, event->xmotion.window, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2270 (Window *) &dummy, (Window *) &dummy, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2271 &dummy, &dummy, &dummy, &dummy, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2272 (unsigned int *) &dummy); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2273 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2274 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2275 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2276 /* Return information to the user about the current position of the mouse |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2277 on the scrollbar. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2278 static void |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2279 x_scrollbar_report_motion (f, bar_window, part, x, y, time) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2280 FRAME_PTR *f; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2281 Lisp_Object *bar_window; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2282 enum scrollbar_part *part; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2283 Lisp_Object *x, *y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2284 unsigned long *time; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2285 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2286 struct scrollbar *bar = XSCROLLBAR (last_mouse_scrollbar); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2287 int win_x, win_y; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2288 |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2289 BLOCK_INPUT; |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2290 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2291 /* Get the mouse's position relative to the scrollbar window, and |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2292 report that. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2293 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2294 Window dummy_window; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2295 int dummy_coord; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2296 unsigned int dummy_mask; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2297 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2298 if (! XQueryPointer (x_current_display, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2299 SCROLLBAR_X_WINDOW (bar), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2300 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2301 /* Root, child, root x and root y. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2302 &dummy_window, &dummy_window, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2303 &dummy_coord, &dummy_coord, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2304 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2305 /* Position relative to scrollbar. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2306 &win_x, &win_y, |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2307 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2308 /* Mouse buttons and modifier keys. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2309 &dummy_mask)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2310 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2311 *f = 0; |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2312 goto done; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2313 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2314 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2315 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2316 { |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2317 int inside_height = VERTICAL_SCROLLBAR_INSIDE_HEIGHT (XINT (bar->height)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2318 int top_range = VERTICAL_SCROLLBAR_TOP_RANGE (XINT (bar->height)); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2319 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2320 win_y -= VERTICAL_SCROLLBAR_TOP_BORDER; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2321 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2322 if (! NILP (bar->dragging)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2323 win_y -= XINT (bar->dragging); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2324 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2325 if (win_y < 0) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2326 win_y = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2327 if (win_y > top_range) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2328 win_y = top_range; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2329 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2330 *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2331 *bar_window = bar->window; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2332 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2333 if (! NILP (bar->dragging)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2334 *part = scrollbar_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2335 else if (win_y < XINT (bar->start)) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2336 *part = scrollbar_above_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2337 else if (win_y < XINT (bar->end) + VERTICAL_SCROLLBAR_MIN_HANDLE) |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2338 *part = scrollbar_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2339 else |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2340 *part = scrollbar_below_handle; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2341 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2342 XSET (*x, Lisp_Int, win_y); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2343 XSET (*y, Lisp_Int, top_range); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2344 *time = last_mouse_movement_time; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2345 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2346 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2347 mouse_moved = 0; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2348 last_mouse_scrollbar = Qnil; |
|
1803
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2349 |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2350 done: |
|
5752a95053f2
* xterm.c (x_window_to_scrollbar): Search frames'
Jim Blandy <jimb@redhat.com>
parents:
1793
diff
changeset
|
2351 UNBLOCK_INPUT; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2352 } |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2353 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2354 |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2355 /* The screen has been cleared so we may have changed foreground or |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2356 background colors, and the scrollbars may need to be redrawn. |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2357 Clear out the scrollbars, and ask for expose events, so we can |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2358 redraw them. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2359 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2360 x_scrollbar_clear (f) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2361 FRAME_PTR f; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2362 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2363 Lisp_Object bar; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2364 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2365 for (bar = FRAME_SCROLLBARS (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2366 XTYPE (bar) == Lisp_Vector; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2367 bar = XSCROLLBAR (bar)->next) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2368 XClearArea (x_current_display, SCROLLBAR_X_WINDOW (XSCROLLBAR (bar)), |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2369 0, 0, 0, 0, True); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2370 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2371 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2372 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2373 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2374 /* The main X event-reading loop - XTread_socket. */ |
| 286 | 2375 |
| 2376 /* Timestamp of enter window event. This is only used by XTread_socket, | |
| 2377 but we have to put it out here, since static variables within functions | |
| 2378 sometimes don't work. */ | |
| 2379 static Time enter_timestamp; | |
| 2380 | |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2381 /* This holds the state XLookupString needs to implement dead keys |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2382 and other tricks known as "compose processing". _X Window System_ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2383 says that a portable program can't use this, but Stephen Gildea assures |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2384 me that letting the compiler initialize it to zeros will work okay. |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2385 |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2386 This must be defined outside of XTread_socket, for the same reasons |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2387 given for enter_timestamp, above. */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2388 static XComposeStatus compose_status; |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2389 |
| 642 | 2390 /* Communication with window managers. */ |
| 2391 Atom Xatom_wm_protocols; | |
| 2392 | |
| 2393 /* Kinds of protocol things we may receive. */ | |
| 2394 Atom Xatom_wm_take_focus; | |
| 2395 Atom Xatom_wm_save_yourself; | |
| 2396 Atom Xatom_wm_delete_window; | |
| 2397 | |
| 2398 /* Other WM communication */ | |
| 2399 Atom Xatom_wm_configure_denied; /* When our config request is denied */ | |
| 2400 Atom Xatom_wm_window_moved; /* When the WM moves us. */ | |
| 2401 | |
| 286 | 2402 /* Read events coming from the X server. |
| 2403 This routine is called by the SIGIO handler. | |
| 2404 We return as soon as there are no more events to be read. | |
| 2405 | |
| 2406 Events representing keys are stored in buffer BUFP, | |
| 2407 which can hold up to NUMCHARS characters. | |
| 2408 We return the number of characters stored into the buffer, | |
| 2409 thus pretending to be `read'. | |
| 2410 | |
| 2411 WAITP is nonzero if we should block until input arrives. | |
| 2412 EXPECTED is nonzero if the caller knows input is available. */ | |
| 2413 | |
|
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
2414 int |
| 286 | 2415 XTread_socket (sd, bufp, numchars, waitp, expected) |
| 2416 register int sd; | |
| 2417 register struct input_event *bufp; | |
| 2418 register int numchars; | |
| 2419 int waitp; | |
| 2420 int expected; | |
| 2421 { | |
| 2422 int count = 0; | |
| 2423 int nbytes = 0; | |
| 2424 int mask; | |
| 2425 int items_pending; /* How many items are in the X queue. */ | |
| 2426 XEvent event; | |
| 771 | 2427 struct frame *f; |
| 286 | 2428 int event_found; |
| 2429 int prefix; | |
| 2430 Lisp_Object part; | |
| 2431 | |
| 2432 if (x_input_blocked) | |
| 2433 { | |
| 2434 x_pending_input = 1; | |
| 2435 return -1; | |
| 2436 } | |
| 2437 | |
| 2438 x_pending_input = 0; | |
| 2439 BLOCK_INPUT; | |
| 2440 | |
| 2441 if (numchars <= 0) | |
| 2442 abort (); /* Don't think this happens. */ | |
| 2443 | |
| 2444 #ifdef FIOSNBIO | |
| 2445 /* If available, Xlib uses FIOSNBIO to make the socket | |
| 2446 non-blocking, and then looks for EWOULDBLOCK. If O_NDELAY is set, | |
| 2447 FIOSNBIO is ignored, and instead of signalling EWOULDBLOCK, | |
| 2448 a read returns 0, which Xlib interprets as equivalent to EPIPE. */ | |
| 2449 fcntl (fileno (stdin), F_SETFL, 0); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2450 #endif /* ! defined (FIOSNBIO) */ |
| 286 | 2451 |
| 2452 #ifndef SIGIO | |
| 2453 #ifndef HAVE_SELECT | |
| 2454 if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY)) | |
| 2455 { | |
| 2456 extern int read_alarm_should_throw; | |
| 2457 read_alarm_should_throw = 1; | |
| 2458 XPeekEvent (XDISPLAY &event); | |
| 2459 read_alarm_should_throw = 0; | |
| 2460 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2461 #endif /* HAVE_SELECT */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2462 #endif /* SIGIO */ |
| 286 | 2463 |
| 2464 while (XStuffPending () != 0) | |
| 2465 { | |
| 2466 XNextEvent (XDISPLAY &event); | |
| 2467 event_found = 1; | |
| 2468 | |
| 2469 switch (event.type) | |
| 2470 { | |
| 2471 #ifdef HAVE_X11 | |
| 642 | 2472 case ClientMessage: |
| 2473 { | |
| 2474 if (event.xclient.message_type == Xatom_wm_protocols | |
| 2475 && event.xclient.format == 32) | |
| 2476 { | |
| 2477 if (event.xclient.data.l[0] == Xatom_wm_take_focus) | |
| 2478 { | |
| 771 | 2479 f = x_window_to_frame (event.xclient.window); |
| 2480 if (f) | |
| 2481 x_focus_on_frame (f); | |
| 642 | 2482 /* Not certain about handling scrollbars here */ |
| 2483 } | |
| 2484 else if (event.xclient.data.l[0] == Xatom_wm_save_yourself) | |
| 2485 { | |
| 2486 /* Save state modify the WM_COMMAND property to | |
| 2487 something which can reinstate us. This notifies | |
| 2488 the session manager, who's looking for such a | |
| 2489 PropertyNotify. Can restart processing when | |
| 2490 a keyboard or mouse event arrives. */ | |
| 2491 if (numchars > 0) | |
| 2492 { | |
| 2493 } | |
| 2494 } | |
| 2495 else if (event.xclient.data.l[0] == Xatom_wm_delete_window) | |
| 2496 { | |
| 771 | 2497 struct frame *f = x_window_to_frame (event.xclient.window); |
| 2498 | |
| 2499 if (f) | |
| 642 | 2500 if (numchars > 0) |
| 2501 { | |
| 2502 } | |
| 2503 } | |
| 2504 } | |
| 2505 else if (event.xclient.message_type == Xatom_wm_configure_denied) | |
| 2506 { | |
| 2507 } | |
| 2508 else if (event.xclient.message_type == Xatom_wm_window_moved) | |
| 2509 { | |
| 2510 int new_x, new_y; | |
| 2511 | |
| 786 | 2512 new_x = event.xclient.data.s[0]; |
| 2513 new_y = event.xclient.data.s[1]; | |
| 642 | 2514 } |
| 2515 } | |
| 2516 break; | |
| 286 | 2517 |
| 2518 case SelectionClear: /* Someone has grabbed ownership. */ | |
| 2519 x_disown_selection (event.xselectionclear.window, | |
| 2520 event.xselectionclear.selection, | |
| 2521 event.xselectionclear.time); | |
| 2522 break; | |
| 2523 | |
| 2524 case SelectionRequest: /* Someone wants our selection. */ | |
| 2525 x_answer_selection_request (event); | |
| 2526 break; | |
| 2527 | |
| 2528 case PropertyNotify: | |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2529 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2530 /* If we're being told about a root window property, then it's |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2531 a cut buffer change. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2532 if (event.xproperty.window == ROOT_WINDOW) |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2533 x_invalidate_cut_buffer_cache (&event.xproperty); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2534 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2535 /* Otherwise, we're probably handling an incremental |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2536 selection transmission. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2537 else |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2538 { |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2539 /* If we were to do this synchronously, there'd be no worry |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2540 about re-selecting. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2541 x_send_incremental (event); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2542 } |
| 286 | 2543 break; |
| 2544 | |
| 2545 case Expose: | |
| 771 | 2546 f = x_window_to_frame (event.xexpose.window); |
| 2547 if (f) | |
| 286 | 2548 { |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2549 if (f->async_visible == 0) |
| 286 | 2550 { |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2551 f->async_visible = 1; |
|
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2552 f->async_iconified = 0; |
| 771 | 2553 SET_FRAME_GARBAGED (f); |
| 286 | 2554 } |
| 2555 else | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2556 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2557 dumprectangle (x_window_to_frame (event.xexpose.window), |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2558 event.xexpose.x, event.xexpose.y, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2559 event.xexpose.width, event.xexpose.height); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2560 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2561 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2562 else |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2563 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2564 struct scrollbar *bar |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2565 = x_window_to_scrollbar (event.xexpose.window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2566 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2567 if (bar) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2568 x_scrollbar_expose (bar, &event); |
| 286 | 2569 } |
| 2570 break; | |
| 2571 | |
| 2572 case GraphicsExpose: /* This occurs when an XCopyArea's | |
| 2573 source area was obscured or not | |
| 2574 available.*/ | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2575 f = x_window_to_frame (event.xgraphicsexpose.drawable); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2576 if (f) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2577 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2578 dumprectangle (f, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2579 event.xgraphicsexpose.x, event.xgraphicsexpose.y, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2580 event.xgraphicsexpose.width, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2581 event.xgraphicsexpose.height); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2582 } |
| 286 | 2583 break; |
| 2584 | |
| 2585 case NoExpose: /* This occurs when an XCopyArea's | |
| 2586 source area was completely | |
| 2587 available */ | |
| 2588 break; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2589 #else /* ! defined (HAVE_X11) */ |
| 286 | 2590 case ExposeWindow: |
| 2591 if (event.subwindow != 0) | |
| 2592 break; /* duplicate event */ | |
| 771 | 2593 f = x_window_to_frame (event.window); |
| 2594 if (event.window == f->display.x->icon_desc) | |
| 286 | 2595 { |
| 771 | 2596 refreshicon (f); |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2597 f->async_iconified = 1; |
| 286 | 2598 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2599 if (event.window == FRAME_X_WINDOW (f)) |
| 286 | 2600 { |
| 2601 /* Say must check all windows' needs_exposure flags. */ | |
| 2602 expose_all_windows = 1; | |
| 771 | 2603 f->display.x->needs_exposure = 1; |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2604 f->async_visible = 1; |
| 286 | 2605 } |
| 2606 break; | |
| 2607 | |
| 2608 case ExposeRegion: | |
| 2609 if (event.subwindow != 0) | |
| 2610 break; /* duplicate event */ | |
| 771 | 2611 f = x_window_to_frame (event.window); |
| 2612 if (event.window == f->display.x->icon_desc) | |
| 286 | 2613 { |
| 771 | 2614 refreshicon (f); |
| 286 | 2615 break; |
| 2616 } | |
| 2617 /* If window already needs full redraw, ignore this rectangle. */ | |
| 771 | 2618 if (expose_all_windows && f->display.x->needs_exposure) |
| 286 | 2619 break; |
| 2620 /* Put the event on the queue of rectangles to redraw. */ | |
| 2621 if (enqueue_event (&event, &x_expose_queue)) | |
| 2622 /* If it is full, we can't record the rectangle, | |
| 2623 so redraw this entire window. */ | |
| 2624 { | |
| 2625 /* Say must check all windows' needs_exposure flags. */ | |
| 2626 expose_all_windows = 1; | |
| 771 | 2627 f->display.x->needs_exposure = 1; |
| 286 | 2628 } |
| 2629 break; | |
| 2630 | |
| 2631 case ExposeCopy: | |
| 2632 /* This should happen only when we are expecting it, | |
| 2633 in x_read_exposes. */ | |
| 2634 abort (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2635 #endif /* ! defined (HAVE_X11) */ |
| 286 | 2636 |
| 2637 #ifdef HAVE_X11 | |
| 2638 case UnmapNotify: | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2639 f = x_window_to_frame (event.xunmap.window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2640 if (f) /* F may no longer exist if |
| 771 | 2641 the frame was deleted. */ |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2642 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2643 /* While a frame is unmapped, display generation is |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2644 disabled; you don't want to spend time updating a |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2645 display that won't ever be seen. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2646 f->async_visible = 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2647 } |
| 286 | 2648 break; |
| 2649 | |
| 2650 case MapNotify: | |
| 771 | 2651 f = x_window_to_frame (event.xmap.window); |
| 2652 if (f) | |
| 286 | 2653 { |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2654 f->async_visible = 1; |
|
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2655 f->async_iconified = 0; |
| 286 | 2656 |
| 2657 /* wait_reading_process_input will notice this and update | |
| 771 | 2658 the frame's display structures. */ |
| 2659 SET_FRAME_GARBAGED (f); | |
| 286 | 2660 } |
| 2661 break; | |
| 2662 | |
| 2663 /* Turn off processing if we become fully obscured. */ | |
| 2664 case VisibilityNotify: | |
| 2665 break; | |
| 2666 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2667 #else /* ! defined (HAVE_X11) */ |
| 286 | 2668 case UnmapWindow: |
| 771 | 2669 f = x_window_to_frame (event.window); |
| 2670 if (event.window == f->display.x->icon_desc) | |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2671 f->async_iconified = 0; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2672 if (event.window == FRAME_X_WINDOW (f)) |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2673 f->async_visible = 0; |
| 286 | 2674 break; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2675 #endif /* ! defined (HAVE_X11) */ |
| 286 | 2676 |
| 2677 #ifdef HAVE_X11 | |
| 2678 case KeyPress: | |
| 771 | 2679 f = x_window_to_frame (event.xkey.window); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2680 |
| 771 | 2681 if (f != 0) |
| 286 | 2682 { |
| 2683 KeySym keysym; | |
| 2684 char copy_buffer[80]; | |
|
1841
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
2685 int modifiers; |
|
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
2686 |
|
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
2687 event.xkey.state |= extra_keyboard_modifiers; |
|
338e4ffdb54b
(XTread_socket): Support extra_keyboard_modifiers.
Richard M. Stallman <rms@gnu.org>
parents:
1821
diff
changeset
|
2688 modifiers = event.xkey.state; |
| 555 | 2689 |
| 2690 /* Some keyboards generate different characters | |
| 2691 depending on the state of the meta key, in an attempt | |
| 2692 to support non-English typists. It would be nice to | |
| 2693 keep this functionality somehow, but for now, we will | |
| 2694 just clear the meta-key flag to get the 'pure' character. */ | |
| 2695 event.xkey.state &= ~Mod1Mask; | |
| 286 | 2696 |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2697 /* This will have to go some day... */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2698 nbytes = |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2699 XLookupString (&event.xkey, copy_buffer, 80, &keysym, |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2700 &compose_status); |
| 286 | 2701 |
| 395 | 2702 /* Strip off the vendor-specific keysym bit, and take a shot |
| 2703 at recognizing the codes. HP servers have extra keysyms | |
| 2704 that fit into the MiscFunctionKey category. */ | |
| 2705 keysym &= ~(1<<28); | |
| 2706 | |
| 286 | 2707 if (numchars > 1) |
| 2708 { | |
| 395 | 2709 if (IsCursorKey (keysym) /* 0xff50 <= x < 0xff60 */ |
| 2710 || IsMiscFunctionKey (keysym) /* 0xff60 <= x < 0xff80 */ | |
| 2711 || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ | |
| 2712 || IsFunctionKey (keysym)) /* 0xffbe <= x < 0xffe1 */ | |
| 286 | 2713 { |
| 2714 bufp->kind = non_ascii_keystroke; | |
| 429 | 2715 XSET (bufp->code, Lisp_Int, (unsigned) keysym - 0xff50); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2716 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 555 | 2717 bufp->modifiers = x_convert_modifiers (modifiers); |
| 708 | 2718 bufp->timestamp = event.xkey.time; |
| 286 | 2719 bufp++; |
| 2720 count++; | |
| 2721 numchars--; | |
| 2722 } | |
| 2723 else if (numchars > nbytes) | |
| 2724 { | |
| 2725 register int i; | |
| 2726 | |
| 2727 if (nbytes == 1) | |
| 2728 { | |
|
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
2729 if (modifiers & x_meta_mod_mask) |
| 286 | 2730 *copy_buffer |= METABIT; |
| 2731 bufp->kind = ascii_keystroke; | |
| 708 | 2732 XSET (bufp->code, Lisp_Int, *copy_buffer); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2733 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 708 | 2734 bufp->timestamp = event.xkey.time; |
| 286 | 2735 bufp++; |
| 2736 } | |
| 2737 else | |
| 2738 for (i = nbytes - 1; i > 1; i--) | |
| 2739 { | |
| 2740 bufp->kind = ascii_keystroke; | |
| 2741 XSET (bufp->code, Lisp_Int, copy_buffer[i]); | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2742 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 708 | 2743 bufp->timestamp = event.xkey.time; |
| 286 | 2744 bufp++; |
| 2745 } | |
| 2746 | |
| 2747 count += nbytes; | |
| 2748 numchars -= nbytes; | |
| 2749 } | |
| 2750 } | |
| 2751 } | |
| 2752 break; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2753 #else /* ! defined (HAVE_X11) */ |
| 286 | 2754 case KeyPressed: |
| 2755 { | |
| 2756 register char *where_mapping; | |
| 2757 | |
| 771 | 2758 f = x_window_to_frame (event.window); |
| 286 | 2759 /* Ignore keys typed on icon windows. */ |
| 771 | 2760 if (f != 0 && event.window == f->display.x->icon_desc) |
| 286 | 2761 break; |
| 2762 where_mapping = XLookupMapping (&event, &nbytes); | |
| 2763 /* Nasty fix for arrow keys */ | |
| 2764 if (!nbytes && IsCursorKey (event.detail & 0xff)) | |
| 2765 { | |
| 2766 switch (event.detail & 0xff) | |
| 2767 { | |
| 2768 case KC_CURSOR_LEFT: | |
| 2769 where_mapping = "\002"; | |
| 2770 break; | |
| 2771 case KC_CURSOR_RIGHT: | |
| 2772 where_mapping = "\006"; | |
| 2773 break; | |
| 2774 case KC_CURSOR_UP: | |
| 2775 where_mapping = "\020"; | |
| 2776 break; | |
| 2777 case KC_CURSOR_DOWN: | |
| 2778 where_mapping = "\016"; | |
| 2779 break; | |
| 2780 } | |
| 2781 nbytes = 1; | |
| 2782 } | |
| 2783 if (numchars - nbytes > 0) | |
| 2784 { | |
| 2785 register int i; | |
| 2786 | |
| 2787 for (i = 0; i < nbytes; i++) | |
| 2788 { | |
| 2789 bufp->kind = ascii_keystroke; | |
| 2790 XSET (bufp->code, Lisp_Int, where_mapping[i]); | |
| 429 | 2791 XSET (bufp->time, Lisp_Int, event.xkey.time); |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2792 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 286 | 2793 bufp++; |
| 2794 } | |
| 2795 count += nbytes; | |
| 2796 numchars -= nbytes; | |
| 2797 } | |
| 2798 } | |
| 2799 break; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2800 #endif /* ! defined (HAVE_X11) */ |
| 286 | 2801 |
| 2802 #ifdef HAVE_X11 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2803 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2804 /* Here's a possible interpretation of the whole |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2805 FocusIn-EnterNotify FocusOut-LeaveNotify mess. If you get a |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2806 FocusIn event, you have to get a FocusOut event before you |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2807 relinquish the focus. If you haven't received a FocusIn event, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2808 then a mere LeaveNotify is enough to free you. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2809 |
| 286 | 2810 case EnterNotify: |
| 771 | 2811 f = x_window_to_frame (event.xcrossing.window); |
| 369 | 2812 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2813 if (event.xcrossing.focus) /* Entered Window */ |
| 286 | 2814 { |
| 2815 /* Avoid nasty pop/raise loops. */ | |
| 771 | 2816 if (f && (!(f->auto_raise) |
| 2817 || !(f->auto_lower) | |
| 286 | 2818 || (event.xcrossing.time - enter_timestamp) > 500)) |
| 2819 { | |
| 771 | 2820 x_new_focus_frame (f); |
| 286 | 2821 enter_timestamp = event.xcrossing.time; |
| 2822 } | |
| 2823 } | |
| 771 | 2824 else if (f == x_focus_frame) |
| 2825 x_new_focus_frame (0); | |
| 286 | 2826 |
| 2827 break; | |
| 2828 | |
| 2829 case FocusIn: | |
| 771 | 2830 f = x_window_to_frame (event.xfocus.window); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2831 if (event.xfocus.detail != NotifyPointer) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2832 x_focus_event_frame = f; |
| 771 | 2833 if (f) |
| 2834 x_new_focus_frame (f); | |
| 286 | 2835 break; |
| 2836 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2837 |
| 286 | 2838 case LeaveNotify: |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2839 f = x_window_to_frame (event.xcrossing.window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2840 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2841 if (event.xcrossing.focus) |
| 286 | 2842 { |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2843 if (! x_focus_event_frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2844 x_new_focus_frame (0); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2845 else |
| 771 | 2846 x_new_focus_frame (f); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2847 } |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2848 else |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2849 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2850 if (f == x_focus_event_frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2851 x_focus_event_frame = 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2852 if (f == x_focus_frame) |
| 771 | 2853 x_new_focus_frame (0); |
| 286 | 2854 } |
| 2855 break; | |
| 2856 | |
| 2857 case FocusOut: | |
| 771 | 2858 f = x_window_to_frame (event.xfocus.window); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2859 if (event.xfocus.detail != NotifyPointer |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2860 && f == x_focus_event_frame) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2861 x_focus_event_frame = 0; |
| 771 | 2862 if (f && f == x_focus_frame) |
| 2863 x_new_focus_frame (0); | |
| 286 | 2864 break; |
| 2865 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2866 #else /* ! defined (HAVE_X11) */ |
| 286 | 2867 |
| 2868 case EnterWindow: | |
| 2869 if ((event.detail & 0xFF) == 1) | |
| 2870 break; /* Coming from our own subwindow */ | |
| 2871 if (event.subwindow != 0) | |
| 2872 break; /* Entering our own subwindow. */ | |
| 2873 | |
| 2874 { | |
| 771 | 2875 f = x_window_to_frame (event.window); |
| 2876 x_mouse_frame = f; | |
| 2877 | |
| 2878 x_new_focus_frame (f); | |
| 286 | 2879 } |
| 2880 break; | |
| 2881 | |
| 2882 case LeaveWindow: | |
| 2883 if ((event.detail & 0xFF) == 1) | |
| 2884 break; /* Entering our own subwindow */ | |
| 2885 if (event.subwindow != 0) | |
| 2886 break; /* Leaving our own subwindow. */ | |
| 2887 | |
| 771 | 2888 x_mouse_frame = 0; |
| 2889 if (x_focus_frame == 0 | |
| 2890 && x_input_frame != 0 | |
| 2891 && x_input_frame == x_window_to_frame (event.window) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2892 && event.window == FRAME_X_WINDOW (x_input_frame)) |
| 286 | 2893 { |
| 771 | 2894 f = x_input_frame; |
| 2895 x_input_frame = 0; | |
| 2896 if (f) | |
| 2897 frame_unhighlight (f); | |
| 286 | 2898 } |
| 2899 break; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2900 #endif /* ! defined (HAVE_X11) */ |
| 286 | 2901 |
| 2902 #ifdef HAVE_X11 | |
| 2903 case MotionNotify: | |
| 2904 { | |
| 771 | 2905 f = x_window_to_frame (event.xmotion.window); |
| 2906 if (f) | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2907 note_mouse_movement (f, &event.xmotion); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2908 else |
| 286 | 2909 { |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2910 struct scrollbar *bar = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2911 x_window_to_scrollbar (event.xmotion.window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2912 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2913 if (bar) |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
2914 x_scrollbar_note_movement (bar, &event); |
| 286 | 2915 } |
| 2916 } | |
| 2917 break; | |
| 2918 | |
| 2919 case ConfigureNotify: | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2920 f = x_window_to_frame (event.xconfigure.window); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2921 if (f) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2922 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2923 int rows = PIXEL_TO_CHAR_HEIGHT (f, event.xconfigure.height); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2924 int columns = PIXEL_TO_CHAR_WIDTH (f, event.xconfigure.width); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2925 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2926 /* Even if the number of character rows and columns has |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2927 not changed, the font size may have changed, so we need |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2928 to check the pixel dimensions as well. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2929 if (columns != f->width |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2930 || rows != f->height |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2931 || event.xconfigure.width != f->display.x->pixel_width |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2932 || event.xconfigure.height != f->display.x->pixel_height) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2933 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2934 change_frame_size (f, rows, columns, 0, 1); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2935 SET_FRAME_GARBAGED (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2936 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2937 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2938 f->display.x->pixel_width = event.xconfigure.width; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2939 f->display.x->pixel_height = event.xconfigure.height; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2940 f->display.x->left_pos = event.xconfigure.x; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2941 f->display.x->top_pos = event.xconfigure.y; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2942 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
2943 break; |
| 286 | 2944 |
| 2945 case ButtonPress: | |
| 2946 case ButtonRelease: | |
| 2947 { | |
| 2948 /* If we decide we want to generate an event to be seen | |
| 2949 by the rest of Emacs, we put it here. */ | |
| 2950 struct input_event emacs_event; | |
| 2951 emacs_event.kind = no_event; | |
| 2952 | |
| 771 | 2953 f = x_window_to_frame (event.xbutton.window); |
| 2954 if (f) | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2955 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2956 if (!x_focus_frame || (f == x_focus_frame)) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2957 construct_mouse_click (&emacs_event, |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2958 &event, f, Qnil, 0); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2959 } |
| 286 | 2960 else |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2961 { |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2962 struct scrollbar *bar = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2963 x_window_to_scrollbar (event.xbutton.window); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2964 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2965 if (bar) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2966 x_scrollbar_handle_click (bar, &event, &emacs_event); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2967 } |
| 286 | 2968 |
| 2969 if (numchars >= 1 && emacs_event.kind != no_event) | |
| 2970 { | |
| 2971 bcopy (&emacs_event, bufp, sizeof (struct input_event)); | |
| 2972 bufp++; | |
| 2973 count++; | |
| 2974 numchars--; | |
| 2975 } | |
| 2976 } | |
| 2977 break; | |
| 2978 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2979 #else /* ! defined (HAVE_X11) */ |
| 286 | 2980 case ButtonPressed: |
| 2981 case ButtonReleased: | |
| 771 | 2982 f = x_window_to_frame (event.window); |
| 2983 if (f) | |
| 286 | 2984 { |
| 771 | 2985 if (event.window == f->display.x->icon_desc) |
| 286 | 2986 { |
| 771 | 2987 x_make_frame_visible (f); |
| 286 | 2988 |
| 2989 if (warp_mouse_on_deiconify) | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2990 XWarpMouse (FRAME_X_WINDOW (f), 10, 10); |
| 286 | 2991 break; |
| 2992 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2993 if (event.window == FRAME_X_WINDOW (f)) |
| 286 | 2994 { |
| 771 | 2995 if (f->auto_raise) |
| 2996 x_raise_frame (f); | |
| 286 | 2997 } |
| 2998 } | |
| 2999 enqueue_event (&event, &x_mouse_queue); | |
| 3000 if (numchars >= 2) | |
| 3001 { | |
| 3002 bufp->kind = ascii_keystroke; | |
| 3003 bufp->code = (char) 'X' & 037; /* C-x */ | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3004 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 429 | 3005 XSET (bufp->time, Lisp_Int, event.xkey.time); |
| 286 | 3006 bufp++; |
| 3007 | |
| 3008 bufp->kind = ascii_keystroke; | |
| 3009 bufp->code = (char) 0; /* C-@ */ | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3010 XSET (bufp->frame_or_window, Lisp_Frame, f); |
| 429 | 3011 XSET (bufp->time, Lisp_Int, event.xkey.time); |
| 286 | 3012 bufp++; |
| 3013 | |
| 3014 count += 2; | |
| 3015 numchars -= 2; | |
| 3016 } | |
| 3017 break; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3018 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3019 |
| 3020 #ifdef HAVE_X11 | |
| 3021 | |
| 3022 case CirculateNotify: | |
| 3023 break; | |
| 3024 case CirculateRequest: | |
| 3025 break; | |
| 3026 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3027 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3028 |
| 3029 case MappingNotify: | |
|
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3030 /* Someone has changed the keyboard mapping - update the |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3031 local cache. */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3032 switch (event.xmapping.request) |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3033 { |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3034 case MappingModifier: |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3035 x_find_modifier_meanings (); |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3036 /* This is meant to fall through. */ |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3037 case MappingKeyboard: |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3038 XRefreshKeyboardMapping (&event.xmapping); |
|
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
3039 } |
| 286 | 3040 break; |
| 3041 | |
| 3042 default: | |
| 3043 break; | |
| 3044 } | |
| 3045 } | |
| 3046 | |
| 3047 #if 0 | |
| 3048 #ifdef HAVE_SELECT | |
| 3049 if (expected && ! event_found) | |
| 3050 { | |
| 3051 /* AOJ 880406: if select returns true but XPending doesn't, it means that | |
| 3052 there is an EOF condition; in other words, that X has died. | |
| 3053 Act as if there had been a hangup. */ | |
| 3054 | |
| 3055 int fd = ConnectionNumber (x_current_display); | |
| 3056 int mask = 1 << fd; | |
| 3057 | |
| 3058 if (0 != select (fd + 1, &mask, (long *) 0, (long *) 0, | |
| 555 | 3059 (EMACS_TIME) 0) |
| 286 | 3060 && !XStuffPending ()) |
| 3061 kill (getpid (), SIGHUP); | |
| 3062 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3063 #endif /* ! defined (HAVE_SELECT) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3064 #endif /* ! 0 */ |
| 286 | 3065 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3066 #ifndef HAVE_X11 |
| 771 | 3067 if (updating_frame == 0) |
| 286 | 3068 x_do_pending_expose (); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3069 #endif |
| 286 | 3070 |
| 3071 UNBLOCK_INPUT; | |
| 3072 return count; | |
| 3073 } | |
| 3074 | |
| 3075 #ifndef HAVE_X11 | |
| 3076 /* Read and process only Expose events | |
| 3077 until we get an ExposeCopy event; then return. | |
| 3078 This is used in insert/delete line. | |
| 3079 We assume input is already blocked. */ | |
| 3080 | |
| 3081 static void | |
| 3082 x_read_exposes () | |
| 3083 { | |
| 771 | 3084 struct frame *f; |
| 286 | 3085 XKeyPressedEvent event; |
| 3086 | |
| 3087 while (1) | |
| 3088 { | |
| 3089 /* while there are more events*/ | |
| 3090 XMaskEvent (ExposeWindow | ExposeRegion | ExposeCopy, &event); | |
| 3091 switch (event.type) | |
| 3092 { | |
| 3093 case ExposeWindow: | |
| 3094 if (event.subwindow != 0) | |
| 3095 break; /* duplicate event */ | |
| 771 | 3096 f = x_window_to_frame (event.window); |
| 3097 if (event.window == f->display.x->icon_desc) | |
| 286 | 3098 { |
| 771 | 3099 refreshicon (f); |
| 286 | 3100 break; |
| 3101 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3102 if (event.window == FRAME_X_WINDOW (f)) |
| 286 | 3103 { |
| 3104 expose_all_windows = 1; | |
| 771 | 3105 f->display.x->needs_exposure = 1; |
| 286 | 3106 break; |
| 3107 } | |
| 3108 break; | |
| 3109 | |
| 3110 case ExposeRegion: | |
| 3111 if (event.subwindow != 0) | |
| 3112 break; /* duplicate event */ | |
| 771 | 3113 f = x_window_to_frame (event.window); |
| 3114 if (event.window == f->display.x->icon_desc) | |
| 286 | 3115 { |
| 771 | 3116 refreshicon (f); |
| 286 | 3117 break; |
| 3118 } | |
| 3119 /* If window already needs full redraw, ignore this rectangle. */ | |
| 771 | 3120 if (expose_all_windows && f->display.x->needs_exposure) |
| 286 | 3121 break; |
| 3122 /* Put the event on the queue of rectangles to redraw. */ | |
| 3123 if (enqueue_event (&event, &x_expose_queue)) | |
| 3124 /* If it is full, we can't record the rectangle, | |
| 3125 so redraw this entire window. */ | |
| 3126 { | |
| 3127 /* Say must check all windows' needs_exposure flags. */ | |
| 3128 expose_all_windows = 1; | |
| 771 | 3129 f->display.x->needs_exposure = 1; |
| 286 | 3130 } |
| 3131 break; | |
| 3132 | |
| 3133 case ExposeCopy: | |
| 3134 return; | |
| 3135 } | |
| 3136 } | |
| 3137 } | |
| 3138 #endif /* HAVE_X11 */ | |
| 3139 | |
| 3140 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3141 /* Drawing the cursor. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3142 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3143 |
| 286 | 3144 /* Draw a hollow box cursor. Don't change the inside of the box. */ |
| 3145 | |
| 3146 static void | |
| 771 | 3147 x_draw_box (f) |
| 3148 struct frame *f; | |
| 286 | 3149 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3150 int left = CHAR_TO_PIXEL_COL (f, f->cursor_x); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3151 int top = CHAR_TO_PIXEL_ROW (f, f->cursor_y); |
| 771 | 3152 int width = FONT_WIDTH (f->display.x->font); |
| 3153 int height = FONT_HEIGHT (f->display.x->font); | |
| 286 | 3154 |
| 3155 #ifdef HAVE_X11 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3156 XDrawRectangle (x_current_display, FRAME_X_WINDOW (f), |
| 771 | 3157 f->display.x->cursor_gc, |
| 286 | 3158 left, top, width - 1, height - 1); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3159 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3160 XPixSet (FRAME_X_WINDOW (f), |
| 286 | 3161 left, top, width, 1, |
| 771 | 3162 f->display.x->cursor_pixel); |
| 3163 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3164 XPixSet (FRAME_X_WINDOW (f), |
| 286 | 3165 left, top, 1, height, |
| 771 | 3166 f->display.x->cursor_pixel); |
| 3167 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3168 XPixSet (FRAME_X_WINDOW (f), |
| 286 | 3169 left+width-1, top, 1, height, |
| 771 | 3170 f->display.x->cursor_pixel); |
| 3171 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3172 XPixSet (FRAME_X_WINDOW (f), |
| 286 | 3173 left, top+height-1, width, 1, |
| 771 | 3174 f->display.x->cursor_pixel); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3175 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3176 } |
| 3177 | |
| 771 | 3178 /* Clear the cursor of frame F to background color, |
| 286 | 3179 and mark the cursor as not shown. |
| 3180 This is used when the text where the cursor is | |
| 3181 is about to be rewritten. */ | |
| 3182 | |
| 3183 static void | |
| 771 | 3184 clear_cursor (f) |
| 3185 struct frame *f; | |
| 286 | 3186 { |
| 3187 int mask; | |
| 3188 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3189 if (! FRAME_VISIBLE_P (f) |
| 771 | 3190 || f->phys_cursor_x < 0) |
| 286 | 3191 return; |
| 3192 | |
| 3193 #ifdef HAVE_X11 | |
| 771 | 3194 x_display_cursor (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3195 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3196 XPixSet (FRAME_X_WINDOW (f), |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3197 CHAR_TO_PIXEL_COL (f, f->phys_cursor_x), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3198 CHAR_TO_PIXEL_ROW (f, f->phys_cursor_y), |
| 771 | 3199 FONT_WIDTH (f->display.x->font), FONT_HEIGHT (f->display.x->font), |
| 3200 f->display.x->background_pixel); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3201 #endif /* ! defined (HAVE_X11) */ |
| 771 | 3202 f->phys_cursor_x = -1; |
| 286 | 3203 } |
| 3204 | |
| 771 | 3205 /* Redraw the glyph at ROW, COLUMN on frame F, in the style |
| 429 | 3206 HIGHLIGHT. HIGHLIGHT is as defined for dumpglyphs. Return the |
| 3207 glyph drawn. */ | |
| 286 | 3208 |
| 3209 static void | |
| 771 | 3210 x_draw_single_glyph (f, row, column, glyph, highlight) |
| 3211 struct frame *f; | |
| 286 | 3212 int row, column; |
| 429 | 3213 GLYPH glyph; |
| 286 | 3214 int highlight; |
| 3215 { | |
| 771 | 3216 dumpglyphs (f, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3217 CHAR_TO_PIXEL_COL (f, column), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3218 CHAR_TO_PIXEL_ROW (f, row), |
| 771 | 3219 &glyph, 1, highlight, f->display.x->font); |
| 286 | 3220 } |
| 3221 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3222 static void |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3223 x_display_bar_cursor (f, on) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3224 struct frame *f; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3225 int on; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3226 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3227 struct frame_glyphs *current_glyphs = FRAME_CURRENT_GLYPHS (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3228 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3229 if (! FRAME_VISIBLE_P (f)) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3230 return; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3231 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3232 if (! on && f->phys_cursor_x < 0) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3233 return; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3234 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3235 /* If we're not updating, then we want to use the current frame's |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3236 cursor position, not our local idea of where the cursor ought to be. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3237 if (f != updating_frame) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3238 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3239 curs_x = FRAME_CURSOR_X (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3240 curs_y = FRAME_CURSOR_Y (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3241 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3242 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3243 /* If there is anything wrong with the current cursor state, remove it. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3244 if (f->phys_cursor_x >= 0 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3245 && (!on |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3246 || f->phys_cursor_x != curs_x |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3247 || f->phys_cursor_y != curs_y |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3248 || f->display.x->current_cursor != bar_cursor)) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3249 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3250 /* Erase the cursor by redrawing the character underneath it. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3251 x_draw_single_glyph (f, f->phys_cursor_y, f->phys_cursor_x, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3252 f->phys_cursor_glyph, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3253 current_glyphs->highlight[f->phys_cursor_y]); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3254 f->phys_cursor_x = -1; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3255 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3256 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3257 /* If we now need a cursor in the new place or in the new form, do it so. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3258 if (on |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3259 && (f->phys_cursor_x < 0 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3260 || (f->display.x->current_cursor != bar_cursor))) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3261 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3262 f->phys_cursor_glyph |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3263 = ((current_glyphs->enable[curs_y] |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3264 && curs_x < current_glyphs->used[curs_y]) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3265 ? current_glyphs->glyphs[curs_y][curs_x] |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3266 : SPACEGLYPH); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3267 XFillRectangle (x_current_display, FRAME_X_WINDOW (f), |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3268 f->display.x->cursor_gc, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3269 CHAR_TO_PIXEL_COL (f, curs_x), |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3270 CHAR_TO_PIXEL_ROW (f, curs_y), |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3271 1, FONT_HEIGHT (f->display.x->font)); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3272 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3273 f->phys_cursor_x = curs_x; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3274 f->phys_cursor_y = curs_y; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3275 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3276 f->display.x->current_cursor = bar_cursor; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3277 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3278 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3279 if (updating_frame != f) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3280 XFlushQueue (); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3281 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3282 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3283 |
| 771 | 3284 /* Turn the displayed cursor of frame F on or off according to ON. |
| 286 | 3285 If ON is nonzero, where to put the cursor is specified |
| 771 | 3286 by F->cursor_x and F->cursor_y. */ |
| 286 | 3287 |
| 3288 static void | |
| 771 | 3289 x_display_box_cursor (f, on) |
| 3290 struct frame *f; | |
| 286 | 3291 int on; |
| 3292 { | |
| 771 | 3293 struct frame_glyphs *current_glyphs = FRAME_CURRENT_GLYPHS (f); |
| 3294 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3295 if (! FRAME_VISIBLE_P (f)) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3296 return; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3297 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3298 /* If cursor is off and we want it off, return quickly. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3299 if (!on && f->phys_cursor_x < 0) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3300 return; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3301 |
| 771 | 3302 /* If we're not updating, then we want to use the current frame's |
| 708 | 3303 cursor position, not our local idea of where the cursor ought to be. */ |
| 771 | 3304 if (f != updating_frame) |
| 708 | 3305 { |
| 771 | 3306 curs_x = FRAME_CURSOR_X (f); |
| 3307 curs_y = FRAME_CURSOR_Y (f); | |
| 708 | 3308 } |
| 3309 | |
| 286 | 3310 /* If cursor is currently being shown and we don't want it to be |
| 3311 or it is in the wrong place, | |
| 3312 or we want a hollow box and it's not so, (pout!) | |
| 3313 erase it. */ | |
| 771 | 3314 if (f->phys_cursor_x >= 0 |
| 286 | 3315 && (!on |
| 771 | 3316 || f->phys_cursor_x != curs_x |
| 3317 || f->phys_cursor_y != curs_y | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3318 || (f->display.x->current_cursor != hollow_box_cursor |
| 771 | 3319 && (f != x_highlight_frame)))) |
| 286 | 3320 { |
| 3321 /* Erase the cursor by redrawing the character underneath it. */ | |
| 771 | 3322 x_draw_single_glyph (f, f->phys_cursor_y, f->phys_cursor_x, |
| 3323 f->phys_cursor_glyph, | |
| 3324 current_glyphs->highlight[f->phys_cursor_y]); | |
| 3325 f->phys_cursor_x = -1; | |
| 286 | 3326 } |
| 3327 | |
| 3328 /* If we want to show a cursor, | |
| 3329 or we want a box cursor and it's not so, | |
| 3330 write it in the right place. */ | |
| 3331 if (on | |
| 771 | 3332 && (f->phys_cursor_x < 0 |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3333 || (f->display.x->current_cursor != filled_box_cursor |
| 771 | 3334 && f == x_highlight_frame))) |
| 286 | 3335 { |
| 771 | 3336 f->phys_cursor_glyph |
| 708 | 3337 = ((current_glyphs->enable[curs_y] |
| 3338 && curs_x < current_glyphs->used[curs_y]) | |
| 3339 ? current_glyphs->glyphs[curs_y][curs_x] | |
| 429 | 3340 : SPACEGLYPH); |
| 771 | 3341 if (f != x_highlight_frame) |
| 286 | 3342 { |
| 771 | 3343 x_draw_box (f); |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3344 f->display.x->current_cursor = hollow_box_cursor; |
| 286 | 3345 } |
| 3346 else | |
| 3347 { | |
| 771 | 3348 x_draw_single_glyph (f, curs_y, curs_x, |
| 3349 f->phys_cursor_glyph, 2); | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3350 f->display.x->current_cursor = filled_box_cursor; |
| 286 | 3351 } |
| 3352 | |
| 771 | 3353 f->phys_cursor_x = curs_x; |
| 3354 f->phys_cursor_y = curs_y; | |
| 286 | 3355 } |
| 3356 | |
| 771 | 3357 if (updating_frame != f) |
| 286 | 3358 XFlushQueue (); |
| 3359 } | |
| 3360 | |
| 771 | 3361 x_display_cursor (f, on) |
| 3362 struct frame *f; | |
| 286 | 3363 int on; |
| 3364 { | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3365 if (FRAME_DESIRED_CURSOR (f) == filled_box_cursor) |
| 771 | 3366 x_display_box_cursor (f, on); |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3367 else if (FRAME_DESIRED_CURSOR (f) == bar_cursor) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3368 x_display_bar_cursor (f, on); |
| 286 | 3369 else |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3370 /* Those are the only two we have implemented! */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3371 abort (); |
| 286 | 3372 } |
| 3373 | |
| 3374 /* Icons. */ | |
| 3375 | |
| 771 | 3376 /* Refresh bitmap kitchen sink icon for frame F |
| 286 | 3377 when we get an expose event for it. */ |
| 3378 | |
| 771 | 3379 refreshicon (f) |
| 3380 struct frame *f; | |
| 286 | 3381 { |
| 3382 #ifdef HAVE_X11 | |
| 3383 /* Normally, the window manager handles this function. */ | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3384 #else /* ! defined (HAVE_X11) */ |
| 286 | 3385 int mask; |
| 3386 | |
| 771 | 3387 if (f->display.x->icon_bitmap_flag) |
| 3388 XBitmapBitsPut (f->display.x->icon_desc, 0, 0, sink_width, sink_height, | |
| 286 | 3389 sink_bits, BlackPixel, WHITE_PIX_DEFAULT, |
| 3390 icon_bitmap, GXcopy, AllPlanes); | |
| 3391 else | |
| 3392 { | |
| 771 | 3393 extern struct frame *selected_frame; |
| 286 | 3394 struct Lisp_String *str; |
| 3395 unsigned char *string; | |
| 3396 | |
| 3397 string | |
| 771 | 3398 = XSTRING (XBUFFER (XWINDOW (f->selected_window)->buffer)->name)->data; |
| 3399 | |
| 3400 if (f->display.x->icon_label != string) | |
| 286 | 3401 { |
| 771 | 3402 f->display.x->icon_label = string; |
| 3403 XChangeWindow (f->display.x->icon_desc, | |
| 286 | 3404 XQueryWidth (string, icon_font_info->id) + 10, |
| 3405 icon_font_info->height + 10); | |
| 3406 } | |
| 3407 | |
| 771 | 3408 XText (f->display.x->icon_desc, 5, 5, string, |
| 286 | 3409 str->size, icon_font_info->id, |
| 3410 BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT); | |
| 3411 } | |
| 3412 XFlushQueue (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3413 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3414 } |
| 3415 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3416 /* Make the x-window of frame F use the gnu icon bitmap. */ |
| 286 | 3417 |
| 3418 int | |
| 771 | 3419 x_bitmap_icon (f) |
| 3420 struct frame *f; | |
| 286 | 3421 { |
| 3422 int mask; | |
| 3423 Window icon_window; | |
| 3424 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3425 if (FRAME_X_WINDOW (f) == 0) |
| 286 | 3426 return 1; |
| 3427 | |
| 3428 #ifdef HAVE_X11 | |
| 3429 if (icon_bitmap) | |
| 3430 XFreePixmap (x_current_display, icon_bitmap); | |
| 3431 | |
| 3432 icon_bitmap = | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3433 XCreateBitmapFromData (x_current_display, FRAME_X_WINDOW (f), |
| 286 | 3434 gnu_bits, gnu_width, gnu_height); |
| 771 | 3435 x_wm_set_icon_pixmap (f, icon_bitmap); |
| 3436 f->display.x->icon_bitmap_flag = 1; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3437 #else /* ! defined (HAVE_X11) */ |
| 771 | 3438 if (f->display.x->icon_desc) |
| 286 | 3439 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3440 XClearIconWindow (FRAME_X_WINDOW (f)); |
| 771 | 3441 XDestroyWindow (f->display.x->icon_desc); |
| 286 | 3442 } |
| 3443 | |
| 771 | 3444 icon_window = XCreateWindow (f->display.x->parent_desc, |
| 286 | 3445 0, 0, sink_width, sink_height, |
| 3446 2, WhitePixmap, (Pixmap) NULL); | |
| 3447 | |
| 3448 if (icon_window == 0) | |
| 3449 return 1; | |
| 3450 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3451 XSetIconWindow (FRAME_X_WINDOW (f), icon_window); |
| 286 | 3452 XSelectInput (icon_window, ExposeWindow | UnmapWindow); |
| 3453 | |
| 771 | 3454 f->display.x->icon_desc = icon_window; |
| 3455 f->display.x->icon_bitmap_flag = 1; | |
| 286 | 3456 |
| 3457 if (icon_bitmap == 0) | |
| 3458 icon_bitmap | |
| 3459 = XStoreBitmap (sink_mask_width, sink_mask_height, sink_mask_bits); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3460 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3461 |
| 3462 return 0; | |
| 3463 } | |
| 3464 | |
| 3465 | |
| 771 | 3466 /* Make the x-window of frame F use a rectangle with text. */ |
| 286 | 3467 |
| 3468 int | |
| 771 | 3469 x_text_icon (f, icon_name) |
| 3470 struct frame *f; | |
| 286 | 3471 char *icon_name; |
| 3472 { | |
| 3473 #ifndef HAVE_X11 | |
| 3474 int mask; | |
| 3475 int width; | |
| 3476 Window icon_window; | |
| 3477 char *X_DefaultValue; | |
| 3478 Bitmap b1; | |
| 3479 | |
| 3480 #ifndef WhitePixel | |
| 3481 #define WhitePixel 1 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3482 #endif /* WhitePixel */ |
| 286 | 3483 |
| 3484 #ifndef BlackPixel | |
| 3485 #define BlackPixel 0 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3486 #endif /* BlackPixel */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3487 #endif /* HAVE_X11 */ |
| 286 | 3488 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3489 if (FRAME_X_WINDOW (f) == 0) |
| 286 | 3490 return 1; |
| 3491 | |
| 3492 #ifdef HAVE_X11 | |
| 3493 if (icon_name) | |
| 771 | 3494 f->display.x->icon_label = icon_name; |
| 286 | 3495 else |
| 771 | 3496 if (! f->display.x->icon_label) |
| 3497 f->display.x->icon_label = " *emacs* "; | |
| 286 | 3498 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3499 XSetIconName (x_current_display, FRAME_X_WINDOW (f), |
| 771 | 3500 (char *) f->display.x->icon_label); |
| 286 | 3501 |
| 771 | 3502 f->display.x->icon_bitmap_flag = 0; |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3503 x_wm_set_icon_pixmap (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3504 #else /* ! defined (HAVE_X11) */ |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3505 if (icon_font_info == 0) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3506 icon_font_info |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3507 = XGetFont (XGetDefault (XDISPLAY |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3508 (char *) XSTRING (invocation_name)->data, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3509 "BodyFont")); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3510 |
| 771 | 3511 if (f->display.x->icon_desc) |
| 286 | 3512 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3513 XClearIconWindow (XDISPLAY FRAME_X_WINDOW (f)); |
| 771 | 3514 XDestroyWindow (XDISPLAY f->display.x->icon_desc); |
| 286 | 3515 } |
| 3516 | |
| 3517 if (icon_name) | |
| 771 | 3518 f->display.x->icon_label = (unsigned char *) icon_name; |
| 286 | 3519 else |
| 771 | 3520 if (! f->display.x->icon_label) |
| 3521 f->display.x->icon_label = XSTRING (f->name)->data; | |
| 3522 | |
| 3523 width = XStringWidth (f->display.x->icon_label, icon_font_info, 0, 0); | |
| 3524 icon_window = XCreateWindow (f->display.x->parent_desc, | |
| 3525 f->display.x->left_pos, | |
| 3526 f->display.x->top_pos, | |
| 286 | 3527 width + 10, icon_font_info->height + 10, |
| 3528 2, BlackPixmap, WhitePixmap); | |
| 3529 | |
| 3530 if (icon_window == 0) | |
| 3531 return 1; | |
| 3532 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3533 XSetIconWindow (FRAME_X_WINDOW (f), icon_window); |
| 286 | 3534 XSelectInput (icon_window, ExposeWindow | ExposeRegion | UnmapWindow | ButtonPressed); |
| 3535 | |
| 771 | 3536 f->display.x->icon_desc = icon_window; |
| 3537 f->display.x->icon_bitmap_flag = 0; | |
| 3538 f->display.x->icon_label = 0; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3539 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3540 |
| 3541 return 0; | |
| 3542 } | |
| 3543 | |
| 621 | 3544 /* Handling X errors. */ |
| 3545 | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3546 /* Shut down Emacs in an orderly fashion, because of a SIGPIPE on the |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3547 X server's connection, or an error reported via the X protocol. */ |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3548 |
| 621 | 3549 static SIGTYPE |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3550 x_connection_closed () |
| 621 | 3551 { |
| 3552 if (_Xdebug) | |
| 3553 abort (); | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3554 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3555 shut_down_emacs (0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3556 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3557 exit (70); |
| 621 | 3558 } |
| 3559 | |
|
1875
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3560 /* An X error handler which prints an error message and then kills |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3561 Emacs. This is what's normally installed as Xlib's handler for |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3562 protocol errors. */ |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3563 static int |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3564 x_error_quitter (display, error) |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3565 Display *display; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3566 XErrorEvent *error; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3567 { |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3568 char buf[256]; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3569 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3570 /* Note that there is no real way portable across R3/R4 to get the |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3571 original error handler. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3572 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3573 XGetErrorText (display, error->error_code, buf, sizeof (buf)); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3574 fprintf (stderr, "X protocol error: %s on protocol request %d\n", |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3575 buf, error->request_code); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3576 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3577 /* While we're testing Emacs 19, we'll just dump core whenever we |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3578 get an X error, so we can figure out why it happened. */ |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3579 abort (); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3580 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3581 x_connection_closed (); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3582 } |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3583 |
|
1875
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3584 /* A handler for X IO errors which prints an error message and then |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3585 kills Emacs. This is what is always installed as Xlib's handler |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3586 for I/O errors. */ |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3587 static int |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3588 x_io_error_quitter (display) |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3589 Display *display; |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3590 { |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3591 fprintf (stderr, "Connection to X server %s lost.\n", |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3592 XDisplayName (DisplayString (display))); |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3593 |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3594 /* While we're testing Emacs 19, we'll just dump core whenever we |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3595 get an X error, so we can figure out why it happened. */ |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3596 abort (); |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3597 |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3598 x_connection_closed (); |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3599 } |
|
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3600 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3601 /* A buffer for storing X error messages. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3602 static char (*x_caught_error_message)[200]; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3603 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3604 /* An X error handler which stores the error message in |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3605 x_caught_error_message. This is what's installed when |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3606 x_catch_errors is in effect. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3607 static int |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3608 x_error_catcher (display, error) |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3609 Display *display; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3610 XErrorEvent *error; |
| 286 | 3611 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3612 XGetErrorText (display, error->error_code, |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3613 *x_caught_error_message, sizeof (*x_caught_error_message)); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3614 } |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3615 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3616 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3617 /* Begin trapping X errors. |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3618 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3619 After calling this function, X protocol errors no longer cause |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3620 Emacs to exit; instead, they are recorded in x_cfc_error_message. |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3621 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3622 Calling x_check_errors signals an Emacs error if an X error has |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3623 occurred since the last call to x_catch_errors or x_check_errors. |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3624 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3625 Calling x_uncatch_errors resumes the normal error handling. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3626 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3627 void x_catch_errors(), x_check_errors (), x_uncatch_errors (); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3628 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3629 void |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3630 x_catch_errors () |
| 286 | 3631 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3632 /* Make sure any errors from previous requests have been dealt with. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3633 XSync (x_current_display, False); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3634 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3635 /* Set up the error buffer. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3636 x_caught_error_message = |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3637 (char (*)[]) xmalloc (sizeof (*x_caught_error_message)); |
|
1077
d6ee6ff7562d
* xterm.c (x_catch_errors): Don't forget to initialize
Jim Blandy <jimb@redhat.com>
parents:
1052
diff
changeset
|
3638 (*x_caught_error_message)[0] = '\0'; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3639 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3640 /* Install our little error handler. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3641 XHandleError (x_error_catcher); |
| 286 | 3642 } |
| 3643 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3644 /* If any X protocol errors have arrived since the last call to |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3645 x_catch_errors or x_check_errors, signal an Emacs error using |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3646 sprintf (a buffer, FORMAT, the x error message text) as the text. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3647 void |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3648 x_check_errors (format) |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3649 char *format; |
| 286 | 3650 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3651 /* Make sure to catch any errors incurred so far. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3652 XSync (x_current_display, False); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3653 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3654 if ((*x_caught_error_message)[0]) |
| 286 | 3655 { |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3656 char buf[256]; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3657 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3658 sprintf (buf, format, *x_caught_error_message); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3659 free (x_caught_error_message); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3660 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3661 x_uncatch_errors (); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3662 error (buf); |
| 286 | 3663 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3664 } |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3665 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3666 void |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3667 x_uncatch_errors () |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3668 { |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3669 free (x_caught_error_message); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3670 XHandleError (x_error_quitter); |
| 286 | 3671 } |
| 3672 | |
| 3673 #if 0 | |
| 3674 static unsigned int x_wire_count; | |
| 3675 x_trace_wire () | |
| 3676 { | |
| 3677 fprintf (stderr, "Lib call: %d\n", ++x_wire_count); | |
| 3678 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3679 #endif /* ! 0 */ |
| 286 | 3680 |
| 3681 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3682 /* Changing the font of the frame. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3683 |
| 771 | 3684 /* Set the font of the x-window specified by frame F |
| 286 | 3685 to the font named NEWNAME. This is safe to use |
| 771 | 3686 even before F has an actual x-window. */ |
| 286 | 3687 |
| 3688 #ifdef HAVE_X11 | |
| 3689 | |
| 3690 /* A table of all the fonts we have already loaded. */ | |
| 3691 static XFontStruct **x_font_table; | |
| 3692 | |
| 3693 /* The current capacity of x_font_table. */ | |
| 3694 static int x_font_table_size; | |
| 3695 | |
| 3696 /* The number of fonts actually stored in x_font_table. | |
| 3697 x_font_table[n] is used and valid iff 0 <= n < n_fonts. | |
| 3698 0 <= n_fonts <= x_font_table_size. */ | |
| 3699 static int n_fonts; | |
| 3700 | |
| 771 | 3701 x_new_font (f, fontname) |
| 3702 struct frame *f; | |
| 286 | 3703 register char *fontname; |
| 3704 { | |
| 3705 XFontStruct *temp; | |
| 3706 int already_loaded; | |
| 3707 int n_matching_fonts; | |
| 3708 XFontStruct *font_info; | |
| 3709 char **font_names; | |
| 3710 | |
| 3711 /* Get a list of all the fonts that match this name. Once we | |
| 3712 have a list of matching fonts, we compare them against the fonts | |
| 3713 we already have by comparing font ids. */ | |
| 3714 font_names = (char **) XListFontsWithInfo (x_current_display, fontname, | |
| 3715 1024, &n_matching_fonts, | |
| 3716 &font_info); | |
| 3717 /* If the server couldn't find any fonts whose named matched fontname, | |
| 3718 return an error code. */ | |
| 3719 if (n_matching_fonts == 0) | |
| 3720 return 1; | |
| 3721 | |
| 429 | 3722 /* See if we've already loaded a matching font. */ |
| 286 | 3723 { |
| 3724 int i, j; | |
| 3725 | |
| 3726 already_loaded = 0; | |
| 3727 for (i = 0; i < n_fonts; i++) | |
| 3728 for (j = 0; j < n_matching_fonts; j++) | |
| 3729 if (x_font_table[i]->fid == font_info[j].fid) | |
| 3730 { | |
| 3731 already_loaded = i; | |
| 3732 goto found_font; | |
| 3733 } | |
| 3734 } | |
| 3735 found_font: | |
| 3736 | |
| 3737 /* If we have, just return it from the table. */ | |
| 3738 if (already_loaded) | |
| 771 | 3739 f->display.x->font = x_font_table[already_loaded]; |
| 429 | 3740 |
| 286 | 3741 /* Otherwise, load the font and add it to the table. */ |
| 3742 else | |
| 3743 { | |
| 3744 XFontStruct *font; | |
| 3745 | |
| 3746 font = (XFontStruct *) XLoadQueryFont (x_current_display, fontname); | |
| 3747 if (! font) | |
| 3748 return 1; | |
| 3749 | |
| 3750 /* Do we need to create the table? */ | |
| 3751 if (x_font_table_size == 0) | |
| 3752 { | |
| 3753 x_font_table_size = 16; | |
| 3754 x_font_table | |
| 3755 = (XFontStruct **) xmalloc (x_font_table_size | |
| 3756 * sizeof (x_font_table[0])); | |
| 3757 } | |
| 3758 /* Do we need to grow the table? */ | |
| 3759 else if (n_fonts >= x_font_table_size) | |
| 3760 { | |
| 429 | 3761 x_font_table_size *= 2; |
| 286 | 3762 x_font_table |
| 3763 = (XFontStruct **) xrealloc (x_font_table, | |
| 3764 (x_font_table_size | |
| 3765 * sizeof (x_font_table[0]))); | |
| 3766 } | |
| 3767 | |
| 771 | 3768 f->display.x->font = x_font_table[n_fonts++] = font; |
| 286 | 3769 } |
| 3770 | |
| 3771 /* Free the information from XListFontsWithInfo. The data | |
| 3772 we actually retain comes from XLoadQueryFont. */ | |
| 3773 XFreeFontInfo (font_names, font_info, n_matching_fonts); | |
| 3774 | |
| 771 | 3775 /* Now make the frame display the given font. */ |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3776 if (FRAME_X_WINDOW (f) != 0) |
| 286 | 3777 { |
| 771 | 3778 XSetFont (x_current_display, f->display.x->normal_gc, |
| 3779 f->display.x->font->fid); | |
| 3780 XSetFont (x_current_display, f->display.x->reverse_gc, | |
| 3781 f->display.x->font->fid); | |
| 3782 XSetFont (x_current_display, f->display.x->cursor_gc, | |
| 3783 f->display.x->font->fid); | |
| 3784 | |
| 3785 x_set_window_size (f, f->width, f->height); | |
| 286 | 3786 } |
| 3787 | |
| 3788 return 0; | |
| 3789 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3790 #else /* ! defined (HAVE_X11) */ |
| 771 | 3791 x_new_font (f, newname) |
| 3792 struct frame *f; | |
| 286 | 3793 register char *newname; |
| 3794 { | |
| 3795 FONT_TYPE *temp; | |
| 3796 int mask; | |
| 3797 | |
| 3798 temp = XGetFont (newname); | |
| 3799 if (temp == (FONT_TYPE *) 0) | |
| 3800 return 1; | |
| 3801 | |
| 771 | 3802 if (f->display.x->font) |
| 3803 XLoseFont (f->display.x->font); | |
| 3804 | |
| 3805 f->display.x->font = temp; | |
| 3806 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3807 if (FRAME_X_WINDOW (f) != 0) |
| 771 | 3808 x_set_window_size (f, f->width, f->height); |
| 286 | 3809 |
| 3810 return 0; | |
| 3811 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3812 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3813 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3814 /* X Window sizes and positions. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3815 |
| 771 | 3816 x_calc_absolute_position (f) |
| 3817 struct frame *f; | |
| 286 | 3818 { |
| 3819 #ifdef HAVE_X11 | |
| 771 | 3820 if (f->display.x->left_pos < 0) |
| 3821 f->display.x->left_pos | |
|
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
3822 = x_screen_width - PIXEL_WIDTH (f) + f->display.x->left_pos; |
| 771 | 3823 |
| 3824 if (f->display.x->top_pos < 0) | |
| 3825 f->display.x->top_pos | |
|
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
3826 = x_screen_height - PIXEL_HEIGHT (f) + f->display.x->top_pos; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3827 #else /* ! defined (HAVE_X11) */ |
| 286 | 3828 WINDOWINFO_TYPE parentinfo; |
| 3829 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3830 XGetWindowInfo (FRAME_X_WINDOW (f), &parentinfo); |
| 771 | 3831 |
| 3832 if (f->display.x->left_pos < 0) | |
| 3833 f->display.x->left_pos = parentinfo.width + (f->display.x->left_pos + 1) | |
| 3834 - PIXEL_WIDTH (f) - 2 * f->display.x->internal_border_width; | |
| 3835 | |
| 3836 if (f->display.x->top_pos < 0) | |
| 3837 f->display.x->top_pos = parentinfo.height + (f->display.x->top_pos + 1) | |
| 3838 - PIXEL_HEIGHT (f) - 2 * f->display.x->internal_border_width; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3839 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3840 } |
| 3841 | |
| 771 | 3842 x_set_offset (f, xoff, yoff) |
| 3843 struct frame *f; | |
| 286 | 3844 register int xoff, yoff; |
| 3845 { | |
| 771 | 3846 f->display.x->top_pos = yoff; |
| 3847 f->display.x->left_pos = xoff; | |
| 3848 x_calc_absolute_position (f); | |
| 286 | 3849 |
| 3850 BLOCK_INPUT; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3851 XMoveWindow (XDISPLAY FRAME_X_WINDOW (f), |
| 771 | 3852 f->display.x->left_pos, f->display.x->top_pos); |
| 286 | 3853 #ifdef HAVE_X11 |
| 771 | 3854 x_wm_set_size_hint (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3855 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3856 UNBLOCK_INPUT; |
| 3857 } | |
| 3858 | |
| 771 | 3859 /* Call this to change the size of frame F's x-window. */ |
| 3860 | |
| 3861 x_set_window_size (f, cols, rows) | |
| 3862 struct frame *f; | |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3863 int cols, rows; |
| 286 | 3864 { |
| 3865 int pixelwidth, pixelheight; | |
| 3866 int mask; | |
| 3867 | |
| 3868 BLOCK_INPUT; | |
| 3869 | |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3870 check_frame_size (f, &rows, &cols); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3871 f->display.x->vertical_scrollbar_extra = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3872 (FRAME_HAS_VERTICAL_SCROLLBARS (f) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3873 ? VERTICAL_SCROLLBAR_PIXEL_WIDTH (f) |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3874 : 0); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3875 pixelwidth = CHAR_TO_PIXEL_WIDTH (f, cols); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3876 pixelheight = CHAR_TO_PIXEL_HEIGHT (f, rows); |
| 286 | 3877 |
| 3878 #ifdef HAVE_X11 | |
| 771 | 3879 x_wm_set_size_hint (f, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3880 #endif /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3881 XChangeWindowSize (FRAME_X_WINDOW (f), pixelwidth, pixelheight); |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3882 |
|
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3883 /* Now, strictly speaking, we can't be sure that this is accurate, |
|
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3884 but the window manager will get around to dealing with the size |
|
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3885 change request eventually, and we'll hear how it went when the |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3886 ConfigureNotify event gets here. |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3887 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3888 We could just not bother storing any of this information here, |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3889 and let the ConfigureNotify event set everything up, but that |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3890 might be kind of confusing to the lisp code, since size changes |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3891 wouldn't be reported in the frame parameters until some random |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3892 point in the future when the ConfigureNotify event arrives. */ |
|
1875
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
3893 change_frame_size (f, rows, cols, 0, 0); |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3894 PIXEL_WIDTH (f) = pixelwidth; |
|
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3895 PIXEL_HEIGHT (f) = pixelheight; |
|
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3896 |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3897 /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3898 receive in the ConfigureNotify event; if we get what we asked |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3899 for, then the event won't cause the screen to become garbaged, so |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3900 we have to make sure to do it here. */ |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3901 SET_FRAME_GARBAGED (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3902 |
| 286 | 3903 XFlushQueue (); |
| 3904 UNBLOCK_INPUT; | |
| 3905 } | |
| 3906 | |
| 3907 #ifndef HAVE_X11 | |
| 771 | 3908 x_set_resize_hint (f) |
| 3909 struct frame *f; | |
| 286 | 3910 { |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3911 XSetResizeHint (FRAME_X_WINDOW (f), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3912 2 * f->display.x->internal_border_width, |
| 771 | 3913 2 * f->display.x->internal_border_width, |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3914 FONT_WIDTH (f->display.x->font), |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3915 FONT_HEIGHT (f->display.x->font)); |
| 286 | 3916 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3917 #endif /* HAVE_X11 */ |
| 286 | 3918 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3919 /* Mouse warping, focus shifting, raising and lowering. */ |
| 286 | 3920 |
| 771 | 3921 x_set_mouse_position (f, x, y) |
| 3922 struct frame *f; | |
| 286 | 3923 int x, y; |
| 3924 { | |
| 3925 int pix_x, pix_y; | |
| 3926 | |
| 771 | 3927 x_raise_frame (f); |
| 286 | 3928 |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3929 pix_x = CHAR_TO_PIXEL_COL (f, x) + FONT_WIDTH (f->display.x->font) / 2; |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
3930 pix_y = CHAR_TO_PIXEL_ROW (f, y) + FONT_HEIGHT (f->display.x->font) / 2; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3931 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3932 if (pix_x < 0) pix_x = 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3933 if (pix_x > PIXEL_WIDTH (f)) pix_x = PIXEL_WIDTH (f); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3934 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3935 if (pix_y < 0) pix_y = 0; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3936 if (pix_y > PIXEL_HEIGHT (f)) pix_y = PIXEL_HEIGHT (f); |
| 286 | 3937 |
| 3938 BLOCK_INPUT; | |
| 3939 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3940 XWarpMousePointer (FRAME_X_WINDOW (f), pix_x, pix_y); |
| 286 | 3941 UNBLOCK_INPUT; |
| 3942 } | |
| 3943 | |
| 3944 #ifdef HAVE_X11 | |
| 771 | 3945 x_focus_on_frame (f) |
| 3946 struct frame *f; | |
| 286 | 3947 { |
| 771 | 3948 x_raise_frame (f); |
| 369 | 3949 #if 0 |
| 3950 /* I don't think that the ICCCM allows programs to do things like this | |
| 3951 without the interaction of the window manager. Whatever you end up | |
| 771 | 3952 doing with this code, do it to x_unfocus_frame too. */ |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3953 XSetInputFocus (x_current_display, FRAME_X_WINDOW (f), |
| 286 | 3954 RevertToPointerRoot, CurrentTime); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3955 #endif /* ! 0 */ |
| 286 | 3956 } |
| 3957 | |
| 771 | 3958 x_unfocus_frame (f) |
| 3959 struct frame *f; | |
| 286 | 3960 { |
| 369 | 3961 #if 0 |
| 771 | 3962 /* Look at the remarks in x_focus_on_frame. */ |
| 3963 if (x_focus_frame == f) | |
| 286 | 3964 XSetInputFocus (x_current_display, PointerRoot, |
| 3965 RevertToPointerRoot, CurrentTime); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3966 #endif /* ! 0 */ |
| 286 | 3967 } |
| 3968 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3969 #endif /* ! defined (HAVE_X11) */ |
| 286 | 3970 |
| 771 | 3971 /* Raise frame F. */ |
| 3972 | |
| 3973 x_raise_frame (f) | |
| 3974 struct frame *f; | |
| 286 | 3975 { |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3976 if (f->async_visible) |
| 286 | 3977 { |
| 3978 BLOCK_INPUT; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3979 XRaiseWindow (XDISPLAY FRAME_X_WINDOW (f)); |
| 286 | 3980 XFlushQueue (); |
| 3981 UNBLOCK_INPUT; | |
| 3982 } | |
| 3983 } | |
| 3984 | |
| 771 | 3985 /* Lower frame F. */ |
| 3986 | |
| 3987 x_lower_frame (f) | |
| 3988 struct frame *f; | |
| 286 | 3989 { |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3990 if (f->async_visible) |
| 286 | 3991 { |
| 3992 BLOCK_INPUT; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3993 XLowerWindow (XDISPLAY FRAME_X_WINDOW (f)); |
| 286 | 3994 XFlushQueue (); |
| 3995 UNBLOCK_INPUT; | |
| 3996 } | |
| 3997 } | |
| 3998 | |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
3999 static void |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4000 XTframe_raise_lower (f, raise) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4001 FRAME_PTR f; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4002 int raise; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4003 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4004 if (raise) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4005 x_raise_frame (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4006 else |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4007 x_lower_frame (f); |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4008 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4009 |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4010 |
| 286 | 4011 /* Change from withdrawn state to mapped state. */ |
| 4012 | |
| 771 | 4013 x_make_frame_visible (f) |
| 4014 struct frame *f; | |
| 286 | 4015 { |
| 4016 int mask; | |
| 4017 | |
| 429 | 4018 BLOCK_INPUT; |
| 4019 | |
| 771 | 4020 if (! FRAME_VISIBLE_P (f)) |
| 286 | 4021 { |
| 4022 #ifdef HAVE_X11 | |
| 429 | 4023 if (! EQ (Vx_no_window_manager, Qt)) |
| 771 | 4024 x_wm_set_window_state (f, NormalState); |
| 4025 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4026 XMapWindow (XDISPLAY FRAME_X_WINDOW (f)); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4027 if (FRAME_HAS_VERTICAL_SCROLLBARS (f)) |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4028 XMapSubwindows (x_current_display, FRAME_X_WINDOW (f)); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4029 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4030 XMapWindow (XDISPLAY FRAME_X_WINDOW (f)); |
| 771 | 4031 if (f->display.x->icon_desc != 0) |
| 4032 XUnmapWindow (f->display.x->icon_desc); | |
| 429 | 4033 |
| 4034 /* Handled by the MapNotify event for X11 */ | |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4035 f->async_visible = 1; |
|
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4036 f->async_iconified = 0; |
| 771 | 4037 |
| 4038 /* NOTE: this may cause problems for the first frame. */ | |
| 429 | 4039 XTcursor_to (0, 0); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4040 #endif /* ! defined (HAVE_X11) */ |
| 429 | 4041 } |
| 286 | 4042 |
| 4043 XFlushQueue (); | |
| 429 | 4044 |
| 286 | 4045 UNBLOCK_INPUT; |
| 4046 } | |
| 4047 | |
| 4048 /* Change from mapped state to withdrawn state. */ | |
| 4049 | |
| 771 | 4050 x_make_frame_invisible (f) |
| 4051 struct frame *f; | |
| 286 | 4052 { |
| 4053 int mask; | |
| 4054 | |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4055 if (! f->async_visible) |
| 286 | 4056 return; |
| 4057 | |
| 4058 BLOCK_INPUT; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4059 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4060 #ifdef HAVE_X11R4 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4061 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4062 if (! XWithdrawWindow (x_current_display, FRAME_X_WINDOW (f), |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4063 DefaultScreen (x_current_display))) |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4064 { |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4065 UNBLOCK_INPUT_RESIGNAL; |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4066 error ("can't notify window manager of window withdrawl"); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4067 } |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4068 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4069 #else /* ! defined (HAVE_X11R4) */ |
| 286 | 4070 #ifdef HAVE_X11 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4071 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4072 /* Tell the window manager what we're going to do. */ |
| 286 | 4073 if (! EQ (Vx_no_window_manager, Qt)) |
| 4074 { | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4075 XEvent unmap; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4076 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4077 unmap.xunmap.type = UnmapNotify; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4078 unmap.xunmap.window = FRAME_X_WINDOW (f); |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4079 unmap.xunmap.event = DefaultRootWindow (x_current_display); |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4080 unmap.xunmap.from_configure = False; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4081 if (! XSendEvent (x_current_display, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4082 DefaultRootWindow (x_current_display), |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4083 False, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4084 SubstructureRedirectMask|SubstructureNotifyMask, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4085 &unmap)) |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4086 { |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4087 UNBLOCK_INPUT_RESIGNAL; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4088 error ("can't notify window manager of withdrawal"); |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4089 } |
| 286 | 4090 } |
| 4091 | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4092 /* Unmap the window ourselves. Cheeky! */ |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4093 XUnmapWindow (x_current_display, FRAME_X_WINDOW (f)); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4094 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4095 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4096 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4097 XUnmapWindow (FRAME_X_WINDOW (f)); |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4098 f->async_visible = 0; /* Handled by the UnMap event for X11 */ |
| 771 | 4099 if (f->display.x->icon_desc != 0) |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4100 XUnmapWindow (f->display.x->icon_desc); |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4101 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4102 #endif /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4103 #endif /* ! defined (HAVE_X11R4) */ |
| 286 | 4104 |
| 4105 XFlushQueue (); | |
| 4106 UNBLOCK_INPUT; | |
| 4107 } | |
| 4108 | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4109 /* Window manager communication. Created in Fx_open_connection. */ |
| 286 | 4110 extern Atom Xatom_wm_change_state; |
| 4111 | |
| 4112 /* Change window state from mapped to iconified. */ | |
| 4113 | |
| 771 | 4114 x_iconify_frame (f) |
| 4115 struct frame *f; | |
| 286 | 4116 { |
| 4117 int mask; | |
| 4118 | |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4119 if (f->async_iconified) |
| 286 | 4120 return; |
| 4121 | |
| 4122 BLOCK_INPUT; | |
| 4123 | |
| 4124 #ifdef HAVE_X11 | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4125 /* Since we don't know which revision of X we're running, we'll use both |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4126 the X11R3 and X11R4 techniques. I don't know if this is a good idea. */ |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4127 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4128 /* X11R4: send a ClientMessage to the window manager using the |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4129 WM_CHANGE_STATE type. */ |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4130 { |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4131 XEvent message; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4132 |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4133 message.xclient.window = FRAME_X_WINDOW (f); |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4134 message.xclient.type = ClientMessage; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4135 message.xclient.message_type = Xatom_wm_change_state; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4136 message.xclient.format = 32; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4137 message.xclient.data.l[0] = IconicState; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4138 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4139 if (! XSendEvent (x_current_display, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4140 DefaultRootWindow (x_current_display), |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4141 False, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4142 SubstructureRedirectMask | SubstructureNotifyMask, |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4143 &message)) |
| 286 | 4144 { |
| 4145 UNBLOCK_INPUT_RESIGNAL; | |
| 4146 error ("Can't notify window manager of iconification."); | |
| 4147 } | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4148 } |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4149 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4150 /* X11R3: set the initial_state field of the window manager hints to |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4151 IconicState. */ |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4152 x_wm_set_window_state (f, IconicState); |
| 286 | 4153 |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4154 f->async_iconified = 1; |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4155 #else /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4156 XUnmapWindow (XDISPLAY FRAME_X_WINDOW (f)); |
| 771 | 4157 |
|
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
4158 f->async_visible = 0; /* Handled in the UnMap event for X11. */ |
| 771 | 4159 if (f->display.x->icon_desc != 0) |
| 286 | 4160 { |
| 771 | 4161 XMapWindow (XDISPLAY f->display.x->icon_desc); |
| 4162 refreshicon (f); | |
| 286 | 4163 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4164 #endif /* ! defined (HAVE_X11) */ |
| 286 | 4165 |
| 4166 XFlushQueue (); | |
| 4167 UNBLOCK_INPUT; | |
| 4168 } | |
| 4169 | |
|
1810
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4170 /* Destroy the X window of frame F. */ |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4171 |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4172 x_destroy_window (f) |
| 771 | 4173 struct frame *f; |
| 286 | 4174 { |
| 4175 BLOCK_INPUT; | |
|
1810
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4176 |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4177 if (f->display.x->icon_desc != 0) |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4178 XDestroyWindow (XDISPLAY f->display.x->icon_desc); |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4179 XDestroyWindow (XDISPLAY f->display.x->window_desc); |
| 286 | 4180 XFlushQueue (); |
|
1810
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4181 |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4182 free (f->display.x); |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4183 f->display.x = 0; |
| 771 | 4184 if (f == x_focus_frame) |
| 4185 x_focus_frame = 0; | |
| 4186 if (f == x_highlight_frame) | |
| 4187 x_highlight_frame = 0; | |
|
1810
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4188 |
|
bf618128d973
* xterm.c (x_scrollbar_create): Set the scrollbars to use
Jim Blandy <jimb@redhat.com>
parents:
1803
diff
changeset
|
4189 UNBLOCK_INPUT; |
| 286 | 4190 } |
| 4191 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4192 /* Manage event queues for X10. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4193 |
| 286 | 4194 #ifndef HAVE_X11 |
| 4195 | |
| 4196 /* Manage event queues. | |
| 4197 | |
| 4198 This code is only used by the X10 support. | |
| 4199 | |
| 4200 We cannot leave events in the X queue and get them when we are ready | |
| 4201 because X does not provide a subroutine to get only a certain kind | |
| 4202 of event but not block if there are no queued events of that kind. | |
| 4203 | |
| 4204 Therefore, we must examine events as they come in and copy events | |
| 4205 of certain kinds into our private queues. | |
| 4206 | |
| 4207 All ExposeRegion events are put in x_expose_queue. | |
| 4208 All ButtonPressed and ButtonReleased events are put in x_mouse_queue. */ | |
| 4209 | |
| 4210 | |
| 4211 /* Write the event *P_XREP into the event queue *QUEUE. | |
| 4212 If the queue is full, do nothing, but return nonzero. */ | |
| 4213 | |
| 4214 int | |
| 4215 enqueue_event (p_xrep, queue) | |
| 4216 register XEvent *p_xrep; | |
| 4217 register struct event_queue *queue; | |
| 4218 { | |
| 4219 int newindex = queue->windex + 1; | |
| 4220 if (newindex == EVENT_BUFFER_SIZE) | |
| 4221 newindex = 0; | |
| 4222 if (newindex == queue->rindex) | |
| 4223 return -1; | |
| 4224 queue->xrep[queue->windex] = *p_xrep; | |
| 4225 queue->windex = newindex; | |
| 4226 return 0; | |
| 4227 } | |
| 4228 | |
| 4229 /* Fetch the next event from queue *QUEUE and store it in *P_XREP. | |
| 4230 If *QUEUE is empty, do nothing and return 0. */ | |
| 4231 | |
| 4232 int | |
| 4233 dequeue_event (p_xrep, queue) | |
| 4234 register XEvent *p_xrep; | |
| 4235 register struct event_queue *queue; | |
| 4236 { | |
| 4237 if (queue->windex == queue->rindex) | |
| 4238 return 0; | |
| 4239 *p_xrep = queue->xrep[queue->rindex++]; | |
| 4240 if (queue->rindex == EVENT_BUFFER_SIZE) | |
| 4241 queue->rindex = 0; | |
| 4242 return 1; | |
| 4243 } | |
| 4244 | |
| 4245 /* Return the number of events buffered in *QUEUE. */ | |
| 4246 | |
| 4247 int | |
| 4248 queue_event_count (queue) | |
| 4249 register struct event_queue *queue; | |
| 4250 { | |
| 4251 int tem = queue->windex - queue->rindex; | |
| 4252 if (tem >= 0) | |
| 4253 return tem; | |
| 4254 return EVENT_BUFFER_SIZE + tem; | |
| 4255 } | |
| 4256 | |
| 4257 /* Return nonzero if mouse input is pending. */ | |
| 4258 | |
| 4259 int | |
| 4260 mouse_event_pending_p () | |
| 4261 { | |
| 4262 return queue_event_count (&x_mouse_queue); | |
| 4263 } | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4264 #endif /* HAVE_X11 */ |
| 286 | 4265 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4266 /* Setting window manager hints. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4267 |
| 286 | 4268 #ifdef HAVE_X11 |
| 4269 | |
| 771 | 4270 x_wm_set_size_hint (f, prompting) |
| 4271 struct frame *f; | |
| 286 | 4272 long prompting; |
| 4273 { | |
| 4274 XSizeHints size_hints; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4275 Window window = FRAME_X_WINDOW (f); |
| 286 | 4276 |
| 4277 size_hints.flags = PResizeInc | PMinSize | PMaxSize; | |
| 4278 | |
| 771 | 4279 flexlines = f->height; |
| 4280 | |
| 4281 size_hints.x = f->display.x->left_pos; | |
| 4282 size_hints.y = f->display.x->top_pos; | |
| 4283 size_hints.height = PIXEL_HEIGHT (f); | |
| 4284 size_hints.width = PIXEL_WIDTH (f); | |
| 4285 size_hints.width_inc = FONT_WIDTH (f->display.x->font); | |
| 4286 size_hints.height_inc = FONT_HEIGHT (f->display.x->font); | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
4287 size_hints.max_width = x_screen_width - CHAR_TO_PIXEL_WIDTH (f, 0); |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
4288 size_hints.max_height = x_screen_height - CHAR_TO_PIXEL_HEIGHT (f, 0); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4289 |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
4290 { |
|
1127
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4291 int base_width, base_height; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4292 |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4293 base_width = CHAR_TO_PIXEL_WIDTH (f, 0); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4294 base_height = CHAR_TO_PIXEL_HEIGHT (f, 0); |
|
1127
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4295 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4296 { |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4297 int min_rows = 0, min_cols = 0; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4298 check_frame_size (f, &min_rows, &min_cols); |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4299 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4300 /* The window manager uses the base width hints to calculate the |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4301 current number of rows and columns in the frame while |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4302 resizing; min_width and min_height aren't useful for this |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4303 purpose, since they might not give the dimensions for a |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4304 zero-row, zero-column frame. |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4305 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4306 We use the base_width and base_height members if we have |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4307 them; otherwise, we set the min_width and min_height members |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4308 to the size for a zero x zero frame. */ |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4309 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4310 #ifdef HAVE_X11R4 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4311 size_hints.flags |= PBaseSize; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4312 size_hints.base_width = base_width; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4313 size_hints.base_height = base_height; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4314 size_hints.min_width = base_width + min_cols * size_hints.width_inc; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4315 size_hints.min_height = base_height + min_rows * size_hints.height_inc; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4316 #else |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4317 size_hints.min_width = base_width; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4318 size_hints.min_height = base_height; |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4319 #endif |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4320 } |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4321 |
|
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
4322 } |
| 286 | 4323 |
| 4324 if (prompting) | |
| 4325 size_hints.flags |= prompting; | |
| 4326 else | |
| 4327 { | |
| 4328 XSizeHints hints; /* Sometimes I hate X Windows... */ | |
| 4329 | |
| 4330 XGetNormalHints (x_current_display, window, &hints); | |
| 4331 if (hints.flags & PSize) | |
| 4332 size_hints.flags |= PSize; | |
| 4333 if (hints.flags & PPosition) | |
| 4334 size_hints.flags |= PPosition; | |
| 4335 if (hints.flags & USPosition) | |
| 4336 size_hints.flags |= USPosition; | |
| 4337 if (hints.flags & USSize) | |
| 4338 size_hints.flags |= USSize; | |
| 4339 } | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4340 |
|
1127
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4341 #ifdef HAVE_X11R4 |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4342 XSetWMNormalHints (x_current_display, window, &size_hints); |
|
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4343 #else |
| 286 | 4344 XSetNormalHints (x_current_display, window, &size_hints); |
|
1127
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4345 #endif |
| 286 | 4346 } |
| 4347 | |
| 4348 /* Used for IconicState or NormalState */ | |
| 771 | 4349 x_wm_set_window_state (f, state) |
| 4350 struct frame *f; | |
| 286 | 4351 int state; |
| 4352 { | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4353 Window window = FRAME_X_WINDOW (f); |
| 286 | 4354 |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4355 f->display.x->wm_hints.flags |= StateHint; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4356 f->display.x->wm_hints.initial_state = state; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4357 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4358 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
| 286 | 4359 } |
| 4360 | |
| 771 | 4361 x_wm_set_icon_pixmap (f, icon_pixmap) |
| 4362 struct frame *f; | |
| 286 | 4363 Pixmap icon_pixmap; |
| 4364 { | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4365 Window window = FRAME_X_WINDOW (f); |
| 286 | 4366 |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4367 if (icon_pixmap) |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4368 { |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4369 f->display.x->wm_hints.icon_pixmap = icon_pixmap; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4370 f->display.x->wm_hints.flags |= IconPixmapHint; |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4371 } |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4372 else |
|
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4373 f->display.x->wm_hints.flags &= ~IconPixmapHint; |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4374 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4375 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
| 286 | 4376 } |
| 4377 | |
| 771 | 4378 x_wm_set_icon_position (f, icon_x, icon_y) |
| 4379 struct frame *f; | |
| 286 | 4380 int icon_x, icon_y; |
| 4381 { | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4382 Window window = FRAME_X_WINDOW (f); |
| 286 | 4383 |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4384 f->display.x->wm_hints.flags |= IconPositionHint; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4385 f->display.x->wm_hints.icon_x = icon_x; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4386 f->display.x->wm_hints.icon_y = icon_y; |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4387 |
|
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4388 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
| 286 | 4389 } |
| 4390 | |
| 4391 | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4392 /* Initialization. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4393 |
| 286 | 4394 void |
| 4395 x_term_init (display_name) | |
| 4396 char *display_name; | |
| 4397 { | |
| 771 | 4398 Lisp_Object frame; |
| 286 | 4399 char *defaultvalue; |
| 4400 #ifdef F_SETOWN | |
| 4401 extern int old_fcntl_owner; | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4402 #endif /* ! defined (F_SETOWN) */ |
| 369 | 4403 |
| 771 | 4404 x_focus_frame = x_highlight_frame = 0; |
| 286 | 4405 |
| 4406 x_current_display = XOpenDisplay (display_name); | |
| 4407 if (x_current_display == 0) | |
| 4408 fatal ("X server %s not responding; check the DISPLAY environment variable or use \"-d\"\n", | |
| 4409 display_name); | |
| 4410 | |
| 4411 #ifdef HAVE_X11 | |
| 4412 { | |
|
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4413 int hostname_size = 256; |
| 398 | 4414 |
| 4415 hostname = (char *) xmalloc (hostname_size); | |
| 4416 | |
| 286 | 4417 #if 0 |
| 4418 XSetAfterFunction (x_current_display, x_trace_wire); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4419 #endif /* ! 0 */ |
| 286 | 4420 |
| 395 | 4421 invocation_name = Ffile_name_nondirectory (Fcar (Vcommand_line_args)); |
| 398 | 4422 |
| 4423 /* Try to get the host name; if the buffer is too short, try | |
| 4424 again. Apparently, the only indication gethostname gives of | |
| 4425 whether the buffer was large enough is the presence or absence | |
| 4426 of a '\0' in the string. Eech. */ | |
| 4427 for (;;) | |
| 4428 { | |
| 4429 gethostname (hostname, hostname_size - 1); | |
| 4430 hostname[hostname_size - 1] = '\0'; | |
| 4431 | |
| 4432 /* Was the buffer large enough for gethostname to store the '\0'? */ | |
| 4433 if (strlen (hostname) < hostname_size - 1) | |
| 4434 break; | |
| 4435 | |
| 4436 hostname_size <<= 1; | |
| 4437 hostname = (char *) xrealloc (hostname, hostname_size); | |
| 4438 } | |
| 4439 x_id_name = (char *) xmalloc (XSTRING (invocation_name)->size | |
| 4440 + strlen (hostname) | |
| 4441 + 2); | |
| 4442 sprintf (x_id_name, "%s@%s", XSTRING (invocation_name)->data, hostname); | |
| 286 | 4443 } |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4444 |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4445 /* Figure out which modifier bits mean what. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4446 x_find_modifier_meanings (); |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4447 |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4448 /* Get the scrollbar cursor. */ |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4449 x_vertical_scrollbar_cursor = |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4450 XCreateFontCursor (x_current_display, XC_sb_v_double_arrow); |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4451 |
|
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4452 /* Watch for PropertyNotify events on the root window; we use them |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4453 to figure out when to invalidate our cache of the cut buffers. */ |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4454 x_watch_cut_buffer_cache (); |
|
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4455 |
| 286 | 4456 dup2 (ConnectionNumber (x_current_display), 0); |
| 369 | 4457 |
| 4458 #ifndef SYSV_STREAMS | |
| 4459 /* Streams somehow keeps track of which descriptor number | |
| 4460 is being used to talk to X. So it is not safe to substitute | |
| 4461 descriptor 0. But it is safe to make descriptor 0 a copy of it. */ | |
| 286 | 4462 close (ConnectionNumber (x_current_display)); |
| 369 | 4463 ConnectionNumber (x_current_display) = 0; /* Looks a little strange? |
| 4464 * check the def of the macro; | |
| 4465 * it is a genuine lvalue */ | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4466 #endif /* SYSV_STREAMS */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4467 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4468 #endif /* ! defined (HAVE_X11) */ |
| 286 | 4469 |
| 4470 #ifdef F_SETOWN | |
| 4471 old_fcntl_owner = fcntl (0, F_GETOWN, 0); | |
| 4472 #ifdef F_SETOWN_SOCK_NEG | |
| 4473 fcntl (0, F_SETOWN, -getpid ()); /* stdin is a socket here */ | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4474 #else /* ! defined (F_SETOWN_SOCK_NEG) */ |
| 286 | 4475 fcntl (0, F_SETOWN, getpid ()); |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4476 #endif /* ! defined (F_SETOWN_SOCK_NEG) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4477 #endif /* ! defined (F_SETOWN) */ |
| 286 | 4478 |
| 4479 #ifdef SIGIO | |
| 4480 init_sigio (); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4481 #endif /* ! defined (SIGIO) */ |
| 286 | 4482 |
| 4483 /* Must use interrupt input because we cannot otherwise | |
| 4484 arrange for C-g to be noticed immediately. | |
| 4485 We cannot connect it to SIGINT. */ | |
| 4486 Fset_input_mode (Qt, Qnil, Qt, Qnil); | |
| 4487 | |
| 4488 expose_all_windows = 0; | |
| 4489 | |
| 771 | 4490 clear_frame_hook = XTclear_frame; |
| 286 | 4491 clear_end_of_line_hook = XTclear_end_of_line; |
| 4492 ins_del_lines_hook = XTins_del_lines; | |
| 4493 change_line_highlight_hook = XTchange_line_highlight; | |
| 4494 insert_glyphs_hook = XTinsert_glyphs; | |
| 4495 write_glyphs_hook = XTwrite_glyphs; | |
| 4496 delete_glyphs_hook = XTdelete_glyphs; | |
| 4497 ring_bell_hook = XTring_bell; | |
| 4498 reset_terminal_modes_hook = XTreset_terminal_modes; | |
| 4499 set_terminal_modes_hook = XTset_terminal_modes; | |
| 4500 update_begin_hook = XTupdate_begin; | |
| 4501 update_end_hook = XTupdate_end; | |
| 4502 set_terminal_window_hook = XTset_terminal_window; | |
| 4503 read_socket_hook = XTread_socket; | |
| 4504 cursor_to_hook = XTcursor_to; | |
| 4505 reassert_line_highlight_hook = XTreassert_line_highlight; | |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4506 mouse_position_hook = XTmouse_position; |
| 771 | 4507 frame_rehighlight_hook = XTframe_rehighlight; |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1810
diff
changeset
|
4508 frame_raise_lower_hook = XTframe_raise_lower; |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
4509 set_vertical_scrollbar_hook = XTset_vertical_scrollbar; |
|
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4510 condemn_scrollbars_hook = XTcondemn_scrollbars; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4511 redeem_scrollbar_hook = XTredeem_scrollbar; |
|
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4512 judge_scrollbars_hook = XTjudge_scrollbars; |
| 286 | 4513 |
| 771 | 4514 scroll_region_ok = 1; /* we'll scroll partial frames */ |
| 286 | 4515 char_ins_del_ok = 0; /* just as fast to write the line */ |
| 4516 line_ins_del_ok = 1; /* we'll just blt 'em */ | |
| 4517 fast_clear_end_of_line = 1; /* X does this well */ | |
| 771 | 4518 memory_below_frame = 0; /* we don't remember what scrolls |
| 286 | 4519 off the bottom */ |
| 4520 baud_rate = 19200; | |
| 4521 | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4522 /* Note that there is no real way portable across R3/R4 to get the |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4523 original error handler. */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4524 XHandleError (x_error_quitter); |
|
1875
f569bc4e9b8f
* xterm.c (x_set_window_size): Call change_frame_size instead of
Jim Blandy <jimb@redhat.com>
parents:
1841
diff
changeset
|
4525 XHandleIOError (x_io_error_quitter); |
| 286 | 4526 |
| 4527 /* Disable Window Change signals; they are handled by X events. */ | |
| 4528 #ifdef SIGWINCH | |
| 4529 signal (SIGWINCH, SIG_DFL); | |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4530 #endif /* ! defined (SIGWINCH) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4531 |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4532 signal (SIGPIPE, x_connection_closed); |
| 286 | 4533 } |
| 395 | 4534 |
| 4535 void | |
| 4536 syms_of_xterm () | |
| 4537 { | |
| 4538 staticpro (&invocation_name); | |
| 4539 invocation_name = Qnil; | |
|
1787
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
4540 |
|
5e245540d06f
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1739
diff
changeset
|
4541 staticpro (&last_mouse_scrollbar); |
| 395 | 4542 } |
|
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4543 #endif /* ! defined (HAVE_X11) */ |
|
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4544 #endif /* ! defined (HAVE_X_WINDOWS) */ |
