mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-24 07:36:48 +03:00
148 lines
3.8 KiB
PHP
148 lines
3.8 KiB
PHP
|
; adjustWindowDimensions
|
||
|
; adjust menut window dimensions to get a certain work area size.
|
||
|
; or so. who on earth cares anyway, i certinaly don't, i'm just
|
||
|
; writing this code because i've got to kill time somehow...
|
||
|
;
|
||
|
; Copyright (c) 2002 Thomas Mathys
|
||
|
; killer@vantage.ch
|
||
|
;
|
||
|
; This program is free software; you can redistribute it and/or modify
|
||
|
; it under the terms of the GNU General Public License as published by
|
||
|
; the Free Software Foundation; either version 2 of the License, or
|
||
|
; (at your option) any later version.
|
||
|
;
|
||
|
; This program is distributed in the hope that it will be useful,
|
||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
; GNU General Public License for more details.
|
||
|
;
|
||
|
; You should have received a copy of the GNU General Public License
|
||
|
; along with this program; if not, write to the Free Software
|
||
|
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
;
|
||
|
%ifndef _ADJSTWND_INC
|
||
|
%define _ADJSTWND_INC
|
||
|
|
||
|
|
||
|
;window types
|
||
|
ADJSTWND_TYPE_SKINNED equ 0
|
||
|
|
||
|
|
||
|
;********************************************************************
|
||
|
; adjust window dimensions to get a certain work area size
|
||
|
;
|
||
|
; - first the window width and height are adjusted
|
||
|
; and clamped if they're too large for the screen.
|
||
|
; - then the window positions are adjusted, if the
|
||
|
; window goes out of the screen.
|
||
|
;
|
||
|
; input:
|
||
|
; eax window type, one of the ADJSTWND_TYPE_xxx constants
|
||
|
; ebx window x position
|
||
|
; ecx window y position
|
||
|
; edx desired work area width
|
||
|
; esi desired work area height
|
||
|
;
|
||
|
; output:
|
||
|
; eax return code. 0 = ok, -1 = invalid window type
|
||
|
; ebx adjusted window x position
|
||
|
; ecx adjusted window y position
|
||
|
; edx window width to get desired work area width
|
||
|
; esi window height to get desired work area height
|
||
|
;
|
||
|
; destroys:
|
||
|
; nothing
|
||
|
;
|
||
|
; normally x and y are the upper left corner of the window,
|
||
|
; relative to the upper left corner of the screen.
|
||
|
; if you pass a negative x or y it will be treated as the
|
||
|
; lower right corner of the window, relative to the lower
|
||
|
; right corner of the screen.
|
||
|
;********************************************************************
|
||
|
adjustWindowDimensions:
|
||
|
push edi
|
||
|
push ebp
|
||
|
pushfd
|
||
|
|
||
|
; adjust window dimensions, depending on the window type
|
||
|
cmp eax,ADJSTWND_TYPE_SKINNED
|
||
|
je .adjust_skinned
|
||
|
mov eax,-1 ; invalid window type,
|
||
|
jmp .bye ; return error code
|
||
|
|
||
|
; clamp window dimensions
|
||
|
.clamp:
|
||
|
mov eax,MOS_SC_GETSCREENMAX ; get screen dimensions
|
||
|
int 0x40
|
||
|
mov edi,eax ; edi = screen width
|
||
|
shr edi,16
|
||
|
mov ebp,eax ; ebp = screen height
|
||
|
and ebp,0xffff
|
||
|
cmp edx,edi ; window width > screen width ?
|
||
|
jna .widthok
|
||
|
mov edx,edi ; yes -> use screen width
|
||
|
.widthok:
|
||
|
cmp esi,ebp ; wnd height > screen height ?
|
||
|
jna .heightok
|
||
|
mov esi,ebp ; yes -> use screen height
|
||
|
.heightok:
|
||
|
|
||
|
; adjust x position
|
||
|
or ebx,ebx ; do the lower right corner
|
||
|
jns .foo ; stuff if x is negative.
|
||
|
add ebx,edi
|
||
|
sub ebx,edx
|
||
|
.foo:
|
||
|
or ebx,ebx ; x < 0 ?
|
||
|
jns .xnotnegative
|
||
|
xor ebx,ebx ; yes -> x = 0
|
||
|
.xnotnegative:
|
||
|
mov eax,ebx ; x + width > screen width ?
|
||
|
add eax,edx
|
||
|
cmp eax,edi
|
||
|
jna .xok
|
||
|
sub eax,edi ; yes -> adjust
|
||
|
sub ebx,eax
|
||
|
.xok:
|
||
|
|
||
|
; adjust y position
|
||
|
or ecx,ecx ; do the lower right corner
|
||
|
jns .bar ; stuff if y is negative.
|
||
|
add ecx,ebp
|
||
|
sub ecx,esi
|
||
|
.bar:
|
||
|
or ecx,ecx ; y < 0 ?
|
||
|
jns .ynotnegative
|
||
|
xor ecx,ecx ; yes -> y = 0
|
||
|
.ynotnegative:
|
||
|
mov eax,ecx ; y + height > screen height ?
|
||
|
add eax,esi
|
||
|
cmp eax,ebp
|
||
|
jna .yok
|
||
|
sub eax,ebp ; yes -> adjust
|
||
|
sub ecx,eax
|
||
|
.yok:
|
||
|
|
||
|
.done:
|
||
|
xor eax,eax
|
||
|
.bye:
|
||
|
popfd
|
||
|
pop ebp
|
||
|
pop edi
|
||
|
ret
|
||
|
|
||
|
.adjust_skinned:
|
||
|
; adjust width (edx)
|
||
|
add edx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
|
||
|
; adjust height (esi). we need the skin height to do this.
|
||
|
push ebx
|
||
|
mov eax,MOS_SC_WINDOWPROPERTIES
|
||
|
mov ebx,4
|
||
|
int 0x40
|
||
|
lea esi,[esi+eax+MOS_WND_SKIN_BORDER_BOTTOM]
|
||
|
pop ebx
|
||
|
jmp .clamp
|
||
|
|
||
|
%endif
|
||
|
|