home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / evbl0627.zip / everblue_20010627.zip / x11 / Xlib_CreateWindow.c < prev    next >
C/C++ Source or Header  |  2001-05-21  |  8KB  |  202 lines

  1.  
  2. #include "Xlib_private.h"
  3.  
  4. Colormap Xlib_CreateDefaultColormap(Display *dpy);
  5.  
  6. Window XCreateWindow(
  7.     Display*            display,
  8.     Window              parent,
  9.     int                 x,
  10.     int                 y,
  11.     unsigned int        width,
  12.     unsigned int        height,
  13.     unsigned int        border_width,
  14.     int                 depth,
  15.     unsigned int        class,
  16.     Visual*             visual,
  17.     unsigned long       valuemask,
  18.     XSetWindowAttributes*       attributes
  19. )
  20. {
  21.         DBUG_ENTER("XCreateWindow")
  22.         XID newwind;
  23.         XWindowAttributes *parentattrib = GetWinAttrib(parent, NULL);
  24.         WinAttribData *winattribdata = calloc(1,sizeof(WinAttribData));
  25.         Xlib_CreateWindow CreateParams = { (HWND)parent, 0, "Xlib/PM",
  26.         x, y, width, height, winattribdata,
  27.         FCF_MINMAX | FCF_SYSMENU | FCF_TITLEBAR | FCF_TASKLIST
  28.         };
  29.  
  30.         if (!display) DBUG_RETURN(False);
  31.         winattribdata->cb = sizeof(WinAttribData);
  32.         winattribdata->winattrib.x = x;
  33.         winattribdata->winattrib.y = y;
  34.         winattribdata->winattrib.width = width;
  35.         winattribdata->winattrib.height = height;
  36.         CreateParams.x = CreateParams.y =
  37.         winattribdata->winattrib.border_width = WinQuerySysValue(hwndDesktop, SV_CXSIZEBORDER);
  38.         winattribdata->winattrib.screen = DefaultScreenOfDisplay(display);
  39.         winattribdata->winattrib.win_gravity = NorthWestGravity;
  40.         winattribdata->winattrib.backing_store = NotUseful;
  41.         winattribdata->background_pixmap = None;
  42.         winattribdata->background_pixel = 0xffffff;
  43.  
  44.         if (attributes && valuemask)
  45.         {
  46.             if ((valuemask & CWColormap) != 0)
  47.                 winattribdata->winattrib.colormap = attributes->colormap;
  48.             else
  49.                 winattribdata->winattrib.colormap = Xlib_CreateDefaultColormap(display);
  50.  
  51.             if ((valuemask & CWOverrideRedirect) != 0)
  52.                 winattribdata->winattrib.override_redirect = attributes->override_redirect;
  53.             if ((valuemask & CWSaveUnder) != 0)
  54.                 winattribdata->winattrib.save_under = attributes->save_under;
  55.             if ((valuemask & CWEventMask) != 0)
  56.                 winattribdata->winattrib.your_event_mask = attributes->event_mask;
  57.             if ((valuemask & CWDontPropagate) != 0)
  58.                 winattribdata->winattrib.do_not_propagate_mask = attributes->do_not_propagate_mask;
  59.             if ((valuemask & CWBackPixel) != 0 )
  60.                 winattribdata->background_pixel = attributes->background_pixel;
  61.             if ((valuemask & CWBackPixmap) != 0 )
  62.             {
  63.                 winattribdata->background_pixmap = attributes->background_pixmap;
  64.                 Xlib_MonitorResource((XID *)&winattribdata->background_pixmap);
  65.             }
  66.             if ((valuemask & CWWinGravity) != 0 )
  67.                 winattribdata->winattrib.win_gravity = attributes->win_gravity;
  68.             if ((valuemask & CWCursor) != 0)
  69.                 winattribdata->cursor = attributes->cursor;
  70.         }
  71.  
  72.         if (parentattrib)
  73.         {
  74.             if (parentattrib->your_event_mask & SubstructureNotifyMask)
  75.                 winattribdata->winattrib.your_event_mask |= StructureNotifyMask;
  76.         }
  77.  
  78.         if (winattribdata->winattrib.save_under) CreateParams.flStyle |= WS_SAVEBITS;
  79.         if (!border_width || winattribdata->background_pixmap == ParentRelative)
  80.             winattribdata->winattrib.border_width = 0;
  81.         else
  82.             CreateParams.frameStyle |= FCF_SIZEBORDER;
  83.  
  84.         (ULONG) newwind =
  85.             WinSendMsg(mainhwnd, UM_CreateWindow, (MPARAM)&CreateParams,
  86.                 (MPARAM)(parent==hwndDesktop?1:0));
  87.  
  88.         if (newwind)
  89.         {
  90.                 SIZEL sizl = {0,0};
  91.                 winattribdata->hps = GpiCreatePS(mainhab, winattribdata->hdc, &sizl,
  92.                                                  PU_PELS | GPIT_MICRO | GPIA_ASSOC );
  93.                 GpiCreateLogColorTable(winattribdata->hps, 0, LCOLF_RGB, 0, 0, NULL );
  94.                 XMoveResizeWindow(display, newwind, x, y, width, height);
  95.                 if (parent == hwndDesktop && (valuemask & CWBorderPixel) != 0 ) {
  96.                     RGB2 rgb2 = { attributes->border_pixel & 0xff,
  97.                     (attributes->border_pixel >> 8) & 0xff,
  98.                     (attributes->border_pixel >> 16) & 0xff, 0 };
  99.                     WinSetPresParam(WinQueryWindow(newwind, QW_PARENT),
  100.                                     PP_BORDERCOLOR,sizeof(rgb2),&rgb2);
  101.                 }
  102.         }
  103.  
  104.         /*if (winattribdata->background_pixmap == ParentRelative)
  105.                 printf("ParentRelative window %x (parent %x)\n", newwind, parent);
  106.  
  107.         printf("Window created (parent %x), handle %x\n", parent, newwind);*/
  108.         DBUG_RETURN(newwind);
  109. }
  110.  
  111. Window XCreateSimpleWindow(
  112.     Display*            display,
  113.     Window              parent,
  114.     int                 x,
  115.     int                 y,
  116.     unsigned int        width,
  117.     unsigned int        height,
  118.     unsigned int        border_width,
  119.     unsigned long       border,
  120.     unsigned long       background
  121. )
  122. {
  123.    DBUG_ENTER("XCreateSimpleWindow")
  124.         XID newwind;
  125.         XWindowAttributes *parentattrib = GetWinAttrib(parent, NULL);
  126.         WinAttribData *winattribdata = calloc(1,sizeof(WinAttribData));
  127.         Xlib_CreateWindow CreateParams = { (HWND)parent, 0, "Xlib/PM",
  128.                 x, y, width, height, winattribdata,
  129.                 FCF_MINMAX | FCF_SYSMENU | FCF_TITLEBAR | FCF_TASKLIST
  130.         };
  131.  
  132.         if (!display) DBUG_RETURN(False);
  133.         winattribdata->cb = sizeof(WinAttribData);
  134.         winattribdata->winattrib.x = x;
  135.         winattribdata->winattrib.y = y;
  136.         winattribdata->winattrib.width = width;
  137.         winattribdata->winattrib.height = height;
  138.         CreateParams.x = CreateParams.y =
  139.         winattribdata->winattrib.border_width = WinQuerySysValue(hwndDesktop, SV_CXSIZEBORDER);
  140.         winattribdata->winattrib.screen = DefaultScreenOfDisplay(display);
  141.         winattribdata->winattrib.win_gravity = NorthWestGravity;
  142.         winattribdata->winattrib.backing_store = NotUseful;
  143.         winattribdata->background_pixmap = None;
  144.         winattribdata->background_pixel = background;
  145.  
  146.         if (parentattrib) {
  147.                 if (parentattrib->your_event_mask & SubstructureNotifyMask)
  148.                         winattribdata->winattrib.your_event_mask |= StructureNotifyMask;
  149.         }
  150.  
  151.         if (!border_width || winattribdata->background_pixmap == ParentRelative)
  152.                 winattribdata->winattrib.border_width = 0;
  153.         else
  154.                 CreateParams.frameStyle |= FCF_SIZEBORDER;
  155.  
  156.         (ULONG) newwind =
  157.         WinSendMsg(mainhwnd, UM_CreateWindow, (MPARAM)&CreateParams,
  158.                 (MPARAM)(parent==hwndDesktop?1:0));
  159.  
  160.         if (newwind) {
  161.                 SIZEL sizl = {0,0};
  162.                 RGB2 rgb2 = { border & 0xff,
  163.                               (border >> 8) & 0xff,
  164.                               (border >> 16) & 0xff, 0 };
  165.                 winattribdata->hps = GpiCreatePS(mainhab, winattribdata->hdc, &sizl,
  166.                                 PU_PELS | GPIT_MICRO | GPIA_ASSOC );
  167.                 GpiCreateLogColorTable(winattribdata->hps, 0, LCOLF_RGB, 0, 0, NULL );
  168.                 XMoveResizeWindow(display, newwind, x, y, width, height);
  169.                 WinSetPresParam(WinQueryWindow(newwind, QW_PARENT),
  170.                         PP_BORDERCOLOR,sizeof(rgb2),&rgb2);
  171.         }
  172.  
  173.         /*if (winattribdata->background_pixmap == ParentRelative)
  174.                 printf("ParentRelative window %x (parent %x)\n", newwind, parent);
  175.  
  176.         printf("Window created (parent %x), handle %x\n", parent, newwind);*/
  177.         DBUG_RETURN(newwind);
  178. }
  179.  
  180. void _XPurgeGC(Display* display, GC gc);
  181.  
  182. int XDestroyWindow(Display *display, Window window)
  183. {
  184.         DBUG_ENTER("XDestroyWindow")
  185.         WinAttribData *winattrib = WinQueryWindowPtr(window,QWP_WINATTRIB);
  186.         HWND winframe = WinQueryWindowULong(window, QWP_FRAMEHWND);
  187.         if (winattrib && winframe) {
  188.                 Xlib_GC *xgc = (Xlib_GC *)winattrib->currentGC;
  189.                 _XPurgeGC(display, winattrib->currentGC);
  190.                 if (xgc->winattrib == winattrib) {
  191.                         xgc->winattrib = NULL;
  192.                         (HPS)xgc->gid = WinGetScreenPS(hwndDesktop);
  193.                 }
  194.                 winattrib->currentGC = (GC)0L;
  195.                 Xlib_FreeAllAtoms((Xlib_Pixmap *)winattrib);
  196.                 Xlib_UnmonitorResource((XID *)&winattrib->background_pixmap);
  197.                 WinSendMsg(mainhwnd, UM_DestroyWindow, (MPARAM)winframe, 0);
  198.         }
  199.         DBUG_RETURN(True);
  200. }
  201.  
  202.