0,0 → 1,147 |
; 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 |
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |