Add moving windows
This commit is contained in:
parent
7367a4cf34
commit
f4b0adc4da
3 changed files with 68 additions and 12 deletions
|
@ -8,9 +8,6 @@ bits 16
|
||||||
|
|
||||||
org 0x7c00
|
org 0x7c00
|
||||||
|
|
||||||
COLUMNS equ 80
|
|
||||||
ROWS equ 25
|
|
||||||
|
|
||||||
X_SENSITIVITY equ 1
|
X_SENSITIVITY equ 1
|
||||||
Y_SENSITIVITY equ 2
|
Y_SENSITIVITY equ 2
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,9 @@ FS_DIRENT_SIZE equ 32
|
||||||
FS_DIRENT_NAME_SIZE equ 30
|
FS_DIRENT_NAME_SIZE equ 30
|
||||||
FS_FILE_MAX_SIZE equ 128
|
FS_FILE_MAX_SIZE equ 128
|
||||||
|
|
||||||
|
COLUMNS equ 80
|
||||||
|
ROWS equ 25
|
||||||
|
|
||||||
WM_PAINT equ 0
|
WM_PAINT equ 0
|
||||||
WM_MOUSE equ 1
|
WM_MOUSE equ 1
|
||||||
WM_KEYBOARD equ 2
|
WM_KEYBOARD equ 2
|
||||||
|
|
74
shell.asm
74
shell.asm
|
@ -9,9 +9,15 @@ struc window
|
||||||
.data resw 1
|
.data resw 1
|
||||||
.icon resb 1
|
.icon resb 1
|
||||||
.mouse_released_inside resb 1
|
.mouse_released_inside resb 1
|
||||||
|
.status resb 1
|
||||||
|
.res_x resw 1
|
||||||
|
.res_y resw 1
|
||||||
.size:
|
.size:
|
||||||
endstruc
|
endstruc
|
||||||
|
|
||||||
|
WINDOW_MOVE equ 1
|
||||||
|
WINDOW_RESIZE equ 2
|
||||||
|
|
||||||
cpu 8086
|
cpu 8086
|
||||||
bits 16
|
bits 16
|
||||||
|
|
||||||
|
@ -134,11 +140,22 @@ paint:
|
||||||
|
|
||||||
; Draw a rectangle on-screen
|
; Draw a rectangle on-screen
|
||||||
mov bx, [si + window.width]
|
mov bx, [si + window.width]
|
||||||
mov cx, bx
|
|
||||||
mov dx, [si + window.height]
|
mov dx, [si + window.height]
|
||||||
mov di, [si + window.x]
|
mov di, [si + window.x]
|
||||||
mov bp, [si + window.y]
|
mov bp, [si + window.y]
|
||||||
mov si, [si + window.data]
|
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
|
call PONYDOS_SEG:SYS_DRAW_RECT
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
@ -165,16 +182,22 @@ mouse:
|
||||||
; X
|
; X
|
||||||
xor ch, ch
|
xor ch, ch
|
||||||
|
|
||||||
cmp cx, [si + window.x]
|
cmp byte [si + window.status], WINDOW_MOVE
|
||||||
jl .outside
|
jne .not_move
|
||||||
cmp bx, [si + window.y]
|
call move
|
||||||
jl .outside
|
.not_move:
|
||||||
|
cmp byte [si + window.status], WINDOW_RESIZE
|
||||||
|
jne .not_resize
|
||||||
|
;call window_resize
|
||||||
|
.not_resize:
|
||||||
|
|
||||||
sub cx, [si + window.x]
|
sub cx, [si + window.x]
|
||||||
|
jc .outside
|
||||||
cmp [si + window.width], cx
|
cmp [si + window.width], cx
|
||||||
jle .outside
|
jle .outside
|
||||||
add cx, [si + window.x]
|
add cx, [si + window.x]
|
||||||
sub bx, [si + window.y]
|
sub bx, [si + window.y]
|
||||||
|
jc .outside
|
||||||
cmp [si + window.height], bx
|
cmp [si + window.height], bx
|
||||||
jle .outside
|
jle .outside
|
||||||
add bx, [si + window.y]
|
add bx, [si + window.y]
|
||||||
|
@ -194,6 +217,7 @@ mouse:
|
||||||
jmp .inside
|
jmp .inside
|
||||||
.not_buttons_held:
|
.not_buttons_held:
|
||||||
mov byte [si + window.mouse_released_inside], 1
|
mov byte [si + window.mouse_released_inside], 1
|
||||||
|
mov byte [si + window.status], 0
|
||||||
|
|
||||||
.inside:
|
.inside:
|
||||||
pop cx
|
pop cx
|
||||||
|
@ -213,6 +237,28 @@ mouse:
|
||||||
call forward_event
|
call forward_event
|
||||||
ret
|
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:
|
; in:
|
||||||
; ax = window ID
|
; ax = window ID
|
||||||
; bx = Y coördinate
|
; bx = Y coördinate
|
||||||
|
@ -236,18 +282,28 @@ click:
|
||||||
.file_window:
|
.file_window:
|
||||||
call raise_window
|
call raise_window
|
||||||
|
|
||||||
; If clicked the window close button
|
|
||||||
cmp bx, [si + window.y]
|
cmp bx, [si + window.y]
|
||||||
jne .not_close
|
jne .not_title_bar
|
||||||
|
|
||||||
|
; If clicked the window close button
|
||||||
mov ax, [si + window.x]
|
mov ax, [si + window.x]
|
||||||
|
;cmp ax, cx
|
||||||
|
;je .resize
|
||||||
add ax, [si + window.width]
|
add ax, [si + window.width]
|
||||||
dec ax
|
dec ax
|
||||||
cmp ax, cx
|
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:
|
.close:
|
||||||
call hide_file_window
|
call hide_file_window
|
||||||
jmp .end
|
jmp .end
|
||||||
.not_close:
|
|
||||||
|
|
||||||
|
.not_title_bar:
|
||||||
|
|
||||||
; If clicked within the content area
|
; If clicked within the content area
|
||||||
mov ax, bx
|
mov ax, bx
|
||||||
|
|
Loading…
Reference in a new issue