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