diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/main.c | 2 | ||||
-rw-r--r-- | src/kernel/window.c | 42 | ||||
-rw-r--r-- | src/kernel/window.h | 2 |
3 files changed, 41 insertions, 5 deletions
diff --git a/src/kernel/main.c b/src/kernel/main.c index 1fd3182..92315ce 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -40,7 +40,7 @@ void main() { init_kbd(); init_idt(); - paint_bg(); + init_win(); logf(LOG_INFO, "Kernel initialization done."); logf(LOG_INFO, "Available kernel memory: %dk", kernel_pages_left * 4); diff --git a/src/kernel/window.c b/src/kernel/window.c index 80780d4..c251077 100644 --- a/src/kernel/window.c +++ b/src/kernel/window.c @@ -1,9 +1,11 @@ #include "paging.h" #include "window.h" #include "drive.h" +#include "panic.h" #include "task.h" #include "util.h" #include "pmap.h" +#include "elf.h" #include "log.h" #define MAX_WINDOWS 64 @@ -91,7 +93,7 @@ static void paint_and_above(const struct window *w) { switch_to_task_cr3(); } -void paint_bg() { +static void paint_bg() { for (uint16_t y = 0; y < SCREEN_HEIGHT; ++y) for (uint16_t x = 0; x < SCREEN_WIDTH; ++x) VGA_MEMORY[y * SCREEN_WIDTH + x] = BACKGROUND(x, y); @@ -213,6 +215,8 @@ static void send_action(struct window *w, struct window_action packet) { } } +#define RUN_COMMAND_FILE "sys/winspace.rc" + enum wm_action { WM_SHUFFLE_UP, WM_SHUFFLE_DOWN, @@ -220,6 +224,7 @@ enum wm_action { WM_MOVE_RIGHT, WM_MOVE_UP, WM_MOVE_DOWN, + WM_RUN_COMMAND, N_WM_ACTIONS }; @@ -230,7 +235,8 @@ static struct key_packet keybinds[] = { {.key_id = KEY_LEFT_ARROW, .modifiers = WINS}, {.key_id = KEY_RIGHT_ARROW, .modifiers = WINS}, {.key_id = KEY_UP_ARROW, .modifiers = WINS}, - {.key_id = KEY_DOWN_ARROW, .modifiers = WINS} + {.key_id = KEY_DOWN_ARROW, .modifiers = WINS}, + {.key_id = KEY_SPACE, .modifiers = WINS} }; static inline bool fuzzy_key_match(struct key_packet t, struct key_packet a) { @@ -249,7 +255,33 @@ static inline bool fuzzy_key_match(struct key_packet t, struct key_packet a) { return a.modifiers == t.modifiers; } -#include "log.h" +static char *run_command; +static char *run_command_pass = ""; + +void init_win() { + paint_bg(); + + const file_id_t fid = drives->get_file(drives, RUN_COMMAND_FILE); + if (!fid) + PANIC("Couldn't open " RUN_COMMAND_FILE "."); + + const uint32_t len = drives->get_file_length(drives, fid); + run_command = allocate_kernel_pages(len / 4096 + 1); + if (!run_command) + PANIC("Couldn't make buffer for " RUN_COMMAND_FILE " contents."); + + fmcpy(run_command, drives, fid, 0, len); + run_command[len] = '\0'; + + drives->free_file(drives, fid); + + for (char *c = run_command; *c; ++c) + if (*c == ' ') { + *c = '\0'; + run_command_pass = c + 1; + break; + } +} void on_action(struct window_action packet) { //logf(LOG_INFO, "Window action, top window = 0x%d from %s.", top_window, top_window->from_task->name); @@ -305,6 +337,10 @@ void on_action(struct window_action packet) { case WM_MOVE_DOWN: ++top_window->ypos; paint_all(); + break; + case WM_RUN_COMMAND: + if (!try_elf_run(drives, run_command, run_command_pass, 0)) + PANIC("Couldn't run program listed in " RUN_COMMAND_FILE "."); } switch_to_task_cr3(); return; diff --git a/src/kernel/window.h b/src/kernel/window.h index 0aa9b0f..a226c11 100644 --- a/src/kernel/window.h +++ b/src/kernel/window.h @@ -9,7 +9,7 @@ struct window; -void paint_bg(); +void init_win(); struct window *new_window(uint16_t width, uint16_t height, const void *pixel_buffer); void del_window(struct window *w); |