79 lines
1.7 KiB
PHP
79 lines
1.7 KiB
PHP
; =============================================================================
|
|
; Display Service - Auto-resize on window change
|
|
; =============================================================================
|
|
|
|
align 4
|
|
kos_display_ptr dd ?
|
|
|
|
proc display_change uses ebx ecx edx esi edi
|
|
DEBUGF 2, "display_change\n"
|
|
|
|
; Request display change information
|
|
mov eax, [vbox_device.display_phys]
|
|
stdcall vmmdev_request_perform, eax
|
|
|
|
mov ebx, [vbox_device.display_virt]
|
|
mov edi, [ebx + VMMDEV_DISPLAY_CHANGE.x_res]
|
|
mov esi, [ebx + VMMDEV_DISPLAY_CHANGE.y_res]
|
|
mov ecx, [ebx + VMMDEV_DISPLAY_CHANGE.bpp]
|
|
|
|
DEBUGF 2, "[display] Requested resolution: %dx%d %dbpp\n", edi, esi, ecx
|
|
|
|
; Validate minimum
|
|
cmp edi, DISP_W_MIN
|
|
jb .skip
|
|
cmp esi, DISP_H_MIN
|
|
jb .skip
|
|
|
|
; Validate maximum
|
|
cmp edi, DISP_W_MAX
|
|
ja .skip
|
|
cmp esi, DISP_H_MAX
|
|
ja .skip
|
|
|
|
; Validate BPP
|
|
cmp ecx, 32
|
|
je .valid
|
|
cmp ecx, 24
|
|
je .valid
|
|
cmp ecx, 16
|
|
je .valid
|
|
cmp ecx, 8
|
|
jne .skip
|
|
|
|
.valid:
|
|
DEBUGF 2, "[display] Setting resolution %dx%d %dbpp\n", edi, esi, ecx
|
|
|
|
; Set video mode using VGA
|
|
cli
|
|
vga_set_mode edi, esi, ecx
|
|
sti
|
|
|
|
; Update KolibriOS display structure
|
|
mov eax, [kos_display_ptr]
|
|
mov [eax + DISPLAY.width], edi
|
|
mov [eax + DISPLAY.height], esi
|
|
mov [eax + DISPLAY.bits_per_pixel], ecx
|
|
|
|
; Calculate pitch
|
|
push ebx
|
|
mov ebx, ecx
|
|
shr ecx, 3
|
|
imul ecx, edi
|
|
mov [eax + DISPLAY.pitch], ecx
|
|
pop ebx
|
|
|
|
; Apply changes
|
|
mov eax, edi
|
|
mov edx, esi
|
|
dec eax
|
|
dec edx
|
|
invoke SetScreen
|
|
|
|
DEBUGF 2, "[display] Resolution set successfully\n"
|
|
|
|
.skip:
|
|
DEBUGF 2, "[trace] <<< display_change\n"
|
|
ret
|
|
endp
|