efl

Форк
0
/
elput_manager.c 
141 строка · 3.1 Кб
1
#include "elput_private.h"
2

3
static Elput_Interface *_ifaces[] =
4
{
5
#ifdef HAVE_SYSTEMD
6
   &_logind_interface,
7
#endif
8
   &_root_interface,
9
   NULL,
10
};
11

12
static Eina_Bool
13
_cb_key_down(void *data, int type EINA_UNUSED, void *event)
14
{
15
   Elput_Manager *em;
16
   Ecore_Event_Key *ev;
17
   int code = 0, vt = 0;
18

19
   em = data;
20
   ev = event;
21
   code = (ev->keycode - 8);
22

23
   if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
24
       (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
25
       (code >= KEY_F1) && (code <= KEY_F8))
26
     {
27
        vt = (code - KEY_F1 + 1);
28
        if (em->interface->vt_set)
29
          {
30
             if (!em->interface->vt_set(em, vt))
31
               ERR("Failed to switch to virtual terminal %d", vt);
32
          }
33
     }
34

35
   return ECORE_CALLBACK_RENEW;
36
}
37

38
EAPI Elput_Manager *
39
elput_manager_connect(const char *seat, unsigned int tty)
40
{
41
   Elput_Interface **it;
42

43
   for (it = _ifaces; *it != NULL; it++)
44
     {
45
        Elput_Interface *iface;
46
        Elput_Manager *em;
47

48
        iface = *it;
49
        if (iface->connect(&em, seat, tty))
50
          return em;
51
     }
52

53
   return NULL;
54
}
55

56
EAPI void
57
elput_manager_disconnect(Elput_Manager *manager)
58
{
59
   EINA_SAFETY_ON_NULL_RETURN(manager);
60
   EINA_SAFETY_ON_NULL_RETURN(manager->interface);
61

62
   if (manager->input.thread)
63
     {
64
        ecore_thread_cancel(manager->input.thread);
65
        manager->del = 1;
66
        return;
67
     }
68

69
   if (manager->interface->disconnect)
70
     manager->interface->disconnect(manager);
71
}
72

73
EAPI int
74
elput_manager_open(Elput_Manager *manager, const char *path, int flags)
75
{
76
   int ret = -1;
77

78
   EINA_SAFETY_ON_NULL_RETURN_VAL(manager, -1);
79
   EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, -1);
80
   EINA_SAFETY_ON_NULL_RETURN_VAL(path, -1);
81

82
   if (flags < 0) flags = O_RDWR;
83

84
   if (manager->interface->open)
85
     {
86
        ret = manager->interface->open(manager, path, flags);
87
        if (ret)
88
          {
89
             manager->vt_hdlr =
90
               ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
91
                                       _cb_key_down, manager);
92
             manager->vt_fd = ret;
93
          }
94
     }
95

96
   return ret;
97
}
98

99
EAPI void
100
elput_manager_close(Elput_Manager *manager, int fd)
101
{
102
   EINA_SAFETY_ON_NULL_RETURN(manager);
103
   EINA_SAFETY_ON_NULL_RETURN(manager->interface);
104

105
   if (fd == manager->vt_fd)
106
     {
107
        if (manager->vt_hdlr) ecore_event_handler_del(manager->vt_hdlr);
108
        manager->vt_hdlr = NULL;
109
     }
110

111
   if (manager->interface->close)
112
     manager->interface->close(manager, fd);
113
}
114

115
EAPI Eina_Bool
116
elput_manager_vt_set(Elput_Manager *manager, int vt)
117
{
118
   EINA_SAFETY_ON_NULL_RETURN_VAL(manager, EINA_FALSE);
119
   EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, EINA_FALSE);
120
   EINA_SAFETY_ON_TRUE_RETURN_VAL((vt < 0), EINA_FALSE);
121

122
   if (manager->interface->vt_set)
123
     return manager->interface->vt_set(manager, vt);
124

125
   return EINA_FALSE;
126
}
127

128
EAPI void
129
elput_manager_window_set(Elput_Manager *manager, unsigned int window)
130
{
131
   EINA_SAFETY_ON_NULL_RETURN(manager);
132

133
   manager->window = window;
134
}
135

136
EAPI const Eina_List *
137
elput_manager_seats_get(Elput_Manager *manager)
138
{
139
   EINA_SAFETY_ON_NULL_RETURN_VAL(manager, NULL);
140
   return manager->input.seats;
141
}
142

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.