Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

Window.c

Go to the documentation of this file.
00001 /*
00002  *    gui - [gega user interface] the flexible solution for user interface problems
00003  *    Copyright (C) 2002  Gergely Gati
00004  *
00005  *    This program is free software; you can redistribute it and/or modify
00006  *    it under the terms of the GNU General Public License as published by
00007  *    the Free Software Foundation; version 2 of the License.
00008  *
00009  *    This program is distributed in the hope that it will be useful,
00010  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *    GNU General Public License for more details.
00013  *
00014  *    You should have received a copy of the GNU General Public License
00015  *    along with this program; if not, write to the Free Software
00016  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  *
00018  *    Gergely Gati
00019  *      email:           g.gati@freemail.hu
00020  *      AIM screenname:  GatiGergely
00021  *      ICQ number:      93131690
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 //Declare call_vector[]
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 //  glw_ClearWindow(TAG_GLW_WINDOW,win->handle,TAG_DONE);
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   //bitmap_Print(win->mask,"after window");
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     //ha min>win->size: glw_SetWindowDimension(min);
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     //ha max<win->size: glw_SetWindowDimension(max);
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 //  u32 id;
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     /* uncomment: application dependent system font
00524                         if(NULL!=gadget_search(win->gadgetroot,GADGET_SYSBASE+3)) id=GADGET_SYSBASE+3;
00525                         else id=GADGET_SYSBASE+1;
00526                         gadget_MethodCall
00527                         (
00528                           win,id,MET_GAD_SET_FONT,
00529                           TAG_GAD_FONTNAME,tag_GetTagData(taglist,TAG_WIN_FONTNAME,(u32)GADGET_DEFAULT_FONTNAME),
00530                           TAG_GAD_FONTSIZE,tag_GetTagData(taglist,TAG_WIN_FONTSIZE,GADGET_DEFAULT_FONTSIZE),
00531                           TAG_GAD_FONTSTYLE,tag_GetTagData(taglist,TAG_WIN_FONTSTYLE,GADGET_DEFAULT_FONTSTYLE),
00532                           TAG_GAD_FONTWEIGHT,tag_GetTagData(taglist,TAG_WIN_FONTWEIGHT,GADGET_DEFAULT_FONTWEIGHT),
00533                           TAG_GAD_FONTDECORATION,tag_GetTagData(taglist,TAG_WIN_FONTDECORATION,GADGET_DEFAULT_FONTDECORATION),
00534                           TAG_DONE
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   if(win!=NULL)
00595   {
00596     Gadget_t *myicon;
00597     u8 *mem=NULL;
00598     int size=0,i;
00599     if(NULL!=(myicon=(Gadget_t *)gadget_search(TAG_GADGET_ROOT,win->gadgetroot,TAG_GADGET_GADGET_ID,10,TAG_DONE)))
00600     {
00601       gadget_Save(TAG_GADGET_OBJECT,myicon,TAG_GADGET_MEM,&mem,TAG_GADGET_SIZE,&size,TAG_DONE);
00602       printf("ICON SAVED: (size=%d)\n  ",size);
00603       for(i=0;i<size;i++)
00604       {
00605         printf("%02x (%c)  ",mem[i],(mem[i]>=32&&mem[i]<127?mem[i]:'.'));
00606       }
00607       printf("\n\n");
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   // send event to the client
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 u32 window_GetHandle(Window_t *win)
00764 {
00765   return(win->handle);
00766 }
00767 Skin_t *window_GetSkin(Window_t *win)
00768 {
00769   return(win->app->skin);
00770 }
00771 */
00772 
00773 int window_Init(void)
00774 {
00775   int ret=-1;
00776 
00777   debug_Begin();
00778 
00779 //Initialize call vector BEGIN - put this into the init function of this module
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 //Initialize call vector END
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 }

Generated on Tue Jan 7 12:11:24 2003 for THEGUI by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002