52 lines
1.4 KiB
C
52 lines
1.4 KiB
C
#include "raw_hid.h"
|
|
#include <string.h>
|
|
|
|
#include "app_focus.h"
|
|
|
|
#define CMD_SET_FOCUSED_APP 0x80
|
|
#define APP_NAME_BUF_SIZE 64
|
|
|
|
focused_app_t focused_app = APP_UNKNOWN;
|
|
|
|
static char app_name_buf[APP_NAME_BUF_SIZE];
|
|
|
|
typedef struct {
|
|
const char *name;
|
|
focused_app_t app;
|
|
} app_mapping_t;
|
|
|
|
static const app_mapping_t app_map[] = {
|
|
{ "Terminal", APP_TERMINAL },
|
|
{ "iTerm2", APP_TERMINAL },
|
|
{ "Xcode", APP_XCODE },
|
|
{ "Code", APP_VSCODE }, // "Code" is VSCode's localizedName
|
|
{ "Visual Studio Code", APP_VSCODE },
|
|
};
|
|
|
|
static focused_app_t resolve_app(const char *name) {
|
|
for (uint8_t i = 0; i < sizeof(app_map) / sizeof(app_map[0]); i++) {
|
|
if (strcmp(name, app_map[i].name) == 0) {
|
|
return app_map[i].app;
|
|
}
|
|
}
|
|
return APP_UNKNOWN;
|
|
}
|
|
|
|
// Called from system76_ec.c's raw_hid_receive (injected via sed at build time).
|
|
// Returns true if the command was handled.
|
|
bool app_focus_raw_hid_intercept(uint8_t *data, uint8_t length) {
|
|
if (data[0] == CMD_SET_FOCUSED_APP) {
|
|
uint8_t copy_len = length - 1;
|
|
if (copy_len >= APP_NAME_BUF_SIZE) {
|
|
copy_len = APP_NAME_BUF_SIZE - 1;
|
|
}
|
|
memcpy(app_name_buf, &data[1], copy_len);
|
|
app_name_buf[copy_len] = '\0';
|
|
focused_app = resolve_app(app_name_buf);
|
|
data[1] = 0; // success
|
|
raw_hid_send(data, length);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|