forked from offtopia/ponydos
Add window resizing
This commit is contained in:
parent
f4b0adc4da
commit
89f2e15d0b
1 changed files with 90 additions and 17 deletions
107
shell.asm
107
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
|
||||
|
|
Loading…
Reference in a new issue