Mercurial > emacs
annotate src/xterm.c @ 1761:b9ef55b0df4a
(Fwrite_region): Doc fix.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 11 Jan 1993 23:15:30 +0000 |
parents | d738d3690836 |
children | 5e245540d06f |
rev | line source |
---|---|
286 | 1 /* X Communication module for terminals which understand the X protocol. |
621 | 2 Copyright (C) 1989, 1992 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 | |
261 extern Display *XOpenDisplay (); | |
262 extern Window XCreateWindow (); | |
263 | |
264 extern Cursor XCreateCursor (); | |
265 extern FONT_TYPE *XOpenFont (); | |
266 | |
267 static void flashback (); | |
268 | |
269 #ifndef HAVE_X11 | |
270 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
|
271 #endif /* HAVE_X11 */ |
286 | 272 |
273 void dumpborder (); | |
621 | 274 static int XTcursor_to (); |
275 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
|
276 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
277 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
278 /* Starting and ending updates. |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
279 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
280 These hooks are called by update_frame at the beginning and end |
771 | 281 of a frame update. We record in `updating_frame' the identity |
282 of the frame being updated, so that the XT... functions do not | |
283 need to take a frame as argument. Most of the XT... functions | |
286 | 284 should never be called except during an update, the only exceptions |
285 being XTcursor_to, XTwrite_char and XTreassert_line_highlight. */ | |
286 | |
287 extern int mouse_track_top, mouse_track_left, mouse_track_width; | |
288 | |
289 static | |
771 | 290 XTupdate_begin (f) |
291 struct frame *f; | |
286 | 292 { |
293 int mask; | |
294 | |
771 | 295 if (f == 0) |
286 | 296 abort (); |
297 | |
771 | 298 updating_frame = f; |
299 flexlines = f->height; | |
286 | 300 highlight = 0; |
301 | |
302 BLOCK_INPUT; | |
303 #ifndef HAVE_X11 | |
304 dumpqueue (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
305 #endif /* HAVE_X11 */ |
286 | 306 UNBLOCK_INPUT; |
307 } | |
308 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
309 #ifndef HAVE_X11 |
286 | 310 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
|
311 #endif |
286 | 312 |
313 static | |
771 | 314 XTupdate_end (f) |
315 struct frame *f; | |
286 | 316 { |
317 int mask; | |
318 | |
771 | 319 if (updating_frame == 0 |
320 || updating_frame != f) | |
286 | 321 abort (); |
322 | |
323 BLOCK_INPUT; | |
324 #ifndef HAVE_X11 | |
325 dumpqueue (); | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
326 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
|
327 #endif /* HAVE_X11 */ |
286 | 328 |
771 | 329 x_display_cursor (f, 1); |
330 | |
331 updating_frame = 0; | |
286 | 332 XFlushQueue (); |
333 UNBLOCK_INPUT; | |
334 } | |
335 | |
336 /* External interface to control of standout mode. | |
337 Call this when about to modify line at position VPOS | |
338 and not change whether it is highlighted. */ | |
339 | |
340 XTreassert_line_highlight (new, vpos) | |
341 int new, vpos; | |
342 { | |
343 highlight = new; | |
344 } | |
345 | |
346 /* Call this when about to modify line at position VPOS | |
347 and change whether it is highlighted. */ | |
348 | |
349 static | |
350 XTchange_line_highlight (new_highlight, vpos, first_unused_hpos) | |
351 int new_highlight, vpos, first_unused_hpos; | |
352 { | |
353 highlight = new_highlight; | |
354 XTcursor_to (vpos, 0); | |
771 | 355 XTclear_end_of_line (updating_frame->width); |
286 | 356 } |
357 | |
358 /* This is used when starting Emacs and when restarting after suspend. | |
359 When starting Emacs, no X window is mapped. And nothing must be done | |
360 to Emacs's own window if it is suspended (though that rarely happens). */ | |
361 | |
362 static | |
363 XTset_terminal_modes () | |
364 { | |
365 } | |
366 | |
367 /* This is called when exiting or suspending Emacs. | |
368 Exiting will make the X-windows go away, and suspending | |
369 requires no action. */ | |
370 | |
371 static | |
372 XTreset_terminal_modes () | |
373 { | |
771 | 374 /* XTclear_frame (); */ |
286 | 375 } |
376 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
377 /* 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
|
378 This is where display update commands will take effect. |
286 | 379 This does not affect the place where the cursor-box is displayed. */ |
380 | |
621 | 381 static int |
286 | 382 XTcursor_to (row, col) |
383 register int row, col; | |
384 { | |
385 int mask; | |
386 int orow = row; | |
387 | |
388 curs_x = col; | |
389 curs_y = row; | |
390 | |
771 | 391 if (updating_frame == 0) |
286 | 392 { |
393 BLOCK_INPUT; | |
771 | 394 x_display_cursor (selected_frame, 1); |
286 | 395 XFlushQueue (); |
396 UNBLOCK_INPUT; | |
397 } | |
398 } | |
399 | |
400 /* Display a sequence of N glyphs found at GP. | |
401 WINDOW is the x-window to output to. LEFT and TOP are starting coords. | |
402 HL is 1 if this text is highlighted, 2 if the cursor is on it. | |
403 | |
404 FONT is the default font to use (for glyphs whose font-code is 0). */ | |
405 | |
406 static void | |
771 | 407 dumpglyphs (f, left, top, gp, n, hl, font) |
408 struct frame *f; | |
286 | 409 int left, top; |
410 register GLYPH *gp; /* Points to first GLYPH. */ | |
411 register int n; /* Number of glyphs to display. */ | |
412 int hl; | |
413 FONT_TYPE *font; | |
414 { | |
415 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
|
416 Window window = FRAME_X_WINDOW (f); |
771 | 417 GC drawing_gc = (hl == 2 ? f->display.x->cursor_gc |
418 : (hl ? f->display.x->reverse_gc | |
419 : f->display.x->normal_gc)); | |
286 | 420 |
313 | 421 if (sizeof (GLYPH) == sizeof (XChar2b)) |
422 XDrawImageString16 (x_current_display, window, drawing_gc, | |
423 left, top + FONT_BASE (font), (XChar2b *) gp, n); | |
424 else if (sizeof (GLYPH) == sizeof (unsigned char)) | |
425 XDrawImageString (x_current_display, window, drawing_gc, | |
426 left, top + FONT_BASE (font), (char *) gp, n); | |
427 else | |
428 /* What size of glyph ARE you using? And does X have a function to | |
429 draw them? */ | |
430 abort (); | |
286 | 431 } |
432 | |
433 #if 0 | |
434 static void | |
771 | 435 dumpglyphs (f, left, top, gp, n, hl, font) |
436 struct frame *f; | |
286 | 437 int left, top; |
438 register GLYPH *gp; /* Points to first GLYPH. */ | |
439 register int n; /* Number of glyphs to display. */ | |
440 int hl; | |
441 FONT_TYPE *font; | |
442 { | |
771 | 443 char buf[f->width]; /* Holds characters to be displayed. */ |
286 | 444 register char *cp; /* Steps through buf[]. */ |
445 register int tlen = GLYPH_TABLE_LENGTH; | |
446 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
|
447 Window window = FRAME_X_WINDOW (f); |
771 | 448 int cursor_pixel = f->display.x->cursor_pixel; |
449 int fg_pixel = f->display.x->foreground_pixel; | |
450 int bg_pixel = f->display.x->background_pixel; | |
451 int intborder = f->display.x->internal_border_width; | |
286 | 452 |
453 while (n) | |
454 { | |
455 /* Get the face-code of the next GLYPH. */ | |
456 int cf, len; | |
457 int g = *gp; | |
458 | |
459 while (GLYPH_ALIAS_P (tbase, tlen, g)) | |
460 g = GLYPH_ALIAS (tbase, g); | |
461 | |
462 cf = g >> 8; | |
463 | |
464 /* Find the run of consecutive glyphs with the same face-code. | |
465 Extract their character codes into BUF. */ | |
466 cp = buf; | |
467 while (n > 0) | |
468 { | |
469 g = *gp; | |
470 while (GLYPH_ALIAS_P (tbase, tlen, g)) | |
471 g = GLYPH_ALIAS (tbase, g); | |
472 if ((g >> 8) != cf) | |
473 break; | |
474 | |
475 *cp++ = 0377 & g; | |
476 --n; | |
477 ++gp; | |
478 } | |
479 | |
480 /* LEN gets the length of the run. */ | |
481 len = cp - buf; | |
482 | |
483 /* Now output this run of chars, with the font and pixel values | |
484 determined by the face code CF. */ | |
485 if (cf == 0) | |
486 { | |
487 #ifdef HAVE_X11 | |
771 | 488 GC GC_cursor = f->display.x->cursor_gc; |
489 GC GC_reverse = f->display.x->reverse_gc; | |
490 GC GC_normal = f->display.x->normal_gc; | |
286 | 491 |
492 XDrawImageString (x_current_display, window, | |
493 (hl == 2 | |
494 ? GC_cursor | |
495 : (hl ? GC_reverse : GC_normal)), | |
496 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
|
497 #else /* ! defined (HAVE_X11) */ |
286 | 498 XText (window, left, top, |
499 buf, | |
500 len, | |
501 font->id, | |
502 (hl == 2 | |
503 ? (cursor_pixel == fg_pixel ? bg_pixel : fg_pixel) | |
504 : hl ? bg_pixel : fg_pixel), | |
505 (hl == 2 ? cursor_pixel | |
506 : 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
|
507 #endif /* ! defined (HAVE_X11) */ |
286 | 508 } |
509 else | |
510 { | |
511 #ifdef HAVE_X11 | |
512 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
|
513 XDrawImageString (x_current_display, FRAME_X_WINDOW (f), |
286 | 514 FACE_GC (cf), |
515 left, top + FONT_BASE (FACE_FONT (cf)), | |
516 buf, len); | |
517 else if (FACE_IS_IMAGE (cf)) | |
518 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
|
519 FRAME_X_WINDOW (f), |
771 | 520 f->display.x->normal_gc, |
286 | 521 0, 0, |
522 FACE_IMAGE_WIDTH (cf), | |
523 FACE_IMAGE_HEIGHT (cf), left, top); | |
524 else | |
525 abort (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
526 #else /* ! defined (HAVE_X11) */ |
286 | 527 register struct face *fp = x_face_table[cf]; |
528 | |
529 XText (window, left, top, | |
530 buf, | |
531 len, | |
532 fp->font->id, | |
533 (hl == 2 | |
534 ? (cursor_pixel == fp->fg ? fp->bg : fp->fg) | |
535 : hl ? fp->bg : fp->fg), | |
536 (hl == 2 ? cursor_pixel | |
537 : 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
|
538 #endif /* ! defined (HAVE_X11) */ |
286 | 539 } |
540 left += len * FONT_WIDTH (font); | |
541 } | |
542 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
543 #endif /* ! 0 */ |
286 | 544 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
545 /* 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
|
546 Advance the cursor over the text. |
286 | 547 Output LEN glyphs at START. |
548 | |
549 `highlight', set up by XTreassert_line_highlight or XTchange_line_highlight, | |
550 controls the pixel values used for foreground and background. */ | |
551 | |
552 static | |
553 XTwrite_glyphs (start, len) | |
554 register GLYPH *start; | |
555 int len; | |
556 { | |
557 register int temp_length; | |
558 int mask; | |
771 | 559 struct frame *f; |
286 | 560 |
561 BLOCK_INPUT; | |
562 | |
771 | 563 f = updating_frame; |
564 if (f == 0) | |
286 | 565 { |
771 | 566 f = selected_frame; |
286 | 567 /* If not within an update, |
771 | 568 output at the frame's visible cursor. */ |
569 curs_x = f->cursor_x; | |
570 curs_y = f->cursor_y; | |
286 | 571 } |
572 | |
771 | 573 dumpglyphs (f, |
574 (curs_x * FONT_WIDTH (f->display.x->font) | |
575 + f->display.x->internal_border_width), | |
576 (curs_y * FONT_HEIGHT (f->display.x->font) | |
577 + f->display.x->internal_border_width), | |
578 start, len, highlight, f->display.x->font); | |
429 | 579 |
580 /* If we drew on top of the cursor, note that it is turned off. */ | |
771 | 581 if (curs_y == f->phys_cursor_y |
582 && curs_x <= f->phys_cursor_x | |
583 && curs_x + len > f->phys_cursor_x) | |
584 f->phys_cursor_x = -1; | |
286 | 585 |
771 | 586 if (updating_frame == 0) |
286 | 587 { |
771 | 588 f->cursor_x += len; |
589 x_display_cursor (f, 1); | |
590 f->cursor_x -= len; | |
286 | 591 } |
592 else | |
593 curs_x += len; | |
594 | |
595 UNBLOCK_INPUT; | |
596 } | |
597 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
598 /* 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
|
599 Erase the current text line from the nominal cursor position (inclusive) |
286 | 600 to column FIRST_UNUSED (exclusive). The idea is that everything |
601 from FIRST_UNUSED onward is already erased. */ | |
602 | |
621 | 603 static int |
286 | 604 XTclear_end_of_line (first_unused) |
605 register int first_unused; | |
606 { | |
771 | 607 struct frame *f = updating_frame; |
286 | 608 int mask; |
609 | |
771 | 610 if (f == 0) |
286 | 611 abort (); |
612 | |
771 | 613 if (curs_y < 0 || curs_y >= f->height) |
286 | 614 return; |
615 if (first_unused <= 0) | |
616 return; | |
617 | |
771 | 618 if (first_unused >= f->width) |
619 first_unused = f->width; | |
286 | 620 |
621 BLOCK_INPUT; | |
622 | |
429 | 623 /* Notice if the cursor will be cleared by this operation. */ |
771 | 624 if (curs_y == f->phys_cursor_y |
625 && curs_x <= f->phys_cursor_x | |
626 && f->phys_cursor_x < first_unused) | |
627 f->phys_cursor_x = -1; | |
286 | 628 |
629 #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
|
630 XClearArea (x_current_display, FRAME_X_WINDOW (f), |
771 | 631 curs_x * FONT_WIDTH (f->display.x->font) |
632 + f->display.x->internal_border_width, | |
633 curs_y * FONT_HEIGHT (f->display.x->font) | |
634 + f->display.x->internal_border_width, | |
635 FONT_WIDTH (f->display.x->font) * (first_unused - curs_x), | |
636 FONT_HEIGHT (f->display.x->font), False); | |
286 | 637 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
638 #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
|
639 XPixSet (FRAME_X_WINDOW (f), |
771 | 640 curs_x * FONT_WIDTH (f->display.x->font) + f->display.x->internal_border_width, |
641 curs_y * FONT_HEIGHT (f->display.x->font) + f->display.x->internal_border_width, | |
642 FONT_WIDTH (f->display.x->font) * (first_unused - curs_x), | |
643 FONT_HEIGHT (f->display.x->font), | |
644 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
|
645 #endif /* ! defined (HAVE_X11) */ |
286 | 646 |
647 UNBLOCK_INPUT; | |
648 } | |
649 | |
650 static | |
771 | 651 XTclear_frame () |
286 | 652 { |
653 int mask; | |
771 | 654 struct frame *f = updating_frame; |
655 | |
656 if (f == 0) | |
657 f = selected_frame; | |
658 | |
659 f->phys_cursor_x = -1; /* Cursor not visible. */ | |
286 | 660 curs_x = 0; /* Nominal cursor position is top left. */ |
661 curs_y = 0; | |
662 | |
663 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
|
664 XClear (FRAME_X_WINDOW (f)); |
286 | 665 #ifndef HAVE_X11 |
771 | 666 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
|
667 #endif /* HAVE_X11 */ |
286 | 668 XFlushQueue (); |
669 UNBLOCK_INPUT; | |
670 } | |
671 | |
771 | 672 /* Paint horzontal bars down the frame for a visible bell. |
286 | 673 Note that this may be way too slow on some machines. */ |
674 | |
771 | 675 XTflash (f) |
676 struct frame *f; | |
286 | 677 { |
771 | 678 register struct frame_glyphs *active_frame = FRAME_CURRENT_GLYPHS (f); |
286 | 679 register int i; |
680 int x, y; | |
681 | |
771 | 682 if (updating_frame != 0) |
286 | 683 abort (); |
684 | |
685 BLOCK_INPUT; | |
686 #ifdef HAVE_X11 | |
687 #if 0 | |
771 | 688 for (i = f->height * FONT_HEIGHT (f->display.x->font) - 10; |
286 | 689 i >= 0; |
690 i -= 100) /* Should be NO LOWER than 75 for speed reasons. */ | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
691 XFillRectangle (x_current_display, FRAME_X_WINDOW (f), |
771 | 692 f->display.x->cursor_gc, |
693 0, i, f->width * FONT_WIDTH (f->display.x->font) | |
694 + 2 * f->display.x->internal_border_width, 25); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
695 #endif /* ! 0 */ |
286 | 696 |
771 | 697 x = (f->width * FONT_WIDTH (f->display.x->font)) / 4; |
698 y = (f->height * FONT_HEIGHT (f->display.x->font)) / 4; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
699 XFillRectangle (x_current_display, FRAME_X_WINDOW (f), |
771 | 700 f->display.x->cursor_gc, |
286 | 701 x, y, 2 * x, 2 * y); |
771 | 702 dumpglyphs (f, (x + f->display.x->internal_border_width), |
703 (y + f->display.x->internal_border_width), | |
704 &active_frame->glyphs[(f->height / 4) + 1][(f->width / 4)], | |
705 1, 0, f->display.x->font); | |
286 | 706 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
707 #else /* ! defined (HAVE_X11) */ |
771 | 708 for (i = f->height * FONT_HEIGHT (f->display.x->font) - 10; |
286 | 709 i >= 0; |
710 i -= 50) | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
711 XPixFill (FRAME_X_WINDOW (f), 0, i, |
771 | 712 f->width * FONT_WIDTH (f->display.x->font) |
713 + 2 * f->display.x->internal_border_width, 10, | |
286 | 714 WHITE_PIX_DEFAULT, ClipModeClipped, GXinvert, AllPlanes); |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
715 #endif /* ! defined (HAVE_X11) */ |
286 | 716 |
717 XFlushQueue (); | |
718 UNBLOCK_INPUT; | |
719 } | |
720 | |
771 | 721 /* Flip background and forground colors of the frame. */ |
722 | |
723 x_invert_frame (f) | |
724 struct frame *f; | |
286 | 725 { |
726 #ifdef HAVE_X11 | |
727 GC temp; | |
728 unsigned long pix_temp; | |
729 | |
771 | 730 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
|
731 XClearWindow (x_current_display, FRAME_X_WINDOW (f)); |
771 | 732 temp = f->display.x->normal_gc; |
733 f->display.x->normal_gc = f->display.x->reverse_gc; | |
734 f->display.x->reverse_gc = temp; | |
735 pix_temp = f->display.x->foreground_pixel; | |
736 f->display.x->foreground_pixel = f->display.x->background_pixel; | |
737 f->display.x->background_pixel = pix_temp; | |
738 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
739 XSetWindowBackground (x_current_display, FRAME_X_WINDOW (f), |
771 | 740 f->display.x->background_pixel); |
741 if (f->display.x->background_pixel == f->display.x->cursor_pixel) | |
286 | 742 { |
771 | 743 f->display.x->cursor_pixel = f->display.x->foreground_pixel; |
744 XSetBackground (x_current_display, f->display.x->cursor_gc, | |
745 f->display.x->cursor_pixel); | |
746 XSetForeground (x_current_display, f->display.x->cursor_gc, | |
747 f->display.x->background_pixel); | |
286 | 748 } |
771 | 749 redraw_frame (f); |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
750 #endif /* ! defined (HAVE_X11) */ |
286 | 751 } |
752 | |
753 /* Make audible bell. */ | |
754 | |
755 #ifdef HAVE_X11 | |
756 #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
|
757 #else /* ! defined (HAVE_X11) */ |
286 | 758 #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
|
759 #endif /* ! defined (HAVE_X11) */ |
286 | 760 |
761 XTring_bell () | |
762 { | |
763 if (visible_bell) | |
764 #if 0 | |
771 | 765 XTflash (selected_frame); |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
766 #endif /* ! 0 */ |
286 | 767 { |
771 | 768 x_invert_frame (selected_frame); |
769 x_invert_frame (selected_frame); | |
286 | 770 } |
771 else | |
772 { | |
773 BLOCK_INPUT; | |
774 XRINGBELL; | |
775 XFlushQueue (); | |
776 UNBLOCK_INPUT; | |
777 } | |
778 } | |
779 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
780 /* Insert and delete character. |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
781 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
|
782 off the feature of using them. */ |
286 | 783 |
784 static | |
785 XTinsert_glyphs (start, len) | |
786 register char *start; | |
787 register int len; | |
788 { | |
789 abort (); | |
790 } | |
791 | |
792 static | |
793 XTdelete_glyphs (n) | |
794 register int n; | |
795 { | |
796 abort (); | |
797 } | |
798 | |
799 /* Specify how many text lines, from the top of the window, | |
800 should be affected by insert-lines and delete-lines operations. | |
801 This, and those operations, are used only within an update | |
802 that is bounded by calls to XTupdate_begin and XTupdate_end. */ | |
803 | |
804 static | |
805 XTset_terminal_window (n) | |
806 register int n; | |
807 { | |
771 | 808 if (updating_frame == 0) |
286 | 809 abort (); |
810 | |
771 | 811 if ((n <= 0) || (n > updating_frame->height)) |
812 flexlines = updating_frame->height; | |
286 | 813 else |
814 flexlines = n; | |
815 } | |
816 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
817 /* 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
|
818 Insert N lines at a vertical position curs_y. */ |
286 | 819 |
820 static void | |
821 stufflines (n) | |
822 register int n; | |
823 { | |
824 register int topregion, bottomregion; | |
825 register int length, newtop, mask; | |
771 | 826 register struct frame *f = updating_frame; |
827 int intborder = f->display.x->internal_border_width; | |
286 | 828 |
829 if (curs_y >= flexlines) | |
830 return; | |
831 | |
832 topregion = curs_y; | |
833 bottomregion = flexlines - (n + 1); | |
834 newtop = topregion + n; | |
835 length = (bottomregion - topregion) + 1; | |
836 | |
837 #ifndef HAVE_X11 | |
838 dumpqueue (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
839 #endif /* HAVE_X11 */ |
286 | 840 |
841 if ((length > 0) && (newtop <= flexlines)) | |
842 { | |
843 #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
|
844 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
|
845 FRAME_X_WINDOW (f), f->display.x->normal_gc, |
771 | 846 intborder, topregion * FONT_HEIGHT (f->display.x->font) + intborder, |
847 f->width * FONT_WIDTH (f->display.x->font), | |
848 length * FONT_HEIGHT (f->display.x->font), intborder, | |
849 newtop * FONT_HEIGHT (f->display.x->font) + intborder); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
850 #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
|
851 XMoveArea (FRAME_X_WINDOW (f), |
771 | 852 intborder, topregion * FONT_HEIGHT (f->display.x->font) + intborder, |
853 intborder, newtop * FONT_HEIGHT (f->display.x->font) + intborder, | |
854 f->width * FONT_WIDTH (f->display.x->font), | |
855 length * FONT_HEIGHT (f->display.x->font)); | |
286 | 856 /* Now we must process any ExposeRegion events that occur |
857 if the area being copied from is obscured. | |
858 We can't let it wait because further i/d operations | |
859 may want to copy this area to another area. */ | |
860 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
|
861 #endif /* ! defined (HAVE_X11) */ |
286 | 862 } |
863 | |
864 newtop = min (newtop, (flexlines - 1)); | |
865 length = newtop - topregion; | |
866 if (length > 0) | |
867 { | |
868 #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
|
869 XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder, |
771 | 870 topregion * FONT_HEIGHT (f->display.x->font) + intborder, |
871 f->width * FONT_WIDTH (f->display.x->font), | |
872 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
|
873 #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
|
874 XPixSet (FRAME_X_WINDOW (f), |
286 | 875 intborder, |
771 | 876 topregion * FONT_HEIGHT (f->display.x->font) + intborder, |
877 f->width * FONT_WIDTH (f->display.x->font), | |
878 n * FONT_HEIGHT (f->display.x->font), | |
879 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
|
880 #endif /* ! defined (HAVE_X11) */ |
286 | 881 } |
882 } | |
883 | |
884 /* Perform a delete-lines operation, deleting N lines | |
885 at a vertical position curs_y. */ | |
886 | |
887 static void | |
888 scraplines (n) | |
889 register int n; | |
890 { | |
891 int mask; | |
771 | 892 register struct frame *f = updating_frame; |
893 int intborder = f->display.x->internal_border_width; | |
286 | 894 |
895 if (curs_y >= flexlines) | |
896 return; | |
897 | |
898 #ifndef HAVE_X11 | |
899 dumpqueue (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
900 #endif /* HAVE_X11 */ |
286 | 901 |
902 if ((curs_y + n) >= flexlines) | |
903 { | |
904 if (flexlines >= (curs_y + 1)) | |
905 { | |
906 #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
|
907 XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder, |
771 | 908 curs_y * FONT_HEIGHT (f->display.x->font) + intborder, |
909 f->width * FONT_WIDTH (f->display.x->font), | |
910 (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
|
911 #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
|
912 XPixSet (FRAME_X_WINDOW (f), |
771 | 913 intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder, |
914 f->width * FONT_WIDTH (f->display.x->font), | |
915 (flexlines - curs_y) * FONT_HEIGHT (f->display.x->font), | |
916 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
|
917 #endif /* ! defined (HAVE_X11) */ |
286 | 918 } |
919 } | |
920 else | |
921 { | |
922 #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
|
923 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
|
924 FRAME_X_WINDOW (f), f->display.x->normal_gc, |
286 | 925 intborder, |
771 | 926 (curs_y + n) * FONT_HEIGHT (f->display.x->font) + intborder, |
927 f->width * FONT_WIDTH (f->display.x->font), | |
928 (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font), | |
929 intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
930 XClearArea (x_current_display, FRAME_X_WINDOW (f), |
286 | 931 intborder, |
771 | 932 (flexlines - n) * FONT_HEIGHT (f->display.x->font) + intborder, |
933 f->width * FONT_WIDTH (f->display.x->font), | |
934 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
|
935 #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
|
936 XMoveArea (FRAME_X_WINDOW (f), |
286 | 937 intborder, |
771 | 938 (curs_y + n) * FONT_HEIGHT (f->display.x->font) + intborder, |
939 intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder, | |
940 f->width * FONT_WIDTH (f->display.x->font), | |
941 (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font)); | |
286 | 942 /* Now we must process any ExposeRegion events that occur |
943 if the area being copied from is obscured. | |
944 We can't let it wait because further i/d operations | |
945 may want to copy this area to another area. */ | |
946 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
|
947 XPixSet (FRAME_X_WINDOW (f), intborder, |
771 | 948 (flexlines - n) * FONT_HEIGHT (f->display.x->font) + intborder, |
949 f->width * FONT_WIDTH (f->display.x->font), | |
950 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
|
951 #endif /* ! defined (HAVE_X11) */ |
286 | 952 } |
953 } | |
954 | |
955 /* Perform an insert-lines or delete-lines operation, | |
956 inserting N lines or deleting -N lines at vertical position VPOS. */ | |
957 | |
958 XTins_del_lines (vpos, n) | |
959 int vpos, n; | |
960 { | |
771 | 961 if (updating_frame == 0) |
286 | 962 abort (); |
963 | |
429 | 964 /* Hide the cursor. */ |
771 | 965 x_display_cursor (updating_frame, 0); |
286 | 966 |
967 XTcursor_to (vpos, 0); | |
968 | |
969 BLOCK_INPUT; | |
970 if (n >= 0) | |
971 stufflines (n); | |
972 else | |
973 scraplines (-n); | |
974 XFlushQueue (); | |
975 UNBLOCK_INPUT; | |
976 } | |
977 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
978 /* Support routines for exposure events. */ |
286 | 979 static void clear_cursor (); |
980 | |
771 | 981 /* Output into a rectangle of an X-window (for frame F) |
982 the characters in f->phys_lines that overlap that rectangle. | |
286 | 983 TOP and LEFT are the position of the upper left corner of the rectangle. |
984 ROWS and COLS are the size of the rectangle. */ | |
985 | |
986 static void | |
771 | 987 dumprectangle (f, left, top, cols, rows) |
988 struct frame *f; | |
286 | 989 register int left, top, cols, rows; |
990 { | |
771 | 991 register struct frame_glyphs *active_frame = FRAME_CURRENT_GLYPHS (f); |
286 | 992 int cursor_cleared = 0; |
993 int bottom, right; | |
994 register int y; | |
995 | |
771 | 996 if (FRAME_GARBAGED_P (f)) |
286 | 997 return; |
998 | |
771 | 999 top -= f->display.x->internal_border_width; |
1000 left -= f->display.x->internal_border_width; | |
286 | 1001 |
1002 /* Express rectangle as four edges, instead of position-and-size. */ | |
1003 bottom = top + rows; | |
1004 right = left + cols; | |
1005 | |
1006 #ifndef HAVE_X11 /* Window manger does this for X11. */ | |
1007 /* If the rectangle includes any of the internal border area, | |
1008 redisplay the border emphasis. */ | |
1009 if (top < 0 || left < 0 | |
771 | 1010 || bottom > f->height * FONT_HEIGHT (f->display.x->font) |
1011 || right > f->width * FONT_WIDTH (f->display.x->font)) | |
1012 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
|
1013 #endif /* HAVE_X11 /* Window manger does this for X11. */ */ |
286 | 1014 |
1015 /* Convert rectangle edges in pixels to edges in chars. | |
1016 Round down for left and top, up for right and bottom. */ | |
771 | 1017 top /= FONT_HEIGHT (f->display.x->font); |
1018 left /= FONT_WIDTH (f->display.x->font); | |
1019 bottom += (FONT_HEIGHT (f->display.x->font) - 1); | |
1020 right += (FONT_WIDTH (f->display.x->font) - 1); | |
1021 bottom /= FONT_HEIGHT (f->display.x->font); | |
1022 right /= FONT_WIDTH (f->display.x->font); | |
286 | 1023 |
1024 /* Clip the rectangle to what can be visible. */ | |
1025 if (left < 0) | |
1026 left = 0; | |
1027 if (top < 0) | |
1028 top = 0; | |
771 | 1029 if (right > f->width) |
1030 right = f->width; | |
1031 if (bottom > f->height) | |
1032 bottom = f->height; | |
286 | 1033 |
1034 /* Get size in chars of the rectangle. */ | |
1035 cols = right - left; | |
1036 rows = bottom - top; | |
1037 | |
1038 /* If rectangle has zero area, return. */ | |
1039 if (rows <= 0) return; | |
1040 if (cols <= 0) return; | |
1041 | |
1042 /* Turn off the cursor if it is in the rectangle. | |
1043 We will turn it back on afterward. */ | |
771 | 1044 if ((f->phys_cursor_x >= left) && (f->phys_cursor_x < right) |
1045 && (f->phys_cursor_y >= top) && (f->phys_cursor_y < bottom)) | |
286 | 1046 { |
771 | 1047 clear_cursor (f); |
286 | 1048 cursor_cleared = 1; |
1049 } | |
1050 | |
1051 /* Display the text in the rectangle, one text line at a time. */ | |
1052 | |
1053 for (y = top; y < bottom; y++) | |
1054 { | |
771 | 1055 GLYPH *line = &active_frame->glyphs[y][left]; |
1056 | |
1057 if (! active_frame->enable[y] || left > active_frame->used[y]) | |
286 | 1058 continue; |
1059 | |
771 | 1060 dumpglyphs (f, |
1061 (left * FONT_WIDTH (f->display.x->font) | |
1062 + f->display.x->internal_border_width), | |
1063 (y * FONT_HEIGHT (f->display.x->font) | |
1064 + f->display.x->internal_border_width), | |
1065 line, min (cols, active_frame->used[y] - left), | |
1066 active_frame->highlight[y], f->display.x->font); | |
286 | 1067 } |
1068 | |
1069 /* Turn the cursor on if we turned it off. */ | |
1070 | |
1071 if (cursor_cleared) | |
771 | 1072 x_display_cursor (f, 1); |
286 | 1073 } |
1074 | |
1075 #ifndef HAVE_X11 | |
1076 /* Process all queued ExposeRegion events. */ | |
1077 | |
1078 static void | |
1079 dumpqueue () | |
1080 { | |
1081 register int i; | |
1082 XExposeRegionEvent r; | |
1083 | |
1084 while (dequeue_event (&r, &x_expose_queue)) | |
1085 { | |
771 | 1086 struct frame *f = x_window_to_frame (r.window); |
1087 if (f->display.x->icon_desc == r.window) | |
1088 refreshicon (f); | |
286 | 1089 else |
771 | 1090 dumprectangle (f, r.x, r.y, r.width, r.height); |
286 | 1091 } |
1092 XFlushQueue (); | |
1093 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1094 #endif /* HAVE_X11 */ |
286 | 1095 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1096 /* Process all expose events that are pending, for X10. |
771 | 1097 Redraws the cursor if necessary on any frame that |
1098 is not in the process of being updated with update_frame. */ | |
286 | 1099 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1100 #ifndef HAVE_X11 |
286 | 1101 static void |
1102 x_do_pending_expose () | |
1103 { | |
1104 int mask; | |
771 | 1105 struct frame *f; |
1106 Lisp_Object tail, frame; | |
286 | 1107 |
1108 if (expose_all_windows) | |
1109 { | |
1110 expose_all_windows = 0; | |
771 | 1111 for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr) |
286 | 1112 { |
1113 register int temp_width, temp_height; | |
1114 int intborder; | |
1115 | |
771 | 1116 frame = XCONS (tail)->car; |
1117 if (XTYPE (frame) != Lisp_Frame) | |
286 | 1118 continue; |
771 | 1119 f = XFRAME (frame); |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
1120 if (! FRAME_X_P (f)) |
286 | 1121 continue; |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
1122 if (!f->async_visible) |
286 | 1123 continue; |
771 | 1124 if (!f->display.x->needs_exposure) |
286 | 1125 continue; |
1126 | |
771 | 1127 intborder = f->display.x->internal_border_width; |
1128 | |
1129 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
|
1130 XGetWindowInfo (FRAME_X_WINDOW (f), &windowinfo); |
286 | 1131 temp_width = ((windowinfo.width - 2 * intborder |
771 | 1132 - f->display.x->v_scrollbar_width) |
1133 / FONT_WIDTH (f->display.x->font)); | |
286 | 1134 temp_height = ((windowinfo.height- 2 * intborder |
771 | 1135 - f->display.x->h_scrollbar_height) |
1136 / FONT_HEIGHT (f->display.x->font)); | |
1137 if (temp_width != f->width || temp_height != f->height) | |
286 | 1138 { |
771 | 1139 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
|
1140 max (1, temp_width), 0, 1); |
771 | 1141 x_resize_scrollbars (f); |
286 | 1142 } |
771 | 1143 f->display.x->left_pos = windowinfo.x; |
1144 f->display.x->top_pos = windowinfo.y; | |
1145 dumprectangle (f, 0, 0, PIXEL_WIDTH (f), PIXEL_HEIGHT (f)); | |
286 | 1146 #if 0 |
771 | 1147 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
|
1148 #endif /* ! 0 */ |
771 | 1149 f->display.x->needs_exposure = 0; |
1150 if (updating_frame != f) | |
1151 x_display_cursor (f, 1); | |
286 | 1152 XFlushQueue (); |
1153 } | |
1154 } | |
1155 else | |
1156 /* Handle any individual-rectangle expose events queued | |
1157 for various windows. */ | |
1158 #ifdef HAVE_X11 | |
1159 ; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1160 #else /* ! defined (HAVE_X11) */ |
286 | 1161 dumpqueue (); |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1162 #endif /* ! defined (HAVE_X11) */ |
286 | 1163 } |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1164 #endif |
286 | 1165 |
1166 #ifdef HAVE_X11 | |
1167 static void | |
771 | 1168 frame_highlight (frame) |
1169 struct frame *frame; | |
286 | 1170 { |
1171 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
|
1172 XSetWindowBorder (x_current_display, FRAME_X_WINDOW (frame), |
771 | 1173 frame->display.x->border_pixel); |
1174 x_display_cursor (frame, 1); | |
286 | 1175 } |
1176 | |
1177 static void | |
771 | 1178 frame_unhighlight (frame) |
1179 struct frame *frame; | |
286 | 1180 { |
1181 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
|
1182 XSetWindowBorderPixmap (x_current_display, FRAME_X_WINDOW (frame), |
771 | 1183 frame->display.x->border_tile); |
1184 x_display_cursor (frame, 1); | |
286 | 1185 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1186 #else /* ! defined (HAVE_X11) */ |
771 | 1187 /* Dump the border-emphasis of frame F. |
1188 If F is selected, this is a lining of the same color as the border, | |
286 | 1189 just within the border, occupying a portion of the internal border. |
771 | 1190 If F is not selected, it is background in the same place. |
286 | 1191 If ALWAYS is 0, don't bother explicitly drawing if it's background. |
1192 | |
771 | 1193 ALWAYS = 1 is used when a frame becomes selected or deselected. |
286 | 1194 In that case, we also turn the cursor off and on again |
1195 so it will appear in the proper shape (solid if selected; else hollow.) */ | |
1196 | |
1197 static void | |
771 | 1198 dumpborder (f, always) |
1199 struct frame *f; | |
286 | 1200 int always; |
1201 { | |
771 | 1202 int thickness = f->display.x->internal_border_width / 2; |
1203 int width = PIXEL_WIDTH (f); | |
1204 int height = PIXEL_HEIGHT (f); | |
286 | 1205 int pixel; |
1206 | |
771 | 1207 if (f != selected_frame) |
286 | 1208 { |
1209 if (!always) | |
1210 return; | |
1211 | |
771 | 1212 pixel = f->display.x->background_pixel; |
286 | 1213 } |
1214 else | |
1215 { | |
771 | 1216 pixel = f->display.x->border_pixel; |
286 | 1217 } |
1218 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1219 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
|
1220 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
|
1221 XPixSet (FRAME_X_WINDOW (f), 0, height - thickness, width, |
286 | 1222 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
|
1223 XPixSet (FRAME_X_WINDOW (f), width - thickness, 0, thickness, |
286 | 1224 height, pixel); |
1225 | |
1226 if (always) | |
771 | 1227 x_display_cursor (f, 1); |
286 | 1228 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1229 #endif /* ! defined (HAVE_X11) */ |
286 | 1230 |
771 | 1231 static void XTframe_rehighlight (); |
1232 | |
1233 /* The focus has changed. Update the frames as necessary to reflect | |
1234 the new situation. Note that we can't change the selected frame | |
286 | 1235 here, because the lisp code we are interrupting might become confused. |
771 | 1236 Each event gets marked with the frame in which it occured, so the |
369 | 1237 lisp code can tell when the switch took place by examining the events. */ |
1238 | |
1239 static void | |
771 | 1240 x_new_focus_frame (frame) |
1241 struct frame *frame; | |
286 | 1242 { |
771 | 1243 struct frame *old_focus = x_focus_frame; |
286 | 1244 int events_enqueued = 0; |
1245 | |
771 | 1246 if (frame != x_focus_frame) |
286 | 1247 { |
369 | 1248 /* Set this before calling other routines, so that they see |
771 | 1249 the correct value of x_focus_frame. */ |
1250 x_focus_frame = frame; | |
369 | 1251 |
1252 if (old_focus && old_focus->auto_lower) | |
771 | 1253 x_lower_frame (old_focus); |
286 | 1254 |
1255 #if 0 | |
771 | 1256 selected_frame = frame; |
1257 XSET (XWINDOW (selected_frame->selected_window)->frame, | |
1258 Lisp_Frame, selected_frame); | |
1259 Fselect_window (selected_frame->selected_window); | |
1260 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
|
1261 #endif /* ! 0 */ |
286 | 1262 |
771 | 1263 if (x_focus_frame && x_focus_frame->auto_raise) |
1264 x_raise_frame (x_focus_frame); | |
369 | 1265 } |
1266 | |
771 | 1267 XTframe_rehighlight (); |
369 | 1268 } |
1269 | |
1270 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1271 /* 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
|
1272 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
|
1273 minibuffer frame). Shift the highlight as appropriate. */ |
369 | 1274 static void |
771 | 1275 XTframe_rehighlight () |
369 | 1276 { |
771 | 1277 struct frame *old_highlight = x_highlight_frame; |
1278 | |
1279 if (x_focus_frame) | |
286 | 1280 { |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1281 x_highlight_frame = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1282 ((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
|
1283 ? 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
|
1284 : x_focus_frame); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1285 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
|
1286 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1287 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
|
1288 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
|
1289 } |
286 | 1290 } |
369 | 1291 else |
771 | 1292 x_highlight_frame = 0; |
1293 | |
1294 if (x_highlight_frame != old_highlight) | |
369 | 1295 { |
1296 if (old_highlight) | |
771 | 1297 frame_unhighlight (old_highlight); |
1298 if (x_highlight_frame) | |
1299 frame_highlight (x_highlight_frame); | |
369 | 1300 } |
286 | 1301 } |
1302 | |
429 | 1303 /* Mouse clicks and mouse movement. Rah. */ |
1304 #ifdef HAVE_X11 | |
1305 | |
771 | 1306 /* Given a pixel position (PIX_X, PIX_Y) on the frame F, return |
429 | 1307 glyph co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle |
1308 that the glyph at X, Y occupies, if BOUNDS != 0. */ | |
1309 static void | |
771 | 1310 pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds) |
1311 FRAME_PTR f; | |
286 | 1312 register unsigned int pix_x, pix_y; |
1313 register int *x, *y; | |
429 | 1314 XRectangle *bounds; |
286 | 1315 { |
771 | 1316 int ibw = f->display.x->internal_border_width; |
429 | 1317 int width, height; |
771 | 1318 FONT_TYPE *font = f->display.x->font; |
429 | 1319 |
1320 width = FONT_WIDTH (font); | |
1321 height = FONT_HEIGHT (font); | |
286 | 1322 |
1323 /* What line is it on? */ | |
429 | 1324 if (pix_y < ibw) |
1325 *y = 0; | |
771 | 1326 else if (pix_y > f->display.x->pixel_height - ibw) |
1327 *y = FRAME_HEIGHT (f) - 1; | |
429 | 1328 else |
1329 *y = (pix_y - ibw) / height; | |
1330 | |
1331 /* And what column? */ | |
286 | 1332 if (pix_x < ibw) |
1333 *x = 0; | |
771 | 1334 else if (pix_x > f->display.x->pixel_width - ibw) |
1335 *x = FRAME_WIDTH (f) - 1; | |
286 | 1336 else |
429 | 1337 *x = (pix_x - ibw) / width; |
1338 | |
1339 if (bounds) | |
1340 { | |
1341 bounds->width = width; | |
1342 bounds->height = height; | |
1343 bounds->x = ibw + (*x * width); | |
1344 bounds->y = ibw + (*y * height); | |
1345 } | |
286 | 1346 } |
1347 | |
1348 /* Any buttons grabbed. */ | |
1349 unsigned int x_mouse_grabbed; | |
1350 | |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1351 /* 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
|
1352 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1353 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
|
1354 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
|
1355 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
|
1356 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
|
1357 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
|
1358 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1359 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
|
1360 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
|
1361 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
|
1362 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
|
1363 |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1364 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
|
1365 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
|
1366 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
|
1367 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
|
1368 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
|
1369 (EVENT.state & x_shift_lock_mask) != 0. */ |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1370 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
|
1371 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1372 /* 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
|
1373 static void |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1374 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
|
1375 { |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1376 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
|
1377 KeySym *syms; |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1378 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
|
1379 XModifierKeymap *mods; |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1380 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
|
1381 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1382 x_meta_mod_mask = 0; |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1383 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
|
1384 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1385 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
|
1386 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
|
1387 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
|
1388 &syms_per_code); |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1389 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
|
1390 |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1391 /* 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
|
1392 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
|
1393 { |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1394 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
|
1395 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1396 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
|
1397 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
|
1398 { |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1399 KeyCode code = |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1400 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
|
1401 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1402 /* 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
|
1403 { |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1404 int code_col; |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1405 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1406 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
|
1407 { |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1408 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
|
1409 |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1410 switch (sym) |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1411 { |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1412 case XK_Meta_L: |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1413 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
|
1414 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
|
1415 break; |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1416 |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1417 case XK_Alt_L: |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1418 case XK_Alt_R: |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1419 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
|
1420 break; |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1421 |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1422 case XK_Shift_Lock: |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1423 /* 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
|
1424 if ((1 << row) == LockMask) |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1425 x_shift_lock_mask = LockMask; |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1426 break; |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1427 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1428 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1429 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1430 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1431 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1432 |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1433 /* 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
|
1434 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
|
1435 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
|
1436 |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1437 XFree ((char *) syms); |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1438 XFreeModifiermap (mods); |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1439 } |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1440 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
1441 |
286 | 1442 /* Convert a set of X modifier bits to the proper form for a |
1443 struct input_event modifiers value. */ | |
1444 | |
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
1445 static unsigned int |
286 | 1446 x_convert_modifiers (state) |
1447 unsigned int state; | |
1448 { | |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1449 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
|
1450 | ((state & ControlMask) ? ctrl_modifier : 0) |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
1451 | ((state & x_meta_mod_mask) ? meta_modifier : 0)); |
286 | 1452 } |
1453 | |
1454 /* Prepare a mouse-event in *RESULT for placement in the input queue. | |
1455 | |
1456 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
|
1457 the mouse. */ |
286 | 1458 |
1459 static Lisp_Object | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1460 construct_mouse_click (result, event, f) |
286 | 1461 struct input_event *result; |
1462 XButtonEvent *event; | |
771 | 1463 struct frame *f; |
286 | 1464 { |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1465 /* Make the event type no_event; we'll change that when we decide |
286 | 1466 otherwise. */ |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1467 result->kind = mouse_click; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1468 XSET (result->code, Lisp_Int, event->button - Button1); |
708 | 1469 result->timestamp = event->time; |
286 | 1470 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
|
1471 | (event->type == ButtonRelease |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1472 ? up_modifier |
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
1473 : down_modifier)); |
286 | 1474 |
1475 /* Notice if the mouse is still grabbed. */ | |
1476 if (event->type == ButtonPress) | |
1477 { | |
1478 if (! x_mouse_grabbed) | |
1479 Vmouse_depressed = Qt; | |
429 | 1480 x_mouse_grabbed |= (1 << event->button); |
286 | 1481 } |
1482 else if (event->type == ButtonRelease) | |
1483 { | |
429 | 1484 x_mouse_grabbed &= ~(1 << event->button); |
286 | 1485 if (!x_mouse_grabbed) |
1486 Vmouse_depressed = Qnil; | |
1487 } | |
1488 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1489 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1490 int row, column; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1491 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1492 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
|
1493 XFASTINT (result->x) = column; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1494 XFASTINT (result->y) = row; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1495 result->frame = f; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1496 } |
286 | 1497 } |
1498 | |
1499 | |
429 | 1500 /* Mouse movement. Rah. |
1501 | |
1502 In order to avoid asking for motion events and then throwing most | |
1503 of them away or busy-polling the server for mouse positions, we ask | |
1504 the server for pointer motion hints. This means that we get only | |
1505 one event per group of mouse movements. "Groups" are delimited by | |
1506 other kinds of events (focus changes and button clicks, for | |
1507 example), or by XQueryPointer calls; when one of these happens, we | |
1508 get another MotionNotify event the next time the mouse moves. This | |
732 | 1509 is at least as efficient as getting motion events when mouse |
429 | 1510 tracking is on, and I suspect only negligibly worse when tracking |
1511 is off. | |
1512 | |
1513 The silly O'Reilly & Associates Nutshell guides barely document | |
1514 pointer motion hints at all (I think you have to infer how they | |
1515 work from an example), and the description of XQueryPointer doesn't | |
1516 mention that calling it causes you to get another motion hint from | |
1517 the server, which is very important. */ | |
1518 | |
1519 /* Where the mouse was last time we reported a mouse event. */ | |
771 | 1520 static FRAME_PTR last_mouse_frame; |
429 | 1521 static XRectangle last_mouse_glyph; |
1522 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1523 /* If the last-checked mouse motion was in a scrollbar, this is that |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1524 scrollbar, the part being dragged, and the limits it is moving in. |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1525 Otherwise, this is zero. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1526 static struct scrollbar *last_mouse_bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1527 static FRAME_PTR last_mouse_bar_frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1528 static enum scrollbar_part last_mouse_part; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1529 static int last_mouse_scroll_range_start; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1530 static int last_mouse_scroll_range_end; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1531 |
732 | 1532 /* This is a hack. We would really prefer that XTmouse_position would |
1533 return the time associated with the position it returns, but there | |
1534 doesn't seem to be any way to wrest the timestamp from the server | |
1535 along with the position query. So, we just keep track of the time | |
1536 of the last movement we received, and return that in hopes that | |
1537 it's somewhat accurate. */ | |
1538 static Time last_mouse_movement_time; | |
1539 | |
429 | 1540 /* Function to report a mouse movement to the mainstream Emacs code. |
1541 The input handler calls this. | |
1542 | |
1543 We have received a mouse movement event, which is given in *event. | |
1544 If the mouse is over a different glyph than it was last time, tell | |
1545 the mainstream emacs code by setting mouse_moved. If not, ask for | |
1546 another motion event, so we can check again the next time it moves. */ | |
1547 static void | |
771 | 1548 note_mouse_position (frame, event) |
1549 FRAME_PTR frame; | |
429 | 1550 XMotionEvent *event; |
1551 | |
1552 { | |
732 | 1553 last_mouse_movement_time = event->time; |
1554 | |
429 | 1555 /* Has the mouse moved off the glyph it was on at the last sighting? */ |
1556 if (event->x < last_mouse_glyph.x | |
1557 || event->x >= last_mouse_glyph.x + last_mouse_glyph.width | |
1558 || event->y < last_mouse_glyph.y | |
1559 || event->y >= last_mouse_glyph.y + last_mouse_glyph.height) | |
1560 mouse_moved = 1; | |
1561 else | |
1562 { | |
1563 /* It's on the same glyph. Call XQueryPointer so we'll get an | |
1564 event the next time the mouse moves and we can see if it's | |
1565 *still* on the same glyph. */ | |
1566 int dummy; | |
1567 | |
1568 XQueryPointer (event->display, event->window, | |
1569 (Window *) &dummy, (Window *) &dummy, | |
1570 &dummy, &dummy, &dummy, &dummy, | |
1571 (unsigned int *) &dummy); | |
1572 } | |
1573 } | |
1574 | |
1575 /* Return the current position of the mouse. | |
1576 | |
1577 This clears the mouse_moved flag, so we can wait for the next mouse | |
1578 position. This also calls XQueryPointer, which will cause the | |
1579 server to give us another MotionNotify when the mouse moves again. | |
1580 */ | |
1581 | |
1582 static void | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1583 XTmouse_position (f, bar, part, x, y, time) |
771 | 1584 FRAME_PTR *f; |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1585 struct scrollbar **bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1586 enum scrollbar_part *part; |
429 | 1587 Lisp_Object *x, *y; |
732 | 1588 unsigned long *time; |
429 | 1589 { |
1590 int ix, iy, dummy; | |
1591 Display *d = x_current_display; | |
1592 Window guess, root, child; | |
1593 | |
1594 BLOCK_INPUT; | |
1595 | |
1596 /* I would like to have an X function that just told me the | |
1597 innermost window containing the mouse. | |
1598 | |
1599 /* There doesn't seem to be any way to just get the innermost window | |
771 | 1600 containing the pointer, no matter what X frame it's on; you have |
429 | 1601 to guess a window, and then X will tell you which one of that |
1602 window's children it's in. If the pointer isn't in any of that | |
1603 window's children, it gives you a root window that contains it. | |
1604 | |
771 | 1605 So we start with the selected frame's window and chase down |
429 | 1606 branches under the guidance of XQueryPointer until we hit a leaf |
1607 (all of the Emacs windows we care about are leaf windows). If at | |
1608 any time XQueryPointer returns false, that means that the current | |
1609 window does not contain the pointer any more (perhaps it moved), | |
1610 so we start with the root window XQueryPointer has given us and | |
1611 start again. */ | |
1612 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1613 guess = FRAME_X_WINDOW (selected_frame); |
429 | 1614 for (;;) |
1615 if (XQueryPointer (d, guess, &root, &child, | |
1616 &dummy, &dummy, &ix, &iy, (unsigned int *) &dummy)) | |
1617 { | |
1618 if (child == None) | |
1619 /* Guess is a leaf window, and it contains the pointer. */ | |
1620 break; | |
1621 else | |
1622 guess = child; | |
1623 } | |
1624 else | |
1625 /* When XQueryPointer returns False, the pointer isn't in guess | |
771 | 1626 anymore, but root is the root window of the frame we should |
429 | 1627 try instead. */ |
1628 guess = root; | |
1629 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1630 if (last_mouse_bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1631 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1632 *f = last_mouse_bar_frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1633 *bar = last_mouse_bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1634 *part = last_mouse_part; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1635 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1636 if (iy < last_mouse_scroll_range_start) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1637 iy = last_mouse_scroll_range_start; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1638 if (iy > last_mouse_scroll_range_end) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1639 iy = last_mouse_scroll_range_end; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1640 XSETINT (*x, iy - last_mouse_scroll_range_start); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1641 XSETINT (*y, (last_mouse_scroll_range_end |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1642 - last_mouse_scroll_range_start)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1643 } |
429 | 1644 else |
1645 { | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1646 *f = last_mouse_frame = x_window_to_frame (guess); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1647 if (! *f) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1648 *x = *y = Qnil; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1649 else |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1650 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1651 pixel_to_glyph_coords (*f, ix, iy, &ix, &iy, &last_mouse_glyph); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1652 XSET (*x, Lisp_Int, ix); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1653 XSET (*y, Lisp_Int, iy); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1654 } |
429 | 1655 } |
1656 | |
1657 mouse_moved = 0; | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1658 last_mouse_bar = 0; |
429 | 1659 |
1660 /* I don't know how to find the time for the last movement; it seems | |
732 | 1661 like XQueryPointer ought to return it, but it doesn't. So, we'll |
1662 return the time of the last MotionNotify event we received. Note | |
1663 that the use of motion hints means that this isn't guaranteed to | |
1664 be accurate at all. */ | |
1665 *time = last_mouse_movement_time; | |
429 | 1666 |
1667 UNBLOCK_INPUT; | |
1668 } | |
1669 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
1670 #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
|
1671 #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
|
1672 #endif /* ! defined (HAVE_X11) */ |
429 | 1673 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1674 /* Scrollbar support. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1675 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1676 /* Map an X window that implements a scroll bar to the struct |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1677 scrollbar representing it. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1678 static struct scrollbar * |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1679 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
|
1680 Window window_id; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1681 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1682 Lisp_Object tail, frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1683 struct frame *f; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1684 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1685 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
|
1686 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1687 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1688 Lisp_Object frame = XCONS (tail)->car; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1689 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1690 /* 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
|
1691 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
|
1692 abort (); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1693 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1694 /* 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
|
1695 right window ID. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1696 for (bar = XFRAME (frame)->display.x->vertical_scrollbars; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1697 bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1698 bar = bar->next) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1699 if (bar->window == window_id) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1700 return bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1701 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1702 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1703 return 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1704 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1705 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1706 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1707 /* Open a new X window to serve as a scrollbar. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1708 static struct scrollbar * |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1709 x_scrollbar_create (frame, top, left, width, height) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1710 FRAME_PTR frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1711 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
|
1712 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1713 struct x_display *d = frame->display.x; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1714 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1715 /* We can't signal a malloc error from within redisplay, so call |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1716 malloc instead of xmalloc. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1717 struct scrollbar *bar = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1718 (struct scrollbar *) malloc (sizeof (struct scrollbar)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1719 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1720 if (! bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1721 return 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1722 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1723 BLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1724 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1725 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1726 XSetWindowAttributes a; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1727 unsigned long mask; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1728 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1729 a.background_pixel = d->background_pixel; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1730 a.border_pixel = d->foreground_pixel; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1731 a.event_mask = (KeyPressMask |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1732 | ButtonPressMask | ButtonReleaseMask |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1733 | ButtonMotionMask); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1734 a.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
|
1735 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1736 mask = (CWBackPixel | CWBorderPixel | CWEventMask | CWCursor); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1737 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1738 bar->window = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1739 XCreateWindow (x_current_display, FRAME_X_WINDOW (frame), |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1740 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1741 /* Position and size of scrollbar. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1742 top, left, width, height, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1743 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1744 /* Border width, depth, class, and visual. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1745 1, CopyFromParent, CopyFromParent, CopyFromParent, |
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 /* Attributes. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1748 mask, &a); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1749 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1750 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1751 bar->frame = frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1752 bar->top = top; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1753 bar->left = left; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1754 bar->width = width; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1755 bar->height = height; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1756 bar->start = bar->end = 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1757 bar->judge_timestamp = d->judge_timestamp; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1758 bar->dragging = -1; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1759 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1760 /* Add bar to its frame's list of scroll bars. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1761 bar->next = d->vertical_scrollbars; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1762 d->vertical_scrollbars = bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1763 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1764 XMapWindow (x_current_display, bar->window); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1765 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1766 UNBLOCK_INPUT; |
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 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1769 /* Draw BAR's handle in the proper position. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1770 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1771 x_scrollbar_set_handle (bar, start, end) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1772 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1773 int start, end; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1774 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1775 BLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1776 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1777 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1778 int inside_width = (bar->width |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1779 - VERTICAL_SCROLLBAR_LEFT_BORDER |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1780 - VERTICAL_SCROLLBAR_RIGHT_BORDER); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1781 int inside_height = (bar->height |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1782 - VERTICAL_SCROLLBAR_TOP_BORDER |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1783 - VERTICAL_SCROLLBAR_BOTTOM_BORDER); |
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 /* 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
|
1786 the distance between start and end. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1787 if (end < start) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1788 end = start; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1789 if (start < VERTICAL_SCROLLBAR_TOP_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1790 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1791 end = VERTICAL_SCROLLBAR_TOP_BORDER + (end - start); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1792 start = VERTICAL_SCROLLBAR_TOP_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1793 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1794 if (end > bar->height - VERTICAL_SCROLLBAR_BOTTOM_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1795 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1796 start = ((bar->height - VERTICAL_SCROLLBAR_BOTTOM_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1797 - (end - start)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1798 end = bar->height - VERTICAL_SCROLLBAR_BOTTOM_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1799 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1800 if (start < VERTICAL_SCROLLBAR_TOP_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1801 start = VERTICAL_SCROLLBAR_TOP_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1802 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1803 /* Draw the empty space above the handle. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1804 XClearArea (x_current_display, bar->window, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1805 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1806 /* x, y, width, height, and exposures. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1807 VERTICAL_SCROLLBAR_LEFT_BORDER, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1808 VERTICAL_SCROLLBAR_TOP_BORDER, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1809 inside_width + 1, start + 1, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1810 False); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1811 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1812 /* Draw the handle itself. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1813 XFillRectangle (x_current_display, bar->window, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1814 bar->frame->display.x->normal_gc, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1815 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1816 /* x, y, width, height */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1817 VERTICAL_SCROLLBAR_LEFT_BORDER, start, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1818 inside_width, (end - start) + 1); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1819 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1820 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1821 /* Draw the empty space below the handle. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1822 XClearArea (x_current_display, bar->window, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1823 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1824 /* x, y, width, height, and exposures. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1825 VERTICAL_SCROLLBAR_LEFT_BORDER, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1826 VERTICAL_SCROLLBAR_TOP_BORDER + end, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1827 inside_width + 1, (inside_height - end) + 1, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1828 False); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1829 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1830 bar->start = start; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1831 bar->end = end; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1832 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1833 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1834 UNBLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1835 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1836 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1837 /* Remove the scrollbar BAR. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1838 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1839 x_scrollbar_remove (bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1840 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1841 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1842 BLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1843 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1844 /* Remove bar from the frame's list. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1845 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1846 struct scrollbar **ptr; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1847 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1848 for (ptr = &bar->frame->display.x->vertical_scrollbars; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1849 *ptr; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1850 ptr = &(*ptr)->next) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1851 if (*ptr == bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1852 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1853 *ptr = bar->next; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1854 break; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1855 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1856 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1857 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1858 /* Destroy the window. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1859 XDestroyWindow (x_current_display, bar->window); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1860 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1861 /* Free the storage. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1862 free (bar); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1863 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1864 UNBLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1865 } |
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 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1868 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
|
1869 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1870 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
|
1871 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1872 BLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1873 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1874 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1875 XWindowChanges wc; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1876 unsigned int mask = 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1877 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1878 wc.x = left; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1879 wc.y = top; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1880 wc.width = width; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1881 wc.height = height; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1882 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1883 if (left != bar->left) mask |= CWX; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1884 if (top != bar->top) mask |= CWY; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1885 if (width != bar->width) mask |= CWWidth; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1886 if (height != bar->height) mask |= CWHeight; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1887 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1888 XConfigureWindow (x_current_display, bar->window, mask, &wc); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1889 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1890 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1891 UNBLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1892 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1893 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1894 /* Set BAR to be the vertical scroll bar for WINDOW. Set its handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1895 to indicate that we are displaying PORTION characters out of a |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1896 total of WHOLE characters, starting at POSITION. Return BAR. If |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1897 BAR is zero, create a new scrollbar and return a pointer to it. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1898 static struct scrollbar * |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1899 XTset_scrollbar (bar, window, portion, whole, position) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1900 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1901 struct window *window; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1902 int portion, whole, position; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1903 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1904 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
|
1905 struct x_display *d = f->display.x; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1906 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
|
1907 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
|
1908 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
|
1909 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1910 /* Where should this scrollbar be, pixelwise? */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1911 int pixel_top = (d->internal_border_width + top * FONT_HEIGHT (d->font)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1912 int pixel_left = (d->internal_border_width + left * FONT_WIDTH (d->font)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1913 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
|
1914 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
|
1915 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1916 /* Does the scrollbar exist yet? */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1917 if (! bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1918 bar = x_scrollbar_create (f, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1919 pixel_top, pixel_left, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1920 pixel_width, pixel_height); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1921 else |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1922 /* It may just need to be moved and resized. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1923 x_scrollbar_move (bar, pixel_top, pixel_left, pixel_width, pixel_height); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1924 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1925 /* 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
|
1926 dragged. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1927 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1928 if (bar && bar->dragging == -1) |
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 int inside_height = (pixel_height |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1931 - VERTICAL_SCROLLBAR_TOP_BORDER |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1932 - VERTICAL_SCROLLBAR_BOTTOM_BORDER); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1933 int start = (position * inside_height) / whole; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1934 int end = ((position + portion) * inside_height) / whole; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1935 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1936 x_scrollbar_set_handle (bar, start, end); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1937 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1938 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1939 return bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1940 } |
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 /* 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
|
1943 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
|
1944 are going to be deleted, because keeping track of when windows go |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1945 away is a real pain - can you say set-window-configuration? |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1946 Instead, we just assert at the beginning of redisplay that *all* |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1947 scrollbars are to be removed, and then save scrollbars from the |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1948 firey pit when we actually redisplay their window. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1949 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1950 /* 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
|
1951 to `*judge_scrollbars_hook'. A scrollbar may be spared if |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1952 `*redeem_scrollbar_hook' is applied to it before the judgement. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1953 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1954 XTcondemn_scrollbars (frame) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1955 FRAME_PTR frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1956 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1957 /* Any scrollbars which don't get caught up to this will be deleted. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1958 frame->display.x->judge_timestamp++; |
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 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1961 /* Unmark BAR for deletion in this judgement cycle. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1962 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1963 XTredeem_scrollbar (bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1964 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1965 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1966 bar->judge_timestamp = bar->frame->display.x->judge_timestamp; |
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 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1969 /* 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
|
1970 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
|
1971 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1972 XTjudge_scrollbars(frame) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1973 FRAME_PTR frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1974 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1975 int judge_timestamp = frame->display.x->judge_timestamp; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1976 struct scrollbar *bar, *next; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1977 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1978 for (bar = frame->display.x->vertical_scrollbars; bar; bar = next) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1979 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1980 next = bar->next; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1981 if (bar->judge_timestamp < judge_timestamp) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1982 x_scrollbar_remove (bar); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1983 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1984 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1985 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1986 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1987 /* 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
|
1988 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1989 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
|
1990 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1991 XEvent *event; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1992 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1993 BLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1994 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1995 x_scrollbar_set_handle (bar, bar->start, bar->end); |
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 /* Draw the extra-thick border on the right. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1998 XFillRectangle (x_current_display, bar->window, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
1999 bar->frame->display.x->normal_gc, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2000 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2001 /* x, y, width, height */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2002 bar->width - VERTICAL_SCROLLBAR_RIGHT_BORDER, 0, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2003 VERTICAL_SCROLLBAR_RIGHT_BORDER, bar->height + 1); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2004 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2005 UNBLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2006 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2007 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2008 /* Handle an exposure event which might be over the extra scrollbar space. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2009 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2010 x_scrollbar_background_expose (frame, event) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2011 FRAME_PTR frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2012 XEvent *event; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2013 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2014 /* Where is the extra scrollbar space, anyway? */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2015 int width = VERTICAL_SCROLLBAR_PIXEL_WIDTH (frame); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2016 int height = PIXEL_HEIGHT (frame); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2017 int x = PIXEL_WIDTH (frame) - width; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2018 int y = 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2019 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2020 BLOCK_INPUT; |
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 /* Clear it out. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2023 XClearArea (x_current_display, FRAME_X_WINDOW (frame), |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2024 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2025 /* x, y, width, height, expose */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2026 x, y, width+1, height+1, False); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2027 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2028 /* Draw the border. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2029 XDrawRectangle (x_current_display, FRAME_X_WINDOW (frame), |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2030 frame->display.x->normal_gc, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2031 x, y, width, height); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2032 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2033 /* Draw the extra-thick border on the right edge. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2034 XFillRectangle (x_current_display, FRAME_X_WINDOW (frame), |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2035 frame->display.x->normal_gc, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2036 x + width - VERTICAL_SCROLLBAR_RIGHT_BORDER, 0, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2037 VERTICAL_SCROLLBAR_RIGHT_BORDER, height + 1); |
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 UNBLOCK_INPUT; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2040 } |
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 /* 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
|
2043 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
|
2044 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2045 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
|
2046 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2047 XEvent *event; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2048 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
|
2049 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2050 emacs_event->kind = scrollbar_click; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2051 XSETINT (emacs_event->code, event->xbutton.button - Button1); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2052 emacs_event->modifiers = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2053 (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
|
2054 | (event->type == ButtonRelease |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2055 ? up_modifier |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2056 : down_modifier)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2057 emacs_event->part = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2058 ((event->xbutton.x < bar->start) ? scrollbar_above_handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2059 : (event->xbutton.x < bar->end) ? scrollbar_handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2060 : scrollbar_below_handle); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2061 emacs_event->scrollbar = bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2062 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2063 if (event->xbutton.y < VERTICAL_SCROLLBAR_TOP_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2064 event->xbutton.y = VERTICAL_SCROLLBAR_TOP_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2065 if (event->xbutton.y > bar->height - VERTICAL_SCROLLBAR_BOTTOM_BORDER) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2066 event->xbutton.y = bar->height - VERTICAL_SCROLLBAR_BOTTOM_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2067 XSETINT (emacs_event->x, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2068 event->xbutton.y - VERTICAL_SCROLLBAR_TOP_BORDER); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2069 XSETINT (emacs_event->y, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2070 (bar->height |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2071 - VERTICAL_SCROLLBAR_TOP_BORDER |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2072 - VERTICAL_SCROLLBAR_BOTTOM_BORDER)); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2073 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2074 emacs_event->frame = bar->frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2075 emacs_event->timestamp = event->xbutton.time; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2076 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2077 if (event->type == ButtonPress |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2078 && emacs_event->part == scrollbar_handle) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2079 bar->dragging = event->xbutton.x - bar->start; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2080 else |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2081 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2082 int new_start = event->xbutton.x - bar->dragging; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2083 int new_end = new_start + (bar->end - bar->start); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2084 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2085 x_scrollbar_set_handle (bar, new_start, new_end); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2086 bar->dragging = -1; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2087 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2088 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2089 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2090 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2091 /* 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
|
2092 static void |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2093 x_scrollbar_handle_motion (bar, event) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2094 struct scrollbar *bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2095 XEvent *event; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2096 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2097 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
|
2098 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2099 mouse_moved = 1; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2100 last_mouse_bar = bar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2101 last_mouse_bar_frame = bar->frame; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2102 last_mouse_part = (bar->dragging == -1 ? scrollbar_handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2103 : (event->xbutton.x < bar->start) ? scrollbar_above_handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2104 : (event->xbutton.x < bar->end) ? scrollbar_handle |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2105 : scrollbar_below_handle); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2106 last_mouse_scroll_range_start = bar->top + VERTICAL_SCROLLBAR_TOP_BORDER; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2107 last_mouse_scroll_range_end = (bar->top |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2108 + bar->height |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2109 - VERTICAL_SCROLLBAR_BOTTOM_BORDER); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2110 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2111 /* If we're dragging the bar, display it. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2112 if (bar->dragging != -1) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2113 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2114 /* Where should the handle be now? */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2115 int new_start = event->xmotion.x - bar->dragging; |
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 if (new_start != bar->start) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2118 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2119 int new_end = new_start + (bar->end - bar->start); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2120 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2121 x_scrollbar_set_handle (bar, new_start, new_end); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2122 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2123 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2124 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2125 /* 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
|
2126 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
|
2127 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2128 int dummy; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2129 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2130 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
|
2131 (Window *) &dummy, (Window *) &dummy, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2132 &dummy, &dummy, &dummy, &dummy, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2133 (unsigned int *) &dummy); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2134 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2135 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2136 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2137 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2138 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2139 /* The main X event-reading loop - XTread_socket. */ |
286 | 2140 |
2141 /* Timestamp of enter window event. This is only used by XTread_socket, | |
2142 but we have to put it out here, since static variables within functions | |
2143 sometimes don't work. */ | |
2144 static Time enter_timestamp; | |
2145 | |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2146 /* 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
|
2147 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
|
2148 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
|
2149 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
|
2150 |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2151 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
|
2152 given for enter_timestamp, above. */ |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2153 static XComposeStatus compose_status; |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2154 |
642 | 2155 /* Communication with window managers. */ |
2156 Atom Xatom_wm_protocols; | |
2157 | |
2158 /* Kinds of protocol things we may receive. */ | |
2159 Atom Xatom_wm_take_focus; | |
2160 Atom Xatom_wm_save_yourself; | |
2161 Atom Xatom_wm_delete_window; | |
2162 | |
2163 /* Other WM communication */ | |
2164 Atom Xatom_wm_configure_denied; /* When our config request is denied */ | |
2165 Atom Xatom_wm_window_moved; /* When the WM moves us. */ | |
2166 | |
286 | 2167 /* Read events coming from the X server. |
2168 This routine is called by the SIGIO handler. | |
2169 We return as soon as there are no more events to be read. | |
2170 | |
2171 Events representing keys are stored in buffer BUFP, | |
2172 which can hold up to NUMCHARS characters. | |
2173 We return the number of characters stored into the buffer, | |
2174 thus pretending to be `read'. | |
2175 | |
2176 WAITP is nonzero if we should block until input arrives. | |
2177 EXPECTED is nonzero if the caller knows input is available. */ | |
2178 | |
1530
a7f8a1fe258e
* xterm.c (x_convert_modifiers): Declare this to return an
Jim Blandy <jimb@redhat.com>
parents:
1436
diff
changeset
|
2179 int |
286 | 2180 XTread_socket (sd, bufp, numchars, waitp, expected) |
2181 register int sd; | |
2182 register struct input_event *bufp; | |
2183 register int numchars; | |
2184 int waitp; | |
2185 int expected; | |
2186 { | |
2187 int count = 0; | |
2188 int nbytes = 0; | |
2189 int mask; | |
2190 int items_pending; /* How many items are in the X queue. */ | |
2191 XEvent event; | |
771 | 2192 struct frame *f; |
286 | 2193 int event_found; |
2194 int prefix; | |
2195 Lisp_Object part; | |
2196 | |
2197 if (x_input_blocked) | |
2198 { | |
2199 x_pending_input = 1; | |
2200 return -1; | |
2201 } | |
2202 | |
2203 x_pending_input = 0; | |
2204 BLOCK_INPUT; | |
2205 | |
2206 if (numchars <= 0) | |
2207 abort (); /* Don't think this happens. */ | |
2208 | |
2209 #ifdef FIOSNBIO | |
2210 /* If available, Xlib uses FIOSNBIO to make the socket | |
2211 non-blocking, and then looks for EWOULDBLOCK. If O_NDELAY is set, | |
2212 FIOSNBIO is ignored, and instead of signalling EWOULDBLOCK, | |
2213 a read returns 0, which Xlib interprets as equivalent to EPIPE. */ | |
2214 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
|
2215 #endif /* ! defined (FIOSNBIO) */ |
286 | 2216 |
2217 #ifndef SIGIO | |
2218 #ifndef HAVE_SELECT | |
2219 if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY)) | |
2220 { | |
2221 extern int read_alarm_should_throw; | |
2222 read_alarm_should_throw = 1; | |
2223 XPeekEvent (XDISPLAY &event); | |
2224 read_alarm_should_throw = 0; | |
2225 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2226 #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
|
2227 #endif /* SIGIO */ |
286 | 2228 |
2229 while (XStuffPending () != 0) | |
2230 { | |
2231 XNextEvent (XDISPLAY &event); | |
2232 event_found = 1; | |
2233 | |
2234 switch (event.type) | |
2235 { | |
2236 #ifdef HAVE_X11 | |
642 | 2237 case ClientMessage: |
2238 { | |
2239 if (event.xclient.message_type == Xatom_wm_protocols | |
2240 && event.xclient.format == 32) | |
2241 { | |
2242 if (event.xclient.data.l[0] == Xatom_wm_take_focus) | |
2243 { | |
771 | 2244 f = x_window_to_frame (event.xclient.window); |
2245 if (f) | |
2246 x_focus_on_frame (f); | |
642 | 2247 /* Not certain about handling scrollbars here */ |
2248 } | |
2249 else if (event.xclient.data.l[0] == Xatom_wm_save_yourself) | |
2250 { | |
2251 /* Save state modify the WM_COMMAND property to | |
2252 something which can reinstate us. This notifies | |
2253 the session manager, who's looking for such a | |
2254 PropertyNotify. Can restart processing when | |
2255 a keyboard or mouse event arrives. */ | |
2256 if (numchars > 0) | |
2257 { | |
2258 } | |
2259 } | |
2260 else if (event.xclient.data.l[0] == Xatom_wm_delete_window) | |
2261 { | |
771 | 2262 struct frame *f = x_window_to_frame (event.xclient.window); |
2263 | |
2264 if (f) | |
642 | 2265 if (numchars > 0) |
2266 { | |
2267 } | |
2268 } | |
2269 } | |
2270 else if (event.xclient.message_type == Xatom_wm_configure_denied) | |
2271 { | |
2272 } | |
2273 else if (event.xclient.message_type == Xatom_wm_window_moved) | |
2274 { | |
2275 int new_x, new_y; | |
2276 | |
786 | 2277 new_x = event.xclient.data.s[0]; |
2278 new_y = event.xclient.data.s[1]; | |
642 | 2279 } |
2280 } | |
2281 break; | |
286 | 2282 |
2283 case SelectionClear: /* Someone has grabbed ownership. */ | |
2284 x_disown_selection (event.xselectionclear.window, | |
2285 event.xselectionclear.selection, | |
2286 event.xselectionclear.time); | |
2287 break; | |
2288 | |
2289 case SelectionRequest: /* Someone wants our selection. */ | |
2290 x_answer_selection_request (event); | |
2291 break; | |
2292 | |
2293 case PropertyNotify: | |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2294 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2295 /* 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
|
2296 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
|
2297 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
|
2298 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
|
2299 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2300 /* 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
|
2301 selection transmission. */ |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2302 else |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2303 { |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2304 /* 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
|
2305 about re-selecting. */ |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
2306 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
|
2307 } |
286 | 2308 break; |
2309 | |
2310 case Expose: | |
771 | 2311 f = x_window_to_frame (event.xexpose.window); |
2312 if (f) | |
286 | 2313 { |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2314 if (f->async_visible == 0) |
286 | 2315 { |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2316 f->async_visible = 1; |
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2317 f->async_iconified = 0; |
771 | 2318 SET_FRAME_GARBAGED (f); |
286 | 2319 } |
2320 else | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2321 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2322 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
|
2323 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
|
2324 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
|
2325 x_scrollbar_background_expose (f, &event); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2326 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2327 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2328 else |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2329 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2330 struct scrollbar *bar |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2331 = 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
|
2332 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2333 if (bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2334 x_scrollbar_expose (bar, &event); |
286 | 2335 } |
2336 break; | |
2337 | |
2338 case GraphicsExpose: /* This occurs when an XCopyArea's | |
2339 source area was obscured or not | |
2340 available.*/ | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2341 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
|
2342 if (f) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2343 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2344 dumprectangle (f, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2345 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
|
2346 event.xgraphicsexpose.width, |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2347 event.xgraphicsexpose.height); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2348 x_scrollbar_background_expose (f, &event); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2349 } |
286 | 2350 break; |
2351 | |
2352 case NoExpose: /* This occurs when an XCopyArea's | |
2353 source area was completely | |
2354 available */ | |
2355 break; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2356 #else /* ! defined (HAVE_X11) */ |
286 | 2357 case ExposeWindow: |
2358 if (event.subwindow != 0) | |
2359 break; /* duplicate event */ | |
771 | 2360 f = x_window_to_frame (event.window); |
2361 if (event.window == f->display.x->icon_desc) | |
286 | 2362 { |
771 | 2363 refreshicon (f); |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2364 f->async_iconified = 1; |
286 | 2365 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2366 if (event.window == FRAME_X_WINDOW (f)) |
286 | 2367 { |
2368 /* Say must check all windows' needs_exposure flags. */ | |
2369 expose_all_windows = 1; | |
771 | 2370 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
|
2371 f->async_visible = 1; |
286 | 2372 } |
2373 break; | |
2374 | |
2375 case ExposeRegion: | |
2376 if (event.subwindow != 0) | |
2377 break; /* duplicate event */ | |
771 | 2378 f = x_window_to_frame (event.window); |
2379 if (event.window == f->display.x->icon_desc) | |
286 | 2380 { |
771 | 2381 refreshicon (f); |
286 | 2382 break; |
2383 } | |
2384 /* If window already needs full redraw, ignore this rectangle. */ | |
771 | 2385 if (expose_all_windows && f->display.x->needs_exposure) |
286 | 2386 break; |
2387 /* Put the event on the queue of rectangles to redraw. */ | |
2388 if (enqueue_event (&event, &x_expose_queue)) | |
2389 /* If it is full, we can't record the rectangle, | |
2390 so redraw this entire window. */ | |
2391 { | |
2392 /* Say must check all windows' needs_exposure flags. */ | |
2393 expose_all_windows = 1; | |
771 | 2394 f->display.x->needs_exposure = 1; |
286 | 2395 } |
2396 break; | |
2397 | |
2398 case ExposeCopy: | |
2399 /* This should happen only when we are expecting it, | |
2400 in x_read_exposes. */ | |
2401 abort (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2402 #endif /* ! defined (HAVE_X11) */ |
286 | 2403 |
2404 #ifdef HAVE_X11 | |
2405 case UnmapNotify: | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2406 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
|
2407 if (f) /* F may no longer exist if |
771 | 2408 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
|
2409 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2410 /* 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
|
2411 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
|
2412 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
|
2413 f->async_visible = 0; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2414 } |
286 | 2415 break; |
2416 | |
2417 case MapNotify: | |
771 | 2418 f = x_window_to_frame (event.xmap.window); |
2419 if (f) | |
286 | 2420 { |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2421 f->async_visible = 1; |
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
2422 f->async_iconified = 0; |
286 | 2423 |
2424 /* wait_reading_process_input will notice this and update | |
771 | 2425 the frame's display structures. */ |
2426 SET_FRAME_GARBAGED (f); | |
286 | 2427 } |
2428 break; | |
2429 | |
2430 /* Turn off processing if we become fully obscured. */ | |
2431 case VisibilityNotify: | |
2432 break; | |
2433 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2434 #else /* ! defined (HAVE_X11) */ |
286 | 2435 case UnmapWindow: |
771 | 2436 f = x_window_to_frame (event.window); |
2437 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
|
2438 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
|
2439 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
|
2440 f->async_visible = 0; |
286 | 2441 break; |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2442 #endif /* ! defined (HAVE_X11) */ |
286 | 2443 |
2444 #ifdef HAVE_X11 | |
2445 case KeyPress: | |
771 | 2446 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
|
2447 |
771 | 2448 if (f != 0) |
286 | 2449 { |
2450 KeySym keysym; | |
2451 char copy_buffer[80]; | |
555 | 2452 int modifiers = event.xkey.state; |
2453 | |
2454 /* Some keyboards generate different characters | |
2455 depending on the state of the meta key, in an attempt | |
2456 to support non-English typists. It would be nice to | |
2457 keep this functionality somehow, but for now, we will | |
2458 just clear the meta-key flag to get the 'pure' character. */ | |
2459 event.xkey.state &= ~Mod1Mask; | |
286 | 2460 |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2461 /* This will have to go some day... */ |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2462 nbytes = |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2463 XLookupString (&event.xkey, copy_buffer, 80, &keysym, |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2464 &compose_status); |
286 | 2465 |
395 | 2466 /* Strip off the vendor-specific keysym bit, and take a shot |
2467 at recognizing the codes. HP servers have extra keysyms | |
2468 that fit into the MiscFunctionKey category. */ | |
2469 keysym &= ~(1<<28); | |
2470 | |
286 | 2471 if (numchars > 1) |
2472 { | |
395 | 2473 if (IsCursorKey (keysym) /* 0xff50 <= x < 0xff60 */ |
2474 || IsMiscFunctionKey (keysym) /* 0xff60 <= x < 0xff80 */ | |
2475 || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ | |
2476 || IsFunctionKey (keysym)) /* 0xffbe <= x < 0xffe1 */ | |
286 | 2477 { |
2478 bufp->kind = non_ascii_keystroke; | |
429 | 2479 XSET (bufp->code, Lisp_Int, (unsigned) keysym - 0xff50); |
771 | 2480 bufp->frame = f; |
555 | 2481 bufp->modifiers = x_convert_modifiers (modifiers); |
708 | 2482 bufp->timestamp = event.xkey.time; |
286 | 2483 bufp++; |
2484 count++; | |
2485 numchars--; | |
2486 } | |
2487 else if (numchars > nbytes) | |
2488 { | |
2489 register int i; | |
2490 | |
2491 if (nbytes == 1) | |
2492 { | |
1324
44215417cf6e
* xterm.c (x_find_modifier_meanings): If there are no
Jim Blandy <jimb@redhat.com>
parents:
1279
diff
changeset
|
2493 if (modifiers & x_meta_mod_mask) |
286 | 2494 *copy_buffer |= METABIT; |
2495 bufp->kind = ascii_keystroke; | |
708 | 2496 XSET (bufp->code, Lisp_Int, *copy_buffer); |
771 | 2497 bufp->frame = f; |
708 | 2498 bufp->timestamp = event.xkey.time; |
286 | 2499 bufp++; |
2500 } | |
2501 else | |
2502 for (i = nbytes - 1; i > 1; i--) | |
2503 { | |
2504 bufp->kind = ascii_keystroke; | |
2505 XSET (bufp->code, Lisp_Int, copy_buffer[i]); | |
771 | 2506 bufp->frame = f; |
708 | 2507 bufp->timestamp = event.xkey.time; |
286 | 2508 bufp++; |
2509 } | |
2510 | |
2511 count += nbytes; | |
2512 numchars -= nbytes; | |
2513 } | |
2514 } | |
2515 } | |
2516 break; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2517 #else /* ! defined (HAVE_X11) */ |
286 | 2518 case KeyPressed: |
2519 { | |
2520 register char *where_mapping; | |
2521 | |
771 | 2522 f = x_window_to_frame (event.window); |
286 | 2523 /* Ignore keys typed on icon windows. */ |
771 | 2524 if (f != 0 && event.window == f->display.x->icon_desc) |
286 | 2525 break; |
2526 where_mapping = XLookupMapping (&event, &nbytes); | |
2527 /* Nasty fix for arrow keys */ | |
2528 if (!nbytes && IsCursorKey (event.detail & 0xff)) | |
2529 { | |
2530 switch (event.detail & 0xff) | |
2531 { | |
2532 case KC_CURSOR_LEFT: | |
2533 where_mapping = "\002"; | |
2534 break; | |
2535 case KC_CURSOR_RIGHT: | |
2536 where_mapping = "\006"; | |
2537 break; | |
2538 case KC_CURSOR_UP: | |
2539 where_mapping = "\020"; | |
2540 break; | |
2541 case KC_CURSOR_DOWN: | |
2542 where_mapping = "\016"; | |
2543 break; | |
2544 } | |
2545 nbytes = 1; | |
2546 } | |
2547 if (numchars - nbytes > 0) | |
2548 { | |
2549 register int i; | |
2550 | |
2551 for (i = 0; i < nbytes; i++) | |
2552 { | |
2553 bufp->kind = ascii_keystroke; | |
2554 XSET (bufp->code, Lisp_Int, where_mapping[i]); | |
429 | 2555 XSET (bufp->time, Lisp_Int, event.xkey.time); |
771 | 2556 bufp->frame = f; |
286 | 2557 bufp++; |
2558 } | |
2559 count += nbytes; | |
2560 numchars -= nbytes; | |
2561 } | |
2562 } | |
2563 break; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2564 #endif /* ! defined (HAVE_X11) */ |
286 | 2565 |
2566 #ifdef HAVE_X11 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2567 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2568 /* 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
|
2569 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
|
2570 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
|
2571 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
|
2572 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
|
2573 |
286 | 2574 case EnterNotify: |
771 | 2575 f = x_window_to_frame (event.xcrossing.window); |
369 | 2576 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2577 if (event.xcrossing.focus) /* Entered Window */ |
286 | 2578 { |
2579 /* Avoid nasty pop/raise loops. */ | |
771 | 2580 if (f && (!(f->auto_raise) |
2581 || !(f->auto_lower) | |
286 | 2582 || (event.xcrossing.time - enter_timestamp) > 500)) |
2583 { | |
771 | 2584 x_new_focus_frame (f); |
286 | 2585 enter_timestamp = event.xcrossing.time; |
2586 } | |
2587 } | |
771 | 2588 else if (f == x_focus_frame) |
2589 x_new_focus_frame (0); | |
286 | 2590 |
2591 break; | |
2592 | |
2593 case FocusIn: | |
771 | 2594 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
|
2595 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
|
2596 x_focus_event_frame = f; |
771 | 2597 if (f) |
2598 x_new_focus_frame (f); | |
286 | 2599 break; |
2600 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2601 |
286 | 2602 case LeaveNotify: |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2603 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
|
2604 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2605 if (event.xcrossing.focus) |
286 | 2606 { |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2607 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
|
2608 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
|
2609 else |
771 | 2610 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
|
2611 } |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2612 else |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2613 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2614 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
|
2615 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
|
2616 if (f == x_focus_frame) |
771 | 2617 x_new_focus_frame (0); |
286 | 2618 } |
2619 break; | |
2620 | |
2621 case FocusOut: | |
771 | 2622 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
|
2623 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
|
2624 && 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
|
2625 x_focus_event_frame = 0; |
771 | 2626 if (f && f == x_focus_frame) |
2627 x_new_focus_frame (0); | |
286 | 2628 break; |
2629 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2630 #else /* ! defined (HAVE_X11) */ |
286 | 2631 |
2632 case EnterWindow: | |
2633 if ((event.detail & 0xFF) == 1) | |
2634 break; /* Coming from our own subwindow */ | |
2635 if (event.subwindow != 0) | |
2636 break; /* Entering our own subwindow. */ | |
2637 | |
2638 { | |
771 | 2639 f = x_window_to_frame (event.window); |
2640 x_mouse_frame = f; | |
2641 | |
2642 x_new_focus_frame (f); | |
286 | 2643 } |
2644 break; | |
2645 | |
2646 case LeaveWindow: | |
2647 if ((event.detail & 0xFF) == 1) | |
2648 break; /* Entering our own subwindow */ | |
2649 if (event.subwindow != 0) | |
2650 break; /* Leaving our own subwindow. */ | |
2651 | |
771 | 2652 x_mouse_frame = 0; |
2653 if (x_focus_frame == 0 | |
2654 && x_input_frame != 0 | |
2655 && 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
|
2656 && event.window == FRAME_X_WINDOW (x_input_frame)) |
286 | 2657 { |
771 | 2658 f = x_input_frame; |
2659 x_input_frame = 0; | |
2660 if (f) | |
2661 frame_unhighlight (f); | |
286 | 2662 } |
2663 break; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2664 #endif /* ! defined (HAVE_X11) */ |
286 | 2665 |
2666 #ifdef HAVE_X11 | |
2667 case MotionNotify: | |
2668 { | |
771 | 2669 f = x_window_to_frame (event.xmotion.window); |
2670 if (f) | |
2671 note_mouse_position (f, &event.xmotion); | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2672 else |
286 | 2673 { |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2674 struct scrollbar *bar = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2675 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
|
2676 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2677 if (bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2678 x_scrollbar_handle_motion (bar, &event); |
286 | 2679 } |
2680 } | |
2681 break; | |
2682 | |
2683 case ConfigureNotify: | |
2684 { | |
2685 int rows, columns; | |
771 | 2686 f = x_window_to_frame (event.xconfigure.window); |
2687 if (!f) | |
286 | 2688 break; |
2689 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2690 columns = PIXEL_TO_CHAR_WIDTH (f, event.xconfigure.width); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2691 rows = PIXEL_TO_CHAR_HEIGHT (f, event.xconfigure.height); |
286 | 2692 |
429 | 2693 /* Even if the number of character rows and columns has |
2694 not changed, the font size may have changed, so we need | |
2695 to check the pixel dimensions as well. */ | |
771 | 2696 if (columns != f->width |
2697 || rows != f->height | |
2698 || event.xconfigure.width != f->display.x->pixel_width | |
2699 || event.xconfigure.height != f->display.x->pixel_height) | |
286 | 2700 { |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
2701 change_frame_size (f, rows, columns, 0, 1); |
771 | 2702 SET_FRAME_GARBAGED (f); |
286 | 2703 } |
2704 | |
771 | 2705 f->display.x->pixel_width = event.xconfigure.width; |
2706 f->display.x->pixel_height = event.xconfigure.height; | |
2707 f->display.x->left_pos = event.xconfigure.x; | |
2708 f->display.x->top_pos = event.xconfigure.y; | |
286 | 2709 break; |
2710 } | |
2711 | |
2712 case ButtonPress: | |
2713 case ButtonRelease: | |
2714 { | |
2715 /* If we decide we want to generate an event to be seen | |
2716 by the rest of Emacs, we put it here. */ | |
2717 struct input_event emacs_event; | |
2718 emacs_event.kind = no_event; | |
2719 | |
771 | 2720 f = x_window_to_frame (event.xbutton.window); |
2721 if (f) | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2722 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2723 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
|
2724 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
|
2725 &event, f, Qnil, 0); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2726 } |
286 | 2727 else |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2728 { |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2729 struct scrollbar *bar = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2730 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
|
2731 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2732 if (bar) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2733 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
|
2734 } |
286 | 2735 |
2736 if (numchars >= 1 && emacs_event.kind != no_event) | |
2737 { | |
2738 bcopy (&emacs_event, bufp, sizeof (struct input_event)); | |
2739 bufp++; | |
2740 count++; | |
2741 numchars--; | |
2742 } | |
2743 } | |
2744 break; | |
2745 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2746 #else /* ! defined (HAVE_X11) */ |
286 | 2747 case ButtonPressed: |
2748 case ButtonReleased: | |
771 | 2749 f = x_window_to_frame (event.window); |
2750 if (f) | |
286 | 2751 { |
771 | 2752 if (event.window == f->display.x->icon_desc) |
286 | 2753 { |
771 | 2754 x_make_frame_visible (f); |
286 | 2755 |
2756 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
|
2757 XWarpMouse (FRAME_X_WINDOW (f), 10, 10); |
286 | 2758 break; |
2759 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2760 if (event.window == FRAME_X_WINDOW (f)) |
286 | 2761 { |
771 | 2762 if (f->auto_raise) |
2763 x_raise_frame (f); | |
286 | 2764 } |
2765 } | |
2766 enqueue_event (&event, &x_mouse_queue); | |
2767 if (numchars >= 2) | |
2768 { | |
2769 bufp->kind = ascii_keystroke; | |
2770 bufp->code = (char) 'X' & 037; /* C-x */ | |
771 | 2771 bufp->frame = f; |
429 | 2772 XSET (bufp->time, Lisp_Int, event.xkey.time); |
286 | 2773 bufp++; |
2774 | |
2775 bufp->kind = ascii_keystroke; | |
2776 bufp->code = (char) 0; /* C-@ */ | |
771 | 2777 bufp->frame = f; |
429 | 2778 XSET (bufp->time, Lisp_Int, event.xkey.time); |
286 | 2779 bufp++; |
2780 | |
2781 count += 2; | |
2782 numchars -= 2; | |
2783 } | |
2784 break; | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2785 #endif /* ! defined (HAVE_X11) */ |
286 | 2786 |
2787 #ifdef HAVE_X11 | |
2788 | |
2789 case CirculateNotify: | |
2790 break; | |
2791 case CirculateRequest: | |
2792 break; | |
2793 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2794 #endif /* ! defined (HAVE_X11) */ |
286 | 2795 |
2796 case MappingNotify: | |
1436
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2797 /* Someone has changed the keyboard mapping - update the |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2798 local cache. */ |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2799 switch (event.xmapping.request) |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2800 { |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2801 case MappingModifier: |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2802 x_find_modifier_meanings (); |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2803 /* This is meant to fall through. */ |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2804 case MappingKeyboard: |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2805 XRefreshKeyboardMapping (&event.xmapping); |
e7c5faab6571
* xterm.c (compose_status): New variable.
Jim Blandy <jimb@redhat.com>
parents:
1389
diff
changeset
|
2806 } |
286 | 2807 break; |
2808 | |
2809 default: | |
2810 break; | |
2811 } | |
2812 } | |
2813 | |
2814 #if 0 | |
2815 #ifdef HAVE_SELECT | |
2816 if (expected && ! event_found) | |
2817 { | |
2818 /* AOJ 880406: if select returns true but XPending doesn't, it means that | |
2819 there is an EOF condition; in other words, that X has died. | |
2820 Act as if there had been a hangup. */ | |
2821 | |
2822 int fd = ConnectionNumber (x_current_display); | |
2823 int mask = 1 << fd; | |
2824 | |
2825 if (0 != select (fd + 1, &mask, (long *) 0, (long *) 0, | |
555 | 2826 (EMACS_TIME) 0) |
286 | 2827 && !XStuffPending ()) |
2828 kill (getpid (), SIGHUP); | |
2829 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2830 #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
|
2831 #endif /* ! 0 */ |
286 | 2832 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2833 #ifndef HAVE_X11 |
771 | 2834 if (updating_frame == 0) |
286 | 2835 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
|
2836 #endif |
286 | 2837 |
2838 UNBLOCK_INPUT; | |
2839 return count; | |
2840 } | |
2841 | |
2842 #ifndef HAVE_X11 | |
2843 /* Read and process only Expose events | |
2844 until we get an ExposeCopy event; then return. | |
2845 This is used in insert/delete line. | |
2846 We assume input is already blocked. */ | |
2847 | |
2848 static void | |
2849 x_read_exposes () | |
2850 { | |
771 | 2851 struct frame *f; |
286 | 2852 XKeyPressedEvent event; |
2853 | |
2854 while (1) | |
2855 { | |
2856 /* while there are more events*/ | |
2857 XMaskEvent (ExposeWindow | ExposeRegion | ExposeCopy, &event); | |
2858 switch (event.type) | |
2859 { | |
2860 case ExposeWindow: | |
2861 if (event.subwindow != 0) | |
2862 break; /* duplicate event */ | |
771 | 2863 f = x_window_to_frame (event.window); |
2864 if (event.window == f->display.x->icon_desc) | |
286 | 2865 { |
771 | 2866 refreshicon (f); |
286 | 2867 break; |
2868 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2869 if (event.window == FRAME_X_WINDOW (f)) |
286 | 2870 { |
2871 expose_all_windows = 1; | |
771 | 2872 f->display.x->needs_exposure = 1; |
286 | 2873 break; |
2874 } | |
2875 break; | |
2876 | |
2877 case ExposeRegion: | |
2878 if (event.subwindow != 0) | |
2879 break; /* duplicate event */ | |
771 | 2880 f = x_window_to_frame (event.window); |
2881 if (event.window == f->display.x->icon_desc) | |
286 | 2882 { |
771 | 2883 refreshicon (f); |
286 | 2884 break; |
2885 } | |
2886 /* If window already needs full redraw, ignore this rectangle. */ | |
771 | 2887 if (expose_all_windows && f->display.x->needs_exposure) |
286 | 2888 break; |
2889 /* Put the event on the queue of rectangles to redraw. */ | |
2890 if (enqueue_event (&event, &x_expose_queue)) | |
2891 /* If it is full, we can't record the rectangle, | |
2892 so redraw this entire window. */ | |
2893 { | |
2894 /* Say must check all windows' needs_exposure flags. */ | |
2895 expose_all_windows = 1; | |
771 | 2896 f->display.x->needs_exposure = 1; |
286 | 2897 } |
2898 break; | |
2899 | |
2900 case ExposeCopy: | |
2901 return; | |
2902 } | |
2903 } | |
2904 } | |
2905 #endif /* HAVE_X11 */ | |
2906 | |
2907 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2908 /* Drawing the cursor. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2909 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2910 |
286 | 2911 /* Draw a hollow box cursor. Don't change the inside of the box. */ |
2912 | |
2913 static void | |
771 | 2914 x_draw_box (f) |
2915 struct frame *f; | |
286 | 2916 { |
771 | 2917 int left = f->cursor_x * FONT_WIDTH (f->display.x->font) |
2918 + f->display.x->internal_border_width; | |
2919 int top = f->cursor_y * FONT_HEIGHT (f->display.x->font) | |
2920 + f->display.x->internal_border_width; | |
2921 int width = FONT_WIDTH (f->display.x->font); | |
2922 int height = FONT_HEIGHT (f->display.x->font); | |
286 | 2923 |
2924 #ifdef HAVE_X11 | |
2925 /* Perhaps we should subtract 1 from width and height... */ | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2926 XDrawRectangle (x_current_display, FRAME_X_WINDOW (f), |
771 | 2927 f->display.x->cursor_gc, |
286 | 2928 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
|
2929 #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
|
2930 XPixSet (FRAME_X_WINDOW (f), |
286 | 2931 left, top, width, 1, |
771 | 2932 f->display.x->cursor_pixel); |
2933 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2934 XPixSet (FRAME_X_WINDOW (f), |
286 | 2935 left, top, 1, height, |
771 | 2936 f->display.x->cursor_pixel); |
2937 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2938 XPixSet (FRAME_X_WINDOW (f), |
286 | 2939 left+width-1, top, 1, height, |
771 | 2940 f->display.x->cursor_pixel); |
2941 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2942 XPixSet (FRAME_X_WINDOW (f), |
286 | 2943 left, top+height-1, width, 1, |
771 | 2944 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
|
2945 #endif /* ! defined (HAVE_X11) */ |
286 | 2946 } |
2947 | |
771 | 2948 /* Clear the cursor of frame F to background color, |
286 | 2949 and mark the cursor as not shown. |
2950 This is used when the text where the cursor is | |
2951 is about to be rewritten. */ | |
2952 | |
2953 static void | |
771 | 2954 clear_cursor (f) |
2955 struct frame *f; | |
286 | 2956 { |
2957 int mask; | |
2958 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2959 if (! FRAME_VISIBLE_P (f) |
771 | 2960 || f->phys_cursor_x < 0) |
286 | 2961 return; |
2962 | |
2963 #ifdef HAVE_X11 | |
771 | 2964 x_display_cursor (f, 0); |
286 | 2965 #if 0 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2966 XClearArea (x_current_display, FRAME_X_WINDOW (f), |
771 | 2967 f->phys_cursor_x * FONT_WIDTH (f->display.x->font) |
2968 + f->display.x->internal_border_width, | |
2969 f->phys_cursor_y * FONT_HEIGHT (f->display.x->font) | |
2970 + f->display.x->internal_border_width, | |
2971 FONT_WIDTH (f->display.x->font) + 1, FONT_HEIGHT (f->display.x->font) + 1, False); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2972 #endif /* ! 0 */ |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
2973 #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
|
2974 XPixSet (FRAME_X_WINDOW (f), |
771 | 2975 f->phys_cursor_x * FONT_WIDTH (f->display.x->font) + f->display.x->internal_border_width, |
2976 f->phys_cursor_y * FONT_HEIGHT (f->display.x->font) + f->display.x->internal_border_width, | |
2977 FONT_WIDTH (f->display.x->font), FONT_HEIGHT (f->display.x->font), | |
2978 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
|
2979 #endif /* ! defined (HAVE_X11) */ |
771 | 2980 f->phys_cursor_x = -1; |
286 | 2981 } |
2982 | |
429 | 2983 static void |
771 | 2984 x_display_bar_cursor (f, on) |
2985 struct frame *f; | |
286 | 2986 int on; |
2987 { | |
771 | 2988 register int phys_x = f->phys_cursor_x; |
2989 register int phys_y = f->phys_cursor_y; | |
286 | 2990 register int x1; |
2991 register int y1; | |
2992 register int y2; | |
2993 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
2994 if (! FRAME_VISIBLE_P (f) || (! on && f->phys_cursor_x < 0)) |
286 | 2995 return; |
2996 | |
2997 #ifdef HAVE_X11 | |
2998 if (phys_x >= 0 && | |
771 | 2999 (!on || phys_x != f->cursor_x || phys_y != f->cursor_y)) |
286 | 3000 { |
771 | 3001 x1 = phys_x * FONT_WIDTH (f->display.x->font) |
3002 + f->display.x->internal_border_width; | |
3003 y1 = phys_y * FONT_HEIGHT (f->display.x->font) | |
3004 + f->display.x->internal_border_width - 1; | |
3005 y2 = y1 + FONT_HEIGHT (f->display.x->font) + 1; | |
3006 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3007 XDrawLine (x_current_display, FRAME_X_WINDOW (f), |
771 | 3008 f->display.x->reverse_gc, x1, y1, x1, y2); |
3009 | |
3010 f->phys_cursor_x = phys_x = -1; | |
286 | 3011 } |
3012 | |
771 | 3013 if (on && f == x_highlight_frame) |
286 | 3014 { |
771 | 3015 x1 = f->cursor_x * FONT_WIDTH (f->display.x->font) |
3016 + f->display.x->internal_border_width; | |
3017 y1 = f->cursor_y * FONT_HEIGHT (f->display.x->font) | |
3018 + f->display.x->internal_border_width - 1; | |
3019 y2 = y1 + FONT_HEIGHT (f->display.x->font) + 1; | |
3020 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3021 XDrawLine (x_current_display, FRAME_X_WINDOW (f), |
771 | 3022 f->display.x->cursor_gc, x1, y1, x1, y2); |
3023 | |
3024 f->phys_cursor_x = f->cursor_x; | |
3025 f->phys_cursor_y = f->cursor_y; | |
286 | 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 #else /* ! defined (HAVE_X11) */ |
286 | 3028 Give it up, dude. |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3029 #endif /* ! defined (HAVE_X11) */ |
286 | 3030 } |
3031 | |
3032 | |
771 | 3033 /* Redraw the glyph at ROW, COLUMN on frame F, in the style |
429 | 3034 HIGHLIGHT. HIGHLIGHT is as defined for dumpglyphs. Return the |
3035 glyph drawn. */ | |
286 | 3036 |
3037 static void | |
771 | 3038 x_draw_single_glyph (f, row, column, glyph, highlight) |
3039 struct frame *f; | |
286 | 3040 int row, column; |
429 | 3041 GLYPH glyph; |
286 | 3042 int highlight; |
3043 { | |
771 | 3044 dumpglyphs (f, |
3045 (column * FONT_WIDTH (f->display.x->font) | |
3046 + f->display.x->internal_border_width), | |
3047 (row * FONT_HEIGHT (f->display.x->font) | |
3048 + f->display.x->internal_border_width), | |
3049 &glyph, 1, highlight, f->display.x->font); | |
286 | 3050 } |
3051 | |
771 | 3052 /* Turn the displayed cursor of frame F on or off according to ON. |
286 | 3053 If ON is nonzero, where to put the cursor is specified |
771 | 3054 by F->cursor_x and F->cursor_y. */ |
286 | 3055 |
3056 static void | |
771 | 3057 x_display_box_cursor (f, on) |
3058 struct frame *f; | |
286 | 3059 int on; |
3060 { | |
771 | 3061 struct frame_glyphs *current_glyphs = FRAME_CURRENT_GLYPHS (f); |
3062 | |
3063 /* If we're not updating, then we want to use the current frame's | |
708 | 3064 cursor position, not our local idea of where the cursor ought to be. */ |
771 | 3065 if (f != updating_frame) |
708 | 3066 { |
771 | 3067 curs_x = FRAME_CURSOR_X (f); |
3068 curs_y = FRAME_CURSOR_Y (f); | |
708 | 3069 } |
3070 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3071 if (! FRAME_VISIBLE_P (f)) |
286 | 3072 return; |
3073 | |
3074 /* If cursor is off and we want it off, return quickly. */ | |
771 | 3075 if (!on && f->phys_cursor_x < 0) |
286 | 3076 return; |
3077 | |
3078 /* If cursor is currently being shown and we don't want it to be | |
3079 or it is in the wrong place, | |
3080 or we want a hollow box and it's not so, (pout!) | |
3081 erase it. */ | |
771 | 3082 if (f->phys_cursor_x >= 0 |
286 | 3083 && (!on |
771 | 3084 || f->phys_cursor_x != curs_x |
3085 || f->phys_cursor_y != curs_y | |
3086 || (f->display.x->text_cursor_kind != hollow_box_cursor | |
3087 && (f != x_highlight_frame)))) | |
286 | 3088 { |
3089 /* Erase the cursor by redrawing the character underneath it. */ | |
771 | 3090 x_draw_single_glyph (f, f->phys_cursor_y, f->phys_cursor_x, |
3091 f->phys_cursor_glyph, | |
3092 current_glyphs->highlight[f->phys_cursor_y]); | |
3093 f->phys_cursor_x = -1; | |
286 | 3094 } |
3095 | |
3096 /* If we want to show a cursor, | |
3097 or we want a box cursor and it's not so, | |
3098 write it in the right place. */ | |
3099 if (on | |
771 | 3100 && (f->phys_cursor_x < 0 |
3101 || (f->display.x->text_cursor_kind != filled_box_cursor | |
3102 && f == x_highlight_frame))) | |
286 | 3103 { |
771 | 3104 f->phys_cursor_glyph |
708 | 3105 = ((current_glyphs->enable[curs_y] |
3106 && curs_x < current_glyphs->used[curs_y]) | |
3107 ? current_glyphs->glyphs[curs_y][curs_x] | |
429 | 3108 : SPACEGLYPH); |
771 | 3109 if (f != x_highlight_frame) |
286 | 3110 { |
771 | 3111 x_draw_box (f); |
3112 f->display.x->text_cursor_kind = hollow_box_cursor; | |
286 | 3113 } |
3114 else | |
3115 { | |
771 | 3116 x_draw_single_glyph (f, curs_y, curs_x, |
3117 f->phys_cursor_glyph, 2); | |
3118 f->display.x->text_cursor_kind = filled_box_cursor; | |
286 | 3119 } |
3120 | |
771 | 3121 f->phys_cursor_x = curs_x; |
3122 f->phys_cursor_y = curs_y; | |
286 | 3123 } |
3124 | |
771 | 3125 if (updating_frame != f) |
286 | 3126 XFlushQueue (); |
3127 } | |
3128 | |
3129 extern Lisp_Object Vbar_cursor; | |
3130 | |
771 | 3131 x_display_cursor (f, on) |
3132 struct frame *f; | |
286 | 3133 int on; |
3134 { | |
3135 if (EQ (Vbar_cursor, Qnil)) | |
771 | 3136 x_display_box_cursor (f, on); |
286 | 3137 else |
771 | 3138 x_display_bar_cursor (f, on); |
286 | 3139 } |
3140 | |
3141 /* Icons. */ | |
3142 | |
771 | 3143 /* Refresh bitmap kitchen sink icon for frame F |
286 | 3144 when we get an expose event for it. */ |
3145 | |
771 | 3146 refreshicon (f) |
3147 struct frame *f; | |
286 | 3148 { |
3149 #ifdef HAVE_X11 | |
3150 /* 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
|
3151 #else /* ! defined (HAVE_X11) */ |
286 | 3152 int mask; |
3153 | |
771 | 3154 if (f->display.x->icon_bitmap_flag) |
3155 XBitmapBitsPut (f->display.x->icon_desc, 0, 0, sink_width, sink_height, | |
286 | 3156 sink_bits, BlackPixel, WHITE_PIX_DEFAULT, |
3157 icon_bitmap, GXcopy, AllPlanes); | |
3158 else | |
3159 { | |
771 | 3160 extern struct frame *selected_frame; |
286 | 3161 struct Lisp_String *str; |
3162 unsigned char *string; | |
3163 | |
3164 string | |
771 | 3165 = XSTRING (XBUFFER (XWINDOW (f->selected_window)->buffer)->name)->data; |
3166 | |
3167 if (f->display.x->icon_label != string) | |
286 | 3168 { |
771 | 3169 f->display.x->icon_label = string; |
3170 XChangeWindow (f->display.x->icon_desc, | |
286 | 3171 XQueryWidth (string, icon_font_info->id) + 10, |
3172 icon_font_info->height + 10); | |
3173 } | |
3174 | |
771 | 3175 XText (f->display.x->icon_desc, 5, 5, string, |
286 | 3176 str->size, icon_font_info->id, |
3177 BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT); | |
3178 } | |
3179 XFlushQueue (); | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3180 #endif /* ! defined (HAVE_X11) */ |
286 | 3181 } |
3182 | |
771 | 3183 /* Make the x-window of frame F use the kitchen-sink icon |
286 | 3184 that's a window generated by Emacs. */ |
3185 | |
3186 int | |
771 | 3187 x_bitmap_icon (f) |
3188 struct frame *f; | |
286 | 3189 { |
3190 int mask; | |
3191 Window icon_window; | |
3192 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3193 if (FRAME_X_WINDOW (f) == 0) |
286 | 3194 return 1; |
3195 | |
3196 #ifdef HAVE_X11 | |
3197 if (icon_bitmap) | |
3198 XFreePixmap (x_current_display, icon_bitmap); | |
3199 | |
3200 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
|
3201 XCreateBitmapFromData (x_current_display, FRAME_X_WINDOW (f), |
286 | 3202 gnu_bits, gnu_width, gnu_height); |
771 | 3203 x_wm_set_icon_pixmap (f, icon_bitmap); |
3204 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
|
3205 #else /* ! defined (HAVE_X11) */ |
771 | 3206 if (f->display.x->icon_desc) |
286 | 3207 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3208 XClearIconWindow (FRAME_X_WINDOW (f)); |
771 | 3209 XDestroyWindow (f->display.x->icon_desc); |
286 | 3210 } |
3211 | |
771 | 3212 icon_window = XCreateWindow (f->display.x->parent_desc, |
286 | 3213 0, 0, sink_width, sink_height, |
3214 2, WhitePixmap, (Pixmap) NULL); | |
3215 | |
3216 if (icon_window == 0) | |
3217 return 1; | |
3218 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3219 XSetIconWindow (FRAME_X_WINDOW (f), icon_window); |
286 | 3220 XSelectInput (icon_window, ExposeWindow | UnmapWindow); |
3221 | |
771 | 3222 f->display.x->icon_desc = icon_window; |
3223 f->display.x->icon_bitmap_flag = 1; | |
286 | 3224 |
3225 if (icon_bitmap == 0) | |
3226 icon_bitmap | |
3227 = 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
|
3228 #endif /* ! defined (HAVE_X11) */ |
286 | 3229 |
3230 return 0; | |
3231 } | |
3232 | |
3233 | |
771 | 3234 /* Make the x-window of frame F use a rectangle with text. */ |
286 | 3235 |
3236 int | |
771 | 3237 x_text_icon (f, icon_name) |
3238 struct frame *f; | |
286 | 3239 char *icon_name; |
3240 { | |
3241 #ifndef HAVE_X11 | |
3242 int mask; | |
3243 int width; | |
3244 Window icon_window; | |
3245 char *X_DefaultValue; | |
3246 Bitmap b1; | |
3247 | |
3248 #ifndef WhitePixel | |
3249 #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
|
3250 #endif /* WhitePixel */ |
286 | 3251 |
3252 #ifndef BlackPixel | |
3253 #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
|
3254 #endif /* BlackPixel */ |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3255 #endif /* HAVE_X11 */ |
286 | 3256 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3257 if (FRAME_X_WINDOW (f) == 0) |
286 | 3258 return 1; |
3259 | |
3260 if (icon_font_info == 0) | |
3261 icon_font_info | |
395 | 3262 = XGetFont (XGetDefault (XDISPLAY |
3263 (char *) XSTRING (invocation_name)->data, | |
3264 "BodyFont")); | |
286 | 3265 |
3266 #ifdef HAVE_X11 | |
3267 if (icon_name) | |
771 | 3268 f->display.x->icon_label = icon_name; |
286 | 3269 else |
771 | 3270 if (! f->display.x->icon_label) |
3271 f->display.x->icon_label = " *emacs* "; | |
286 | 3272 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3273 XSetIconName (x_current_display, FRAME_X_WINDOW (f), |
771 | 3274 (char *) f->display.x->icon_label); |
286 | 3275 |
771 | 3276 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
|
3277 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
|
3278 #else /* ! defined (HAVE_X11) */ |
771 | 3279 if (f->display.x->icon_desc) |
286 | 3280 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3281 XClearIconWindow (XDISPLAY FRAME_X_WINDOW (f)); |
771 | 3282 XDestroyWindow (XDISPLAY f->display.x->icon_desc); |
286 | 3283 } |
3284 | |
3285 if (icon_name) | |
771 | 3286 f->display.x->icon_label = (unsigned char *) icon_name; |
286 | 3287 else |
771 | 3288 if (! f->display.x->icon_label) |
3289 f->display.x->icon_label = XSTRING (f->name)->data; | |
3290 | |
3291 width = XStringWidth (f->display.x->icon_label, icon_font_info, 0, 0); | |
3292 icon_window = XCreateWindow (f->display.x->parent_desc, | |
3293 f->display.x->left_pos, | |
3294 f->display.x->top_pos, | |
286 | 3295 width + 10, icon_font_info->height + 10, |
3296 2, BlackPixmap, WhitePixmap); | |
3297 | |
3298 if (icon_window == 0) | |
3299 return 1; | |
3300 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3301 XSetIconWindow (FRAME_X_WINDOW (f), icon_window); |
286 | 3302 XSelectInput (icon_window, ExposeWindow | ExposeRegion | UnmapWindow | ButtonPressed); |
3303 | |
771 | 3304 f->display.x->icon_desc = icon_window; |
3305 f->display.x->icon_bitmap_flag = 0; | |
3306 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
|
3307 #endif /* ! defined (HAVE_X11) */ |
286 | 3308 |
3309 return 0; | |
3310 } | |
3311 | |
621 | 3312 /* Handling X errors. */ |
3313 | |
3314 /* A handler for SIGPIPE, when it occurs on the X server's connection. | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3315 This basically does an orderly shutdown of Emacs. */ |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3316 |
621 | 3317 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
|
3318 x_connection_closed () |
621 | 3319 { |
3320 if (_Xdebug) | |
3321 abort (); | |
3322 else | |
3323 Fkill_emacs (make_number (70)); | |
3324 } | |
3325 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3326 /* An X error handler which prints an error message and then kills Emacs. |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3327 This is what's normally installed as Xlib's handler for protocol and |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3328 I/O errors. */ |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3329 static int |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3330 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
|
3331 Display *display; |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3332 XErrorEvent *error; |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3333 { |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3334 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
|
3335 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3336 /* While we're testing Emacs 19, we'll just dump core whenever we |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3337 get an X error, so we can figure out why it happened. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3338 abort (); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3339 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3340 /* 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
|
3341 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
|
3342 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3343 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
|
3344 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
|
3345 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
|
3346 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3347 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
|
3348 } |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3349 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3350 /* 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
|
3351 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
|
3352 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3353 /* 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
|
3354 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
|
3355 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
|
3356 static int |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3357 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
|
3358 Display *display; |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3359 XErrorEvent *error; |
286 | 3360 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3361 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
|
3362 *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
|
3363 } |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3364 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3365 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3366 /* 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
|
3367 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3368 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
|
3369 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
|
3370 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3371 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
|
3372 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
|
3373 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3374 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
|
3375 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3376 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
|
3377 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3378 void |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3379 x_catch_errors () |
286 | 3380 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3381 /* 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
|
3382 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
|
3383 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3384 /* 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
|
3385 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
|
3386 (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
|
3387 (*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
|
3388 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3389 /* 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
|
3390 XHandleError (x_error_catcher); |
286 | 3391 } |
3392 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3393 /* 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
|
3394 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
|
3395 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
|
3396 void |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3397 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
|
3398 char *format; |
286 | 3399 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3400 /* 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
|
3401 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
|
3402 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3403 if ((*x_caught_error_message)[0]) |
286 | 3404 { |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3405 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
|
3406 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3407 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
|
3408 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
|
3409 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3410 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
|
3411 error (buf); |
286 | 3412 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3413 } |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3414 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3415 void |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3416 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
|
3417 { |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3418 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
|
3419 XHandleError (x_error_quitter); |
286 | 3420 } |
3421 | |
3422 #if 0 | |
3423 static unsigned int x_wire_count; | |
3424 x_trace_wire () | |
3425 { | |
3426 fprintf (stderr, "Lib call: %d\n", ++x_wire_count); | |
3427 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3428 #endif /* ! 0 */ |
286 | 3429 |
3430 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3431 /* 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
|
3432 |
771 | 3433 /* Set the font of the x-window specified by frame F |
286 | 3434 to the font named NEWNAME. This is safe to use |
771 | 3435 even before F has an actual x-window. */ |
286 | 3436 |
3437 #ifdef HAVE_X11 | |
3438 | |
3439 /* A table of all the fonts we have already loaded. */ | |
3440 static XFontStruct **x_font_table; | |
3441 | |
3442 /* The current capacity of x_font_table. */ | |
3443 static int x_font_table_size; | |
3444 | |
3445 /* The number of fonts actually stored in x_font_table. | |
3446 x_font_table[n] is used and valid iff 0 <= n < n_fonts. | |
3447 0 <= n_fonts <= x_font_table_size. */ | |
3448 static int n_fonts; | |
3449 | |
771 | 3450 x_new_font (f, fontname) |
3451 struct frame *f; | |
286 | 3452 register char *fontname; |
3453 { | |
3454 XFontStruct *temp; | |
3455 int already_loaded; | |
3456 int n_matching_fonts; | |
3457 XFontStruct *font_info; | |
3458 char **font_names; | |
3459 | |
3460 /* Get a list of all the fonts that match this name. Once we | |
3461 have a list of matching fonts, we compare them against the fonts | |
3462 we already have by comparing font ids. */ | |
3463 font_names = (char **) XListFontsWithInfo (x_current_display, fontname, | |
3464 1024, &n_matching_fonts, | |
3465 &font_info); | |
3466 /* If the server couldn't find any fonts whose named matched fontname, | |
3467 return an error code. */ | |
3468 if (n_matching_fonts == 0) | |
3469 return 1; | |
3470 | |
429 | 3471 /* See if we've already loaded a matching font. */ |
286 | 3472 { |
3473 int i, j; | |
3474 | |
3475 already_loaded = 0; | |
3476 for (i = 0; i < n_fonts; i++) | |
3477 for (j = 0; j < n_matching_fonts; j++) | |
3478 if (x_font_table[i]->fid == font_info[j].fid) | |
3479 { | |
3480 already_loaded = i; | |
3481 goto found_font; | |
3482 } | |
3483 } | |
3484 found_font: | |
3485 | |
3486 /* If we have, just return it from the table. */ | |
3487 if (already_loaded) | |
771 | 3488 f->display.x->font = x_font_table[already_loaded]; |
429 | 3489 |
286 | 3490 /* Otherwise, load the font and add it to the table. */ |
3491 else | |
3492 { | |
3493 XFontStruct *font; | |
3494 | |
3495 font = (XFontStruct *) XLoadQueryFont (x_current_display, fontname); | |
3496 if (! font) | |
3497 return 1; | |
3498 | |
3499 /* Do we need to create the table? */ | |
3500 if (x_font_table_size == 0) | |
3501 { | |
3502 x_font_table_size = 16; | |
3503 x_font_table | |
3504 = (XFontStruct **) xmalloc (x_font_table_size | |
3505 * sizeof (x_font_table[0])); | |
3506 } | |
3507 /* Do we need to grow the table? */ | |
3508 else if (n_fonts >= x_font_table_size) | |
3509 { | |
429 | 3510 x_font_table_size *= 2; |
286 | 3511 x_font_table |
3512 = (XFontStruct **) xrealloc (x_font_table, | |
3513 (x_font_table_size | |
3514 * sizeof (x_font_table[0]))); | |
3515 } | |
3516 | |
771 | 3517 f->display.x->font = x_font_table[n_fonts++] = font; |
286 | 3518 } |
3519 | |
3520 /* Free the information from XListFontsWithInfo. The data | |
3521 we actually retain comes from XLoadQueryFont. */ | |
3522 XFreeFontInfo (font_names, font_info, n_matching_fonts); | |
3523 | |
771 | 3524 /* 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
|
3525 if (FRAME_X_WINDOW (f) != 0) |
286 | 3526 { |
771 | 3527 XSetFont (x_current_display, f->display.x->normal_gc, |
3528 f->display.x->font->fid); | |
3529 XSetFont (x_current_display, f->display.x->reverse_gc, | |
3530 f->display.x->font->fid); | |
3531 XSetFont (x_current_display, f->display.x->cursor_gc, | |
3532 f->display.x->font->fid); | |
3533 | |
3534 x_set_window_size (f, f->width, f->height); | |
286 | 3535 } |
3536 | |
3537 return 0; | |
3538 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3539 #else /* ! defined (HAVE_X11) */ |
771 | 3540 x_new_font (f, newname) |
3541 struct frame *f; | |
286 | 3542 register char *newname; |
3543 { | |
3544 FONT_TYPE *temp; | |
3545 int mask; | |
3546 | |
3547 temp = XGetFont (newname); | |
3548 if (temp == (FONT_TYPE *) 0) | |
3549 return 1; | |
3550 | |
771 | 3551 if (f->display.x->font) |
3552 XLoseFont (f->display.x->font); | |
3553 | |
3554 f->display.x->font = temp; | |
3555 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3556 if (FRAME_X_WINDOW (f) != 0) |
771 | 3557 x_set_window_size (f, f->width, f->height); |
286 | 3558 |
3559 return 0; | |
3560 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3561 #endif /* ! defined (HAVE_X11) */ |
286 | 3562 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3563 /* 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
|
3564 |
771 | 3565 x_calc_absolute_position (f) |
3566 struct frame *f; | |
286 | 3567 { |
3568 #ifdef HAVE_X11 | |
771 | 3569 if (f->display.x->left_pos < 0) |
3570 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
|
3571 = x_screen_width - PIXEL_WIDTH (f) + f->display.x->left_pos; |
771 | 3572 |
3573 if (f->display.x->top_pos < 0) | |
3574 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
|
3575 = 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
|
3576 #else /* ! defined (HAVE_X11) */ |
286 | 3577 WINDOWINFO_TYPE parentinfo; |
3578 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3579 XGetWindowInfo (FRAME_X_WINDOW (f), &parentinfo); |
771 | 3580 |
3581 if (f->display.x->left_pos < 0) | |
3582 f->display.x->left_pos = parentinfo.width + (f->display.x->left_pos + 1) | |
3583 - PIXEL_WIDTH (f) - 2 * f->display.x->internal_border_width; | |
3584 | |
3585 if (f->display.x->top_pos < 0) | |
3586 f->display.x->top_pos = parentinfo.height + (f->display.x->top_pos + 1) | |
3587 - 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
|
3588 #endif /* ! defined (HAVE_X11) */ |
286 | 3589 } |
3590 | |
771 | 3591 x_set_offset (f, xoff, yoff) |
3592 struct frame *f; | |
286 | 3593 register int xoff, yoff; |
3594 { | |
771 | 3595 f->display.x->top_pos = yoff; |
3596 f->display.x->left_pos = xoff; | |
3597 x_calc_absolute_position (f); | |
286 | 3598 |
3599 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
|
3600 XMoveWindow (XDISPLAY FRAME_X_WINDOW (f), |
771 | 3601 f->display.x->left_pos, f->display.x->top_pos); |
286 | 3602 #ifdef HAVE_X11 |
771 | 3603 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
|
3604 #endif /* ! defined (HAVE_X11) */ |
286 | 3605 UNBLOCK_INPUT; |
3606 } | |
3607 | |
771 | 3608 /* Call this to change the size of frame F's x-window. */ |
3609 | |
3610 x_set_window_size (f, cols, rows) | |
3611 struct frame *f; | |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3612 int cols, rows; |
286 | 3613 { |
3614 int pixelwidth, pixelheight; | |
3615 int mask; | |
771 | 3616 int ibw = f->display.x->internal_border_width; |
286 | 3617 |
3618 BLOCK_INPUT; | |
3619 | |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3620 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
|
3621 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
|
3622 (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
|
3623 ? 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
|
3624 : 0); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3625 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
|
3626 pixelheight = CHAR_TO_PIXEL_HEIGHT (f, rows); |
286 | 3627 |
3628 #ifdef HAVE_X11 | |
771 | 3629 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
|
3630 #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
|
3631 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
|
3632 |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3633 /* 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
|
3634 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
|
3635 change request eventually, and we'll hear how it went when the |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3636 ConfigureNotify event gets here. */ |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3637 FRAME_WIDTH (f) = cols; |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3638 FRAME_WIDTH (f) = rows; |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3639 PIXEL_WIDTH (f) = pixelwidth; |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3640 PIXEL_HEIGHT (f) = pixelheight; |
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
3641 |
286 | 3642 XFlushQueue (); |
3643 UNBLOCK_INPUT; | |
3644 } | |
3645 | |
3646 #ifndef HAVE_X11 | |
771 | 3647 x_set_resize_hint (f) |
3648 struct frame *f; | |
286 | 3649 { |
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 XSetResizeHint (FRAME_X_WINDOW (f), 2 * f->display.x->internal_border_width, |
771 | 3652 2 * f->display.x->internal_border_width, |
3653 FONT_WIDTH (f->display.x->font), FONT_HEIGHT (f->display.x->font)); | |
286 | 3654 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3655 #endif /* HAVE_X11 */ |
286 | 3656 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3657 /* Mouse warping, focus shifting, raising and lowering. */ |
286 | 3658 |
771 | 3659 x_set_mouse_position (f, x, y) |
3660 struct frame *f; | |
286 | 3661 int x, y; |
3662 { | |
3663 int pix_x, pix_y; | |
3664 | |
771 | 3665 x_raise_frame (f); |
286 | 3666 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3667 pix_x = (f->display.x->internal_border_width |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3668 + x * FONT_WIDTH (f->display.x->font) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3669 + FONT_WIDTH (f->display.x->font) / 2); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3670 pix_y = (f->display.x->internal_border_width |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3671 + y * FONT_HEIGHT (f->display.x->font) |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3672 + FONT_HEIGHT (f->display.x->font) / 2); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3673 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3674 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
|
3675 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
|
3676 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3677 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
|
3678 if (pix_y > PIXEL_HEIGHT (f)) pix_y = PIXEL_HEIGHT (f); |
286 | 3679 |
3680 BLOCK_INPUT; | |
3681 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3682 XWarpMousePointer (FRAME_X_WINDOW (f), pix_x, pix_y); |
286 | 3683 UNBLOCK_INPUT; |
3684 } | |
3685 | |
3686 #ifdef HAVE_X11 | |
771 | 3687 x_focus_on_frame (f) |
3688 struct frame *f; | |
286 | 3689 { |
771 | 3690 x_raise_frame (f); |
369 | 3691 #if 0 |
3692 /* I don't think that the ICCCM allows programs to do things like this | |
3693 without the interaction of the window manager. Whatever you end up | |
771 | 3694 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
|
3695 XSetInputFocus (x_current_display, FRAME_X_WINDOW (f), |
286 | 3696 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
|
3697 #endif /* ! 0 */ |
286 | 3698 } |
3699 | |
771 | 3700 x_unfocus_frame (f) |
3701 struct frame *f; | |
286 | 3702 { |
369 | 3703 #if 0 |
771 | 3704 /* Look at the remarks in x_focus_on_frame. */ |
3705 if (x_focus_frame == f) | |
286 | 3706 XSetInputFocus (x_current_display, PointerRoot, |
3707 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
|
3708 #endif /* ! 0 */ |
286 | 3709 } |
3710 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3711 #endif /* ! defined (HAVE_X11) */ |
286 | 3712 |
771 | 3713 /* Raise frame F. */ |
3714 | |
3715 x_raise_frame (f) | |
3716 struct frame *f; | |
286 | 3717 { |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3718 if (f->async_visible) |
286 | 3719 { |
3720 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
|
3721 XRaiseWindow (XDISPLAY FRAME_X_WINDOW (f)); |
286 | 3722 XFlushQueue (); |
3723 UNBLOCK_INPUT; | |
3724 } | |
3725 } | |
3726 | |
771 | 3727 /* Lower frame F. */ |
3728 | |
3729 x_lower_frame (f) | |
3730 struct frame *f; | |
286 | 3731 { |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3732 if (f->async_visible) |
286 | 3733 { |
3734 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
|
3735 XLowerWindow (XDISPLAY FRAME_X_WINDOW (f)); |
286 | 3736 XFlushQueue (); |
3737 UNBLOCK_INPUT; | |
3738 } | |
3739 } | |
3740 | |
3741 /* Change from withdrawn state to mapped state. */ | |
3742 | |
771 | 3743 x_make_frame_visible (f) |
3744 struct frame *f; | |
286 | 3745 { |
3746 int mask; | |
3747 | |
429 | 3748 BLOCK_INPUT; |
3749 | |
771 | 3750 if (! FRAME_VISIBLE_P (f)) |
286 | 3751 { |
3752 #ifdef HAVE_X11 | |
429 | 3753 if (! EQ (Vx_no_window_manager, Qt)) |
771 | 3754 x_wm_set_window_state (f, NormalState); |
3755 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3756 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
|
3757 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
|
3758 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
|
3759 #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
|
3760 XMapWindow (XDISPLAY FRAME_X_WINDOW (f)); |
771 | 3761 if (f->display.x->icon_desc != 0) |
3762 XUnmapWindow (f->display.x->icon_desc); | |
429 | 3763 |
3764 /* 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
|
3765 f->async_visible = 1; |
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3766 f->async_iconified = 0; |
771 | 3767 |
3768 /* NOTE: this may cause problems for the first frame. */ | |
429 | 3769 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
|
3770 #endif /* ! defined (HAVE_X11) */ |
429 | 3771 } |
286 | 3772 |
3773 XFlushQueue (); | |
429 | 3774 |
286 | 3775 UNBLOCK_INPUT; |
3776 } | |
3777 | |
3778 /* Change from mapped state to withdrawn state. */ | |
3779 | |
771 | 3780 x_make_frame_invisible (f) |
3781 struct frame *f; | |
286 | 3782 { |
3783 int mask; | |
3784 | |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3785 if (! f->async_visible) |
286 | 3786 return; |
3787 | |
3788 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
|
3789 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3790 #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
|
3791 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3792 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
|
3793 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
|
3794 { |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3795 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
|
3796 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
|
3797 } |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3798 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3799 #else /* ! defined (HAVE_X11R4) */ |
286 | 3800 #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
|
3801 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3802 /* Tell the window manager what we're going to do. */ |
286 | 3803 if (! EQ (Vx_no_window_manager, Qt)) |
3804 { | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3805 XEvent unmap; |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3806 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3807 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
|
3808 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
|
3809 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
|
3810 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
|
3811 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
|
3812 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
|
3813 False, |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3814 SubstructureRedirectMask|SubstructureNotifyMask, |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3815 &unmap)) |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3816 { |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3817 UNBLOCK_INPUT_RESIGNAL; |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3818 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
|
3819 } |
286 | 3820 } |
3821 | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3822 /* 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
|
3823 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
|
3824 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3825 #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
|
3826 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3827 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
|
3828 f->async_visible = 0; /* Handled by the UnMap event for X11 */ |
771 | 3829 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
|
3830 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
|
3831 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3832 #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
|
3833 #endif /* ! defined (HAVE_X11R4) */ |
286 | 3834 |
3835 XFlushQueue (); | |
3836 UNBLOCK_INPUT; | |
3837 } | |
3838 | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3839 /* Window manager communication. Created in Fx_open_connection. */ |
286 | 3840 extern Atom Xatom_wm_change_state; |
3841 | |
3842 /* Change window state from mapped to iconified. */ | |
3843 | |
771 | 3844 x_iconify_frame (f) |
3845 struct frame *f; | |
286 | 3846 { |
3847 int mask; | |
3848 | |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3849 if (f->async_iconified) |
286 | 3850 return; |
3851 | |
3852 BLOCK_INPUT; | |
3853 | |
3854 #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
|
3855 /* 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
|
3856 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
|
3857 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3858 /* 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
|
3859 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
|
3860 { |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3861 XEvent message; |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3862 |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3863 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
|
3864 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
|
3865 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
|
3866 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
|
3867 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
|
3868 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3869 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
|
3870 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
|
3871 False, |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3872 SubstructureRedirectMask | SubstructureNotifyMask, |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3873 &message)) |
286 | 3874 { |
3875 UNBLOCK_INPUT_RESIGNAL; | |
3876 error ("Can't notify window manager of iconification."); | |
3877 } | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3878 } |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3879 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3880 /* 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
|
3881 IconicState. */ |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
3882 x_wm_set_window_state (f, IconicState); |
286 | 3883 |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3884 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
|
3885 #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
|
3886 XUnmapWindow (XDISPLAY FRAME_X_WINDOW (f)); |
771 | 3887 |
1658
452ba03935d7
* xterm.c (XTread_socket): When we get MapNotify, UnmapNotify,
Jim Blandy <jimb@redhat.com>
parents:
1530
diff
changeset
|
3888 f->async_visible = 0; /* Handled in the UnMap event for X11. */ |
771 | 3889 if (f->display.x->icon_desc != 0) |
286 | 3890 { |
771 | 3891 XMapWindow (XDISPLAY f->display.x->icon_desc); |
3892 refreshicon (f); | |
286 | 3893 } |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3894 #endif /* ! defined (HAVE_X11) */ |
286 | 3895 |
3896 XFlushQueue (); | |
3897 UNBLOCK_INPUT; | |
3898 } | |
3899 | |
771 | 3900 /* Destroy the X window of frame F. |
3901 DISPL is the former f->display (since f->display | |
286 | 3902 has already been nulled out). */ |
3903 | |
771 | 3904 x_destroy_window (f, displ) |
3905 struct frame *f; | |
286 | 3906 union display displ; |
3907 { | |
3908 int mask; | |
3909 | |
3910 BLOCK_INPUT; | |
3911 if (displ.x->icon_desc != 0) | |
3912 XDestroyWindow (XDISPLAY displ.x->icon_desc); | |
3913 XDestroyWindow (XDISPLAY displ.x->window_desc); | |
3914 XFlushQueue (); | |
3915 UNBLOCK_INPUT; | |
3916 | |
3917 free (displ.x); | |
771 | 3918 if (f == x_focus_frame) |
3919 x_focus_frame = 0; | |
3920 if (f == x_highlight_frame) | |
3921 x_highlight_frame = 0; | |
286 | 3922 } |
3923 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3924 /* 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
|
3925 |
286 | 3926 #ifndef HAVE_X11 |
3927 | |
3928 /* Manage event queues. | |
3929 | |
3930 This code is only used by the X10 support. | |
3931 | |
3932 We cannot leave events in the X queue and get them when we are ready | |
3933 because X does not provide a subroutine to get only a certain kind | |
3934 of event but not block if there are no queued events of that kind. | |
3935 | |
3936 Therefore, we must examine events as they come in and copy events | |
3937 of certain kinds into our private queues. | |
3938 | |
3939 All ExposeRegion events are put in x_expose_queue. | |
3940 All ButtonPressed and ButtonReleased events are put in x_mouse_queue. */ | |
3941 | |
3942 | |
3943 /* Write the event *P_XREP into the event queue *QUEUE. | |
3944 If the queue is full, do nothing, but return nonzero. */ | |
3945 | |
3946 int | |
3947 enqueue_event (p_xrep, queue) | |
3948 register XEvent *p_xrep; | |
3949 register struct event_queue *queue; | |
3950 { | |
3951 int newindex = queue->windex + 1; | |
3952 if (newindex == EVENT_BUFFER_SIZE) | |
3953 newindex = 0; | |
3954 if (newindex == queue->rindex) | |
3955 return -1; | |
3956 queue->xrep[queue->windex] = *p_xrep; | |
3957 queue->windex = newindex; | |
3958 return 0; | |
3959 } | |
3960 | |
3961 /* Fetch the next event from queue *QUEUE and store it in *P_XREP. | |
3962 If *QUEUE is empty, do nothing and return 0. */ | |
3963 | |
3964 int | |
3965 dequeue_event (p_xrep, queue) | |
3966 register XEvent *p_xrep; | |
3967 register struct event_queue *queue; | |
3968 { | |
3969 if (queue->windex == queue->rindex) | |
3970 return 0; | |
3971 *p_xrep = queue->xrep[queue->rindex++]; | |
3972 if (queue->rindex == EVENT_BUFFER_SIZE) | |
3973 queue->rindex = 0; | |
3974 return 1; | |
3975 } | |
3976 | |
3977 /* Return the number of events buffered in *QUEUE. */ | |
3978 | |
3979 int | |
3980 queue_event_count (queue) | |
3981 register struct event_queue *queue; | |
3982 { | |
3983 int tem = queue->windex - queue->rindex; | |
3984 if (tem >= 0) | |
3985 return tem; | |
3986 return EVENT_BUFFER_SIZE + tem; | |
3987 } | |
3988 | |
3989 /* Return nonzero if mouse input is pending. */ | |
3990 | |
3991 int | |
3992 mouse_event_pending_p () | |
3993 { | |
3994 return queue_event_count (&x_mouse_queue); | |
3995 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
3996 #endif /* HAVE_X11 */ |
286 | 3997 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3998 /* Setting window manager hints. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
3999 |
286 | 4000 #ifdef HAVE_X11 |
4001 | |
771 | 4002 x_wm_set_size_hint (f, prompting) |
4003 struct frame *f; | |
286 | 4004 long prompting; |
4005 { | |
4006 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
|
4007 Window window = FRAME_X_WINDOW (f); |
286 | 4008 |
4009 size_hints.flags = PResizeInc | PMinSize | PMaxSize; | |
4010 | |
771 | 4011 flexlines = f->height; |
4012 | |
4013 size_hints.x = f->display.x->left_pos; | |
4014 size_hints.y = f->display.x->top_pos; | |
4015 size_hints.height = PIXEL_HEIGHT (f); | |
4016 size_hints.width = PIXEL_WIDTH (f); | |
4017 size_hints.width_inc = FONT_WIDTH (f->display.x->font); | |
4018 size_hints.height_inc = FONT_HEIGHT (f->display.x->font); | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4019 size_hints.max_width = PIXEL_TO_CHAR_WIDTH (f, x_screen_width); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4020 size_hints.max_height = PIXEL_TO_CHAR_HEIGHT (f, x_screen_height); |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4021 |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
4022 { |
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
|
4023 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
|
4024 |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4025 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
|
4026 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
|
4027 |
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4028 { |
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4029 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
|
4030 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
|
4031 |
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4032 /* 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
|
4033 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
|
4034 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
|
4035 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
|
4036 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
|
4037 |
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4038 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
|
4039 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
|
4040 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
|
4041 |
cd3d59155bf7
* xterm.c (x_wm_set_size_hint): Set the base_width and base_height
Jim Blandy <jimb@redhat.com>
parents:
1077
diff
changeset
|
4042 #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
|
4043 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
|
4044 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
|
4045 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
|
4046 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
|
4047 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
|
4048 #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
|
4049 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
|
4050 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
|
4051 #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
|
4052 } |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4053 |
976
cbdfc337ec8f
* xterm.c (x_wm_hints): New variable.
Jim Blandy <jimb@redhat.com>
parents:
786
diff
changeset
|
4054 } |
286 | 4055 |
4056 if (prompting) | |
4057 size_hints.flags |= prompting; | |
4058 else | |
4059 { | |
4060 XSizeHints hints; /* Sometimes I hate X Windows... */ | |
4061 | |
4062 XGetNormalHints (x_current_display, window, &hints); | |
4063 if (hints.flags & PSize) | |
4064 size_hints.flags |= PSize; | |
4065 if (hints.flags & PPosition) | |
4066 size_hints.flags |= PPosition; | |
4067 if (hints.flags & USPosition) | |
4068 size_hints.flags |= USPosition; | |
4069 if (hints.flags & USSize) | |
4070 size_hints.flags |= USSize; | |
4071 } | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4072 |
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
|
4073 #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
|
4074 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
|
4075 #else |
286 | 4076 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
|
4077 #endif |
286 | 4078 } |
4079 | |
4080 /* Used for IconicState or NormalState */ | |
771 | 4081 x_wm_set_window_state (f, state) |
4082 struct frame *f; | |
286 | 4083 int state; |
4084 { | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4085 Window window = FRAME_X_WINDOW (f); |
286 | 4086 |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4087 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
|
4088 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
|
4089 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4090 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
286 | 4091 } |
4092 | |
771 | 4093 x_wm_set_icon_pixmap (f, icon_pixmap) |
4094 struct frame *f; | |
286 | 4095 Pixmap icon_pixmap; |
4096 { | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4097 Window window = FRAME_X_WINDOW (f); |
286 | 4098 |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4099 f->display.x->wm_hints.flags |= IconPixmapHint; |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4100 f->display.x->wm_hints.icon_pixmap = icon_pixmap ? icon_pixmap : None; |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4101 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4102 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
286 | 4103 } |
4104 | |
771 | 4105 x_wm_set_icon_position (f, icon_x, icon_y) |
4106 struct frame *f; | |
286 | 4107 int icon_x, icon_y; |
4108 { | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4109 Window window = FRAME_X_WINDOW (f); |
286 | 4110 |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4111 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
|
4112 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
|
4113 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
|
4114 |
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4115 XSetWMHints (x_current_display, window, &f->display.x->wm_hints); |
286 | 4116 } |
4117 | |
4118 | |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4119 /* Initialization. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4120 |
286 | 4121 void |
4122 x_term_init (display_name) | |
4123 char *display_name; | |
4124 { | |
771 | 4125 Lisp_Object frame; |
286 | 4126 char *defaultvalue; |
4127 #ifdef F_SETOWN | |
4128 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
|
4129 #endif /* ! defined (F_SETOWN) */ |
369 | 4130 |
1739
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4131 { |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4132 fprintf (stderr, "\ |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4133 Hey! The Emacs 19 sources currently contain incomplete changes |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4134 for scrollbars, and don't run properly under X! |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4135 |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4136 It is supposed to work under termcap, though. |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4137 |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4138 -JimB"); |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4139 } |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4140 |
d738d3690836
Small changes to keep people from running Emacs under X.
Jim Blandy <jimb@redhat.com>
parents:
1720
diff
changeset
|
4141 |
771 | 4142 x_focus_frame = x_highlight_frame = 0; |
286 | 4143 |
4144 x_current_display = XOpenDisplay (display_name); | |
4145 if (x_current_display == 0) | |
4146 fatal ("X server %s not responding; check the DISPLAY environment variable or use \"-d\"\n", | |
4147 display_name); | |
4148 | |
4149 #ifdef HAVE_X11 | |
4150 { | |
1020
7c2565dd644c
* xterm.c (x_wm_hints): Variable deleted. This has to be
Jim Blandy <jimb@redhat.com>
parents:
976
diff
changeset
|
4151 int hostname_size = 256; |
398 | 4152 |
4153 hostname = (char *) xmalloc (hostname_size); | |
4154 | |
286 | 4155 #if 0 |
4156 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
|
4157 #endif /* ! 0 */ |
286 | 4158 |
395 | 4159 invocation_name = Ffile_name_nondirectory (Fcar (Vcommand_line_args)); |
398 | 4160 |
4161 /* Try to get the host name; if the buffer is too short, try | |
4162 again. Apparently, the only indication gethostname gives of | |
4163 whether the buffer was large enough is the presence or absence | |
4164 of a '\0' in the string. Eech. */ | |
4165 for (;;) | |
4166 { | |
4167 gethostname (hostname, hostname_size - 1); | |
4168 hostname[hostname_size - 1] = '\0'; | |
4169 | |
4170 /* Was the buffer large enough for gethostname to store the '\0'? */ | |
4171 if (strlen (hostname) < hostname_size - 1) | |
4172 break; | |
4173 | |
4174 hostname_size <<= 1; | |
4175 hostname = (char *) xrealloc (hostname, hostname_size); | |
4176 } | |
4177 x_id_name = (char *) xmalloc (XSTRING (invocation_name)->size | |
4178 + strlen (hostname) | |
4179 + 2); | |
4180 sprintf (x_id_name, "%s@%s", XSTRING (invocation_name)->data, hostname); | |
286 | 4181 } |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4182 |
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4183 /* 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
|
4184 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
|
4185 |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4186 /* Get the scrollbar cursor. */ |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4187 x_vertical_scrollbar_cursor = |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4188 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
|
4189 |
1279
74ae34a80f94
* xterm.c (x_meta_mod_mask): New variable, indicating which X
Jim Blandy <jimb@redhat.com>
parents:
1127
diff
changeset
|
4190 /* 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
|
4191 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
|
4192 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
|
4193 |
286 | 4194 dup2 (ConnectionNumber (x_current_display), 0); |
369 | 4195 |
4196 #ifndef SYSV_STREAMS | |
4197 /* Streams somehow keeps track of which descriptor number | |
4198 is being used to talk to X. So it is not safe to substitute | |
4199 descriptor 0. But it is safe to make descriptor 0 a copy of it. */ | |
286 | 4200 close (ConnectionNumber (x_current_display)); |
369 | 4201 ConnectionNumber (x_current_display) = 0; /* Looks a little strange? |
4202 * check the def of the macro; | |
4203 * 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
|
4204 #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
|
4205 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4206 #endif /* ! defined (HAVE_X11) */ |
286 | 4207 |
4208 #ifdef F_SETOWN | |
4209 old_fcntl_owner = fcntl (0, F_GETOWN, 0); | |
4210 #ifdef F_SETOWN_SOCK_NEG | |
4211 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
|
4212 #else /* ! defined (F_SETOWN_SOCK_NEG) */ |
286 | 4213 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
|
4214 #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
|
4215 #endif /* ! defined (F_SETOWN) */ |
286 | 4216 |
4217 #ifdef SIGIO | |
4218 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
|
4219 #endif /* ! defined (SIGIO) */ |
286 | 4220 |
4221 /* Must use interrupt input because we cannot otherwise | |
4222 arrange for C-g to be noticed immediately. | |
4223 We cannot connect it to SIGINT. */ | |
4224 Fset_input_mode (Qt, Qnil, Qt, Qnil); | |
4225 | |
4226 expose_all_windows = 0; | |
4227 | |
771 | 4228 clear_frame_hook = XTclear_frame; |
286 | 4229 clear_end_of_line_hook = XTclear_end_of_line; |
4230 ins_del_lines_hook = XTins_del_lines; | |
4231 change_line_highlight_hook = XTchange_line_highlight; | |
4232 insert_glyphs_hook = XTinsert_glyphs; | |
4233 write_glyphs_hook = XTwrite_glyphs; | |
4234 delete_glyphs_hook = XTdelete_glyphs; | |
4235 ring_bell_hook = XTring_bell; | |
4236 reset_terminal_modes_hook = XTreset_terminal_modes; | |
4237 set_terminal_modes_hook = XTset_terminal_modes; | |
4238 update_begin_hook = XTupdate_begin; | |
4239 update_end_hook = XTupdate_end; | |
4240 set_terminal_window_hook = XTset_terminal_window; | |
4241 read_socket_hook = XTread_socket; | |
4242 cursor_to_hook = XTcursor_to; | |
4243 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
|
4244 mouse_position_hook = XTmouse_position; |
771 | 4245 frame_rehighlight_hook = XTframe_rehighlight; |
1720
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4246 set_vertical_scrollbar_hook = XTset_scrollbar; |
4f5e3ac5d822
* frame.h (struct frame): New fields `can_have_scrollbars' and
Jim Blandy <jimb@redhat.com>
parents:
1658
diff
changeset
|
4247 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
|
4248 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
|
4249 judge_scrollbars_hook = XTjudge_scrollbars; |
286 | 4250 |
771 | 4251 scroll_region_ok = 1; /* we'll scroll partial frames */ |
286 | 4252 char_ins_del_ok = 0; /* just as fast to write the line */ |
4253 line_ins_del_ok = 1; /* we'll just blt 'em */ | |
4254 fast_clear_end_of_line = 1; /* X does this well */ | |
771 | 4255 memory_below_frame = 0; /* we don't remember what scrolls |
286 | 4256 off the bottom */ |
4257 baud_rate = 19200; | |
4258 | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4259 /* 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
|
4260 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
|
4261 XHandleError (x_error_quitter); |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4262 XHandleIOError (x_error_quitter); |
286 | 4263 |
4264 /* Disable Window Change signals; they are handled by X events. */ | |
4265 #ifdef SIGWINCH | |
4266 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
|
4267 #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
|
4268 |
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4269 signal (SIGPIPE, x_connection_closed); |
286 | 4270 } |
395 | 4271 |
4272 void | |
4273 syms_of_xterm () | |
4274 { | |
4275 staticpro (&invocation_name); | |
4276 invocation_name = Qnil; | |
4277 } | |
1052
b8defcaf1b61
* xterm.c (x_make_frame_invisible): Don't forget to check the
Jim Blandy <jimb@redhat.com>
parents:
1020
diff
changeset
|
4278 #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
|
4279 #endif /* ! defined (HAVE_X_WINDOWS) */ |