2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
7 #include <exec/memory.h>
8 #include <graphics/layers.h>
9 #include <graphics/gfx.h>
10 #include <intuition/intuition.h>
11 #include <intuition/imageclass.h>
12 #include <intuition/windecorclass.h>
13 #include <intuition/gadgetclass.h>
14 #include <intuition/extensions.h>
15 #include <utility/tagitem.h>
16 #include <proto/exec.h>
17 #include <proto/graphics.h>
18 #include <proto/utility.h>
19 #include <proto/intuition.h>
20 #include <proto/layers.h>
21 #include <exec/ports.h>
22 #include "intuition_intern.h"
23 #include "intuition_customize.h"
24 #include "inputhandler.h"
25 #include "inputhandler_actions.h"
26 #include "boopsigadgets.h"
29 #include "transplayers.h"
30 #include "intuition_extend.h"
33 #ifndef DEBUG_OpenWindow
34 # define DEBUG_OpenWindow 0
37 #define DEBUG DEBUG_OpenWindow
38 # include <aros/debug.h>
40 struct OpenWindowActionMsg
42 struct IntuiActionMsg msg
;
43 struct Window
*window
;
44 struct BitMap
*bitmap
;
45 struct Hook
*backfillhook
;
47 struct Hook
*shapehook
;
48 struct Layer
*parentlayer
;
53 static VOID
int_openwindow(struct OpenWindowActionMsg
*msg
,
54 struct IntuitionBase
*IntuitionBase
);
56 /*****************************************************************************
59 AROS_LH1(struct Window
*, OpenWindow
,
62 AROS_LHA(struct NewWindow
*, newWindow
, A0
),
65 struct IntuitionBase
*, IntuitionBase
, 34, Intuition
)
68 Opens a new window with the characteristics specified in
72 newWindow - How you would like your new window.
75 A pointer to the new window or NULL if it couldn't be opened. Reasons
76 for this might be lack of memory or illegal attributes.
85 CloseWindow(), ModifyIDCMP()
89 *****************************************************************************/
93 struct GfxBase
*GfxBase
= GetPrivIBase(IntuitionBase
)->GfxBase
;
94 struct Library
*UtilityBase
= GetPrivIBase(IntuitionBase
)->UtilityBase
;
95 struct OpenWindowActionMsg msg
;
97 struct Window
*w
= NULL
, *helpgroupwindow
= NULL
, *parentwin
= NULL
;
98 struct TagItem
*tag
, *shapeti
= NULL
, *shapehookti
= NULL
;
99 struct TagItem
*tagList
;
101 struct Hook
*backfillhook
= LAYERS_BACKFILL
, *shapehook
= NULL
;
102 struct Region
*shape
= NULL
;
103 struct IBox
*zoombox
= NULL
;
104 struct Image
*AmigaKey
= NULL
;
105 struct Image
*Checkmark
= NULL
;
106 struct Layer
*parentl
= NULL
;
108 struct SkinInfo
*skininfo
= NULL
;
109 BOOL hasskininfo
= FALSE
;
110 struct Region
*usertranspregion
= NULL
;
111 struct Hook
*usertransphook
= NULL
;
112 struct MsgPort
*userport
= NULL
;
114 STRPTR pubScreenName
= NULL
;
115 BOOL pubScreenNameSet
= FALSE
;
116 UBYTE
*screenTitle
= NULL
;
117 BOOL autoAdjust
= FALSE
, pubScreenFallBack
= FALSE
;
118 ULONG innerWidth
= ~0;
119 ULONG innerHeight
= ~0;
120 WORD mousequeue
= DEFAULTMOUSEQUEUE
;
121 WORD repeatqueue
= 3; /* stegerg: test on my Amiga suggests this */
124 ULONG extrabuttons
= 0, extrabuttonsid
= ETI_Dummy
;
126 ULONG windowinvisible
= FALSE
;
127 BOOL driver_init_done
= FALSE
, have_helpgroup
= FALSE
;
128 BOOL do_setwindowpointer
= FALSE
;
130 ASSERT_VALID_PTR_ROMOK(newWindow
);
132 D(bug("OpenWindow (%p = { Left=%d Top=%d Width=%d Height=%d })\n"
134 , newWindow
->LeftEdge
140 FireScreenNotifyMessage((IPTR
) newWindow
, SNOTIFY_BEFORE_OPENWINDOW
, IntuitionBase
);
144 #define WFLG_PRIVATEFLAGS (WFLG_WINDOWREFRESH |\
145 WFLG_WINDOWTICKED | WFLG_VISITOR | \
149 /* WFLG_WBENCHWINDOW | \*/
150 /* this is used by WORKBENCH! */
151 /* WFLG_HASZOOM | \*/
152 /* do NOT filter this! how do you think apps could manage to get a zoom image with struct NewWindow? */
154 nw
.Flags
&= ~WFLG_PRIVATEFLAGS
;
156 if (newWindow
->Flags
& WFLG_NW_EXTENDED
)
158 tagList
= ((struct ExtNewWindow
*)newWindow
)->Extension
;
160 /* Sanitycheck the taglist pointer. Some Am*gaOS 1.3/2.x era
161 * apps have WFLG_NW_EXTENDED set with bogus Extension taglist
162 * pointer... (older CygnusED for example) - Piru
164 if (((IPTR
) tagList
& 1) || !TypeOfMem((APTR
)tagList
))
175 DEBUG_OPENWINDOW(dprintf("OpenWindow: NewWindow 0x%lx TagList 0x%lx\n",
176 newWindow
, tagList
));
180 ASSERT_VALID_PTR_ROMOK(tagList
);
182 /* Look at WA_Flags first, since boolean tags override part of it
183 * even if they appear before it.
185 nw
.Flags
|= (GetTagData(WA_Flags
, nw
.Flags
, tagList
) & ~WFLG_PRIVATEFLAGS
);
187 while ((tag
= NextTagItem (&tagList
)))
189 /* ASSERT_VALID_PTR_ROMOK(tag); */
191 DEBUG_OPENWINDOW(dprintf("OpenWindow: Tag 0x%08lx 0x%p\n",
192 (ULONG
)tag
->ti_Tag
, tag
->ti_Data
));
194 switch ((ULONG
)tag
->ti_Tag
)
197 nw
.LeftEdge
= tag
->ti_Data
;
201 nw
.TopEdge
= tag
->ti_Data
;
205 nw
.Width
= tag
->ti_Data
;
209 nw
.Height
= tag
->ti_Data
;
213 nw
.IDCMPFlags
= tag
->ti_Data
;
217 nw
.MinWidth
= tag
->ti_Data
;
221 nw
.MinHeight
= tag
->ti_Data
;
225 nw
.MaxWidth
= tag
->ti_Data
;
229 nw
.MaxHeight
= tag
->ti_Data
;
233 nw
.FirstGadget
= (struct Gadget
*)(tag
->ti_Data
);
237 nw
.Title
= (UBYTE
*)(tag
->ti_Data
);
241 screenTitle
= (UBYTE
*)tag
->ti_Data
;
245 autoAdjust
= (tag
->ti_Data
!= 0);
249 innerWidth
= tag
->ti_Data
;
253 innerHeight
= tag
->ti_Data
;
256 #define MODIFY_FLAG(name) if (tag->ti_Data) \
257 nw.Flags |= (name); else nw.Flags &= ~(name)
258 #define MODIFY_MFLAG(name) if (tag->ti_Data) \
259 moreFlags |= (name); else moreFlags &= ~(name)
262 MODIFY_FLAG(WFLG_SIZEGADGET
);
266 MODIFY_FLAG(WFLG_DRAGBAR
);
270 MODIFY_FLAG(WFLG_DEPTHGADGET
);
274 MODIFY_FLAG(WFLG_CLOSEGADGET
);
278 MODIFY_FLAG(WFLG_BACKDROP
);
282 MODIFY_FLAG(WFLG_REPORTMOUSE
);
285 case WA_NoCareRefresh
:
286 MODIFY_FLAG(WFLG_NOCAREREFRESH
);
290 MODIFY_FLAG(WFLG_BORDERLESS
);
294 MODIFY_FLAG(WFLG_ACTIVATE
);
298 MODIFY_FLAG(WFLG_RMBTRAP
);
301 case WA_WBenchWindow
:
302 MODIFY_FLAG(WFLG_WBENCHWINDOW
);
306 MODIFY_FLAG(WFLG_SIZEBRIGHT
);
310 MODIFY_FLAG(WFLG_SIZEBBOTTOM
);
313 case WA_GimmeZeroZero
:
314 MODIFY_FLAG(WFLG_GIMMEZEROZERO
);
317 case WA_NewLookMenus
:
318 MODIFY_FLAG(WFLG_NEWLOOKMENUS
);
322 MODIFY_FLAG(WFLG_TOOLBOX
);
326 zoombox
= (struct IBox
*)tag
->ti_Data
;
327 DEBUG_OPENWINDOW(dprintf("OpenWindow: zoom %d %d %d %d\n",
328 zoombox
->Left
, zoombox
->Top
, zoombox
->Width
, zoombox
->Height
));
329 MODIFY_FLAG(WFLG_HASZOOM
);
333 if (nw
.DetailPen
== 0xFF)
334 nw
.DetailPen
= tag
->ti_Data
;
338 if (nw
.BlockPen
== 0xFF)
339 nw
.BlockPen
= tag
->ti_Data
;
342 case WA_CustomScreen
:
343 nw
.Screen
= (struct Screen
*)(tag
->ti_Data
);
344 nw
.Type
= CUSTOMSCREEN
;
348 nw
.Flags
|= WFLG_SUPER_BITMAP
;
349 nw
.BitMap
= (struct BitMap
*)(tag
->ti_Data
);
352 case WA_SimpleRefresh
:
354 nw
.Flags
|= WFLG_SIMPLE_REFRESH
;
357 case WA_SmartRefresh
:
359 nw
.Flags
|= WFLG_SMART_REFRESH
;
362 case WA_PubScreenFallBack
:
363 pubScreenFallBack
= (tag
->ti_Data
? TRUE
: FALSE
);
366 case WA_PubScreenName
:
367 pubScreenNameSet
= TRUE
;
368 pubScreenName
= (STRPTR
)tag
->ti_Data
;
372 nw
.Type
= PUBLICSCREEN
;
373 nw
.Screen
= (struct Screen
*)tag
->ti_Data
;
377 backfillhook
= (struct Hook
*)tag
->ti_Data
;
381 mousequeue
= tag
->ti_Data
;
384 /* These two are not implemented in AmigaOS */
390 MODIFY_MFLAG(WMFLG_NOTIFYDEPTH
);
394 repeatqueue
= tag
->ti_Data
;
398 Checkmark
= (struct Image
*)tag
->ti_Data
;
402 AmigaKey
= (struct Image
*)tag
->ti_Data
;
406 helpgroup
= (ULONG
)tag
->ti_Data
;
407 have_helpgroup
= TRUE
;
410 case WA_HelpGroupWindow
:
411 helpgroupwindow
= (struct Window
*)tag
->ti_Data
;
415 MODIFY_MFLAG(WMFLG_MENUHELP
);
418 case WA_PointerDelay
:
419 MODIFY_MFLAG(WMFLG_POINTERDELAY
);
422 case WA_TabletMessages
:
423 MODIFY_MFLAG(WMFLG_TABLETMESSAGES
);
426 case WA_ExtraTitlebarGadgets
:
427 extrabuttons
= (ULONG
)tag
->ti_Data
;
430 case WA_ExtraGadgetsStartID
:
431 extrabuttonsid
= (ULONG
)tag
->ti_Data
;
434 case WA_ExtraGadget_Iconify
:
437 extrabuttons
|= ETG_ICONIFY
;
441 extrabuttons
&= ~ETG_ICONIFY
;
445 case WA_ExtraGadget_Lock
:
448 extrabuttons
|= ETG_LOCK
;
452 extrabuttons
&= ~ETG_LOCK
;
456 case WA_ExtraGadget_MUI
:
459 extrabuttons
|= ETG_MUI
;
463 extrabuttons
&= ~ETG_MUI
;
467 case WA_ExtraGadget_PopUp
:
470 extrabuttons
|= ETG_POPUP
;
474 extrabuttons
&= ~ETG_POPUP
;
478 case WA_ExtraGadget_Snapshot
:
481 extrabuttons
|= ETG_SNAPSHOT
;
485 extrabuttons
&= ~ETG_SNAPSHOT
;
489 case WA_ExtraGadget_Jump
:
492 extrabuttons
|= ETG_JUMP
;
496 extrabuttons
&= ~ETG_JUMP
;
502 skininfo
= (struct SkinInfo
*)tag
->ti_Data
;
506 case WA_TransparentRegion
:
507 usertranspregion
= (struct Region
*)tag
->ti_Data
;
508 usertransphook
= NULL
; //doesn't make sense
511 case WA_TransparentRegionHook
:
512 usertransphook
= (struct Hook
*)tag
->ti_Data
;
513 usertranspregion
= NULL
;
517 userport
= (struct MsgPort
*)tag
->ti_Data
;
519 /**********************************************************************************/
522 MODIFY_MFLAG(WMFLG_IAMMUI
);
529 shape
= (struct Region
*)tag
->ti_Data
;
534 shapehook
= (struct Hook
*)tag
->ti_Data
;
539 parentwin
= ((struct Window
*)tag
->ti_Data
);
540 parentl
= parentwin
->WLayer
;
544 windowinvisible
= tag
->ti_Data
;
550 do_setwindowpointer
= TRUE
;
555 } /* while ((tag = NextTagItem (&tagList))) */
559 if (nw
.Flags
& WFLG_SIZEGADGET
)
561 if (!(nw
.Flags
& (WFLG_SIZEBRIGHT
| WFLG_SIZEBBOTTOM
)))
563 nw
.Flags
|= WFLG_SIZEBRIGHT
;
566 //jDc: tested behavior of intuition68k
567 nw
.Flags
|= WFLG_HASZOOM
;
571 nw
.Flags
&= ~(WFLG_SIZEBRIGHT
|WFLG_SIZEBBOTTOM
);
574 if (nw
.Flags
& WFLG_BORDERLESS
)
576 nw
.Flags
&= ~(WFLG_SIZEBRIGHT
|WFLG_SIZEBBOTTOM
|WFLG_SIZEGADGET
);
579 /* Find out on which Screen the window must open */
581 /* (cyfm 03/03/03 check for nw.Type == PUBLICSCREEN as well, some programs
582 * like TurboPrint GraphicPublisher specify {WA_PubScreen, NULL} and want
583 * to open on the default public screen that way
585 if (pubScreenNameSet
|| (nw
.Type
== PUBLICSCREEN
&& nw
.Screen
== NULL
))
587 struct Screen
*pubs
= 0;
589 moreFlags
|= WMFLG_DO_UNLOCKPUBSCREEN
;
590 pubs
= LockPubScreen(pubScreenName
);
591 if (!pubs
&& pubScreenFallBack
)
593 nw
.Screen
= LockPubScreen(NULL
);
599 nw
.Type
= PUBLICSCREEN
;
600 if (nw
.Screen
) nw
.Flags
|= WFLG_VISITOR
;
602 else if (nw
.Type
== PUBLICSCREEN
)
604 /* There is no LockPubScreen() with a "struct Screen *" argument, so we have to do
605 * the necessary steps ourself
608 if (GetPrivScreen(nw
.Screen
)->pubScrNode
)
610 GetPrivScreen(nw
.Screen
)->pubScrNode
->psn_VisitorCount
++;
611 moreFlags
|= WMFLG_DO_UNLOCKPUBSCREEN
;
612 nw
.Flags
|= WFLG_VISITOR
;
613 FireScreenNotifyMessage((IPTR
) nw
.Screen
, SNOTIFY_LOCKPUBSCREEN
, IntuitionBase
);
617 /* The screen wasn't a PublicScreen */
618 UnlockPubScreenList();
619 D(bug("OpenWindow: Not a PublicScreen\n"));
622 UnlockPubScreenList();
625 if (nw
.Type
== WBENCHSCREEN
)
627 nw
.Screen
= LockPubScreen("Workbench");
630 moreFlags
|= WMFLG_DO_UNLOCKPUBSCREEN
;
631 nw
.Flags
|= WFLG_VISITOR
;
635 if (nw
.Screen
== NULL
) {
636 D(bug("OpenWindow: No screen\n"));
640 w
= AllocMem (sizeof(struct IntWindow
), MEMF_CLEAR
);
642 DEBUG_OPENWINDOW(dprintf("OpenWindow: Window 0x%lx\n", w
));
644 /* nlorentz: For now, creating a rastport becomes the responsibility of
645 intui_OpenWindow(). This is because intui_OpenWindow() in
646 config/hidd/intuition_driver.c must call CreateUpfrontLayer(),
647 and that will create a rastport for the layer/window, and we don't
648 want two rastports pr. window.
649 Alternatively we may create a layers_driver.c driver for layers,
650 and then call CreateUpfrontLayer() here from openwindow.
651 For the Amiga window<-->X11 window stuff, the layers driver
652 would just allocate a layer struct, a rastport and
653 put the rasport into layer->RastPort, so we
654 could get it inside this routine and put it into
660 D(bug("OpenWindow: No window\n"));
664 DEBUG_OPENWINDOW(dprintf("OpenWindow: Flags 0x%lx MoreFlags 0x%lx IDCMP 0x%lx\n",
665 nw
.Flags
, moreFlags
, nw
.IDCMPFlags
));
668 GetAttr(WDA_UserBuffer
, ((struct IntScreen
*)(nw
.Screen
))->WinDecorObj
, &userbuffersize
);
672 ((struct IntWindow
*)w
)->DecorUserBufferSize
= userbuffersize
;
673 ((struct IntWindow
*)w
)->DecorUserBuffer
= (IPTR
) AllocMem(userbuffersize
, MEMF_ANY
| MEMF_CLEAR
);
674 if (0 == ((struct IntWindow
*)w
)->DecorUserBuffer
) {
675 D(bug("OpenWindow: No decor\n"));
680 struct wdpInitWindow initmsg
;
683 initmsg
.MethodID
= WDM_INITWINDOW
;
684 initmsg
.wdp_TrueColor
= (((struct IntScreen
*) nw
.Screen
)->DInfo
.dri_Flags
& DRIF_DIRECTCOLOR
) ? TRUE
: FALSE
;
685 initmsg
.wdp_UserBuffer
= ((struct IntWindow
*)w
)->DecorUserBuffer
;
686 initmsg
.wdp_ScreenUserBuffer
= ((struct IntScreen
*) nw
.Screen
)->DecorUserBuffer
;
687 initmsg
.wdp_Screen
= nw
.Screen
;
689 ok
= DoMethodA(((struct IntScreen
*)(nw
.Screen
))->WinDecorObj
, (Msg
)&initmsg
);
692 D(bug("OpenWindow: WDM_INITWINDOW failed\n"));
696 w
->WScreen
= nw
.Screen
;
701 w
->UserPort
= userport
;
702 ((struct IntWindow
*)w
)->specialflags
|= SPFLAG_USERPORT
;
706 if (!ModifyIDCMP (w
, nw
.IDCMPFlags
)) {
707 D(bug("OpenWindow: ModifyIDCMP failed\n"));
711 ((struct IntWindow
*)w
)->extrabuttons
= extrabuttons
;
712 ((struct IntWindow
*)w
)->extrabuttonsid
= extrabuttonsid
;
716 //w->FirstGadget = nw.FirstGadget;
718 w
->DetailPen
= (nw
.DetailPen
!= 0xFF) ? nw
.DetailPen
: w
->WScreen
->DetailPen
;
719 w
->BlockPen
= (nw
.BlockPen
!= 0xFF) ? nw
.BlockPen
: w
->WScreen
->BlockPen
;
723 w
->MoreFlags
= moreFlags
;
725 if (!(w
->Flags
& WFLG_BORDERLESS
))
727 w
->BorderLeft
= w
->WScreen
->WBorLeft
;
728 w
->BorderRight
= w
->WScreen
->WBorRight
;
730 w
->BorderTop
= w
->WScreen
->WBorBottom
;
732 w
->BorderTop
= w
->WScreen
->WBorTop
;
734 w
->BorderBottom
= w
->WScreen
->WBorBottom
;
737 if (nw
.Title
|| (w
->Flags
& (WFLG_DRAGBAR
| WFLG_CLOSEGADGET
| WFLG_DEPTHGADGET
)))
739 /* this is a hack. the correct way to "correct" (increase if necessary)
740 the w->Border??? items would be to check all GACT_???BORDER gadgets
741 (inclusive sysgadgets which are GACT_????BORDER gadgets as well) in
742 nw.FirstGadget (or WA_Gadgets tag) and all sysgadgets and then
743 make sure that each window border is big enough so that none of these
744 gadgets extends outside the window border area */
747 w
->BorderTop
= w
->WScreen
->WBorTop
;
749 /* Georg Steger: ??? font ??? */
750 if (w
->WScreen
->Font
)
751 w
->BorderTop
+= ((struct IntScreen
*)(w
->WScreen
))->DInfo
.dri_Font
->tf_YSize
+ 1;
753 w
->BorderTop
+= GfxBase
->DefaultFont
->tf_YSize
+ 1;
758 struct windowclassprefs
*wcprefs
;
759 struct IntDrawInfo
*dri
;
760 if ((dri
= (struct IntDrawInfo
*)GetScreenDrawInfo(w
->WScreen
)))
762 wcprefs
= (struct windowclassprefs
*)int_GetCustomPrefs(TYPE_WINDOWCLASS
,dri
,IntuitionBase
);
763 w
->BorderTop
+= wcprefs
->titlebarincrement
;
764 int_FreeCustomPrefs(TYPE_WINDOWCLASS
,dri
,IntuitionBase
);
771 /* look for GACT_???BORDER gadgets which increase the BorderSizes */
777 for(gad
= nw
.FirstGadget
; gad
; gad
= gad
->NextGadget
)
779 WORD gadx1
, gady1
, gadx2
, gady2
;
781 if (gad
->Activation
& GACT_LEFTBORDER
)
783 /* may never be GFLG_RELRIGHT / GFLG_RELWIDTH */
785 gadx2
= gad
->LeftEdge
+ gad
->Width
- 1;
786 if (gadx2
>= w
->BorderLeft
) w
->BorderLeft
= gadx2
/* + 1*/;
789 if (gad
->Activation
& GACT_TOPBORDER
)
791 /* may never be GFLG_RELBOTTOM / GFLG_RELHEIGHT */
793 gady2
= gad
->TopEdge
+ gad
->Height
- 1;
794 if (gady2
>= w
->BorderTop
) w
->BorderTop
= gady2
/* + 1*/;
797 if (gad
->Activation
& GACT_RIGHTBORDER
)
799 /* must be GFLG_RELRIGHT but never GFLG_RELWIDTH */
801 gadx1
= -gad
->LeftEdge
;
802 if (gadx1
>= w
->BorderRight
) w
->BorderRight
= gadx1
/* + 1*/;
805 if (gad
->Activation
& GACT_BOTTOMBORDER
)
807 /* must be GFLG_RELBOTTOM but never GFLG_RELHEIGHT */
809 gady1
= -gad
->TopEdge
;
810 if (gady1
>= w
->BorderBottom
) w
->BorderBottom
= gady1
/* + 1*/;
813 } /* for(gad = nw.FirstGadget; gad; gad = gad->NextGadget) */
815 } /* if (nw.FirstGadget) */
817 if (!(w
->Flags
& WFLG_SIZEBRIGHT
)) if (w
->BorderRight
> w
->WScreen
->WBorRight
)
819 w
->Flags
|= WFLG_SIZEBRIGHT
;
822 if (!(w
->Flags
& WFLG_SIZEBBOTTOM
)) if (w
->BorderBottom
> w
->WScreen
->WBorBottom
)
824 w
->Flags
|= WFLG_SIZEBBOTTOM
;
828 // if ((w->Flags & WFLG_SIZEGADGET) &&
829 // (w->Flags & (WFLG_SIZEBRIGHT | WFLG_SIZEBBOTTOM)))
831 IPTR sizewidth
= 16, sizeheight
= 16;
833 struct DrawInfo
*dri
;
835 if ((dri
= GetScreenDrawInfo(w
->WScreen
)))
837 struct TagItem imtags
[] =
839 {SYSIA_DrawInfo
, (STACKIPTR
)dri
},
840 {SYSIA_Which
, SIZEIMAGE
},
841 {SYSIA_Size
, w
->WScreen
->Flags
& SCREENHIRES
? SYSISIZE_MEDRES
: SYSISIZE_LOWRES
},
845 if ((im
= NewObjectA(NULL
, SYSICLASS
, imtags
)))
847 GetAttr(IA_Width
, (Object
*)im
, &sizewidth
);
848 GetAttr(IA_Height
, (Object
*)im
, &sizeheight
);
852 FreeScreenDrawInfo(w
->WScreen
, dri
);
855 if (w
->Flags
& WFLG_SIZEBRIGHT
)
857 if (w
->BorderRight
< sizewidth
) w
->BorderRight
= sizewidth
;
860 if (w
->Flags
& WFLG_SIZEBBOTTOM
)
862 if (w
->BorderBottom
< sizeheight
) w
->BorderBottom
= sizeheight
;
865 IW(w
)->sizeimage_width
= sizewidth
;
866 IW(w
)->sizeimage_height
= sizeheight
;
868 /* now increase window size if it's necessary */
873 IW(w
)->custombackfill
.h_Entry
= (HOOKFUNC
)HookEntry
;
874 IW(w
)->custombackfill
.h_SubEntry
= (HOOKFUNC
)GradientizeBackfillFunc
;
875 IW(w
)->custombackfill
.h_Data
= &IW(w
)->hd
;
876 IW(w
)->hd
.intuitionBase
= IntuitionBase
;
878 IW(w
)->usertranspregion
= usertranspregion
;
879 IW(w
)->usertransphook
= usertransphook
;
882 IW(w
)->DefaultWindowShapeHook
.h_Entry
= (HOOKFUNC
)DefaultWindowShapeFunc
;
883 IW(w
)->DefaultWindowShapeHook
.h_SubEntry
= (HOOKFUNC
)w
;
884 IW(w
)->DefaultWindowShapeHook
.h_Data
= (APTR
)IntuitionBase
;
886 if (innerWidth
!= ~0) nw
.Width
= innerWidth
+ w
->BorderLeft
+ w
->BorderRight
;
887 if (innerHeight
!= ~0) nw
.Height
= innerHeight
+ w
->BorderTop
+ w
->BorderBottom
;
893 parentwidth
= parentwin
? parentwin
->Width
: w
->WScreen
->Width
;
894 parentheight
= parentwin
? parentwin
->Height
: w
->WScreen
->Height
;
896 w
->Width
= (nw
.Width
!= ~0) ? nw
.Width
: parentwidth
- nw
.LeftEdge
;
897 w
->Height
= (nw
.Height
!= ~0) ? nw
.Height
: parentheight
- nw
.TopEdge
;
902 if (w
->Width
> parentwidth
) w
->Width
= parentwidth
;
903 if (w
->Height
> parentheight
) w
->Height
= parentheight
;
905 if (nw
.LeftEdge
< 0) nw
.LeftEdge
= 0;
906 if (nw
.TopEdge
< 0) nw
.TopEdge
= 0;
908 if ((nw
.LeftEdge
+ w
->Width
) > parentwidth
)
909 nw
.LeftEdge
= parentwidth
- w
->Width
;
911 if ((nw
.TopEdge
+ w
->Height
) > parentheight
)
912 nw
.TopEdge
= parentheight
- w
->Height
;
915 w
->GZZWidth
= w
->Width
- w
->BorderLeft
- w
->BorderRight
;
916 w
->GZZHeight
= w
->Height
- w
->BorderTop
- w
->BorderBottom
;
919 if (nw
.LeftEdge
< 0 || nw
.TopEdge
< 0 ||
920 nw
.LeftEdge
+ w
->Width
> w
->WScreen
->Width
||
921 nw
.TopEdge
+ w
->Height
> w
->WScreen
->Height
) {
922 D(bug("OpenWindow: Window size (%dx%d) @(%d,%d) is weird for a %dx%d screen\n",
923 nw
.LeftEdge
+ w
->Width
, nw
.TopEdge
+ w
->Height
,
924 nw
.LeftEdge
, nw
.TopEdge
,
925 w
->WScreen
->Width
, w
->WScreen
->Height
));
929 if (NULL
== parentwin
)
931 w
->LeftEdge
= nw
.LeftEdge
;
932 w
->TopEdge
= nw
.TopEdge
;
936 w
->LeftEdge
= nw
.LeftEdge
+ parentwin
->LeftEdge
;
937 w
->TopEdge
= nw
.TopEdge
+ parentwin
->TopEdge
;
941 w
->RelLeftEdge
= nw
.LeftEdge
;
942 w
->RelTopEdge
= nw
.TopEdge
;
945 w
->MinWidth
= (nw
.MinWidth
!= 0) ? nw
.MinWidth
: w
->Width
;
946 w
->MinHeight
= (nw
.MinHeight
!= 0) ? nw
.MinHeight
: w
->Height
;
947 w
->MaxWidth
= (nw
.MaxWidth
!= 0) ? nw
.MaxWidth
: w
->Width
;
948 w
->MaxHeight
= (nw
.MaxHeight
!= 0) ? nw
.MaxHeight
: w
->Height
;
950 //jDc: tested behavior of intuition68k
951 if ((UWORD
)w
->MaxWidth
< w
->Width
) w
->MaxWidth
= w
->Width
;
952 if ((UWORD
)w
->MaxHeight
< w
->Height
) w
->MaxHeight
= w
->Height
;
954 /* check if maxwidth/height is not bigger than screen */
955 if (w
->MaxWidth
> w
->WScreen
->Width
) w
->MaxWidth
= w
->WScreen
->Width
;
956 if (w
->MaxHeight
> w
->WScreen
->Height
) w
->MaxHeight
= w
->WScreen
->Height
;
960 ((struct IntWindow
*)w
)->ZipLeftEdge
= zoombox
->Left
;
961 ((struct IntWindow
*)w
)->ZipTopEdge
= zoombox
->Top
;
962 ((struct IntWindow
*)w
)->ZipWidth
= zoombox
->Width
;
963 ((struct IntWindow
*)w
)->ZipHeight
= zoombox
->Height
;
967 ((struct IntWindow
*)w
)->ZipLeftEdge
= nw
.LeftEdge
;
968 ((struct IntWindow
*)w
)->ZipTopEdge
= nw
.TopEdge
;
969 ((struct IntWindow
*)w
)->ZipWidth
= (w
->Width
== w
->MinWidth
) ? w
->MaxWidth
: w
->MinWidth
;
970 ((struct IntWindow
*)w
)->ZipHeight
= (w
->Height
== w
->MinHeight
) ? w
->MaxHeight
: w
->MinHeight
;
973 DEBUG_OPENWINDOW(dprintf("OpenWindow: zip %d %d %d %d\n",
974 ((struct IntWindow
*)w
)->ZipLeftEdge
,
975 ((struct IntWindow
*)w
)->ZipTopEdge
,
976 ((struct IntWindow
*)w
)->ZipWidth
,
977 ((struct IntWindow
*)w
)->ZipHeight
));
980 IW(w
)->mousequeue
= mousequeue
;
981 IW(w
)->repeatqueue
= repeatqueue
;
983 /* Amiga and checkmark images for menus */
985 IW(w
)->Checkmark
= Checkmark
? Checkmark
:
986 ((struct IntScreen
*)(w
->WScreen
))->DInfo
.dri_CheckMark
;
988 IW(w
)->AmigaKey
= AmigaKey
? AmigaKey
:
989 ((struct IntScreen
*)(w
->WScreen
))->DInfo
.dri_AmigaKey
;
990 IW(w
)->SubMenuImage
= ((struct IntScreen
*)(w
->WScreen
))->DInfo
.dri_Customize
->submenu
;
994 if (NULL
!= parentwin
)
996 if (parentwin
->firstchild
)
997 parentwin
->firstchild
->prevchild
= w
;
999 w
->nextchild
= parentwin
->firstchild
;
1000 parentwin
->firstchild
= w
;
1001 w
->parent
= parentwin
;
1006 if (hasskininfo
) ((struct IntWindow
*)(w
))->specialflags
= SPFLAG_SKININFO
;
1010 if ((w
->Flags
& WFLG_SIMPLE_REFRESH
) && (IS_DOCAREREFRESH(w
)) && (!(w
->Flags
& WFLG_BORDERLESS
))) IW(w
)->trashregion
= NewRegion();
1015 if (!have_helpgroup
&& helpgroupwindow
)
1017 if (IW(helpgroupwindow
)->helpflags
& HELPF_ISHELPGROUP
)
1019 helpgroup
= IW(helpgroupwindow
)->helpgroup
;
1020 have_helpgroup
= TRUE
;
1026 IW(w
)->helpflags
|= HELPF_ISHELPGROUP
;
1027 IW(w
)->helpgroup
= helpgroup
;
1030 w
->Title
= nw
.Title
;
1032 /* as mentioned in the OpenScreen() autodoc/SA_SysFont settings the default
1033 window font will be either screenfont (sysfont=0) or defaultfont (sysfont=1) */
1034 w
->IFont
= SafeReopenFont(IntuitionBase
, (IS(w
->WScreen
)->SysFont
) ? &GfxBase
->DefaultFont
: &IS(w
->WScreen
)->DInfo
.dri_Font
);
1036 if (w
->IFont
== NULL
) goto failexit
;
1038 /* jDc: intui68k waits before opening the window until
1039 ** Move/SizeWindow actions are over (does it mean it's executed on
1040 ** caller's context?).
1043 #ifdef USEWINDOWLOCK
1044 if (!(FindTask(0) == ((struct IIHData
*)GetPrivIBase(IntuitionBase
)->InputHandler
->is_Data
)->InputDeviceTask
))
1046 ObtainSemaphore(&GetPrivIBase(IntuitionBase
)->WindowLock
);
1050 IW(w
)->OutlineShape
= NULL
;
1052 if ((shapeti
!= NULL
) || (shapehookti
!= NULL
)) IW(w
)->CustomShape
= TRUE
;
1053 if (!(IW(w
)->CustomShape
) && (!(w
->Flags
& WFLG_BORDERLESS
)) && !IS_GZZWINDOW(w
))
1055 shapehook
= &IW(w
)->DefaultWindowShapeHook
;
1059 msg
.bitmap
= nw
.BitMap
;
1060 //msg.backfillhook = backfillhook == LAYERS_BACKFILL ? &IW(w)->custombackfill : backfillhook;
1061 msg
.backfillhook
= backfillhook
;
1063 msg
.shapehook
= shapehook
;
1064 msg
.parentlayer
= parentl
;
1065 msg
.invisible
= windowinvisible
;
1067 DoSyncAction((APTR
)int_openwindow
, &msg
.msg
, IntuitionBase
);
1069 #ifdef USEWINDOWLOCK
1070 if (!(FindTask(0) == ((struct IIHData
*)GetPrivIBase(IntuitionBase
)->InputHandler
->is_Data
)->InputDeviceTask
))
1072 ReleaseSemaphore(&GetPrivIBase(IntuitionBase
)->WindowLock
);
1077 D(bug("OpenWindow: DoSyncAction failed\n"));
1081 /* nlorentz: The driver has in some way or another allocated a rastport for us,
1082 which now is ready for us to use. */
1084 driver_init_done
= TRUE
;
1087 D(bug("called driver, rp=%p\n", rp
));
1089 /* The window RastPort always gets the font from GfxBase->DefaultFont, which
1090 is the system's default font. Usually topaz 8, but it can be changed with
1091 the Fonts prefs program to another fixed-sized font. */
1093 SetFont (rp
, w
->IFont
);
1095 D(bug("set fonts\n"));
1097 /* FIXME: Remove workaround! */
1098 /* lbischoff: The following 4 Setxxx lines are a workaround for the InitRastPort
1099 problem (Bug #75 in docs/BUGS). They ensure that at least a window's rastport
1100 is initialized correctly. Remove them if they are not needed any longer!
1102 SetABPenDrMd (rp
, rp
->FgPen
, rp
->BgPen
, rp
->DrawMode
);
1103 SetWriteMask (rp
, rp
->Mask
);
1104 D(bug("set pens\n"));
1107 /* Send all GA_RelSpecial BOOPSI gadgets in the list the GM_LAYOUT msg */
1108 /*DoGMLayout(w->FirstGadget, w, NULL, -1, TRUE, IntuitionBase);
1110 if (NULL != w->FirstGadget)
1111 RefreshGadgets (w->FirstGadget, w, NULL);
1116 struct IntDrawInfo
*dri
= &((struct IntScreen
*)(w
->WScreen
))->DInfo
;
1117 struct wdpLayoutBorderGadgets msg
;
1119 msg
.MethodID
= WDM_LAYOUT_BORDERGADGETS
;
1120 msg
.wdp_UserBuffer
= ((struct IntWindow
*)w
)->DecorUserBuffer
;;
1121 msg
.wdp_TrueColor
= (((struct IntScreen
*)nw
.Screen
)->DInfo
.dri_Flags
& DRIF_DIRECTCOLOR
) ? TRUE
: FALSE
;
1123 msg
.wdp_Gadgets
= nw
.FirstGadget
;
1124 msg
.wdp_Flags
= WDF_LBG_INITIAL
| WDF_LBG_MULTIPLE
;
1125 msg
.wdp_ExtraButtons
= ((struct IntWindow
*)w
)->extrabuttons
;
1126 msg
.wdp_Dri
= (struct DrawInfo
*)dri
;
1128 DoMethodA(((struct IntScreen
*)(nw
.Screen
))->WinDecorObj
, (Msg
)&msg
);
1130 AddGList(w
, nw
.FirstGadget
, -1, -1, NULL
);
1134 /* !!! This does double refreshing as the system gadgets also are refreshed
1135 in the above RfreshGadgets() call */
1136 if (nw
.Flags
& WFLG_ACTIVATE
)
1138 /* RefreshWindowFrame() will be called from within ActivateWindow().
1139 No point in doing double refreshing. */
1145 RefreshWindowFrame(w
);
1149 if (screenTitle
!= NULL
)
1150 SetWindowTitles (w
, (CONST_STRPTR
)~0, screenTitle
);
1152 UpdateMouseCoords(w
);
1154 if (do_setwindowpointer
)
1156 //jDc: main for () loop destroys original taglist pointer, we need to get
1157 //it once again here!
1158 tagList
= (struct TagItem
*)((struct ExtNewWindow
*)newWindow
)->Extension
;
1159 SetWindowPointerA(w
, (struct TagItem
*)tagList
);
1163 ((struct IntWindow
*)w
)->OutlineShape
= NULL
;
1165 if ((shape
!= NULL
) || (shapehook
!= NULL
)) ((struct IntWindow
*)w
)->CustomShape
= TRUE
;
1166 if ((!((struct IntWindow
*)w
)->CustomShape
) && (!(w
->Flags
& WFLG_BORDERLESS
)) && !IS_GZZWINDOW(w
))
1168 struct wdpWindowShape shapemsg
;
1170 shapemsg
.MethodID
= WDM_WINDOWSHAPE
;
1171 shapemsg
.wdp_TrueColor
= (((struct IntScreen
*)nw
.Screen
)->DInfo
.dri_Flags
& DRIF_DIRECTCOLOR
);
1172 shapemsg
.wdp_Width
= w
->Width
;
1173 shapemsg
.wdp_Height
= w
->Height
;
1174 shapemsg
.wdp_Window
= w
;
1175 shapemsg
.wdp_UserBuffer
= ((struct IntWindow
*)w
)->DecorUserBuffer
;
1177 shape
= DoMethodA(((struct IntScreen
*)(nw
.Screen
))->WinDecorObj
, (Msg
)&shapemsg
);
1178 ((struct IntWindow
*)w
)->OutlineShape
= shape
;
1179 ChangeWindowShape(w
, shape
, NULL
);
1180 ((struct IntWindow
*)w
)->CustomShape
= FALSE
;
1193 /* nlorentz: Freeing the rasport is now intui_CloseWindow()'s task.
1201 if (driver_init_done
)
1202 intui_CloseWindow(w
, IntuitionBase
);
1204 if (w
->IFont
) CloseFont(w
->IFont
);
1206 if (((struct IntWindow
*)w
)->DecorUserBuffer
)
1208 FreeMem((APTR
)((struct IntWindow
*)w
)->DecorUserBuffer
, ((struct IntWindow
*)w
)->DecorUserBufferSize
);
1211 FreeMem (w
, sizeof(struct IntWindow
));
1216 if (nw
.Screen
&& (moreFlags
& WMFLG_DO_UNLOCKPUBSCREEN
))
1218 UnlockPubScreen(NULL
, nw
.Screen
);
1223 DEBUG_OPENWINDOW(dprintf("OpenWindow: Return 0x%lx\n", w
));
1225 FireScreenNotifyMessage((IPTR
) w
, SNOTIFY_AFTER_OPENWINDOW
, IntuitionBase
);
1227 ReturnPtr ("OpenWindow", struct Window
*, w
);
1233 /**********************************************************************************/
1235 static VOID
int_openwindow(struct OpenWindowActionMsg
*msg
,
1236 struct IntuitionBase
*IntuitionBase
)
1238 struct GfxBase
* GfxBase
= GetPrivIBase(IntuitionBase
)->GfxBase
;
1239 struct LayersBase
* LayersBase
= GetPrivIBase(IntuitionBase
)->LayersBase
;
1240 struct Window
* w
= msg
->window
;
1241 struct BitMap
* SuperBitMap
= msg
->bitmap
;
1242 struct Hook
* backfillhook
= msg
->backfillhook
;
1243 struct Region
* shape
= msg
->shape
;
1244 struct Hook
* shapehook
= msg
->shapehook
;
1245 struct Layer
* parent
= msg
->parentlayer
;
1246 BOOL invisible
= msg
->invisible
;
1249 BOOL installtransphook
= FALSE
;
1250 BOOL notransphook
= TRUE
;
1253 /* Create a layer for the window */
1254 LONG layerflags
= 0;
1256 EnterFunc(bug("int_OpenWindow(w=%p)\n", w
));
1258 D(bug("screen: %p\n", w
->WScreen
));
1259 D(bug("bitmap: %p\n", w
->WScreen
->RastPort
.BitMap
));
1261 /* Just insert some default values, should be taken from
1262 w->WScreen->WBorxxxx */
1264 /* Set the layer's flags according to the flags of the
1269 if (w
->Flags
& WFLG_SIMPLE_REFRESH
)
1271 layerflags
|= LAYERSIMPLE
;
1275 if (w
->Flags
& WFLG_SUPER_BITMAP
&& SuperBitMap
)
1277 layerflags
|= LAYERSUPER
;
1281 layerflags
|= LAYERSMART
;
1285 if (w
->Flags
& WFLG_BACKDROP
)
1287 layerflags
|= LAYERBACKDROP
;
1290 D(bug("Window dims: (%d, %d, %d, %d)\n",
1291 w
->LeftEdge
, w
->TopEdge
, w
->Width
, w
->Height
));
1294 //install transp layer hook!
1296 struct windowclassprefs
*wcprefs
= NULL
;
1298 wcprefs
= (struct windowclassprefs
*)int_GetCustomPrefs(TYPE_WINDOWCLASS
,&((struct IntScreen
*)(w
->WScreen
))->DInfo
,IntuitionBase
);
1299 if (wcprefs
->flags
& WINDOWCLASS_PREFS_ROUNDEDEDGES
&& (w
->Title
|| (w
->Flags
& (WFLG_DRAGBAR
| WFLG_CLOSEGADGET
| WFLG_DEPTHGADGET
))))
1301 IW(w
)->transpregion
= NewRegion();
1302 if (IW(w
)->transpregion
)
1304 installtransphook
= TRUE
; notransphook
= FALSE
;
1305 IW(w
)->specialflags
|= SPFLAG_TRANSPHOOK
;
1310 if (IW(w
)->usertransphook
)
1312 IW(w
)->transpregion
= NewRegion();
1313 if (IW(w
)->transpregion
)
1315 installtransphook
= TRUE
;
1316 IW(w
)->specialflags
|= SPFLAG_TRANSPHOOK
;
1319 else if (IW(w
)->usertranspregion
)
1321 IW(w
)->transpregion
= NewRegion();
1322 if (IW(w
)->transpregion
)
1324 installtransphook
= TRUE
;
1325 IW(w
)->specialflags
|= SPFLAG_TRANSPHOOK
;
1329 int_FreeCustomPrefs(TYPE_SYSICLASS
,&((struct IntScreen
*)(w
->WScreen
))->DInfo
,IntuitionBase
);
1333 // LockLayers(&w->WScreen->LayerInfo);
1335 /* A GimmeZeroZero window??? */
1336 if (w
->Flags
& WFLG_GIMMEZEROZERO
)
1339 A GimmeZeroZero window is to be created:
1340 - the outer window will be a simple refresh layer
1341 - the inner window will be a layer according to the flags
1342 What is the size of the inner/outer window supposed to be???
1343 I just make it that the outer window has the size of what is requested
1346 struct TagItem layertags
[] =
1348 {LA_BackfillHook
, (IPTR
)LAYERS_NOBACKFILL
},
1349 {SuperBitMap
? LA_SuperBitMap
: TAG_IGNORE
, (IPTR
)SuperBitMap
},
1351 {installtransphook
? LA_TransHook
: TAG_IGNORE
, notransphook
? (IPTR
)&((struct IntIntuitionBase
*)(IntuitionBase
))->notransphook
: (IPTR
)&((struct IntIntuitionBase
*)(IntuitionBase
))->transphook
},
1352 {installtransphook
? LA_TransRegion
: TAG_IGNORE
, (IPTR
)IW(w
)->transpregion
},
1357 {LA_WindowPtr
, (IPTR
)w
},
1358 {LA_ChildOf
, (IPTR
)parent
}, /* These two are AROS-specific */
1359 {LA_Hidden
, invisible
},
1363 /* First create outer window */
1364 struct Layer
* L
= CreateUpfrontLayerTagList(
1365 &w
->WScreen
->LayerInfo
1366 , w
->WScreen
->RastPort
.BitMap
1370 , w
->RelLeftEdge
+ w
->Width
- 1
1371 , w
->RelTopEdge
+ w
->Height
- 1
1375 , w
->LeftEdge
+ w
->Width
- 1
1376 , w
->TopEdge
+ w
->Height
- 1
1378 , LAYERSIMPLE
| (layerflags
& LAYERBACKDROP
)
1379 , (struct TagItem
*)&layertags
);
1381 /* Could the layer be created. Nothing bad happened so far, so simply leave */
1384 msg
->success
= FALSE
;
1385 // UnlockLayers(&w->WScreen->LayerInfo);
1386 ReturnVoid("intui_OpenWindow(No GimmeZeroZero layer)");
1389 D(bug("created outer GimmeZeroZero layer.\n"));
1391 /* install it as the BorderRPort */
1392 w
->BorderRPort
= L
->rp
;
1395 /* Now comes the inner window */
1396 layertags
[0].ti_Data
= (IPTR
)backfillhook
;
1399 layertags
[2].ti_Tag
= LA_ShapeHook
;
1400 layertags
[2].ti_Data
= (IPTR
)shapehook
;
1404 layertags
[3].ti_Tag
= LA_ShapeRegion
;
1405 layertags
[3].ti_Data
= (IPTR
)shape
;
1408 w
->WLayer
= CreateUpfrontLayerTagList(
1409 &w
->WScreen
->LayerInfo
1410 , w
->WScreen
->RastPort
.BitMap
1412 , w
->RelLeftEdge
+ w
->BorderLeft
1413 , w
->RelTopEdge
+ w
->BorderTop
1414 , w
->RelLeftEdge
+ w
->BorderLeft
+ w
->GZZWidth
- 1
1415 , w
->RelTopEdge
+ w
->BorderTop
+ w
->GZZHeight
- 1
1417 , w
->LeftEdge
+ w
->BorderLeft
1418 , w
->TopEdge
+ w
->BorderTop
1419 , w
->LeftEdge
+ w
->BorderLeft
+ w
->GZZWidth
- 1
1420 , w
->TopEdge
+ w
->BorderTop
+ w
->GZZHeight
- 1
1423 , (struct TagItem
*)&layertags
);
1425 /* could this layer be created? If not then delete the outer window and exit */
1426 if (NULL
== w
->WLayer
)
1429 msg
->success
= FALSE
;
1430 // UnlockLayers(&w->WScreen->LayerInfo);
1431 ReturnVoid("intui_OpenWindow(No window layer)");
1434 /* That should do it, I guess... */
1438 struct TagItem layertags
[] =
1440 {LA_BackfillHook
, (IPTR
)backfillhook
},
1441 {SuperBitMap
? LA_SuperBitMap
: TAG_IGNORE
, (IPTR
)SuperBitMap
},
1443 {installtransphook
? LA_TransHook
: TAG_IGNORE
, notransphook
? (IPTR
)&((struct IntIntuitionBase
*)(IntuitionBase
))->notransphook
: (IPTR
)&((struct IntIntuitionBase
*)(IntuitionBase
))->transphook
},
1444 {installtransphook
? LA_TransRegion
: TAG_IGNORE
, (IPTR
)IW(w
)->transpregion
},
1449 {LA_WindowPtr
, (IPTR
)w
},
1450 {LA_ChildOf
, (IPTR
)parent
}, /* These two are AROS-specific */
1451 {LA_Hidden
, invisible
},
1457 layertags
[2].ti_Tag
= LA_ShapeHook
;
1458 layertags
[2].ti_Data
= (IPTR
)shapehook
;
1462 layertags
[3].ti_Tag
= LA_ShapeRegion
;
1463 layertags
[3].ti_Data
= (IPTR
)shape
;
1466 D(dprintf("CreateUpfrontLayerTagList(taglist 0x%lx)\n", &layertags
));
1468 w
->WLayer
= CreateUpfrontLayerTagList( &w
->WScreen
->LayerInfo
,
1469 w
->WScreen
->RastPort
.BitMap
,
1473 w
->RelLeftEdge
+ w
->Width
- 1,
1474 w
->RelTopEdge
+ w
->Height
- 1,
1478 w
->LeftEdge
+ w
->Width
- 1,
1479 w
->TopEdge
+ w
->Height
- 1,
1482 (struct TagItem
*)&layertags
);
1484 /* Install the BorderRPort here! see GZZ window above */
1485 if (NULL
!= w
->WLayer
)
1488 I am installing a totally new RastPort here so window and frame can
1489 have different fonts etc.
1491 w
->BorderRPort
= AllocMem(sizeof(struct RastPort
), MEMF_ANY
);
1495 InitRastPort(w
->BorderRPort
);
1496 w
->BorderRPort
->Layer
= w
->WLayer
;
1497 w
->BorderRPort
->BitMap
= w
->WLayer
->rp
->BitMap
;
1501 /* no memory for RastPort! Simply close the window */
1502 intui_CloseWindow(w
, IntuitionBase
);
1503 msg
->success
= FALSE
;
1504 // UnlockLayers(&w->WScreen->LayerInfo);
1505 ReturnVoid("intui_OpenWindow(No BorderRPort)");
1510 D(bug("Layer created: %p\n", w
->WLayer
));
1511 D(bug("Window created: %p\n", w
));
1513 /* common code for GZZ and regular windows */
1518 if ((layerflags
& LAYERBACKDROP
) && (w
->WScreen
->Flags
& SHOWTITLE
))
1521 struct Layer
*blayer
;
1523 /* make sure the screen titlebar is in front of all user created */
1524 /* backdrop windows */
1526 blayer
= w
->WScreen
->BarLayer
;
1529 if (GetPrivScreen(w
->WScreen
)->SpecialFlags
& (SF_InvisibleBar
|SF_AppearingBar
)) blayer
= 0;
1532 if (blayer
) MoveLayerInFrontOf(blayer
,w
->WLayer
);
1534 D(bug("move screen bar layer in front of window backdrop layer\n"));
1536 /* backdrop window was created over screen barlayer, but it must be
1537 under the screen barlayer if screen has flag SHOWTITLE set */
1539 AROS_ATOMIC_AND(w
->WScreen
->Flags
, ~SHOWTITLE
);
1541 ShowTitle(w
->WScreen
, TRUE
);
1545 /* Layer gets pointer to the window */
1546 WLAYER(w
) = w
->WLayer
;
1548 CheckLayers(w
->WScreen
,IntuitionBase
);
1550 // UnlockLayers(&w->WScreen->LayerInfo);
1553 w
->WLayer
->Window
= (APTR
)w
;
1555 /* Window needs a rastport */
1556 w
->RPort
= w
->WLayer
->rp
;
1558 /* installation of the correct BorderRPort already happened above !! */
1560 if (CreateWinSysGadgets(w
, IntuitionBase
))
1564 lock
= LockIBase (0);
1566 /* insert new window into parent/descendant list
1568 ** before: parent win xyz
1572 ** descendant win abc
1574 ** after: parent win xyz
1581 ** descendant win abc
1586 struct Window
*parent
, *descendant_of_parent
;
1588 parent
= IntuitionBase
->ActiveWindow
;
1589 if (!parent
) parent
= w
->WScreen
->FirstWindow
;
1592 descendant_of_parent
= parent
->Descendant
;
1593 parent
->Descendant
= w
;
1594 if (descendant_of_parent
) descendant_of_parent
->Parent
= w
;
1598 descendant_of_parent
= NULL
;
1601 w
->Descendant
= descendant_of_parent
;
1606 w
->NextWindow
= w
->WScreen
->FirstWindow
;
1607 w
->WScreen
->FirstWindow
= w
;
1609 w
->WindowPort
= GetPrivIBase(IntuitionBase
)->IntuiReplyPort
;
1613 AddResourceToList(w
, RESOURCE_WINDOW
, IntuitionBase
);
1615 if (w
->Flags
& WFLG_ACTIVATE
)
1621 RefreshWindowFrame(w
);
1624 msg
->success
= TRUE
;
1625 ReturnVoid("int_openwindow");
1629 //int_closewindow(w, IntuitionBase);
1631 } /* if (layer created) */
1633 // UnlockLayers(&w->WScreen->LayerInfo);
1636 D(bug("int_openwindow(General failure)"));
1638 msg
->success
= FALSE
;
1639 ReturnVoid("int_openwindow");