Підсистема управління подіями призначена для побудови інтерактивного графічного інтерфейсу користувача (GUI). Вона уніфікує всі дії користувача з пристроями введення — клавіатурою (KB) та поінтинг-пристроєм / мишею (PD) — у формі єдиного поняття «Подія» (Event).
Операції з клавіатурою та поінтинг-пристроєм послідовно поміщаються ядром у єдину системну чергу подій (Event Queue). Прикладні додатки працюють за принципом подієво-орієнтованої архітектури (Event-Driven Architecture): вони послідовно зчитують події з черги та виконують відповідні обробники реакції на дії користувача.
У багатозадачному середовищі в кожен конкретний момент часу інтерактивне введення користувача спрямовується строго до одного активного процесу. Стан прийому введення взаємно передається між процесами відповідно до фокусу введення.
Окрім управління чергою подій, підсистема надає засоби для зчитування та налаштування стану, швидкості повтору, чутливості та атрибутів клавіатури й поінтинг-пристрою, формуючи уніфікований системний інтерфейс для інтерактивних пристроїв введення.
У специфікації ядра BTRON3 визначено наступні класи системних подій:
Генерується при натисканні будь-якої кнопки миші чи поінтинг-пристрою у графічній області.
Генерується при відпусканні кнопки поінтинг-пристрою.
Генерується при натисканні звичайної клавіші клавіатури (окрім клавіш-модифікаторів Shift, Ctrl, Alt/Meta).
Генерується при відпусканні звичайної клавіші клавіатури.
Періодично генерується ядром при тривалій затримці клавіатурної клавіші у натиснутому стані. Затримка перед першим повтором (Offset) та інтервал між повторами (Interval) налаштовуються системно.
Генерується при змінах стану периферійних пристроїв (наприклад, підключення/вилучення носіїв інформації FD/Flash або зміна стану живильної батареї).
Фіктивна подія, що повертається системним викликом, якщо у черзі немає очікуючих подій.
Спеціальні події користувача для міжпроцесної взаємодії та передачі міжвіконних повідомлень системної оболонки Shell.
Клавіатурна підсистема розпізнає натискання та відпускання клавіш, стан клавіш-модифікаторів (Shift, Lock, Command) та генерує відповідні коди символів TRON Code. Швидкість автоповтору та таблиці розкладки клавіатури конфігуруються викликами get_kbs() та set_kbs().
Поінтинг-пристрій (миша, планшет, трекбол) транслює переміщення в координатній сітці екрана та натискання кнопок у системні координати курсора $(X, Y)$. За допомогою системних викликів get_pds() та set_pds() можна обмежувати область переміщення курсора, блокувати його позицію чи змінювати чутливість і коефіцієнт прискорення.
#define EM_BUTDWN 0x0001 /* Маска події натискання кнопки миші */ #define EM_BUTUP 0x0002 /* Маска події відпускання кнопки миші */ #define EM_KEYDWN 0x0004 /* Маска події натискання клавіші */ #define EM_KEYUP 0x0008 /* Маска події відпускання клавіші */ #define EM_AUTKEY 0x0010 /* Маска події автоповтору клавіші */ #define EM_DEVICE 0x0020 /* Маска системних подій пристроїв */ #define EM_APPL1 0x0080 /* Маска додатка 1 */ #define EM_ALL 0xffff /* Маска усіх типів подій */
typedef struct {
H kind; /* Тип події (EV_BUTDWN, EV_KEYDWN тощо) */
H stat; /* Стан модифікаторів (Shift, Ctrl, Alt) */
W time; /* Системна часова мітка події (мс) */
PNT pos; /* Екранні координати курсора (X, Y) */
union {
struct {
H no; /* Номер кнопки поінтинг-пристрою */
H cnt; /* Кількість кліків (Single/Double click) */
} button;
struct {
TC code; /* Символьний код клавіші (TRON Code) */
} key;
} data;
} EVENT;
typedef struct {
UW stat; /* Маска стану модифікаторів (Shift, Ctrl, Alt, CapsLock) */
UH delay; /* Затримка перед першим автоповтором клавіші (мс) */
UH interval; /* Інтервал між повторними спрацьовуваннями (мс) */
UH layout; /* Ідентифікатор кодової розкладки клавіатури */
} T_KBS;
typedef struct {
PNT pos; /* Поточні екранні координати курсора (X, Y) */
UH buttons; /* Бітова маска натиснутих кнопок миші */
RECT limit; /* Прямокутні межі переміщення курсора */
UH accel; /* Коефіцієнт прискорення руху курсора */
UH sens; /* Чутливість поінтинг-пристрою */
} T_PDS;
|
ERR get_evt(EVENT *evt, UW mask, TMOUT tmout)
EVENT *evt Буфер для збереження зчитаної події (Вихід) UW mask Маска фільтрації типів подій (EM_BUTDWN, EM_KEYDWN тощо) TMOUT tmout Час очікування (T_NOWAIT, T_FOREVER або значення у мс)
= 0 Успішне виконання (Подію записано у *evt) < 0 Помилка (Код помилки)
Вилучає чергову подію із системної черги подій процесу відповідно до маски фільтрації mask та записує її у структуру evt. Якщо черга порожня, процес заблокується до появи події або до спливання таймауту tmout.
ER_ADR : Неприпустима адреса вказівника evt. ER_TIMEOUT : Перевищено допустимий час очікування (при T_NOWAIT або таймауті). ER_PAR : Некоректні параметри mask або tmout.
|
ERR pke_evt(EVENT *evt, UW mask)
EVENT *evt Буфер для збереження копії події (Вихід) UW mask Маска фільтрації типів подій
= 0 Успішне виконання (Копію події записано в *evt, сама подія залишається в черзі) < 0 Помилка (Код помилки)
Зчитує копію найстарішої події із системної черги подій без її вилучення з черги.
ER_ADR : Неприпустима адреса вказівника evt. ER_NOEXS : У черзі відсутні події, що відповідають масці mask.
|
ERR snd_evt(W pid, EVENT *evt)
W pid Ідентифікатор цільового процесу (PID) EVENT *evt Вказівник на відправлювану подію
= 0 Успішне виконання < 0 Помилка (Код помилки)
Поміщає прикладну або системну подію evt у чергу подій вказаного цільового процесу pid.
ER_ADR : Неприпустима адреса вказівника evt. ER_ID : Недійсний ідентифікатор цільового процесу pid. ER_NOSPC : Черга подій цільового процесу переповнена.
|
WERR clr_evt(UW mask)
UW mask Маска фільтрації типів подій для вилучення
>= 0 Кількість вилучених та очищених подій < 0 Помилка (Код помилки)
Вилучає та відкидає з черги подій поточної задачі всі події, що відповідають бітовій масці mask. Повертає кількість вилучених подій.
ER_PAR : Некоректна маска подій mask.
|
ERR def_evt(UW mask, FP evthdr)
UW mask Маска типів подій для обробки FP evthdr Адреса процедури обробника (при evthdr = NULL скасовує реєстрацію)
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
Реєструє процедуру асинхронного сповіщення evthdr, яка автоматично викликатиметься ядром при надходженні подій, що відповідають масці mask.
|
ERR get_kbs(T_KBS *kbs)
T_KBS *kbs Вказівник на структуру для збереження параметрів клавіатури
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
Зчитує поточний стан модифікаторів, інтервал автоповтору та ідентифікатор розкладки клавіатури.
|
ERR set_kbs(T_KBS *kbs)
T_KBS *kbs Вказівник на нові параметри клавіатури
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
|
ERR get_pds(T_PDS *pds)
T_PDS *pds Вказівник на структуру для збереження стану поінтинг-пристрою
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
Зчитує поточну позицію курсора $(X, Y)$, стан кнопок та межі руху поінтинг-пристрою.
|
ERR set_pds(T_PDS *pds)
T_PDS *pds Вказівник на нові налаштування поінтинг-пристрою
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
Змінює прямокутні межі руху курсора, позицію курсора, чутливість та коефіцієнт прискорення.