kolibrios/programs/aclock/trunk/adjstwnd.inc

148 lines
3.8 KiB
PHP
Raw Normal View History

; 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