; ============================================================================= ; 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