Специфікація BTRON3 (Український переклад) | Розділ 5: Ядро операційної системи (Kernel)
Повернутися до змісту розділу Ядра
Попередня сторінка: 1.6 Файлова система та менеджер файлів (Повернутися)
Наступна сторінка: 1.8 Менеджер пристроїв та драйверів (Перейти)

1.7 Менеджер подій вводу (Input Event Management)

1.7.1 Огляд підсистеми управління подіями (Overview)

Підсистема управління подіями призначена для побудови інтерактивного графічного інтерфейсу користувача (GUI). Вона уніфікує всі дії користувача з пристроями введення — клавіатурою (KB) та поінтинг-пристроєм / мишею (PD) — у формі єдиного поняття «Подія» (Event).

Операції з клавіатурою та поінтинг-пристроєм послідовно поміщаються ядром у єдину системну чергу подій (Event Queue). Прикладні додатки працюють за принципом подієво-орієнтованої архітектури (Event-Driven Architecture): вони послідовно зчитують події з черги та виконують відповідні обробники реакції на дії користувача.

У багатозадачному середовищі в кожен конкретний момент часу інтерактивне введення користувача спрямовується строго до одного активного процесу. Стан прийому введення взаємно передається між процесами відповідно до фокусу введення.

Окрім управління чергою подій, підсистема надає засоби для зчитування та налаштування стану, швидкості повтору, чутливості та атрибутів клавіатури й поінтинг-пристрою, формуючи уніфікований системний інтерфейс для інтерактивних пристроїв введення.

1.7.2 Класифікація та типи подій (Event Types)

У специфікації ядра BTRON3 визначено наступні класи системних подій:

EV_BUTDWN (Тип 1) — Натискання кнопки поінтинг-пристрою (Button Down Event) :

Генерується при натисканні будь-якої кнопки миші чи поінтинг-пристрою у графічній області.

EV_BUTUP (Тип 2) — Відпускання кнопки поінтинг-пристрою (Button Up Event) :

Генерується при відпусканні кнопки поінтинг-пристрою.

EV_KEYDWN (Тип 3) — Натискання клавіші (Key Down Event) :

Генерується при натисканні звичайної клавіші клавіатури (окрім клавіш-модифікаторів Shift, Ctrl, Alt/Meta).

EV_KEYUP (Тип 4) — Відпускання клавіші (Key Up Event) :

Генерується при відпусканні звичайної клавіші клавіатури.

EV_AUTKEY (Тип 5) — Автоматичний повтор клавіші (Auto-Repeat Key Event) :

Періодично генерується ядром при тривалій затримці клавіатурної клавіші у натиснутому стані. Затримка перед першим повтором (Offset) та інтервал між повторами (Interval) налаштовуються системно.

EV_DEVICE (Тип 6) — Подія системного пристрою (Device Event) :

Генерується при змінах стану периферійних пристроїв (наприклад, підключення/вилучення носіїв інформації FD/Flash або зміна стану живильної батареї).

EV_NULL (Тип 0) — Порожня подія (Null Event) :

Фіктивна подія, що повертається системним викликом, якщо у черзі немає очікуючих подій.

EV_APPL1 .. EV_APPL8 (Типи 8 – 15) — Події прикладних додатків (Application Events) :

Спеціальні події користувача для міжпроцесної взаємодії та передачі міжвіконних повідомлень системної оболонки Shell.

1.7.3 Підсистема клавіатури (Keyboard Management)

Клавіатурна підсистема розпізнає натискання та відпускання клавіш, стан клавіш-модифікаторів (Shift, Lock, Command) та генерує відповідні коди символів TRON Code. Швидкість автоповтору та таблиці розкладки клавіатури конфігуруються викликами get_kbs() та set_kbs().

1.7.4 Підсистема поінтинг-пристрою (Pointing Device Management)

Поінтинг-пристрій (миша, планшет, трекбол) транслює переміщення в координатній сітці екрана та натискання кнопок у системні координати курсора $(X, Y)$. За допомогою системних викликів get_pds() та set_pds() можна обмежувати область переміщення курсора, блокувати його позицію чи змінювати чутливість і коефіцієнт прискорення.

1.7.5 Визначення типів даних та констант (Data Types & Constants)

□ Маски типів подій (Event Type Masks)

#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      /* Маска усіх типів подій */

□ Структура події EVENT

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;

□ Стан та налаштування клавіатури (T_KBS)

typedef struct {
    UW      stat;           /* Маска стану модифікаторів (Shift, Ctrl, Alt, CapsLock) */
    UH      delay;          /* Затримка перед першим автоповтором клавіші (мс) */
    UH      interval;       /* Інтервал між повторними спрацьовуваннями (мс) */
    UH      layout;         /* Ідентифікатор кодової розкладки клавіатури */
} T_KBS;

□ Стан та налаштування поінтинг-пристрою (T_PDS)

typedef struct {
    PNT     pos;            /* Поточні екранні координати курсора (X, Y) */
    UH      buttons;        /* Бітова маска натиснутих кнопок миші */
    RECT    limit;          /* Прямокутні межі переміщення курсора */
    UH      accel;          /* Коефіцієнт прискорення руху курсора */
    UH      sens;           /* Чутливість поінтинг-пристрою */
} T_PDS;

1.7.6 Системні виклики підсистеми подій (Event System Calls)

get_evt
Get Event
Зчитання події з черги (Get Event)

【Синтаксис / Прототип】

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.
pke_evt
Peek Event
Перегляд події у черзі без вилучення (Peek Event)

【Синтаксис / Прототип】

ERR pke_evt(EVENT *evt, UW mask)

【Параметри】

EVENT  *evt     Буфер для збереження копії події (Вихід)
UW      mask    Маска фільтрації типів подій

【Значення, що повертається】

= 0     Успішне виконання (Копію події записано в *evt, сама подія залишається в черзі)
< 0     Помилка (Код помилки)

【Детальний опис】

Зчитує копію найстарішої події із системної черги подій без її вилучення з черги.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника evt.
ER_NOEXS   : У черзі відсутні події, що відповідають масці mask.
snd_evt
Send Event
Відправлення події у чергу (Send Event)

【Синтаксис / Прототип】

ERR snd_evt(W pid, EVENT *evt)

【Параметри】

W       pid     Ідентифікатор цільового процесу (PID)
EVENT  *evt     Вказівник на відправлювану подію

【Значення, що повертається】

= 0     Успішне виконання
< 0     Помилка (Код помилки)

【Детальний опис】

Поміщає прикладну або системну подію evt у чергу подій вказаного цільового процесу pid.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника evt.
ER_ID      : Недійсний ідентифікатор цільового процесу pid.
ER_NOSPC   : Черга подій цільового процесу переповнена.
clr_evt
Clear Events
Очищення очікуючих подій із черги (Clear Events)

【Синтаксис / Прототип】

WERR clr_evt(UW mask)

【Параметри】

UW      mask    Маска фільтрації типів подій для вилучення

【Значення, що повертається】

>= 0    Кількість вилучених та очищених подій
< 0     Помилка (Код помилки)

【Детальний опис】

Вилучає та відкидає з черги подій поточної задачі всі події, що відповідають бітовій масці mask. Повертає кількість вилучених подій.

【Коди помилок】

ER_PAR     : Некоректна маска подій mask.
def_evt
Define Event Handler
Реєстрація обробника асинхронних подій (Define Event Handler)

【Синтаксис / Прототип】

ERR def_evt(UW mask, FP evthdr)

【Параметри】

UW      mask    Маска типів подій для обробки
FP      evthdr  Адреса процедури обробника (при evthdr = NULL скасовує реєстрацію)

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Реєструє процедуру асинхронного сповіщення evthdr, яка автоматично викликатиметься ядром при надходженні подій, що відповідають масці mask.

get_kbs
Get Keyboard Status
Отримання стану та параметрів клавіатури (Get Keyboard Status)

【Синтаксис / Прототип】

ERR get_kbs(T_KBS *kbs)

【Параметри】

T_KBS  *kbs     Вказівник на структуру для збереження параметрів клавіатури

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Зчитує поточний стан модифікаторів, інтервал автоповтору та ідентифікатор розкладки клавіатури.

set_kbs
Set Keyboard Status
Встановлення параметрів клавіатури (Set Keyboard Status)

【Синтаксис / Прототип】

ERR set_kbs(T_KBS *kbs)

【Параметри】

T_KBS  *kbs     Вказівник на нові параметри клавіатури

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)
get_pds
Get Pointing Device Status
Отримання стану поінтинг-пристрою (Get Pointing Device Status)

【Синтаксис / Прототип】

ERR get_pds(T_PDS *pds)

【Параметри】

T_PDS  *pds     Вказівник на структуру для збереження стану поінтинг-пристрою

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Зчитує поточну позицію курсора $(X, Y)$, стан кнопок та межі руху поінтинг-пристрою.

set_pds
Set Pointing Device Status
Встановлення налаштувань поінтинг-пристрою (Set Pointing Device Status)

【Синтаксис / Прототип】

ERR set_pds(T_PDS *pds)

【Параметри】

T_PDS  *pds     Вказівник на нові налаштування поінтинг-пристрою

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Змінює прямокутні межі руху курсора, позицію курсора, чутливість та коефіцієнт прискорення.


Повернутися до змісту цього розділу
Попередня сторінка: 1.6 Файлова система та менеджер файлів (Повернутися)
Наступна сторінка: 1.8 Менеджер пристроїв та драйверів (Перейти)