XEmacs 21.2.5
[chise/xemacs-chise.git.1] / src / frame-tty.c
1 /* TTY frame functions.
2    Copyright (C) 1995  Free Software Foundation, Inc.
3    Copyright (C) 1995, 1996 Ben Wing.
4    Copyright (C) 1997  Free Software Foundation, Inc.
5
6 This file is part of XEmacs.
7
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING.  If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 /* Synched up with: Not in FSF. */
24
25 /* Written by Ben Wing.
26    Multi-frame support added by Hrvoje Niksic. */
27
28 #include <config.h>
29 #include "lisp.h"
30
31 #include "console-tty.h"
32 #include "frame.h"
33
34 #include "events.h"
35
36 #ifdef HAVE_GPM
37 #include <gpm.h>
38 #endif
39
40 \f
41 /* Default properties to use when creating frames.  */
42 Lisp_Object Vdefault_tty_frame_plist;
43
44 static void tty_raise_frame (struct frame *);
45
46 \f
47 static void
48 tty_init_frame_1 (struct frame *f, Lisp_Object props)
49 {
50   struct device *d = XDEVICE (FRAME_DEVICE (f));
51   struct console *c = XCONSOLE (DEVICE_CONSOLE (d));
52
53   ++CONSOLE_TTY_DATA (c)->frame_count;
54   f->order_count = CONSOLE_TTY_DATA (c)->frame_count;
55   f->height = CONSOLE_TTY_DATA (c)->height;
56   f->width = CONSOLE_TTY_DATA (c)->width;
57 }
58
59 static void
60 tty_init_frame_3 (struct frame *f)
61 {
62   tty_raise_frame (f);
63 }
64
65 static void
66 tty_select_frame_if_unhidden (Lisp_Object frame)
67 {
68   if (FRAME_REPAINT_P (XFRAME (frame)))
69     select_frame_1 (frame);
70 }
71
72 static void
73 tty_schedule_frame_select (struct frame *f)
74 {
75   Lisp_Object frame;
76
77   XSETFRAME (frame, f);
78   enqueue_magic_eval_event (tty_select_frame_if_unhidden, frame);
79 }
80
81 static void
82 tty_after_init_frame (struct frame *f, int first_on_device,
83                       int first_on_console)
84 {
85   if (first_on_console)
86     call1 (Qinit_post_tty_win, FRAME_CONSOLE (f));
87 }
88
89 #ifdef HAVE_GPM
90 static int
91 tty_get_mouse_position (struct device *d, Lisp_Object *frame, int *x, int *y)
92 {
93   Gpm_Event ev;
94   int num_buttons;
95
96   num_buttons = Gpm_GetSnapshot(&ev);
97   *x = ev.x;
98   *y = ev.y;
99   *frame = DEVICE_SELECTED_FRAME (d);
100   return (1);
101 }
102
103 static void
104 tty_set_mouse_position (struct window *w, int x, int y)
105 {
106   /* XXX
107      I couldn't find any GPM functions that set the mouse position.
108      Mr. Perry had left this function empty; that must be why.
109      karlheg
110   */
111 }
112
113 #endif
114
115
116 /* Change from withdrawn state to mapped state. */
117 static void
118 tty_make_frame_visible (struct frame *f)
119 {
120   if (!FRAME_VISIBLE_P(f))
121     {
122       f->visible = -1;
123     }
124 }
125
126 /* Change from mapped state to withdrawn state. */
127 static void
128 tty_make_frame_invisible (struct frame *f)
129 {
130   f->visible = 0;
131 }
132
133 static void
134 tty_make_frame_hidden (struct frame *f)
135 {
136   f->visible = -1;
137 }
138
139 static void
140 tty_make_frame_unhidden (struct frame *f)
141 {
142   if (!FRAME_REPAINT_P(f))
143     {
144       SET_FRAME_CLEAR(f);
145       f->visible = 1;
146     }
147 }
148
149 static int
150 tty_frame_visible_p (struct frame *f)
151 {
152   return FRAME_VISIBLE_P (f);
153 }
154
155 static void
156 tty_raise_frame_no_select (struct frame *f)
157 {
158   Lisp_Object frame;
159   LIST_LOOP_2 (frame, DEVICE_FRAME_LIST (XDEVICE (FRAME_DEVICE (f))))
160     {
161       struct frame *o = XFRAME (frame);
162       if (o != f && FRAME_REPAINT_P (o))
163         {
164            tty_make_frame_hidden (o);
165            break;
166         }
167     }
168   tty_make_frame_unhidden (f);
169 }
170
171 static void
172 tty_raise_frame (struct frame *f)
173 {
174   tty_raise_frame_no_select (f);
175   tty_schedule_frame_select (f);
176 }
177
178 static void
179 tty_lower_frame (struct frame *f)
180 {
181   Lisp_Object frame_list = DEVICE_FRAME_LIST (XDEVICE (FRAME_DEVICE (f)));
182   Lisp_Object tail, new;
183
184   if (!FRAME_REPAINT_P (f))
185     return;
186
187   LIST_LOOP (tail, frame_list)
188     {
189       if (f == XFRAME (XCAR (tail)))
190         break;
191     }
192
193   /* To lower this frame, another frame has to be raised.  Return if
194      there is no other frame. */
195   if (NILP (tail) && EQ(frame_list, tail))
196     return;
197
198   tty_make_frame_hidden (f);
199   if (CONSP (XCDR (tail)))
200     new = XCAR (XCDR (tail));
201   else
202     new = XCAR (frame_list);
203   tty_make_frame_unhidden (XFRAME (new));
204   tty_schedule_frame_select (XFRAME (new));
205 }
206
207 static void
208 tty_delete_frame (struct frame *f)
209 {
210   struct device *d = XDEVICE (FRAME_DEVICE (f));
211
212   if (!NILP (DEVICE_SELECTED_FRAME (d)))
213     tty_raise_frame (XFRAME (DEVICE_SELECTED_FRAME (d)));
214 }
215 \f
216 /************************************************************************/
217 /*                            initialization                            */
218 /************************************************************************/
219
220 void
221 console_type_create_frame_tty (void)
222 {
223   CONSOLE_HAS_METHOD (tty, init_frame_1);
224   CONSOLE_HAS_METHOD (tty, init_frame_3);
225   CONSOLE_HAS_METHOD (tty, after_init_frame);
226 #ifdef HAVE_GPM
227   CONSOLE_HAS_METHOD (tty, get_mouse_position);
228   CONSOLE_HAS_METHOD (tty, set_mouse_position);
229 #endif
230   CONSOLE_HAS_METHOD (tty, make_frame_visible);
231   CONSOLE_HAS_METHOD (tty, make_frame_invisible);
232   CONSOLE_HAS_METHOD (tty, frame_visible_p);
233   CONSOLE_HAS_METHOD (tty, raise_frame);
234   CONSOLE_HAS_METHOD (tty, lower_frame);
235   CONSOLE_HAS_METHOD (tty, delete_frame);
236 }
237
238 void
239 vars_of_frame_tty (void)
240 {
241   DEFVAR_LISP ("default-tty-frame-plist", &Vdefault_tty_frame_plist /*
242 Plist of default frame-creation properties for tty frames.
243 These are in addition to and override what is specified in
244 `default-frame-plist', but are overridden by the arguments to the
245 particular call to `make-frame'.
246 */ );
247   Vdefault_tty_frame_plist = Qnil;
248
249   tty_console_methods->device_specific_frame_props =
250     &Vdefault_tty_frame_plist;
251
252   /* Tty frames are now supported.  Advertise a feature to indicate this. */
253   Fprovide (intern ("tty-frames"));
254 }