1 #include "elput_private.h"
2
3 static Elput_Interface *_ifaces[] =
4 {
5 #ifdef HAVE_SYSTEMD
6 &_logind_interface,
7 #endif
8 NULL,
9 };
10
11 static Eina_Bool
_cb_key_down(void * data,int type EINA_UNUSED,void * event)12 _cb_key_down(void *data, int type EINA_UNUSED, void *event)
13 {
14 Elput_Manager *em;
15 Ecore_Event_Key *ev;
16 int code = 0, vt = 0;
17
18 em = data;
19 ev = event;
20 code = (ev->keycode - 8);
21
22 if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
23 (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
24 (code >= KEY_F1) && (code <= KEY_F8))
25 {
26 vt = (code - KEY_F1 + 1);
27 if (em->interface->vt_set)
28 {
29 if (!em->interface->vt_set(em, vt))
30 ERR("Failed to switch to virtual terminal %d", vt);
31 }
32 }
33
34 return ECORE_CALLBACK_RENEW;
35 }
36
37 EAPI Elput_Manager *
elput_manager_connect(const char * seat,unsigned int tty)38 elput_manager_connect(const char *seat, unsigned int tty)
39 {
40 Elput_Interface **it;
41
42 for (it = _ifaces; *it != NULL; it++)
43 {
44 Elput_Interface *iface;
45 Elput_Manager *em;
46
47 iface = *it;
48 if (iface->connect(&em, seat, tty))
49 return em;
50 }
51
52 return NULL;
53 }
54
55 EAPI void
elput_manager_disconnect(Elput_Manager * manager)56 elput_manager_disconnect(Elput_Manager *manager)
57 {
58 EINA_SAFETY_ON_NULL_RETURN(manager);
59 EINA_SAFETY_ON_NULL_RETURN(manager->interface);
60
61 if (manager->input.thread)
62 {
63 ecore_thread_cancel(manager->input.thread);
64 manager->del = 1;
65 return;
66 }
67
68 if (manager->interface->disconnect)
69 manager->interface->disconnect(manager);
70 }
71
72 EAPI int
elput_manager_open(Elput_Manager * manager,const char * path,int flags)73 elput_manager_open(Elput_Manager *manager, const char *path, int flags)
74 {
75 int ret = -1;
76
77 EINA_SAFETY_ON_NULL_RETURN_VAL(manager, -1);
78 EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, -1);
79 EINA_SAFETY_ON_NULL_RETURN_VAL(path, -1);
80
81 if (flags < 0) flags = O_RDWR;
82
83 if (manager->interface->open)
84 {
85 ret = manager->interface->open(manager, path, flags);
86 if (ret)
87 {
88 manager->vt_hdlr =
89 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
90 _cb_key_down, manager);
91 manager->vt_fd = ret;
92 }
93 }
94
95 return ret;
96 }
97
98 EAPI void
elput_manager_close(Elput_Manager * manager,int fd)99 elput_manager_close(Elput_Manager *manager, int fd)
100 {
101 EINA_SAFETY_ON_NULL_RETURN(manager);
102 EINA_SAFETY_ON_NULL_RETURN(manager->interface);
103
104 if (fd == manager->vt_fd)
105 {
106 if (manager->vt_hdlr) ecore_event_handler_del(manager->vt_hdlr);
107 manager->vt_hdlr = NULL;
108 }
109
110 if (manager->interface->close)
111 manager->interface->close(manager, fd);
112 }
113
114 EAPI Eina_Bool
elput_manager_vt_set(Elput_Manager * manager,int vt)115 elput_manager_vt_set(Elput_Manager *manager, int vt)
116 {
117 EINA_SAFETY_ON_NULL_RETURN_VAL(manager, EINA_FALSE);
118 EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, EINA_FALSE);
119 EINA_SAFETY_ON_TRUE_RETURN_VAL((vt < 0), EINA_FALSE);
120
121 if (manager->interface->vt_set)
122 return manager->interface->vt_set(manager, vt);
123
124 return EINA_FALSE;
125 }
126
127 EAPI void
elput_manager_window_set(Elput_Manager * manager,unsigned int window)128 elput_manager_window_set(Elput_Manager *manager, unsigned int window)
129 {
130 EINA_SAFETY_ON_NULL_RETURN(manager);
131
132 manager->window = window;
133 }
134
135 EAPI const Eina_List *
elput_manager_seats_get(Elput_Manager * manager)136 elput_manager_seats_get(Elput_Manager *manager)
137 {
138 EINA_SAFETY_ON_NULL_RETURN_VAL(manager, NULL);
139 return manager->input.seats;
140 }
141