From 2fc768319887945c5c6beafcd21d29d9884cd48a Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Wed, 3 Mar 2021 23:47:26 -0500 Subject: moving windows with mouse, changing some old panics into syslogs, small bugfix in knob files, "send to back" wm keybinding --- src/kernel/elf.c | 25 +++++++++++++---------- src/kernel/task.c | 9 ++++----- src/kernel/task.h | 3 ++- src/kernel/window.c | 57 +++++++++++++++++++++++++++++++++++++++++++--------- src/user/knob/file.c | 2 +- 5 files changed, 68 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/kernel/elf.c b/src/kernel/elf.c index f601654..fdb13aa 100644 --- a/src/kernel/elf.c +++ b/src/kernel/elf.c @@ -76,6 +76,10 @@ struct ph_entry { } __attribute__ ((packed)); uint32_t try_elf_run(const struct drive *d, const char *path, const char *pass_old_vma, uint32_t io_handle) { + struct task_state *tstate = new_task(); + if (!tstate) + return 0; + file_id_t h = d->get_file(d, path); if (!h) return 0; @@ -126,18 +130,17 @@ uint32_t try_elf_run(const struct drive *d, const char *path, const char *pass_o memcpy(pass_pma, pass, pass_l); - struct task_state tstate; - tstate.page_directory = pd; - tstate.ret_addr = ehead.entry_vma; - tstate.stack_bottom = 0; + tstate->page_directory = pd; + tstate->ret_addr = ehead.entry_vma; + tstate->stack_bottom = 0; //logf(LOG_INFO, " tasks: 0x%h", tasks); //logf(LOG_INFO, "active_task: 0x%h", active_task); //logf(LOG_INFO, " new edi: 0x%hb", active_task - tasks + 1); - tstate.edx = (uint32_t)pass_vma; - tstate.esi = io_handle; - tstate.edi = active_task - tasks + 1; - tstate.esp = 0; + tstate->edx = (uint32_t)pass_vma; + tstate->esi = io_handle; + tstate->edi = active_task - tasks + 1; + tstate->esp = 0; const char *path_end_start = path; for (const char *i = path; *i; ++i) @@ -148,9 +151,9 @@ uint32_t try_elf_run(const struct drive *d, const char *path, const char *pass_o for (i = 0; i < TASK_NAME_LEN; ++i) { if (!path_end_start[i]) break; - tstate.name[i] = path_end_start[i]; + tstate->name[i] = path_end_start[i]; } - tstate.name[i] = '\0'; + tstate->name[i] = '\0'; - return new_task(tstate); + return (tstate - tasks) + 1; } diff --git a/src/kernel/task.c b/src/kernel/task.c index 077eea6..b301217 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -46,18 +46,17 @@ struct tss { struct task_state tasks[MAX_TASKS]; struct task_state *active_task; -//puts the handle into ecx -uint32_t new_task(struct task_state state) { +struct task_state *new_task() { for (uint8_t n = 0; n < MAX_TASKS; ++n) if (!tasks[n].page_directory) { - tasks[n] = state; tasks[n].ecx = n + 1; tasks[n].waiting = false; for (uint8_t i = 0; i < MAX_WAITS; ++i) tasks[n].waits[i].mode = NONE; - return n + 1; + return tasks + n; } - PANIC("Maximum number of tasks reached."); + logf(LOG_ERROR, "Reached %d tasks, refusing to create any more.", MAX_TASKS); + return 0; } static void tmp_halt() { diff --git a/src/kernel/task.h b/src/kernel/task.h index 643c88e..ca8e2b7 100644 --- a/src/kernel/task.h +++ b/src/kernel/task.h @@ -52,7 +52,8 @@ extern struct task_state *active_task; void init_tasks(); //puts the handle into ecx -uint32_t new_task(struct task_state state); +//returns null on full +struct task_state *new_task(); void advance_active_task(); void delete_task(struct task_state *state); diff --git a/src/kernel/window.c b/src/kernel/window.c index bc36578..28f7010 100644 --- a/src/kernel/window.c +++ b/src/kernel/window.c @@ -392,6 +392,7 @@ enum wm_action { WM_MOVE_UP, WM_MOVE_DOWN, WM_RUN_COMMAND, + WM_SEND_BOTTOM, N_WM_ACTIONS }; @@ -401,7 +402,8 @@ static struct key_packet keybinds[] = { {.key_id = KEY_RIGHT_ARROW, .modifiers = WINS}, {.key_id = KEY_UP_ARROW, .modifiers = WINS}, {.key_id = KEY_DOWN_ARROW, .modifiers = WINS}, - {.key_id = KEY_SPACE, .modifiers = WINS} + {.key_id = KEY_SPACE, .modifiers = WINS}, + {.key_id = KEY_PAGE_DOWN, .modifiers = WINS} }; static inline bool fuzzy_key_match(struct key_packet t, struct key_packet a) { @@ -496,7 +498,20 @@ void on_action(struct window_action packet) { 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 "."); + logf(LOG_ERROR, "Couldn't run program listed in " RUN_COMMAND_FILE "."); + break; + case WM_SEND_BOTTOM: + if (top_window && (top_window != bottom_window)) { + struct window *const top = top_window; + struct window *const bot = bottom_window; + top->above = bot; + bot->below = top; + top_window = top->below; + bottom_window = top; + top_window->above = 0; + bottom_window->below = 0; + paint_and_above(bot); + } } switch_to_task_cr3(); return; @@ -506,14 +521,27 @@ void on_action(struct window_action packet) { send_action(top_window, packet); } +struct window *being_moved = 0; +int16_t winpos_rel_y; +int16_t winpos_rel_x; + void move_mouse_by(int16_t y, int16_t x) { //logf(LOG_INFO, "old mouse coords: (%d, %d)", mouse_x, mouse_y); switch_to_kernel_cr3(); - blit(mouse_x, mouse_x + MOUSE_WIDTH > VBE_MODE_INFO->width ? VBE_MODE_INFO->width : mouse_x + MOUSE_WIDTH, - mouse_y, mouse_y + MOUSE_HEIGHT > VBE_MODE_INFO->height ? VBE_MODE_INFO->height : mouse_y + MOUSE_HEIGHT); + const uint16_t old_y = mouse_y; + const uint16_t old_x = mouse_x; mouse_y = (-y > mouse_y) ? 0 : (y + mouse_y + MOUSE_HEIGHT > VBE_MODE_INFO->height) ? VBE_MODE_INFO->height - MOUSE_HEIGHT : y + mouse_y; mouse_x = (-x > mouse_x) ? 0 : (x + mouse_x + MOUSE_WIDTH > VBE_MODE_INFO->width) ? VBE_MODE_INFO->width - MOUSE_WIDTH : x + mouse_x; - blit_mouse(); + if (being_moved) { + being_moved->ypos = winpos_rel_y + mouse_y; + being_moved->xpos = winpos_rel_x + mouse_x; + paint_all(); + } + else { + blit(old_x, old_x + MOUSE_WIDTH > VBE_MODE_INFO->width ? VBE_MODE_INFO->width : old_x + MOUSE_WIDTH, + old_y, old_y + MOUSE_HEIGHT > VBE_MODE_INFO->height ? VBE_MODE_INFO->height : old_y + MOUSE_HEIGHT); + blit_mouse(); + } switch_to_task_cr3(); //logf(LOG_INFO, "new mouse coords: (%d, %d)", mouse_x, mouse_y); } @@ -542,10 +570,19 @@ void mouse_button(enum mouse_button which, bool up) { if (!clicked_on) return; - if (clicked_on != top_window) { - focus(clicked_on); - paint_and_above(clicked_on); + if ((mouse_y >= clicked_on->ypos) && (mouse_y < clicked_on->ypos + clicked_on->height) && + (mouse_x >= clicked_on->xpos) && (mouse_x < clicked_on->xpos + clicked_on->width)) { + if (clicked_on != top_window) { + focus(clicked_on); + paint_and_above(clicked_on); + } + send_action(clicked_on, (struct window_action){.action_type = up ? MOUSE_UP : MOUSE_DOWN, .as_mouse = {.y = mouse_y - clicked_on->ypos, .x = mouse_x - clicked_on->xpos, .which = which}}); } - - send_action(clicked_on, (struct window_action){.action_type = up ? MOUSE_UP : MOUSE_DOWN, .as_mouse = {.y = mouse_y - clicked_on->ypos, .x = mouse_x - clicked_on->xpos, .which = which}}); + else if (!up && !being_moved) { + being_moved = clicked_on; + winpos_rel_y = clicked_on->ypos - mouse_y; + winpos_rel_x = clicked_on->xpos - mouse_x; + } + else if (up) + being_moved = 0; } \ No newline at end of file diff --git a/src/user/knob/file.c b/src/user/knob/file.c index 8d7a327..db38e52 100644 --- a/src/user/knob/file.c +++ b/src/user/knob/file.c @@ -85,7 +85,7 @@ uint32_t write_to_file(struct file *f, uint32_t max, void *buf) { //return value and max_length don't include null terminator uint32_t read_line_from_file(struct file *f, char *sz, uint32_t max_length) { - uint8_t i; + uint32_t i; for (i = 0; i < max_length; ++i) { char byte; if (!read_from_file(f, 1, &byte) || (byte == '\n')) -- cgit v1.2.3