From 89f2e15d0bb05121da3b7583cd672cccc4a09104 Mon Sep 17 00:00:00 2001 From: shikhin Date: Thu, 23 Mar 2023 07:20:41 +0530 Subject: [PATCH] Add window resizing --- shell.asm | 107 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 17 deletions(-) diff --git a/shell.asm b/shell.asm index 62219a5..3339794 100644 --- a/shell.asm +++ b/shell.asm @@ -18,6 +18,9 @@ endstruc WINDOW_MOVE equ 1 WINDOW_RESIZE equ 2 +WINDOW_MIN_WIDTH equ 4 +WINDOW_MIN_HEIGHT equ 2 + cpu 8086 bits 16 @@ -188,7 +191,7 @@ mouse: .not_move: cmp byte [si + window.status], WINDOW_RESIZE jne .not_resize - ;call window_resize + call resize .not_resize: sub cx, [si + window.x] @@ -237,6 +240,40 @@ mouse: call forward_event ret +; in: +; ax = window ID +; bx = Y coördinate +; cx = X coördinate +; si = pointer to window structure +resize: + push dx + + mov dx, [si + window.res_y] + sub dx, bx + jc .x + cmp dx, WINDOW_MIN_HEIGHT + jl .x + + mov [si + window.y], bx + mov [si + window.height], dx + + .x: + mov dx, [si + window.res_x] + sub dx, cx + jc .done + cmp dx, WINDOW_MIN_WIDTH + jl .done + + mov [si + window.x], cx + mov [si + window.width], dx + + .done: + pop dx + + call render_file_window + call request_redraw + ret + ; in: ; ax = window ID ; bx = Y coördinate @@ -287,8 +324,8 @@ click: ; If clicked the window close button mov ax, [si + window.x] - ;cmp ax, cx - ;je .resize + cmp ax, cx + je .resize add ax, [si + window.width] dec ax cmp ax, cx @@ -296,8 +333,17 @@ click: .move: mov byte [si + window.status], WINDOW_MOVE sub cx, [si + window.x] - mov [si + window.res_x], cx + mov [si + window.res_x], cx ; In-window x-coordinate of press jmp .end + + .resize: + mov byte [si + window.status], WINDOW_RESIZE + add cx, [si + window.width] + mov [si + window.res_x], cx ; Lower right corner + 1 + add bx, [si + window.height] + mov [si + window.res_y], bx ; Lower right corner + 1 + jmp .end + .close: call hide_file_window jmp .end @@ -341,6 +387,43 @@ click: pop dx ret +; in +; si = pointer to window structure +render_file_window: + push ax + push cx + push dx + push es + + mov ax, cs + mov es, ax + mov di, [si + window.data] + mov cx, [si + window.width] + mov ax, 0x0f00 + rep stosw + + mov cx, (ROWS-1)*COLUMNS + mov ax, 0xf000 + rep stosw + + mov di, [si + window.data] + mov byte [di], 'A' + mov byte [di + 2], ':' + add di, [si + window.width] + add di, [si + window.width] + mov byte [di - 2], 'x' + + mov cx, [si + window.height] + dec cx + mov dx, [si + window.width] + call print_ls + + pop es + pop dx + pop cx + pop ax + ret + show_file_window: cmp byte [file_window_visible], 0 jne .already_visible @@ -356,15 +439,8 @@ show_file_window: mov [windows + 1*window.size + window.next], ax ; Populate file window contents - mov ax, cs - mov es, ax - mov di, file_window - add di, [windows + 1*window.size + window.width] - add di, [windows + 1*window.size + window.width] - mov cx, [windows + 1*window.size + window.height] - dec cx - mov dx, [windows + 1*window.size + window.width] - call print_ls + mov si, windows + 1*window.size + call render_file_window pop ax @@ -851,10 +927,7 @@ disk_icon: db 0x00, 0x0f, 0x00, 0x0f, '|', 0x0f, 0x00, 0x0f, 0x00, 0x0f file_window: - db 'A', 0x0f, ':', 0x0f - times 37 db ' ', 0x0f - db 'x', 0x0f - times 15*40 db 0, 0xf0 + times ROWS*COLUMNS db 0, 0xf0 windows: times window.size db 0