2025-03-07 01:10:44 +01:00

228 lines
7.6 KiB
NASM

; SPDX-License-Identifier: GPL-2.0-only
; SPDX-FileCopyrightText: 2024 KolibriOS-NG Team
format binary as ""
use32
org 0
db 'MENUET01' ; signature
dd 1 ; header version
dd start ; entry point
dd _image_end ; end of image
dd _memory ; required memory size
dd _stacktop ; address of stack top
dd 0 ; buffer for command line arguments
dd 0 ; buffer for path
include '../../macros.inc'
include '../../KOSfuncs.inc'
TEXT_WIDTH = 8
TEXT_HEIGHT = 16
MOUSE_LEFT_BUTTON_MASK = 1b
MOUSE_RIGHT_BUTTON_MASK = 10b
MOUSE_MIDDLE_BUTTON_MASK = 100b
WINDOW_STYLE_SKINNED_FIXED = 0x4000000
WINDOW_STYLE_COORD_CLIENT = 0x20000000
WINDOW_STYLE_CAPTION = 0x10000000
WINDOW_BORDER_SIZE = 5
WINDOW_STYLE = (WINDOW_STYLE_SKINNED_FIXED or WINDOW_STYLE_COORD_CLIENT or WINDOW_STYLE_CAPTION)
MOUSE_BODY_COLOR = 0x007C7C96
MOUSE_LEFT_BUTTON_COLOR = 0x008293A4
MOUSE_RIGHT_BUTTON_COLOR = 0x008293A4
MOUSE_MIDDLE_BUTTON_COLOR = 0x00A48293
MOUSE_LEFT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_RIGHT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_MIDDLE_BUTTON_PRESSED_COLOR = 0x00C7568E
WINDOW_BACK_COLOR = 0x00EFEFEF
MOUSE_WIDTH = 180
MOUSE_HEIGHT = 240
MOUSE_MARGIN = 4
BUTTONS_MARGIN = 2
MOUSE_LEFT = MOUSE_MARGIN
MOUSE_TOP = MOUSE_MARGIN
WINDOW_WIDTH = MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2
MOUSE_BODY_HEIGHT = (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2
MOUSE_BODY_TOP = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP
LEFT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
RIGHT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
LEFT_BUTTON_WIDTH = (MOUSE_WIDTH - BUTTONS_MARGIN) / 2
RIGHT_BUTTON_WIDTH = MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN
LEFT_BUTTON_LEFT = MOUSE_LEFT
RIGHT_BUTTON_LEFT = LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN
MIDDLE_BUTTON_WIDTH = MOUSE_WIDTH / 10
MIDDLE_BUTTON_HEIGHT = MOUSE_HEIGHT / 6
MIDDLE_BUTTON_LEFT = (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT
MIDDLE_BUTTON_TOP = (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP
; data:
mouse_left_button_color dd MOUSE_LEFT_BUTTON_COLOR
mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR
mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR
mouse_button dd 0
sz_caption db "MouseState", 0
sz_button_state db "Buttons state:", 0
STATE_VALUES_WIDTH = ($ - sz_button_state - 1)*TEXT_WIDTH
sz_bin db "bin: ", 0
LEN_SZ_BIN = $ - sz_bin - 1
sz_hex db "hex: 0x", 0
LEN_SZ_HEX = $ - sz_hex - 1
STATE_VALUES_HEIGHT = 3*TEXT_HEIGHT ; we have three lines of text
STATE_VALUES_TOP = ((MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP)
STATE_VALUES_LEFT = ((MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT)
align 4
draw_mouse_buttons:
mov eax, SF_DRAW_RECT
mov ebx, (LEFT_BUTTON_LEFT shl 16) or LEFT_BUTTON_WIDTH
mov ecx, (MOUSE_TOP shl 16) or LEFT_BUTTON_HEIGHT
mov edx, [mouse_left_button_color]
mcall
mov ebx, (RIGHT_BUTTON_LEFT shl 16) or RIGHT_BUTTON_WIDTH
mov ecx, (MOUSE_TOP shl 16) or RIGHT_BUTTON_HEIGHT
mov edx, [mouse_right_button_color]
mcall
mov ebx, (MIDDLE_BUTTON_LEFT shl 16) or MIDDLE_BUTTON_WIDTH
mov ecx, (MIDDLE_BUTTON_TOP shl 16) or MIDDLE_BUTTON_HEIGHT
mov edx, [mouse_middle_button_color]
mcall
; draw state values
mov eax, SF_DRAW_NUMBER
mov esi, (0101b shl 28) or WINDOW_BACK_COLOR
mov ecx, [mouse_button]
mov edi, MOUSE_BODY_COLOR
mov ebx, (10 shl 16) or (2 shl 8) ; 10 digits, base2
mov edx, ((LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT)
mcall
mov ebx, (8 shl 16) or (1 shl 8) ; 8 digits, base16
mov edx, ((LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT * 2)
mcall
ret
align 4
start:
mcall SF_GET_GRAPHICAL_PARAMS, SSF_SCREEN_SIZE
mov edx, eax
movzx ecx, ax
shr edx, 16
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1
mov esi, eax
sub edx, (WINDOW_WIDTH - 1)
sub ecx, eax
shr edx, 1
shr ecx, 1
mov eax, SF_SET_EVENTS_MASK
mov ebx, EVM_REDRAW or EVM_BUTTON or EVM_MOUSE
mcall
align 4
on_redraw:
mcall SF_REDRAW, SSF_BEGIN_DRAW
xor eax, eax ; SF_CREATE_WINDOW
mov ebx, edx ; window.left
; ecx = window.top
shl ebx, 16
shl ecx, 16
or ebx, (WINDOW_WIDTH - 1)
or ecx, esi ; window.height
mov edx, WINDOW_STYLE or WINDOW_BACK_COLOR
mov edi, sz_caption
xor esi, esi
mcall
mcall SF_REDRAW, SSF_END_DRAW
; draw mouse body:
mov eax, SF_DRAW_RECT
mov ebx, (MOUSE_LEFT shl 16) or MOUSE_WIDTH
mov ecx, (MOUSE_BODY_TOP shl 16) or MOUSE_BODY_HEIGHT
mov edx, MOUSE_BODY_COLOR
mcall
mov eax, SF_DRAW_TEXT
mov ecx, (1101b shl 28) or WINDOW_BACK_COLOR
mov edi, MOUSE_BODY_COLOR
mov ebx, (STATE_VALUES_LEFT shl 16) or STATE_VALUES_TOP
mov edx, sz_button_state
mcall
add ebx, TEXT_HEIGHT
mov edx, sz_bin
mcall
add ebx, TEXT_HEIGHT
mov edx, sz_hex
mcall
call draw_mouse_buttons
align 4
wait_event:
mcall SF_WAIT_EVENT
cmp eax, EV_REDRAW
je on_redraw
cmp eax, EV_BUTTON
je on_button
; otherwise mouse:
mcall SF_MOUSE_GET, SSF_BUTTON
cmp [mouse_button], eax ; if equal, then no need update
je wait_event
mov ebx, dword MOUSE_LEFT_BUTTON_COLOR
mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR
mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR
.left:
test eax, MOUSE_LEFT_BUTTON_MASK
jz .right
mov ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR
.right:
test eax, MOUSE_RIGHT_BUTTON_MASK
jz .middle
mov ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR
.middle:
test eax, MOUSE_MIDDLE_BUTTON_MASK
jz .other
mov edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR
.other:
mov [mouse_left_button_color], ebx
mov [mouse_right_button_color], ecx
mov [mouse_middle_button_color], edx
mov [mouse_button], eax
call draw_mouse_buttons
jmp wait_event
align 4
on_button:
; terminate because we have only one button (close)
mcall SF_TERMINATE_PROCESS
align 16
_image_end:
; reserve for stack:
rb 256
align 16
_stacktop:
_memory: