Files
VBoxGuest/services/display.inc
Alexey Mikhailov 0f400bc0e0 #1 init в репу
2026-01-06 15:43:37 +03:00

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