diff --git a/ponydos.asm b/ponydos.asm index 91e44cd..34dc072 100644 --- a/ponydos.asm +++ b/ponydos.asm @@ -8,9 +8,6 @@ bits 16 org 0x7c00 -COLUMNS equ 80 -ROWS equ 25 - X_SENSITIVITY equ 1 Y_SENSITIVITY equ 2 diff --git a/ponydos_static.inc b/ponydos_static.inc index bf1be74..58cb2cf 100644 --- a/ponydos_static.inc +++ b/ponydos_static.inc @@ -7,6 +7,9 @@ FS_DIRENT_SIZE equ 32 FS_DIRENT_NAME_SIZE equ 30 FS_FILE_MAX_SIZE equ 128 +COLUMNS equ 80 +ROWS equ 25 + WM_PAINT equ 0 WM_MOUSE equ 1 WM_KEYBOARD equ 2 diff --git a/shell.asm b/shell.asm index ed28991..62219a5 100644 --- a/shell.asm +++ b/shell.asm @@ -9,9 +9,15 @@ struc window .data resw 1 .icon resb 1 .mouse_released_inside resb 1 + .status resb 1 + .res_x resw 1 + .res_y resw 1 .size: endstruc +WINDOW_MOVE equ 1 +WINDOW_RESIZE equ 2 + cpu 8086 bits 16 @@ -134,11 +140,22 @@ paint: ; Draw a rectangle on-screen mov bx, [si + window.width] - mov cx, bx mov dx, [si + window.height] mov di, [si + window.x] mov bp, [si + window.y] mov si, [si + window.data] + + mov cx, bx + add cx, di + cmp cx, COLUMNS + jle .no_clipping + mov cx, COLUMNS + sub cx, di + jmp .clipping_done + + .no_clipping: + mov cx, bx + .clipping_done: call PONYDOS_SEG:SYS_DRAW_RECT ret @@ -165,16 +182,22 @@ mouse: ; X xor ch, ch - cmp cx, [si + window.x] - jl .outside - cmp bx, [si + window.y] - jl .outside + cmp byte [si + window.status], WINDOW_MOVE + jne .not_move + call move + .not_move: + cmp byte [si + window.status], WINDOW_RESIZE + jne .not_resize + ;call window_resize + .not_resize: sub cx, [si + window.x] + jc .outside cmp [si + window.width], cx jle .outside add cx, [si + window.x] sub bx, [si + window.y] + jc .outside cmp [si + window.height], bx jle .outside add bx, [si + window.y] @@ -194,6 +217,7 @@ mouse: jmp .inside .not_buttons_held: mov byte [si + window.mouse_released_inside], 1 + mov byte [si + window.status], 0 .inside: pop cx @@ -213,6 +237,28 @@ mouse: call forward_event ret +; in: +; ax = window ID +; bx = Y coördinate +; cx = X coördinate +; si = pointer to window structure +move: + push dx + mov [si + window.y], bx + + mov [si + window.x], cx + mov dx, [si + window.res_x] + sub [si + window.x], dx + jnc .not_underflow + + mov word [si + window.x], 0 + + .not_underflow: + pop dx + + call request_redraw + ret + ; in: ; ax = window ID ; bx = Y coördinate @@ -236,18 +282,28 @@ click: .file_window: call raise_window - ; If clicked the window close button cmp bx, [si + window.y] - jne .not_close + jne .not_title_bar + + ; If clicked the window close button mov ax, [si + window.x] + ;cmp ax, cx + ;je .resize add ax, [si + window.width] dec ax cmp ax, cx - jne .not_close + je .close + .move: + mov byte [si + window.status], WINDOW_MOVE + sub cx, [si + window.x] + mov [si + window.res_x], cx + jmp .end .close: call hide_file_window jmp .end - .not_close: + + + .not_title_bar: ; If clicked within the content area mov ax, bx