00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <string.h>
00026
00027 #include "macros.h"
00028 #include "debug.h"
00029 #include "Bases.h"
00030 #include "Locale.h"
00031 #include "Common.h"
00032 #include "Memory.h"
00033 #include "Skin.h"
00034 #include "xml_Gui.h"
00035 #include "classes.h"
00036 #include "Prefs.h"
00037 #include "Gui.h"
00038 #include "Window.h"
00039 #include "Net.h"
00040
00041 #include "gadgets/gadget_SysDrag.h"
00042
00043
00044
00045 static u32 (*call_vector[WINDOW_FUNC_DONE-WINDOW_FUNCBASE+1])(tag *);
00046
00047 static gadget_Check_t window_checklist[]=
00048 {
00049 { GADGET_SYSBASE+1, "Group", GADGET_REQUIRED },
00050 { GADGET_SYSBASE+2, "SysDrag", 0L },
00051 { GADGET_SYSBASE+3, "Group", 0L },
00052 GADGET_CHECK_DONE
00053 };
00054
00055
00059 u32 window_RefreshWindow(u32 firsttag, ...)
00060 {
00061 return(window_RefreshWindowTL((tag *)&firsttag));
00062 }
00063 u32 window_RefreshWindowTL(tag *taglist)
00064 {
00065 Window_t *win;
00066
00067 Rect_t dim;
00068 int w,h,b;
00069
00070 debug_Begin();
00071
00072 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00073
00074
00075 glw_GetWindowDimensions(TAG_GLW_WINDOW,win->handle,TAG_GLW_RECT,&dim,TAG_DONE);
00076 dim.left=0;
00077 dim.top=0;
00078 if(win->mask!=NULL) bitmap_Delete(TAG_BMP_OBJECT,win->mask,TAG_DONE);
00079 win->mask=(Bitmap_t *)bitmap_Create(TAG_BMP_WIDTH,dim.width,
00080 TAG_BMP_HEIGHT,dim.height,
00081 TAG_BMP_INITTYPE,BMP_ITY_FILL,
00082 TAG_BMP_VALUE,1,
00083 TAG_DONE);
00084 gadget_Layout(TAG_GADGET_OBJECT,win->gadgetroot,TAG_GADGET_RECT,&dim,TAG_DONE);
00085 if(!bitmap_IsSolid(TAG_BMP_OBJECT,win->mask,TAG_BMP_VALUE,1,TAG_DONE))
00086 {
00087 Vector_t vector;
00088 bitmap_ObtainVector(TAG_BMP_OBJECT,win->mask,TAG_BMP_VECTOR,&vector.data,TAG_BMP_WIDTH,&w,TAG_BMP_HEIGHT,&h,TAG_BMP_BYTEWIDTH,&b,TAG_DONE);
00089 vector.size=b*h;
00090 glw_SetWindowShape(TAG_GLW_WINDOW,win->handle,TAG_GLW_VECTOR,&vector,TAG_GLW_WIDTH,w,TAG_GLW_HEIGHT,h,TAG_GLW_BYTEWIDTH,b,TAG_DONE);
00091 bitmap_ReleaseVector(TAG_BMP_OBJECT,win->mask,TAG_DONE);
00092 }
00093 else
00094 {
00095 glw_SetWindowShape(TAG_GLW_WINDOW,win->handle,TAG_DONE);
00096 }
00097
00098 glw_RefreshWindow(TAG_GLW_WINDOW,win->handle,TAG_DONE);
00099
00100 debug_End();
00101
00102 return((u32)0);
00103 }
00104
00105
00109 u32 window_GetFocusedGadget(u32 firsttag, ...)
00110 {
00111 return(window_GetFocusedGadgetTL((tag *)&firsttag));
00112 }
00113 u32 window_GetFocusedGadgetTL(tag *taglist)
00114 {
00115 Window_t *win;
00116
00117 Gadget_t *ret=NULL;
00118
00119 debug_Begin();
00120
00121 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00122
00123 if(win!=NULL) ret=win->focused_gadget;
00124
00125 debug_End();
00126
00127 return((u32)ret);
00128 }
00129
00130
00137 u32 window_AddMask(u32 firsttag, ...)
00138 {
00139 return(window_AddMaskTL((tag *)&firsttag));
00140 }
00141 u32 window_AddMaskTL(tag *taglist)
00142 {
00143 Window_t *win;
00144 int x;
00145 int y;
00146 Bitmap_t *bitmap;
00147
00148 u32 ret=~0L;
00149
00150 debug_Begin();
00151
00152 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00153 x=(int)tag_GetTagData(taglist,TAG_WIN_X,0L);
00154 y=(int)tag_GetTagData(taglist,TAG_WIN_Y,0L);
00155 bitmap=(Bitmap_t *)tag_GetTagData(taglist,TAG_WIN_BITMAP,0L);
00156
00157 if(win!=NULL&&bitmap!=NULL&&x>=0&&y>=0)
00158 {
00159 ret=bitmap_Copy(TAG_BMP_OBJECT,win->mask,TAG_BMP_X,x,TAG_BMP_Y,y,TAG_BMP_SOURCE,bitmap,TAG_DONE);
00160 }
00161
00162 debug_End();
00163
00164 return(ret);
00165 }
00166
00167
00172 u32 window_SetFocusedGadget(u32 firsttag, ...)
00173 {
00174 return(window_SetFocusedGadgetTL((tag *)&firsttag));
00175 }
00176 u32 window_SetFocusedGadgetTL(tag *taglist)
00177 {
00178 Window_t *win;
00179 Gadget_t *gad;
00180
00181 Gadget_t *ret=NULL;
00182
00183 debug_Begin();
00184
00185 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00186 gad=(Gadget_t *)tag_GetTagData(taglist,TAG_WIN_GADGET,0L);
00187
00188 if(win!=NULL&&gad!=NULL)
00189 {
00190 ret=win->focused_gadget;
00191 if(ret!=NULL&&(ret->flags&GAD_ONSCREEN)!=0) gadget_SetState(TAG_GADGET_OBJECT,gad,TAG_GADGET_STATE,GADST_NORMAL,TAG_GADGET_VISUAL,1,TAG_DONE);
00192 gadget_SetState(TAG_GADGET_OBJECT,gad,TAG_GADGET_STATE,GADST_FOCUSED,TAG_GADGET_VISUAL,0,TAG_DONE);
00193 win->focused_gadget=gad;
00194 }
00195
00196 debug_End();
00197
00198 return((u32)ret);
00199 }
00200
00201
00206 u32 window_SetActive(u32 firsttag, ...)
00207 {
00208 return(window_SetActiveTL((tag *)&firsttag));
00209 }
00210 u32 window_SetActiveTL(tag *taglist)
00211 {
00212 Gadget_t *gad;
00213 Window_t *win;
00214
00215 Gadget_t *ret=NULL;
00216
00217 debug_Begin();
00218
00219 gad=(Gadget_t *)tag_GetTagData(taglist,TAG_WIN_GADGET,0L);
00220 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00221
00222 if(win!=NULL)
00223 {
00224 ret=win->active_gadget;
00225 win->active_gadget=gad;
00226 if(gad!=NULL) glw_StartMouseTracking(TAG_GLW_WINDOW,win->handle,TAG_DONE);
00227 else glw_StopMouseTracking(TAG_GLW_WINDOW,win->handle,TAG_DONE);
00228 }
00229
00230 debug_End();
00231
00232 return((u32)ret);
00233 }
00234
00235
00239 u32 window_GetUserdata(u32 firsttag, ...)
00240 {
00241 return(window_GetUserdataTL((tag *)&firsttag));
00242 }
00243 u32 window_GetUserdataTL(tag *taglist)
00244 {
00245 Window_t *win;
00246
00247 u32 ret=0L;
00248
00249 debug_Begin();
00250
00251 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00252
00253 if(win!=NULL) ret=win->userdata;
00254
00255 debug_End();
00256
00257 return(ret);
00258 }
00259
00260
00264 u32 window_GetActive(u32 firsttag, ...)
00265 {
00266 return(window_GetActiveTL((tag *)&firsttag));
00267 }
00268 u32 window_GetActiveTL(tag *taglist)
00269 {
00270 Window_t *win;
00271
00272 Gadget_t *ret=NULL;
00273
00274 debug_Begin();
00275
00276 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00277
00278 if(win!=NULL) ret=win->active_gadget;
00279
00280 debug_End();
00281
00282 return((u32)ret);
00283 }
00284
00285
00290 u32 window_ChangeSkin(u32 firsttag, ...)
00291 {
00292 return(window_ChangeSkinTL((tag *)&firsttag));
00293 }
00294 u32 window_ChangeSkinTL(tag *taglist)
00295 {
00296 Window_t *win;
00297 char *skinname;
00298
00299 u32 ret=~0L;
00300 Extent_t min,max;
00301 Rect_t rect;
00302 int ok=0;
00303 Gadget_t *sysgads, *clientgroup;
00304 char *gui_mainname,*gui_main;
00305
00306 debug_Begin();
00307
00308 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00309 skinname=(char *)tag_GetTagData(taglist,TAG_WIN_SKINNAME,0L);
00310
00311 if(win!=NULL&&skinname!=NULL)
00312 {
00313 glw_GetWindowDimensions(TAG_GLW_WINDOW,win->handle,TAG_GLW_RECT,&rect,TAG_DONE);
00314 debug_Message("old %dx%d",rect.width,rect.height);
00315 skin_DeleteSkin(win->app->skin);
00316 win->app->skin=skin_CreateSkin(win->app,skinname);
00317 if((win->flags&WIN_FLAGS_NOBORDER)==0)
00318 {
00319 gadget_Detach(TAG_GADGET_OBJECT,win->gadgetapp);
00320 gadget_DeleteSubtree(TAG_GADGET_OBJECT,win->gadgetroot);
00321 if(NULL!=(gui_mainname=skin_GetWindowDecorationName(win->app->skin)))
00322 {
00323 if(NULL!=(gui_main=(char *)net_LoadFile(TAG_NET_CONN,win->app->conn,TAG_NET_NAME,gui_mainname,TAG_DONE)))
00324 {
00325 if(NULL!=(sysgads=(Gadget_t *)gxml_CreateGadgetTree(
00326 TAG_GXML_XML_FILE,gui_main,
00327 TAG_GXML_LOCALE,win->app->locale,
00328 TAG_GXML_TYPE,"system",
00329 TAG_GXML_LAYOUTNAME,"gui_Window",
00330 TAG_GXML_APPNAME,NULL,
00331 TAG_GXML_WINDOW,win,
00332 TAG_GXML_CHECK,window_checklist,
00333 TAG_DONE)))
00334 {
00335 if(NULL!=(clientgroup=(Gadget_t *)gadget_Search(TAG_GADGET_ROOT,sysgads,TAG_GADGET_GADGET_ID,GADGET_SYSBASE+1,TAG_DONE)))
00336 {
00337 gadget_Attach(TAG_GADGET_NEW_PARENT,clientgroup,TAG_GADGET_NEW_CHILD,win->gadgetapp,TAG_DONE);
00338 win->gadgetroot=sysgads;
00339 }
00340 else debug_Warning("cannot find clientgroup");
00341 }
00342 else debug_Warning("cannot create windowdecoration gadget tree");
00343 mem_free(gui_main);
00344 }
00345 else debug_Warning("cannot load windowdecoration file");
00346 mem_free(gui_mainname);
00347 }
00348 else debug_Warning("cannot get windowdecoration name");
00349 }
00350 gadget_ChangeSkin(win->gadgetroot,win->app->skin);
00351 gadget_GetExtent(TAG_GADGET_OBJECT,win->gadgetroot,TAG_GADGET_MIN,&min,TAG_GADGET_MAX,&max,TAG_DONE);
00352
00353 if(min.width>rect.width) { rect.width=min.width; ok=1; }
00354 if(min.height>rect.height) { rect.height=min.height; ok=1; }
00355
00356 if(max.width<rect.width) { rect.width=max.width; ok=1; }
00357 if(max.height<rect.height) { rect.height=max.height; ok=1; }
00358 if(ok!=0)
00359 {
00360 glw_SetWindowDimensions(TAG_GLW_WINDOW,win->handle,TAG_GLW_RECT,&rect);
00361 debug_Message("new %dx%d",rect.width,rect.height);
00362 }
00363 glw_SetWindowLimits(TAG_GLW_WINDOW,win->handle,TAG_GLW_MINWIDTH,min.width,TAG_GLW_MINHEIGHT,min.height,TAG_GLW_MAXWIDTH,max.width,TAG_GLW_MAXHEIGHT,max.height,TAG_DONE);
00364 if((win->flags&WIN_FLAGS_NOBORDER)==0&&win->title!=NULL) gadget_MethodCall(TAG_GADGET_WINDOW,win,TAG_GADGET_GADGET_ID,GADGET_SYSBASE+2,TAG_GADGET_METHOD,MET_SYSDRAG_SET_TITLE,TAG_SSZ_TITLE,(u32)win->title,TAG_DONE);
00365 window_RefreshWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00366 ret=0L;
00367 }
00368
00369 debug_End();
00370
00371 return(ret);
00372 }
00373
00374
00397 u32 window_OpenWindow(u32 firsttag, ...)
00398 {
00399 return(window_OpenWindowTL((tag *)&firsttag));
00400 }
00401 u32 window_OpenWindowTL(tag *taglist)
00402 {
00403 gui_App_t *app;
00404 char *name;
00405 int (*event_handler)(gui_App_t *,Window_t *,u32,int,u32);
00406 u32 flags;
00407 u32 winflags;
00408 int wtop,wbottom,wleft,wright;
00409 Window_t *parent;
00410 u32 parentdata;
00411 u32 userdata;
00412
00413 Window_t *win=NULL;
00414 Node_t *node;
00415 Gadget_t *gads,*sysgads=NULL,*clientgroup=NULL;
00416 Extent_t min, max;
00417
00418 char *title, *gui_filename=NULL, *gui_file, *extension="_gui.xml", *gui_mainname, *gui_main=NULL;
00419 Rect_t rect;
00420
00421 debug_Begin();
00422
00423 app=(gui_App_t *)tag_GetTagData(taglist,TAG_WIN_APP,0L);
00424 name=(char *)tag_GetTagData(taglist,TAG_WIN_NAME,0L);
00425 event_handler=(int (*)(gui_App_t *,Window_t *,u32,int,u32))tag_GetTagData(taglist,TAG_WIN_EVENT_HANDLER,0L);
00426 flags=(u32)tag_GetTagData(taglist,TAG_WIN_FLAGS,0L);
00427 winflags=(u32)tag_GetTagData(taglist,TAG_WIN_WINFLAGS,0L);
00428 parent=(Window_t *)tag_GetTagData(taglist,TAG_WIN_PARENT,0L);
00429 parentdata=(u32)tag_GetTagData(taglist,TAG_WIN_PARENTDATA,0L);
00430 gui_file=(char *)tag_GetTagData(taglist,TAG_WIN_GUI_FILE,0L);
00431 userdata=(u32)tag_GetTagData(taglist,TAG_WIN_USERDATA,0L);
00432 rect.width=(int)tag_GetTagData(taglist,TAG_WIN_PXWIDTH,0L);
00433 if(rect.width!=0)
00434 {
00435 rect.height=(int)tag_GetTagData(taglist,TAG_WIN_PXHEIGHT,0L);
00436 rect.top=(int)tag_GetTagData(taglist,TAG_WIN_PXTOP,0L);
00437 rect.left=(int)tag_GetTagData(taglist,TAG_WIN_PXLEFT,0L);
00438 }
00439 else
00440 {
00441 Rect_t rct;
00442 glw_GetScreenDimensions(TAG_GLW_RECT,&rct,TAG_DONE);
00443 wleft=(int)tag_GetTagData(taglist,TAG_WIN_LEFT,0L);
00444 wright=(int)tag_GetTagData(taglist,TAG_WIN_RIGHT,0L);
00445 wtop=(int)tag_GetTagData(taglist,TAG_WIN_TOP,0L);
00446 wbottom=(int)tag_GetTagData(taglist,TAG_WIN_BOTTOM,0L);
00447 rect.left=(rct.width*wleft)/100;
00448 rect.width=(rct.width*(100-(wleft+wright)))/100;
00449 rect.top=(rct.height*wtop)/100;
00450 rect.height=(rct.height*(100-(wtop+wbottom)))/100;
00451 }
00452
00453 if(app!=NULL&&event_handler!=NULL&&name!=NULL)
00454 {
00455 gui_mainname=skin_GetWindowDecorationName(app->skin);
00456 if(gui_mainname!=NULL&&NULL!=(node=list_CreateNode()))
00457 {
00458 if(gui_file!=NULL||NULL!=(gui_filename=mem_malloc(strlen(app->name)+strlen(extension)+1)))
00459 {
00460 if(gui_filename!=NULL)
00461 {
00462 strcpy(gui_filename,app->name);
00463 strcat(gui_filename,extension);
00464 }
00465 if(gui_file!=NULL||NULL!=(gui_file=(char *)net_LoadFile(TAG_NET_CONN,app->conn,TAG_NET_NAME,gui_filename,TAG_DONE)))
00466 {
00467 if((winflags&WIN_FLAGS_NOBORDER)!=0||NULL!=(gui_main=(char *)net_LoadFile(TAG_NET_CONN,app->conn,TAG_NET_NAME,gui_mainname,TAG_DONE)))
00468 {
00469 if(NULL!=(win=mem_calloc(1,sizeof(Window_t)))&&NULL!=(win->timerlist=list_CreateList()))
00470 {
00471 if(NULL!=(win->name=common_strdup(name)))
00472 {
00473 win->userdata=userdata;
00474 win->parent=parent;
00475 win->parentdata=parentdata;
00476 win->flags=winflags;
00477 if(win->parent!=NULL)
00478 {
00479 window_WindowEvent(win->parent,0L,CBK_CHILD_WINDOW_OPENED,win->parentdata);
00480 if((win->flags&WIN_FLAGS_SLEEPPARENT)!=0) win->parent->sleep++;
00481 }
00482 win->over=NULL;
00483 win->sleep=0;
00484 win->app=app;
00485 win->focused_gadget=NULL;
00486 win->active_gadget=NULL;
00487 win->event_handler=event_handler;
00488 if(NULL!=(gads=(Gadget_t *)gxml_CreateGadgetTree(
00489 TAG_GXML_XML_FILE,gui_file,
00490 TAG_GXML_LOCALE,app->locale,
00491 TAG_GXML_TYPE,"window",
00492 TAG_GXML_LAYOUTNAME,win->name,
00493 TAG_GXML_APPNAME,app->name,
00494 TAG_GXML_WINDOW,win,
00495 TAG_GXML_CHECK,tag_GetTagData(taglist,TAG_WIN_CHECKLIST,(u32)NULL),
00496 TAG_DONE)))
00497 {
00498 title=(char *)tag_GetTagData(taglist,TAG_WIN_TITLE,(u32)0L);
00499 if(title!=NULL) win->title=common_strdup(title);
00500 else win->title=NULL;
00501 if((win->flags&WIN_FLAGS_NOBORDER)!=0||NULL!=(sysgads=(Gadget_t *)gxml_CreateGadgetTree(
00502 TAG_GXML_XML_FILE,gui_main,
00503 TAG_GXML_LOCALE,app->locale,
00504 TAG_GXML_TYPE,"system",
00505 TAG_GXML_LAYOUTNAME,"gui_Window",
00506 TAG_GXML_APPNAME,NULL,
00507 TAG_GXML_WINDOW,win,
00508 TAG_GXML_CHECK,window_checklist,
00509 TAG_DONE)))
00510 {
00511 list_SetNodeData(node,win);
00512 win->node=node;
00513 list_InsertNodeTail(app->windowlist,node);
00514 if((win->flags&WIN_FLAGS_NOBORDER)!=0||NULL!=(clientgroup=(Gadget_t *)gadget_Search(TAG_GADGET_ROOT,sysgads,TAG_GADGET_GADGET_ID,GADGET_SYSBASE+1,TAG_DONE)))
00515 {
00516 if((win->flags&WIN_FLAGS_NOBORDER)==0&&clientgroup!=NULL)
00517 {
00518 gadget_Attach(TAG_GADGET_NEW_PARENT,clientgroup,TAG_GADGET_NEW_CHILD,gads,TAG_DONE);
00519 win->gadgetroot=sysgads;
00520 }
00521 else win->gadgetroot=gads;
00522 win->gadgetapp=gads;
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537 gadget_GetExtent(TAG_GADGET_OBJECT,win->gadgetroot,TAG_GADGET_MIN,&min,TAG_GADGET_MAX,&max,TAG_DONE);
00538 debug_Message("size min : %3dx%d",min.width,min.height);
00539 debug_Message("size req : %3dx%d",rect.width,rect.height);
00540 if(max.width<rect.width) rect.width=max.width;
00541 if(max.height<rect.height) rect.height=max.height;
00542 if(min.width>rect.width) rect.width=min.width;
00543 if(min.height>rect.height) rect.height=min.height;
00544 if(0L!=(win->handle=glw_OpenWindow(TAG_GLW_CONN,app->conn,TAG_GLW_RECT,&rect,TAG_GLW_FLAGS,flags,TAG_GLW_USERDATA,(u32)win,TAG_DONE)))
00545 {
00546 if((win->flags&WIN_FLAGS_NOBORDER)==0&&title!=NULL) gadget_MethodCall(TAG_GADGET_WINDOW,win,TAG_GADGET_GADGET_ID,GADGET_SYSBASE+2,TAG_GADGET_METHOD,MET_SYSDRAG_SET_TITLE,TAG_SSZ_TITLE,(u32)title,TAG_DONE);
00547 glw_SetWindowLimits(TAG_GLW_WINDOW,win->handle,TAG_GLW_MINWIDTH,min.width,TAG_GLW_MINHEIGHT,min.height,TAG_GLW_MAXWIDTH,max.width,TAG_GLW_MAXHEIGHT,max.height,TAG_DONE);
00548 glw_SetWindowState(TAG_GLW_WINDOW,win->handle,TAG_GLW_STATE,GLWWS_OPENED,TAG_DONE);
00549 if((win->flags&WIN_FLAGS_NOBORDER)==0) glw_SetWindowTransparency(TAG_GLW_WINDOW,win->handle,TAG_GLW_PERCENT,0,TAG_DONE);
00550 window_RefreshWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00551 if((win->flags&WIN_FLAGS_NOBORDER)==0)
00552 {
00553 int i;
00554 for(i=0;i<97;i++)
00555 {
00556 glw_SetWindowTransparency(TAG_GLW_WINDOW,win->handle,TAG_GLW_PERCENT,i,TAG_DONE);
00557 glw_Sleep(TAG_GLW_MILLISEC,1,TAG_DONE);
00558 }
00559 }
00560 }
00561 }
00562 else
00563 {
00564 debug_Error("cannot find attach point");
00565 window_CloseWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00566 win=NULL;
00567 }
00568 }
00569 else
00570 {
00571 debug_Error("cannot create system gadget tree");
00572 window_CloseWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00573 win=NULL;
00574 }
00575 }
00576 else
00577 {
00578 debug_Error("cannot create user gadget tree");
00579 window_CloseWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00580 win=NULL;
00581 }
00582 }
00583 }
00584 if(gui_main!=NULL) mem_free(gui_main);
00585 }
00586 if(gui_filename!=NULL) mem_free(gui_file);
00587 }
00588 if(gui_filename!=NULL) mem_free(gui_filename);
00589 }
00590 mem_free(gui_mainname);
00591 }
00592 }
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611 debug_End();
00612
00613 return((u32)win);
00614 }
00615
00616
00620 u32 window_CloseWindow(u32 firsttag, ...)
00621 {
00622 return(window_CloseWindowTL((tag *)&firsttag));
00623 }
00624 u32 window_CloseWindowTL(tag *taglist)
00625 {
00626 Window_t *win;
00627
00628 Node_t *node;
00629 gui_Timer_t *timer;
00630 gui_App_t *app;
00631
00632
00633 debug_Begin();
00634
00635 win=(Window_t *)tag_GetTagData(taglist,TAG_WIN_OBJECT,0L);
00636
00637 if(win!=NULL)
00638 {
00639 app=win->app;
00640 for(node=list_GetNodeHead(win->timerlist);node!=NULL;node=list_GetNodeHead(win->timerlist))
00641 {
00642 timer=list_GetNodeData(node);
00643 if(timer!=NULL) gui_TimerDelete(timer);
00644 }
00645 list_DeleteList(win->timerlist);
00646 if(NULL!=(node=win->node))
00647 {
00648 list_RemoveNode(app->windowlist,node);
00649 list_SetNodeData(node,NULL);
00650 list_DeleteNode(node);
00651 if(win->parent!=NULL)
00652 {
00653 if((win->flags&WIN_FLAGS_SLEEPPARENT)!=0) win->parent->sleep--;
00654 window_WindowEvent(win->parent,0L,CBK_CHILD_WINDOW_CLOSED,win->parentdata);
00655 }
00656 }
00657 if(win->name!=NULL) mem_free(win->name);
00658 if(win->title!=NULL) mem_free(win->title);
00659 if(win->handle!=0L) glw_CloseWindow(TAG_GLW_WINDOW,win->handle,TAG_DONE);
00660 if(win->gadgetroot!=NULL) gadget_DeleteSubtree(TAG_GADGET_OBJECT,win->gadgetroot,TAG_DONE);
00661 if(win->mask!=NULL) bitmap_Delete(TAG_BMP_OBJECT,win->mask,TAG_DONE);
00662 mem_free(win);
00663 }
00664
00665 debug_End();
00666
00667 return(0L);
00668 }
00669
00670
00671 int window_DamageWindow(Window_t *win, Rect_t *rect)
00672 {
00673 debug_Begin();
00674
00675 gadget_Damage(TAG_GADGET_OBJECT,win->gadgetroot,TAG_GADGET_RECT,rect,TAG_DONE);
00676
00677 debug_End();
00678
00679 return(0);
00680 }
00681
00682
00683 void window_CloseAllWindows(gui_App_t *app)
00684 {
00685 Node_t *node;
00686 Window_t *win;
00687
00688 debug_Begin();
00689
00690 while(NULL!=(node=list_GetNodeHead(app->windowlist)))
00691 {
00692 win=(Window_t *)list_GetNodeData(node);
00693 window_CloseWindow(TAG_WIN_OBJECT,win,TAG_DONE);
00694 }
00695
00696 debug_End();
00697
00698 }
00699
00700
00701 int window_WindowEvent(Window_t *window, u32 gadget_id, int event, u32 event_data)
00702 {
00703
00704 return(window->event_handler(window->app,window,gadget_id,event,event_data));
00705 }
00706
00707
00708 Skin_t *window_GetSkin(Window_t *win)
00709 {
00710 return(win->app->skin);
00711 }
00712 gui_App_t *window_GetApp(Window_t *win)
00713 {
00714 return(win->app);
00715 }
00716 Bitmap_t *window_GetMask(Window_t *win)
00717 {
00718 return(win->mask);
00719 }
00720 u32 window_GetConnection(Window_t *win)
00721 {
00722 return(win->app->conn);
00723 }
00724 int window_IsSleep(Window_t *win)
00725 {
00726 return(!(win->sleep==0));
00727 }
00728 Gadget_t *window_GetRootGadget(Window_t *win)
00729 {
00730 return(win->gadgetroot);
00731 }
00732 List_t *window_GetTimerList(Window_t *win)
00733 {
00734 return(win->timerlist);
00735 }
00736
00737
00738 u32 window_Call(int function, u32 firsttag, ...)
00739 {
00740 return(window_CallTL(function,(tag *)&firsttag));
00741 }
00742 u32 window_CallTL(int function, tag *taglist)
00743 {
00744 u32 ret=~0L;
00745
00746 debug_Begin();
00747
00748 debug_Message("function ID : %d",function-WINDOW_FUNCBASE);
00749
00750 if(function>=WINDOW_FUNCBASE&&function<WINDOW_FUNC_DONE)
00751 {
00752 ret=call_vector[function-WINDOW_FUNCBASE](taglist);
00753 }
00754 else debug_Warning("%s(): Function code out of range! code=0x%04x",__FUNCTION__,function);
00755
00756 debug_End();
00757
00758 return(ret);
00759 }
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773 int window_Init(void)
00774 {
00775 int ret=-1;
00776
00777 debug_Begin();
00778
00779
00780 call_vector[WINDOW_REFRESHWINDOW-WINDOW_FUNCBASE]=window_RefreshWindowTL;
00781 call_vector[WINDOW_GETFOCUSEDGADGET-WINDOW_FUNCBASE]=window_GetFocusedGadgetTL;
00782 call_vector[WINDOW_SETFOCUSEDGADGET-WINDOW_FUNCBASE]=window_SetFocusedGadgetTL;
00783 call_vector[WINDOW_CLOSEWINDOW-WINDOW_FUNCBASE]=window_CloseWindowTL;
00784 call_vector[WINDOW_OPENWINDOW-WINDOW_FUNCBASE]=window_OpenWindowTL;
00785 call_vector[WINDOW_SETACTIVE-WINDOW_FUNCBASE]=window_SetActiveTL;
00786 call_vector[WINDOW_GETACTIVE-WINDOW_FUNCBASE]=window_GetActiveTL;
00787 call_vector[WINDOW_GETUSERDATA-WINDOW_FUNCBASE]=window_GetUserdataTL;
00788 call_vector[WINDOW_CHANGESKIN-WINDOW_FUNCBASE]=window_ChangeSkinTL;
00789 call_vector[WINDOW_ADDMASK-WINDOW_FUNCBASE]=window_AddMaskTL;
00790
00791 bases_modules.window_Call=window_Call;
00792 bases_modules.window_CallTL=window_CallTL;
00793
00794 ret=0;
00795
00796 debug_End();
00797
00798 return(ret);
00799 }
00800
00801
00802 void window_CleanUp(void)
00803 {
00804 debug_Begin();
00805 debug_End();
00806
00807 return;
00808 }