2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
10 #include "ecore_fb_private.h"
12 static int _ecore_fb_vt_do_switch = 0;
14 static int _ecore_fb_vt_tty0_fd = 0;
15 static int _ecore_fb_vt_tty_fd = 0;
16 static int _ecore_fb_vt_current_vt = 0;
17 static int _ecore_fb_vt_prev_vt = 0;
19 static struct termios _ecore_fb_tty_prev_tio_mode;
20 static struct vt_mode _ecore_fb_vt_prev_mode;
22 static int _ecore_fb_signal_usr_handler(void *data, int type, void *ev);
23 static Ecore_Event_Handler *_ecore_fb_user_handler = NULL;
24 static int _ecore_fb_tty_prev_mode = 0;
25 static int _ecore_fb_tty_prev_kd_mode = 0;
27 /* callbacks for an attach/release of a vt */
28 static void (*_ecore_fb_func_fb_lost) (void *data) = NULL;
29 static void *_ecore_fb_func_fb_lost_data = NULL;
30 static void (*_ecore_fb_func_fb_gain) (void *data) = NULL;
31 static void *_ecore_fb_func_fb_gain_data = NULL;
33 /* FIXME what is the filter for? */
34 static Ecore_Event_Filter *_ecore_fb_filter_handler = NULL;
36 static void *_ecore_fb_event_filter_start(void *data);
37 static int _ecore_fb_event_filter_filter(void *data, void *loop_data, int type, void *event);
38 static void _ecore_fb_event_filter_end(void *data, void *loop_data);
41 static void _ecore_fb_vt_switch(int vt);
44 _ecore_fb_signal_usr_handler(void *data __UNUSED__, int type __UNUSED__, void *ev)
47 Ecore_Event_Signal_User *e;
49 e = (Ecore_Event_Signal_User *)ev;
53 if (_ecore_fb_func_fb_lost) _ecore_fb_func_fb_lost(_ecore_fb_func_fb_lost_data);
54 /* TODO stop listening from the devices? let the callback do it? */
55 ioctl(_ecore_fb_vt_tty_fd, VT_RELDISP, 1);
57 else if (e->number == 2)
60 if (_ecore_fb_func_fb_gain) _ecore_fb_func_fb_gain(_ecore_fb_func_fb_gain_data);
61 /* TODO reattach all devices */
67 _ecore_fb_vt_switch(int vt)
70 if (_ecore_fb_vt_tty_fd != 0)
72 if (vt != _ecore_fb_vt_current_vt)
74 tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
75 ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
76 ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
79 ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, vt);
83 _ecore_fb_vt_setup(void)
87 struct vt_mode new_vtmode;
89 if(_ecore_fb_vt_current_vt != _ecore_fb_vt_prev_vt)
91 snprintf(buf, sizeof(buf), "/dev/tty%i", _ecore_fb_vt_current_vt);
92 if((_ecore_fb_vt_tty_fd = open(buf, O_RDWR)) < 0)
94 printf("[ecore_fb:vt_setup] cant open tty %d\n", _ecore_fb_vt_current_vt);
97 close(_ecore_fb_vt_tty0_fd);
98 _ecore_fb_vt_tty0_fd = 0;
99 /* FIXME detach the process from current tty ? */
102 _ecore_fb_vt_tty_fd = _ecore_fb_vt_tty0_fd;
104 tcgetattr(_ecore_fb_vt_tty_fd, &_ecore_fb_tty_prev_tio_mode);
105 ioctl(_ecore_fb_vt_tty_fd, KDGETMODE, &_ecore_fb_tty_prev_kd_mode);
106 ioctl(_ecore_fb_vt_tty_fd, VT_GETMODE, &_ecore_fb_vt_prev_mode);
108 if(ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, KD_GRAPHICS) < 0)
110 perror("[ecore_fb:vt_setup] cant set the mode to KD_GRAPHICS");
111 close(_ecore_fb_vt_tty_fd);
114 ioctl(_ecore_fb_vt_tty_fd, KDGKBMODE, &_ecore_fb_tty_prev_mode);
116 /* support of switching */
117 new_vtmode.mode = VT_PROCESS;
118 new_vtmode.waitv = 0;
119 new_vtmode.relsig = SIGUSR1;
120 new_vtmode.acqsig = SIGUSR2;
121 if(ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &new_vtmode) < 0)
123 perror("[ecore_fb:vt_setup] cant set the tty mode");
124 close(_ecore_fb_vt_tty_fd);
127 /* register signal handlers when alloc/detach of vt */
128 _ecore_fb_user_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
129 _ecore_fb_signal_usr_handler,
131 /* What does this does? */
132 _ecore_fb_filter_handler = ecore_event_filter_add(_ecore_fb_event_filter_start, _ecore_fb_event_filter_filter, _ecore_fb_event_filter_end, NULL);
135 if(ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, _ecore_fb_vt_current_vt) < 0)
137 perror("[ecore_fb:vt_setup] error on VT_ACTIVATE");
138 close(_ecore_fb_vt_tty_fd);
141 if(ioctl(_ecore_fb_vt_tty_fd, VT_WAITACTIVE, _ecore_fb_vt_current_vt) < 0)
143 perror("[ecore_fb:vt_setup] error on VT_WAITACTIVE");
144 close(_ecore_fb_vt_tty_fd);
147 /* FIXME assign the fb to the tty in case isnt setup */
152 ecore_fb_vt_init(void)
154 struct vt_stat vtstat;
156 /* as root you can allocate another tty */
158 _ecore_fb_vt_do_switch = 1;
159 if((_ecore_fb_vt_tty0_fd = open("/dev/tty0", O_RDONLY)) < 0)
161 printf("[ecore_fb:init] cant open /dev/tty0\n");
164 /* query current vt state */
165 if((ioctl(_ecore_fb_vt_tty0_fd, VT_GETSTATE, &vtstat)) < 0)
167 printf("[ecore_fb:init] cant get current tty state\n");
170 _ecore_fb_vt_prev_vt = vtstat.v_active;
171 /* switch to another tty */
172 if(_ecore_fb_vt_do_switch)
176 if ((ioctl(_ecore_fb_vt_tty0_fd, VT_OPENQRY, &vtno) < 0))
178 printf("[ecore_fb:init] cant query for a vt\n");
181 _ecore_fb_vt_current_vt = vtno;
183 /* use current tty */
185 _ecore_fb_vt_current_vt = _ecore_fb_vt_prev_vt;
186 if(!_ecore_fb_vt_setup())
188 printf("[ecore_fb:init] cant setup the vt, restoring previous mode...\n");
189 /* TODO finish this */
190 if(_ecore_fb_vt_do_switch)
192 printf("[ecore_fb:init] switching back to vt %d\n", _ecore_fb_vt_prev_vt);
200 ecore_fb_vt_shutdown(void)
202 /* restore the previous mode */
203 if(_ecore_fb_vt_tty_fd != 0)
205 tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
206 ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
207 ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
208 ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &_ecore_fb_vt_prev_mode);
209 /* go back to previous vt */
210 close(_ecore_fb_vt_tty_fd);
211 _ecore_fb_vt_tty_fd = 0;
214 if(_ecore_fb_user_handler)
215 ecore_event_handler_del(_ecore_fb_user_handler);
216 _ecore_fb_user_handler = NULL;
218 if(_ecore_fb_filter_handler)
219 ecore_event_filter_del(_ecore_fb_filter_handler);
220 _ecore_fb_filter_handler = NULL;
226 * FIXME: To be fixed.
227 * @todo Documentation: Find out what this does.
230 ecore_fb_callback_gain_set(void (*func) (void *data), void *data)
232 _ecore_fb_func_fb_gain = func;
233 _ecore_fb_func_fb_gain_data = data;
239 * FIXME: To be fixed.
240 * @todo Documentation: Find out what this does.
243 ecore_fb_callback_lose_set(void (*func) (void *data), void *data)
245 _ecore_fb_func_fb_lost = func;
246 _ecore_fb_func_fb_lost_data = data;
248 typedef struct _Ecore_Fb_Filter_Data Ecore_Fb_Filter_Data;
250 struct _Ecore_Fb_Filter_Data
256 _ecore_fb_event_filter_start(void *data __UNUSED__)
258 Ecore_Fb_Filter_Data *filter_data;
260 filter_data = calloc(1, sizeof(Ecore_Fb_Filter_Data));
265 _ecore_fb_event_filter_filter(void *data __UNUSED__, void *loop_data,int type, void *event __UNUSED__)
267 Ecore_Fb_Filter_Data *filter_data;
269 filter_data = loop_data;
270 if (!filter_data) return 1;
271 if (type == ECORE_FB_EVENT_MOUSE_MOVE)
273 if ((filter_data->last_event_type) == ECORE_FB_EVENT_MOUSE_MOVE)
275 filter_data->last_event_type = type;
279 filter_data->last_event_type = type;
284 _ecore_fb_event_filter_end(void *data __UNUSED__, void *loop_data)
286 Ecore_Fb_Filter_Data *filter_data;
288 filter_data = loop_data;
289 if (filter_data) free(filter_data);