mirror of https://gitlab.com/nakst/essence
window manager HID list
This commit is contained in:
parent
fe78d0a16e
commit
cc66d80a25
|
@ -77,6 +77,12 @@ Once complete, you can test the operating system in an emulator.
|
|||
* If you have Qemu installed, run `t2` in the build system.
|
||||
* If you have VirtualBox installed, make a 128MB drive called `vbox.vdi` in the `bin` folder, attach it to a virtual machine called "Essence" (choose "Windows 7 64-bit" as the OS), and run `v` in the build system.
|
||||
|
||||
## Keyboard layout
|
||||
|
||||
To set the default keyboard layout for use in the emulator to match your current one, run:
|
||||
|
||||
setxkbmap -query | grep layout | awk '{OFS=""; print "General.keyboard_layout=", $2}' >> bin/config.ini
|
||||
|
||||
## Configuration
|
||||
|
||||
From within the build system, run the command `config` to open the configuration editor. Click an option to change its value, and then click the `Save` button. You changes are saved locally, and will not be uploaded by Git. Not all configurations are likely to work; if you don't know what you're doing, it's probably best to stick with the defaults.
|
||||
|
|
|
@ -558,8 +558,8 @@ void PS2::Initialise(KDevice *parentDevice) {
|
|||
}
|
||||
|
||||
KDevice *controller = KDeviceCreate("PS/2 controller", parentDevice, sizeof(KDevice));
|
||||
KDeviceSendConnectedMessage(KDeviceCreate("PS/2 keyboard", controller, sizeof(KDevice)), ES_DEVICE_KEYBOARD);
|
||||
if (channels == 2) KDeviceCreate("PS/2 mouse", controller, sizeof(KDevice));
|
||||
KRegisterHIDevice((KHIDevice *) KDeviceCreate("PS/2 keyboard", controller, sizeof(KHIDevice)));
|
||||
if (channels == 2) KRegisterHIDevice((KHIDevice *) KDeviceCreate("PS/2 mouse", controller, sizeof(KHIDevice)));
|
||||
|
||||
KernelLog(LOG_INFO, "PS/2", "controller initialised", "Setup PS/2 controller%z.\n", channels == 2 ? ", with a mouse" : "");
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ struct GameController {
|
|||
uint8_t reportPrefix;
|
||||
};
|
||||
|
||||
struct HIDDevice : KDevice {
|
||||
struct HIDDevice : KHIDevice {
|
||||
KUSBDevice *device;
|
||||
|
||||
Array<ReportItem, K_FIXED> reportItems;
|
||||
|
@ -771,7 +771,7 @@ static void DeviceAttach(KDevice *parent) {
|
|||
device->destroy = DeviceDestroy;
|
||||
device->device = (KUSBDevice *) parent;
|
||||
device->Initialise();
|
||||
KDeviceCloseHandle(device);
|
||||
KRegisterHIDevice(device);
|
||||
}
|
||||
|
||||
KDriver driverUSBHID = {
|
||||
|
|
|
@ -360,34 +360,6 @@ struct KTimer {
|
|||
void KTimerSet(KTimer *timer, uint64_t triggerInMs, KAsyncTaskCallback callback = nullptr, EsGeneric argument = 0);
|
||||
void KTimerRemove(KTimer *timer); // Timers with callbacks cannot be removed (it'd race with async task delivery).
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// Window manager.
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
|
||||
struct KMouseUpdateData {
|
||||
int32_t xMovement, yMovement;
|
||||
bool xIsAbsolute, yIsAbsolute;
|
||||
int32_t xFrom, xTo, yFrom, yTo;
|
||||
int32_t xScroll, yScroll;
|
||||
uint32_t buttons;
|
||||
};
|
||||
|
||||
#define K_CURSOR_MOVEMENT_SCALE (0x100)
|
||||
void KMouseUpdate(const KMouseUpdateData *data);
|
||||
void KKeyboardUpdate(uint16_t *keysDown, size_t keysDownCount);
|
||||
void KKeyPress(uint32_t scancode);
|
||||
|
||||
uint64_t KGameControllerConnect();
|
||||
void KGameControllerDisconnect(uint64_t id);
|
||||
void KGameControllerUpdate(EsGameControllerState *state);
|
||||
|
||||
#define K_SCANCODE_KEY_RELEASED (1 << 15)
|
||||
#define K_SCANCODE_KEY_PRESSED (0 << 15)
|
||||
|
||||
#define K_LEFT_BUTTON (1)
|
||||
#define K_MIDDLE_BUTTON (2)
|
||||
#define K_RIGHT_BUTTON (4)
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// Memory manager.
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
|
@ -623,6 +595,45 @@ size_t KDMABufferGetTotalByteCount(KDMABuffer *buffer);
|
|||
KDMASegment KDMABufferNextSegment(KDMABuffer *buffer, bool peek = false);
|
||||
bool KDMABufferIsComplete(KDMABuffer *buffer); // Returns true if the end of the transfer buffer has been reached.
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// Window manager.
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
|
||||
struct KMouseUpdateData {
|
||||
#define K_CURSOR_MOVEMENT_SCALE (0x100)
|
||||
int32_t xMovement, yMovement;
|
||||
bool xIsAbsolute, yIsAbsolute;
|
||||
int32_t xFrom, xTo, yFrom, yTo;
|
||||
int32_t xScroll, yScroll;
|
||||
#define K_LEFT_BUTTON (1)
|
||||
#define K_MIDDLE_BUTTON (2)
|
||||
#define K_RIGHT_BUTTON (4)
|
||||
uint32_t buttons;
|
||||
};
|
||||
|
||||
struct KHIDevice : KDevice {
|
||||
#define K_KEYBOARD_INDICATOR_NUM_LOCK (1 << 0)
|
||||
#define K_KEYBOARD_INDICATOR_CAPS_LOCK (1 << 1)
|
||||
#define K_KEYBOARD_INDICATOR_SCROLL_LOCK (1 << 2)
|
||||
#define K_KEYBOARD_INDICATOR_COMPOSE (1 << 3)
|
||||
#define K_KEYBOARD_INDICATOR_KANA (1 << 4)
|
||||
#define K_KEYBOARD_INDICATOR_SHIFT (1 << 5)
|
||||
void (*setKeyboardIndicators)(KHIDevice *device, uint32_t indicators);
|
||||
};
|
||||
|
||||
void KMouseUpdate(const KMouseUpdateData *data);
|
||||
|
||||
#define K_SCANCODE_KEY_RELEASED (1 << 15)
|
||||
#define K_SCANCODE_KEY_PRESSED (0 << 15)
|
||||
void KKeyPress(uint32_t scancode);
|
||||
void KKeyboardUpdate(uint16_t *keysDown, size_t keysDownCount);
|
||||
|
||||
uint64_t KGameControllerConnect();
|
||||
void KGameControllerDisconnect(uint64_t id);
|
||||
void KGameControllerUpdate(EsGameControllerState *state);
|
||||
|
||||
void KRegisterHIDevice(KHIDevice *device);
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// Block devices.
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -1182,10 +1182,10 @@ SYSCALL_IMPLEMENT(ES_SYSCALL_GAME_CONTROLLER_STATE_POLL) {
|
|||
EsGameControllerState gameControllers[ES_GAME_CONTROLLER_MAX_COUNT];
|
||||
size_t gameControllerCount;
|
||||
|
||||
KMutexAcquire(&windowManager.gameControllersMutex);
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
gameControllerCount = windowManager.gameControllerCount;
|
||||
EsMemoryCopy(gameControllers, windowManager.gameControllers, sizeof(EsGameControllerState) * gameControllerCount);
|
||||
KMutexRelease(&windowManager.gameControllersMutex);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
|
||||
SYSCALL_WRITE(argument0, gameControllers, sizeof(EsGameControllerState) * gameControllerCount);
|
||||
SYSCALL_RETURN(gameControllerCount, false);
|
||||
|
|
|
@ -128,9 +128,12 @@ struct WindowManager {
|
|||
|
||||
EsRectangle workArea;
|
||||
|
||||
// Game controllers:
|
||||
// Devices:
|
||||
|
||||
KMutex deviceMutex;
|
||||
|
||||
Array<KDevice *, K_FIXED> hiDevices;
|
||||
|
||||
KMutex gameControllersMutex;
|
||||
EsGameControllerState gameControllers[ES_GAME_CONTROLLER_MAX_COUNT];
|
||||
size_t gameControllerCount;
|
||||
EsObjectID gameControllerID;
|
||||
|
@ -155,6 +158,44 @@ void SendMessageToWindow(Window *window, EsMessage *message);
|
|||
|
||||
#else
|
||||
|
||||
void HIDeviceUpdateIndicators() {
|
||||
KMutexAssertLocked(&windowManager.mutex);
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
|
||||
// TODO Other indicators.
|
||||
uint32_t indicators = windowManager.numlock ? K_KEYBOARD_INDICATOR_NUM_LOCK : 0;
|
||||
|
||||
for (uintptr_t i = 0; i < windowManager.hiDevices.Length(); i++) {
|
||||
KHIDevice *device = (KHIDevice *) windowManager.hiDevices[i]->parent;
|
||||
|
||||
if (device->setKeyboardIndicators) {
|
||||
device->setKeyboardIndicators(device, indicators);
|
||||
}
|
||||
}
|
||||
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
}
|
||||
|
||||
void HIDeviceRemoved(KDevice *device) {
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
windowManager.hiDevices.FindAndDeleteSwap(device, true);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
}
|
||||
|
||||
void KRegisterHIDevice(KHIDevice *device) {
|
||||
KDevice *child = KDeviceCreate("HID child", device, sizeof(KDevice));
|
||||
|
||||
if (child) {
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
child->removed = HIDeviceRemoved;
|
||||
windowManager.hiDevices.Add(child);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
KDeviceCloseHandle(child);
|
||||
}
|
||||
|
||||
KDeviceCloseHandle(device);
|
||||
}
|
||||
|
||||
bool Window::IsVisible() {
|
||||
return !hidden && !closed && (id != windowManager.eyedropAvoidID || !windowManager.eyedropping);
|
||||
}
|
||||
|
@ -321,6 +362,11 @@ void WindowManager::PressKey(unsigned scancode) {
|
|||
if (scancode == ES_SCANCODE_RIGHT_FLAG) flag2 = true;
|
||||
if (scancode == (ES_SCANCODE_RIGHT_FLAG | K_SCANCODE_KEY_RELEASED)) flag2 = false;
|
||||
|
||||
if (scancode == ES_SCANCODE_NUM_LOCK) {
|
||||
numlock = !numlock;
|
||||
HIDeviceUpdateIndicators();
|
||||
}
|
||||
|
||||
modifiers = (alt ? ES_MODIFIER_ALT : 0)
|
||||
| (alt2 ? ES_MODIFIER_ALT_GR : 0)
|
||||
| ((ctrl | ctrl2) ? ES_MODIFIER_CTRL : 0)
|
||||
|
@ -1310,7 +1356,7 @@ void KKeyboardUpdate(uint16_t *keysDown, size_t keysDownCount) {
|
|||
}
|
||||
|
||||
uint64_t KGameControllerConnect() {
|
||||
KMutexAcquire(&windowManager.gameControllersMutex);
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
|
||||
EsObjectID id = ++windowManager.gameControllerID;
|
||||
|
||||
|
@ -1320,13 +1366,13 @@ uint64_t KGameControllerConnect() {
|
|||
id = 0;
|
||||
}
|
||||
|
||||
KMutexRelease(&windowManager.gameControllersMutex);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void KGameControllerDisconnect(uint64_t id) {
|
||||
KMutexAcquire(&windowManager.gameControllersMutex);
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
|
||||
for (uintptr_t i = 0; i < windowManager.gameControllerCount; i++) {
|
||||
if (windowManager.gameControllers[i].id == id) {
|
||||
|
@ -1338,11 +1384,11 @@ void KGameControllerDisconnect(uint64_t id) {
|
|||
}
|
||||
}
|
||||
|
||||
KMutexRelease(&windowManager.gameControllersMutex);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
}
|
||||
|
||||
void KGameControllerUpdate(EsGameControllerState *state) {
|
||||
KMutexAcquire(&windowManager.gameControllersMutex);
|
||||
KMutexAcquire(&windowManager.deviceMutex);
|
||||
|
||||
for (uintptr_t i = 0; i < windowManager.gameControllerCount; i++) {
|
||||
if (windowManager.gameControllers[i].id == state->id) {
|
||||
|
@ -1356,7 +1402,7 @@ void KGameControllerUpdate(EsGameControllerState *state) {
|
|||
}
|
||||
}
|
||||
|
||||
KMutexRelease(&windowManager.gameControllersMutex);
|
||||
KMutexRelease(&windowManager.deviceMutex);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -320,6 +320,7 @@ Option options[] = {
|
|||
{ "General.wallpaper", OPTION_TYPE_STRING, { .s = NULL } },
|
||||
{ "General.installation_state", OPTION_TYPE_STRING, { .s = "0" } },
|
||||
{ "General.ui_scale", OPTION_TYPE_STRING, { .s = "100" } },
|
||||
{ "General.keyboard_layout", OPTION_TYPE_STRING, { .s = "us" } },
|
||||
};
|
||||
|
||||
char *previousOptionsBuffer;
|
||||
|
|
Loading…
Reference in New Issue