summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/main.c2
-rw-r--r--src/kernel/window.c42
-rw-r--r--src/kernel/window.h2
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);