unixsite.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:77k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: unixsite.cpp,v 1.4.4.8 2004/07/22 23:25:26 nhart Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  *                 Phil Dibowitz
  48.  * 
  49.  * ***** END LICENSE BLOCK ***** */
  50. #ifndef _UNIX
  51. #error This is the UNIX platform specific implementation.
  52. #endif
  53. //
  54. // System includes...
  55. //
  56. #include <stdio.h>
  57. #include "hlxclib/string.h"
  58. #include <X11/Intrinsic.h>
  59. #include <X11/Shell.h>
  60. #include <X11/Xlib.h>
  61. #include <X11/Xutil.h>
  62. #include <X11/keysym.h>
  63. #include <X11/Xos.h>
  64. #include <X11/cursorfont.h>
  65. #include <X11/extensions/XShm.h>
  66. //
  67. // RMA includes...
  68. //
  69. #include "hxcom.h"
  70. #include "hxcore.h"
  71. #include "hxevent.h"
  72. #include "hxwintyp.h"
  73. #include "hxwin.h"
  74. #include "hxsite2.h"
  75. #include "hxtypes.h"
  76. #include "unixsite.h"
  77. #include "unixcmap.h"
  78. #include "visuals.h"
  79. #include "region.h"
  80. #include "basesurf.h"
  81. #include "unixroot.h"
  82. #include "hxthread.h"
  83. #include "hxtick.h"
  84. #include "sitetext.h"
  85. #include "unixsurf.h"
  86. #include "hxprefs.h"
  87. //
  88. // Global & Static global/member data....
  89. //
  90. Display *CHXUnixSite::zm_display = NULL;
  91. static CHXMapPtrToPtr z_mapSiteToWindow;
  92. //
  93. // Scroll bar support
  94. //
  95. #define SCROLL_BAR_WIDTH 13        //Width of scroll bar.
  96. //#define _ARROWS_SIDE_BY_SIDE 1   //Regular or side by side arrows?
  97. //
  98. // CHXUnixSite only Methods...
  99. //
  100. CHXUnixSite::CHXUnixSite( IUnknown* pContext, IUnknown* pUnkOuter, INT32 lInitialZorder)
  101.    : CHXBaseSite( pContext, pUnkOuter, lInitialZorder )
  102.    , m_pUnixEventHandler(NULL)
  103.    , m_ScrollHorizButtonL(0)
  104.    , m_ScrollHorizButtonR(0)
  105.    , m_ScrollVertButtonT(0)
  106.    , m_ScrollVertButtonB(0)
  107.    , m_winFullScreenWindow(0)
  108.    , m_winOldParent(0)
  109.    , m_bScrollingInProgress(FALSE)
  110.    , m_nScrollDir(0)
  111.    , m_bLastPointInSite(FALSE)
  112.    , m_bDamaged(FALSE)
  113.    , m_bIgnoreFocusOutInFS(FALSE)
  114. {
  115.    m_ptScrollVertPosT.x   = m_ptScrollVertPosT.y   = 0;
  116.    m_ptScrollVertPosB.x   = m_ptScrollVertPosB.y   = 0;
  117.    m_ptScrollHorizPosR.x  = m_ptScrollHorizPosR.y  = 0;
  118.    m_ptScrollHorizPosL.x  = m_ptScrollHorizPosL.y  = 0;
  119.    m_ptFullScreenOffset.x = m_ptFullScreenOffset.y = 0;
  120.    memset( &m_PreFullScreenSize, 0, sizeof( m_PreFullScreenSize ) );
  121.    
  122.    HX_ASSERT( m_pContext );
  123.    IHXPreferences* pPreferences = NULL;   
  124.    if( m_pContext && HXR_OK == m_pContext->QueryInterface( IID_IHXPreferences, (void **) &pPreferences))
  125.    { 
  126.        IHXBuffer *pBuffer = NULL;
  127.        pPreferences->ReadPref("IgnoreFocusOutInFS", pBuffer);
  128.        if(pBuffer)
  129.        {
  130.            m_bIgnoreFocusOutInFS = (::atoi((const char*)pBuffer->GetBuffer()) == 1);
  131.            HX_RELEASE(pBuffer);
  132.        }
  133.    }
  134. }
  135. CHXUnixSite::~CHXUnixSite()
  136. {   
  137.    void* pDummy; 
  138.    if (z_mapSiteToWindow.Lookup((void*)this, pDummy))
  139.    {
  140.       z_mapSiteToWindow.RemoveKey((void*)this);
  141.    }
  142.    if( m_pUnixEventHandler )
  143.    {
  144.       m_pUnixEventHandler->CancelCallback();
  145.       HX_RELEASE(m_pUnixEventHandler);
  146.    }
  147. }
  148. HX_RESULT CHXUnixSite::_OpenXDisplay(char* pszDisplayString)
  149. {
  150.    HX_RESULT retVal = HXR_OK;
  151.     
  152.    //Is the connection open already?
  153.    if( NULL==zm_display )
  154.    {
  155.       zm_display = XOpenDisplay(pszDisplayString);
  156.       
  157.       //If you can't open the display your done.
  158.       if(NULL == zm_display )
  159.       {
  160.          HX_ASSERT("Can't open X Display..."==NULL);
  161.          retVal = HXR_FAIL;
  162.       }
  163.       else
  164.       {
  165.          HX_ASSERT(m_pScheduler);
  166.          if( m_pScheduler )
  167.          {
  168.             //UnixEventHandler scheduls itself for init callback
  169.             //in the ctor.
  170.             m_pUnixEventHandler = new UnixEventHandler(this);
  171.             m_pUnixEventHandler->AddRef();
  172.          }
  173.       }
  174.    }
  175.    return retVal;
  176. }
  177. Window CHXUnixSite::CreateXWindow( Window win )
  178. {
  179.    Window     parentWindow;
  180.    HXxWindow* pWindow = NULL;
  181.    //If parentWin is NULL then we belong to the root window.    
  182.    if( win )
  183.    {
  184.       parentWindow = win;
  185.    }
  186.    else
  187.    {
  188.       HX_ASSERT(zm_display);
  189.       XLockDisplay(zm_display);
  190.       parentWindow = RootWindow(zm_display, DefaultScreen(zm_display));
  191.       XUnlockDisplay(zm_display);      
  192.    }
  193.     
  194.    //Find the best visual to use on this display.
  195.    Visual* visual = GetBestVisual(zm_display);
  196.    //Get the visual info.
  197.    int         nNotUsed=0;
  198.    XVisualInfo stVisInfo;
  199.     
  200.    memset(&stVisInfo, 0, sizeof(XVisualInfo));
  201.    stVisInfo.visualid = XVisualIDFromVisual(visual);
  202.    XLockDisplay(zm_display);
  203.    XVisualInfo* pVisual = XGetVisualInfo( zm_display,
  204.                                           VisualIDMask,
  205.                                           &stVisInfo,
  206.                                           &nNotUsed );
  207.    XUnlockDisplay(zm_display);
  208.    // Set up attributes of the window.
  209.    int                  attrMask = CWBackPixel | CWBorderPixel;
  210.    XSetWindowAttributes attr;
  211.     
  212.    memset(&attr, 0, sizeof(XSetWindowAttributes));
  213.    XLockDisplay(zm_display);
  214.    attr.background_pixel = BlackPixel(zm_display, DefaultScreen(zm_display));
  215.    attr.border_pixel     = BlackPixel(zm_display, DefaultScreen(zm_display));
  216.    XUnlockDisplay(zm_display);
  217.    
  218.    //See if the default visaul of hte screen is the same one we Want
  219.    //to use. If not, create a new one and install it.
  220.    Colormap cmap;
  221.    XLockDisplay(zm_display);
  222.    Visual*  defVisual = DefaultVisual(zm_display, DefaultScreen(zm_display));
  223.    XUnlockDisplay(zm_display);
  224.    if( defVisual->visualid != stVisInfo.visualid )
  225.    {
  226.       //XXXgfw Are we leaking this colormap????
  227.       XLockDisplay(zm_display);
  228.       cmap = XCreateColormap(zm_display, parentWindow, visual, AllocNone);
  229.       XUnlockDisplay(zm_display);
  230.       attr.colormap = cmap;
  231.       attrMask |= CWColormap;
  232.    }
  233.    // Set the size/position of the window before creating.
  234.    XSizeHints size_hints;
  235.    size_hints.flags  = PPosition | PSize;
  236.    size_hints.x      = m_position.x;
  237.    size_hints.y      = m_position.y;
  238.    size_hints.width  = 1;
  239.    size_hints.height = 1;
  240.    //Create it.
  241.    XLockDisplay(zm_display);
  242.    Window window = XCreateWindow(zm_display, 
  243.                                  parentWindow,
  244.                                  size_hints.x,
  245.                                  size_hints.y,
  246.                                  size_hints.width,
  247.                                  size_hints.height, 
  248.                                  0,
  249.                                  pVisual->depth,
  250.                                  InputOutput,
  251.                                  visual,
  252.                                  attrMask,
  253.                                  &attr);
  254.    XUnlockDisplay(zm_display);
  255.    XFree(pVisual);
  256.    //Tell the WM about this window.
  257. #if 0
  258.    XSetStandardProperties( zm_display,
  259.                            window,
  260.                            "CHXUnixSite",
  261.                            "CHXUnixSite",
  262.                            None,
  263.                            NULL, 0,
  264.                            &size_hints
  265.                            );
  266. #endif
  267.    //Select all input events on the window since the other platforms
  268.    //we work with have no concept of event masks
  269.    XLockDisplay(zm_display);   
  270.    int result = XSelectInput( zm_display, window,
  271.                               ButtonPressMask   | ButtonReleaseMask | KeyPressMask    |
  272.                               KeyReleaseMask    | EnterWindowMask   | LeaveWindowMask |
  273.                               PointerMotionMask | ButtonMotionMask  | KeymapStateMask |
  274.                               ExposureMask      | StructureNotifyMask | FocusChangeMask
  275.                               );
  276.    XUnlockDisplay(zm_display);
  277.    if( BadWindow == result )
  278.    {
  279. #ifdef _DEBUG
  280.       fprintf( stderr, "Can select events.n" );
  281. #endif      
  282.    }
  283.    
  284.    //Map the window.
  285.    XLockDisplay(zm_display);
  286.    XMapWindow(zm_display, window);
  287.    //Flush event queue.
  288.    XFlush(zm_display);
  289.    XUnlockDisplay(zm_display);
  290.    return window;
  291. }
  292. void CHXUnixSite::_MapHorzScroll()
  293. {
  294.    if( GetWindow() && GetWindow()->display && m_ScrollHorizButtonL)
  295.    {
  296.       Display* pDis = (Display*)GetWindow()->display;
  297.       XLockDisplay(pDis);
  298.       XMapWindow( pDis, m_ScrollHorizButtonL );
  299.       XMapWindow( pDis, m_ScrollHorizButtonR ); 
  300.       XUnlockDisplay(pDis);
  301.    }
  302.    _DrawArrows();
  303. }
  304. void CHXUnixSite::_MapVertScroll()
  305. {
  306.    if( GetWindow() && GetWindow()->display && m_ScrollVertButtonT)
  307.    {
  308.       Display* pDis = (Display*)GetWindow()->display;
  309.       XLockDisplay(pDis);
  310.       XMapWindow( pDis, m_ScrollVertButtonT );
  311.       XMapWindow( pDis, m_ScrollVertButtonB );
  312.       XUnlockDisplay(pDis);
  313.    }
  314.    _DrawArrows();
  315. }
  316. void CHXUnixSite::_MapScrollButtons()
  317. {
  318.    _MapHorzScroll();
  319.    _MapVertScroll();
  320. }
  321. void CHXUnixSite::_UnmapHorzScroll()
  322. {
  323.    HX_ASSERT( GetWindow() );
  324.    if( m_ScrollHorizButtonL && GetWindow()->display )
  325.    {
  326.       Display* pDis = (Display*)GetWindow()->display;
  327.       XLockDisplay(pDis);
  328.       XUnmapWindow( pDis, m_ScrollHorizButtonL );
  329.       XUnmapWindow( pDis, m_ScrollHorizButtonR );
  330.       XUnlockDisplay(pDis);
  331.    }
  332. }
  333. void CHXUnixSite::_UnmapVertScroll()
  334. {
  335.    HX_ASSERT( GetWindow() );
  336.    if( m_ScrollVertButtonT && GetWindow()->display )
  337.    {
  338.       Display* pDis = (Display*)GetWindow()->display;
  339.       XLockDisplay(pDis);
  340.       XUnmapWindow( pDis, m_ScrollVertButtonT );
  341.       XUnmapWindow( pDis, m_ScrollVertButtonB ); 
  342.       XUnlockDisplay(pDis);
  343.    }
  344. }
  345. void CHXUnixSite::_UnmapScrollButtons()
  346. {
  347.    if( GetWindow() )
  348.    {
  349.       _UnmapVertScroll();
  350.       _UnmapHorzScroll();
  351.    }
  352. }
  353. void CHXUnixSite::_DestroyScrollButtons()
  354. {
  355.     if (GetWindow())
  356.     {
  357. Display* pDis = (Display*)GetWindow()->display;
  358. if( m_ScrollHorizButtonL && pDis )
  359. {
  360.     XLockDisplay(pDis);
  361.     XDestroyWindow( pDis, m_ScrollHorizButtonL );
  362.     m_ScrollHorizButtonL = 0;
  363.     XDestroyWindow( pDis, m_ScrollHorizButtonR );
  364.     XUnlockDisplay(pDis);
  365.     m_ScrollHorizButtonR = 0;
  366. }
  367. if( m_ScrollVertButtonT && pDis)
  368. {
  369.     XLockDisplay(pDis);
  370.     XDestroyWindow( pDis, m_ScrollVertButtonT );
  371.     m_ScrollVertButtonT = 0;
  372.     XDestroyWindow( pDis, m_ScrollVertButtonB );
  373.     XUnlockDisplay(pDis);
  374.     m_ScrollVertButtonB = 0;
  375. }
  376. m_ptScrollVertPosT.x = m_ptScrollVertPosT.y = 0;
  377. m_ptScrollVertPosB.x = m_ptScrollVertPosB.y = 0;
  378. m_ptScrollHorizPosR.x = m_ptScrollHorizPosR.y = 0;
  379. m_ptScrollHorizPosL.x = m_ptScrollHorizPosL.y = 0;
  380.     }
  381. }
  382. void CHXUnixSite::_DrawArrows()
  383. {
  384.    //only do the work if our site is visible.
  385.    if( !IsSiteVisible() )
  386.       return;
  387.     
  388.     //Draw an arrow on this window.
  389.    XPoint points[4];
  390.    int offset = SCROLL_BAR_WIDTH/10;
  391.    GC tmpGC;
  392.    XGCValues values;
  393.    Display* dis = (Display*)GetWindow()->display;
  394.    if( m_ScrollVertButtonB )
  395.    {
  396.       XLockDisplay(dis);
  397.       tmpGC = XCreateGC( dis, m_ScrollVertButtonB, 0, &values );
  398.       XUnlockDisplay(dis);
  399.    }
  400.    else if( m_ScrollHorizButtonL )
  401.    {
  402.       XLockDisplay(dis);
  403.       tmpGC = XCreateGC( dis, m_ScrollHorizButtonL, 0, &values );
  404.       XUnlockDisplay(dis);
  405.    }
  406.    else
  407.    {
  408.       //We don't have any scroll bars to draw....
  409.       return;
  410.    }
  411.    
  412.    XLockDisplay(dis);
  413.    XSetForeground( dis, tmpGC, WhitePixel(dis, 0 ));
  414.    XSetBackground( dis, tmpGC, BlackPixel(dis, 0 ));
  415.    XUnlockDisplay(dis);
  416.    Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
  417.                                    (Window)GetWindow()->window);
  418.    XColor color;
  419.     
  420.    memset(&color, 0, sizeof(XColor));
  421.    XLockDisplay(dis);
  422.    XParseColor(dis, cmap, "blue", &color);
  423.    XUnlockDisplay(dis);
  424.    HXFindBestXColor(dis, cmap, &color);
  425.    XLockDisplay(dis);
  426.    XSetForeground( dis, tmpGC, color.pixel);
  427.    XSetLineAttributes(dis, tmpGC, 1, LineSolid, CapRound, JoinRound );
  428.    XUnlockDisplay(dis);
  429.    //Draw up Vertical arrow.
  430.    if( m_ScrollVertButtonT )
  431.    {
  432.       points[0].x = offset;
  433.       points[0].y = SCROLL_BAR_WIDTH-offset;
  434.       points[1].x = SCROLL_BAR_WIDTH/2;
  435.       points[1].y = offset;
  436.       points[2].x = SCROLL_BAR_WIDTH-offset;
  437.       points[2].y = SCROLL_BAR_WIDTH-offset;
  438.       points[3].x = points[0].x;
  439.       points[3].y = points[0].y;
  440.       XLockDisplay(dis);
  441.       XFillPolygon( dis, m_ScrollVertButtonT, tmpGC, points, 4, Convex, CoordModeOrigin);
  442.       XUnlockDisplay(dis);
  443.    }
  444.     
  445.    //Draw down Vertical arrow.
  446.    if( m_ScrollVertButtonB )
  447.    {
  448.       points[0].x = offset;
  449.       points[0].y = offset;
  450.       points[1].x = SCROLL_BAR_WIDTH-offset;
  451.       points[1].y = offset;
  452.       points[2].x = SCROLL_BAR_WIDTH/2;
  453.       points[2].y = SCROLL_BAR_WIDTH-offset;
  454.       points[3].x = points[0].x;
  455.       points[3].y = points[0].y;
  456.       XLockDisplay(dis);
  457.       XFillPolygon( dis, m_ScrollVertButtonB, tmpGC, points, 4, Convex, CoordModeOrigin);
  458.       XUnlockDisplay(dis);
  459.    }
  460.     
  461.    //Draw Left Horizontal arrow.
  462.    if( m_ScrollHorizButtonL )
  463.    {
  464.       points[0].x = SCROLL_BAR_WIDTH-offset;
  465.       points[0].y = offset;
  466.       points[1].x = SCROLL_BAR_WIDTH-offset;
  467.       points[1].y = SCROLL_BAR_WIDTH-offset;
  468.       points[2].x = offset;
  469.       points[2].y = SCROLL_BAR_WIDTH/2;
  470.       points[3].x = points[0].x;
  471.       points[3].y = points[0].y;
  472.       XLockDisplay(dis);
  473.       XFillPolygon( dis, m_ScrollHorizButtonL, tmpGC, points, 4, Convex, CoordModeOrigin);
  474.       XUnlockDisplay(dis);
  475.    }
  476.     
  477.    //Draw Right Horizontal arrow.
  478.    if( m_ScrollHorizButtonR )
  479.    {
  480.       points[0].x = offset;
  481.       points[0].y = SCROLL_BAR_WIDTH-offset;
  482.       points[1].x = offset;
  483.       points[1].y = offset;
  484.       points[2].x = SCROLL_BAR_WIDTH-offset;
  485.       points[2].y = SCROLL_BAR_WIDTH/2;
  486.       points[3].x = points[0].x;
  487.       points[3].y = points[0].y;
  488.       XLockDisplay(dis);
  489.       XFillPolygon( dis, m_ScrollHorizButtonR, tmpGC, points, 4, Convex, CoordModeOrigin);
  490.       XUnlockDisplay(dis);
  491.    }
  492.     
  493.    //Free the GC and go.
  494.    XLockDisplay(dis);
  495.    XFreeGC( dis, tmpGC );
  496.    XUnlockDisplay(dis);
  497. }
  498. BOOL CHXUnixSite::_InButton( HXxPoint& pt, int x, int y )
  499. {
  500.    BOOL retVal =FALSE;
  501.    if( x>= pt.x && x< pt.x+SCROLL_BAR_WIDTH && y>=pt.y && y<pt.y+SCROLL_BAR_WIDTH )
  502.       retVal=TRUE;
  503.    else
  504.       retVal=FALSE;
  505.    return retVal;
  506. }
  507. void CHXUnixSite::_CreateHorizScrollBar()
  508. {
  509.    HX_ASSERT( m_ScrollHorizButtonL == 0 );
  510.    HX_ASSERT( m_ScrollHorizButtonR == 0 );
  511.     
  512.    HXxSize  mySize;
  513.    HXxWindow* pParentWindow = NULL;
  514.    if(GetParentSite())
  515.    {
  516.       pParentWindow = GetParentSite()->GetWindow();
  517.    }
  518.    if(pParentWindow)
  519.    {
  520.       GetParentSite()->GetSize(mySize);
  521.    }
  522.    HX_ASSERT( pParentWindow );
  523.    HX_ASSERT( pParentWindow->window != 0 );
  524.     
  525.    if( m_ScrollVertButtonB )
  526.    {
  527.       // if the other bar already exists, don't overlap it!
  528.       mySize.cx -= SCROLL_BAR_WIDTH;
  529.    }
  530.    m_ptScrollHorizPosL.x = m_topleft.x;
  531.    m_ptScrollHorizPosL.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
  532. #ifndef _ARROWS_SIDE_BY_SIDE    
  533.    m_ptScrollHorizPosR.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
  534. #else    
  535.    m_ptScrollHorizPosR.x = m_topleft.x+SCROLL_BAR_WIDTH;
  536. #endif
  537.    m_ptScrollHorizPosR.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
  538.    Display* dis     = (Display*)GetWindow()->display;
  539.    XLockDisplay(dis);
  540.    Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
  541.    XUnlockDisplay(dis);
  542.    Pixel greyPixel  = blackPixel;
  543.    Colormap cmap = HXGetXColormap(dis, (Window)GetWindow()->window);
  544.    XColor color;
  545.     
  546.    XLockDisplay(dis);
  547.    XParseColor(dis, cmap, "gray", &color);
  548.    XUnlockDisplay(dis);
  549.    HXFindBestXColor(dis, cmap, &color);
  550.    greyPixel = color.pixel;
  551.    XLockDisplay(dis);
  552.    m_ScrollHorizButtonL = XCreateSimpleWindow( dis,
  553.                                                (Window)pParentWindow->window,
  554.                                                m_ptScrollHorizPosL.x, m_ptScrollHorizPosL.y,
  555.                                                SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
  556.                                                1,
  557.                                                blackPixel,
  558.                                                greyPixel
  559.                                                );
  560.    m_ScrollHorizButtonR = XCreateSimpleWindow( dis,
  561.                                                (Window)pParentWindow->window,
  562.                                                m_ptScrollHorizPosR.x, m_ptScrollHorizPosR.y,
  563.                                                SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
  564.                                                1,
  565.                                                blackPixel,
  566.                                                greyPixel
  567.                                                );
  568.    XUnlockDisplay(dis);
  569.    HX_ASSERT( m_ScrollHorizButtonR && m_ScrollHorizButtonL );
  570.     
  571. }
  572. void CHXUnixSite::_CreateVertScrollBar()
  573. {
  574.    HX_ASSERT( m_ScrollVertButtonB == 0 );
  575.    HX_ASSERT( m_ScrollVertButtonT == 0 );
  576.     
  577.    HXxSize  mySize;
  578.    HXxWindow* pParentWindow = NULL;
  579.    if(GetParentSite())
  580.    {
  581.       pParentWindow = GetParentSite()->GetWindow();
  582.    }
  583.    if(pParentWindow)
  584.    {
  585.       GetParentSite()->GetSize(mySize);
  586.    }
  587.    HX_ASSERT( pParentWindow );
  588.    HX_ASSERT( pParentWindow->window != 0 );
  589.     
  590.    if( m_ScrollHorizButtonR )
  591.    {
  592.       // if the other bar already exists, don't overlap it!
  593.       mySize.cy -= SCROLL_BAR_WIDTH;
  594.    }
  595.     
  596.     
  597.    m_ptScrollVertPosT.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
  598.    m_ptScrollVertPosT.y = m_topleft.y;
  599.    m_ptScrollVertPosB.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
  600. #ifndef _ARROWS_SIDE_BY_SIDE    
  601.    m_ptScrollVertPosB.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
  602. #else
  603.    m_ptScrollVertPosB.y = m_topleft.y+SCROLL_BAR_WIDTH;
  604. #endif    
  605.    Display* dis     = (Display*)GetWindow()->display;
  606.    XLockDisplay(dis);
  607.    Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
  608.    XUnlockDisplay(dis);
  609.    Pixel greyPixel  = blackPixel;
  610.    Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
  611.                                    (Window)GetWindow()->window);
  612.    XColor color;
  613.    XLockDisplay(dis);
  614.    XParseColor(dis, cmap, "gray", &color);
  615.    XUnlockDisplay(dis);
  616.    HXFindBestXColor(dis, cmap, &color);
  617.    greyPixel = color.pixel;
  618.     
  619.    HX_ASSERT( GetWindow() );
  620.    XLockDisplay(dis);
  621.    m_ScrollVertButtonT = XCreateSimpleWindow( dis,
  622.                                               (Window)pParentWindow->window,
  623.                                               m_ptScrollVertPosT.x, m_ptScrollVertPosT.y,
  624.                                               SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
  625.                                               1,
  626.                                               blackPixel,
  627.                                               greyPixel
  628.                                               );
  629.    m_ScrollVertButtonB = XCreateSimpleWindow( dis,
  630.                                               (Window)pParentWindow->window,
  631.                                               m_ptScrollVertPosB.x, m_ptScrollVertPosB.y,
  632.                                               SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
  633.                                               1,
  634.                                               blackPixel,
  635.                                               greyPixel
  636.                                               );
  637.    XUnlockDisplay(dis);
  638.    HX_ASSERT( m_ScrollVertButtonB && m_ScrollVertButtonT );
  639. }
  640. //
  641. // Inherited CHXBaseSite methods.
  642. //
  643. void CHXUnixSite::_NeedWindowedSite()
  644. {
  645. #ifdef _DEBUG   
  646.    fprintf( stderr, "CHXUnixSite::_NeedWindowedSite do something here....n" );
  647. #endif   
  648.    //Nothing to do on unix....
  649. }
  650. void CHXUnixSite::_AttachWindow()
  651. {
  652.    void* pDummy=NULL; 
  653.    if(!z_mapSiteToWindow.Lookup((void*)this, pDummy))
  654.    {
  655.       z_mapSiteToWindow.SetAt((void*)this, (void*)m_pWindow);
  656.    }
  657.    //Set the display variable.
  658.    if( m_pWindow->display == NULL )
  659.    {
  660.       HX_ASSERT(zm_display);
  661.       m_pWindow->display = zm_display;
  662.    }
  663.    
  664.    //Now that we have a window be sure to init the CUnixRootSurf.
  665.    //this lets it set up the display, colormap, etc.
  666.    ((CUnixRootSurf*)m_pRootSurface)->Init();
  667. }
  668. void CHXUnixSite::_DetachWindow()
  669. {
  670.    void* pDummy; 
  671.    if (z_mapSiteToWindow.Lookup((void*)this, pDummy))
  672.    {
  673.       z_mapSiteToWindow.RemoveKey((void*)this);
  674.    }
  675. }
  676. void* CHXUnixSite::_Create(void* pParentWindow, UINT32 style)
  677. {
  678.    HRESULT result = HXR_OK;
  679.    if( m_pWindow && m_pWindow->window )
  680.    {
  681.       HX_ASSERT( "We already have created a window"==NULL);
  682.       return NULL;
  683.    }
  684.    if (pParentWindow==NULL || style)
  685.    {
  686.       m_bIsChildWindow = FALSE;
  687.    }
  688.    else
  689.    {
  690.       m_bIsChildWindow = TRUE;
  691.    }
  692.    if( _OpenXDisplay(NULL) != HXR_OK )
  693.    {
  694.       return NULL;
  695.    }
  696.    return (void*)CreateXWindow((Window)pParentWindow);
  697. }
  698. void CHXUnixSite::_Destroy(HXxWindow* pWindow)
  699. {
  700.     _DestroySliders();
  701.     if (GetWindow())
  702.     {
  703. Display* pDis = (Display*)GetWindow()->display;
  704. XLockDisplay(pDis);
  705. XDestroyWindow( pDis, (Window)pWindow->window );
  706. XUnlockDisplay(pDis);
  707.     }
  708. }
  709. void CHXUnixSite::_SetSize(HXxSize size)
  710. {
  711.    HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  712.    //The scroll bars get resized also...
  713.    _DestroySliders();
  714.    Display* pDis = (Display*)GetWindow()->display;
  715.    XLockDisplay(pDis);
  716.    XResizeWindow(pDis,
  717.                  (Window) m_pWindow->window,
  718.                  size.cx,
  719.                  size.cy);
  720.    XUnlockDisplay(pDis);
  721. }
  722. void CHXUnixSite::_SetPosition(HXxPoint position)
  723. {
  724.    HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  725.    _DestroyScrollButtons();
  726.    XLockDisplay((Display*) m_pWindow->display);
  727.    XMoveWindow((Display*)m_pWindow->display,
  728.                (Window)m_pWindow->window,
  729.                position.x,
  730.                position.y);
  731.    XUnlockDisplay((Display*) m_pWindow->display);
  732. }
  733. void CHXUnixSite::_DamageRect(HXxRect rect)
  734. {
  735.    if(GetWindow())
  736.    {    
  737.       m_bDamaged = TRUE;
  738.    }
  739.    return;
  740. }
  741. void CHXUnixSite::_DamageRegion(HXxRegion rect)
  742. {
  743.    if(GetWindow())
  744.    {    
  745.       m_bDamaged = TRUE;
  746.    }
  747.    return;
  748. }
  749. void CHXUnixSite::_SendOSUpdateMessage()
  750. {
  751.    //We need to redraw our window here, m_pWindow.
  752. }
  753. void CHXUnixSite::_ShowSite(BOOL bShow)
  754. {
  755.    if( bShow )
  756.    {
  757.       _MapScrollButtons();
  758.    }
  759.    else
  760.    {
  761.       _UnmapScrollButtons();
  762.    }
  763.    //do nothing....
  764. }
  765. BOOL CHXUnixSite::_AtSystemTime()
  766. {
  767.    return TRUE;
  768. }
  769. void CHXUnixSite::_GetDeviceCaps( void* hdc,
  770.                                   UINT16& uBitsPerPixel,
  771.                                   UINT16& uHorzRes,
  772.                                   UINT16& uVertRes )
  773. {
  774.    Screen* pScreen = NULL;
  775.    HXxWindow* pWin = GetWindow();
  776.    HX_ASSERT( pWin );
  777.    if( pWin )
  778.    {
  779.        Display* dis = (Display*)pWin->display;
  780.        HX_ASSERT( dis );
  781.        if( dis )
  782.        {
  783.    Display* pDisp = (Display*)GetWindow()->display;
  784.    XLockDisplay(pDisp);
  785.            pScreen = DefaultScreenOfDisplay(pDisp);    
  786.    XUnlockDisplay(pDisp);
  787.            
  788.            uBitsPerPixel = pScreen->root_depth;
  789.            uHorzRes      = pScreen->width;
  790.            uVertRes      = pScreen->height;   
  791.        }
  792.    }
  793. }
  794. void CHXUnixSite::_GetWindowRect(HXxRect* destRect)
  795. {
  796.    HX_ASSERT( "Doesn't seem to be used anywhere"==NULL );
  797. }
  798. void CHXUnixSite::_DestroySliders()
  799. {
  800.    _DestroyScrollButtons();
  801. }
  802. void CHXUnixSite::_ForwardUpdateEvent(HXxEvent* pEvent)
  803. {
  804.    GC gc = NULL;
  805.    AddRef();
  806.    HX_ASSERT(GetWindow()->window);
  807.    HX_ASSERT(m_pUser);
  808.    if(m_bIsChildWindow)
  809.    {
  810.       //Create a clip region that excludes our higher z-order
  811.       //siblings and is clipped to our parent.
  812.       if( !m_bRegionIsValid )
  813.       {
  814.          RecomputeClip();
  815.       }
  816.       // The problem is that regions are locked to the origin so we
  817.       // will need to reverse shift the region before we set the
  818.       // origin of the graph port! get the GC from the video surface
  819.       gc = ((CUnixRootSurf*)m_pRootSurface)->GetGC();
  820.       HX_ASSERT( gc );
  821.         
  822.       //Actually setup our clip region
  823.       Display* pDis = (Display*)GetWindow()->display;
  824.       XLockDisplay(pDis);
  825.       XSetRegion( pDis, gc, (Region) m_Region );
  826.       XUnlockDisplay(pDis);
  827.    }
  828.    XEvent* pXEvent = (XEvent*) pEvent->param2; 
  829.    XExposeEvent* exposeEvent = (XExposeEvent*) pXEvent;
  830.    
  831.    // get the rect for this site with respect to our parent
  832.    HXRECTANGLE exposedRect = { exposeEvent->x,
  833.                              exposeEvent->y,
  834.                              exposeEvent->width,
  835.                              exposeEvent->height };
  836.    HXREGION* exposedRegion = HXCreateRegion();
  837.    HXUnionRectWithRegion(&exposedRect, exposedRegion,  exposedRegion);
  838.    
  839.    // does the site intersect the current clipping region?
  840.    HXREGION* resultRegion = HXCreateRegion();
  841.    HXIntersectRegion(exposedRegion, m_Region, resultRegion);
  842.    BOOL bSiteIntersectsExposed = (HXEmptyRegion(resultRegion)==FALSE);
  843.    
  844.    HXDestroyRegion(resultRegion);
  845.    HXDestroyRegion(exposedRegion);
  846.    
  847.    // if the exposed region intersects the sites clipping region
  848.    if(bSiteIntersectsExposed)
  849.    {
  850.       m_pUser->HandleEvent(pEvent);
  851.    }
  852.    
  853.    //If the user doesn't handle the standard update event then send
  854.    //them the cross platform HX_SURFACE_UPDATE event don't damage the
  855.    //original event structure
  856.    if(!pEvent->handled && m_pUser )
  857.    {
  858.       HX_ASSERT(GetWindow());
  859.       HXxEvent event;
  860.       event.event   = HX_SURFACE_UPDATE;
  861.       event.window  = GetWindow()->window;
  862.       event.param1  = m_pVideoSurface;
  863.       event.param2  = GetWindow();
  864.       event.result  = 0;
  865.       event.handled = FALSE;
  866.       m_pUser->HandleEvent(&event);
  867.       pEvent->handled = event.handled;
  868.    }
  869.    
  870.    //reset the gc to use no region
  871.    if(m_bIsChildWindow && gc)
  872.    {
  873.       Display* pDisp = (Display*)GetWindow()->display;
  874.       XLockDisplay(pDisp);
  875.       XSetClipMask(pDisp, gc, None);
  876.       XUnlockDisplay(pDisp);
  877.    }
  878.    //Handle the drawing of our arrows...
  879.    _DrawArrows();
  880.    //Now do all our children.... 
  881.    CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin();
  882.    for(;i!=m_ChildrenMap.End();++i)
  883.    {
  884.       CHXUnixSite* pSite = (CHXUnixSite*) *i;
  885.       pSite->_ForwardUpdateEvent(pEvent);
  886.    }
  887.    
  888.    Release();
  889. }
  890. UINT32 CHXUnixSite::_MapKeySymToHXVK(KeySym sym, UINT32& uFlags )
  891. {
  892.    //XXXgfw if we add the extended flag in the HX_KEYBOARD event
  893.    //structure then we can modify the flags here to show that these
  894.    //keys are 'extended' in the windows sense.
  895.    UINT32 ulRet = 0;
  896.    switch( sym )
  897.    {
  898.       case XK_Shift_R:
  899.          ulRet = XK_Shift_L;
  900.          break;
  901.       case XK_Alt_R:
  902.          ulRet = XK_Alt_L;
  903.          break;
  904.       case XK_KP_Home:
  905.          ulRet = XK_Home;
  906.          break;
  907.       case XK_KP_Next:
  908.          ulRet = XK_Next;
  909.          break;
  910.       case XK_KP_Prior:
  911.          ulRet = XK_Prior;
  912.          break;
  913.       case XK_KP_Enter:
  914.          ulRet = XK_Return;
  915.          break;
  916.       case XK_KP_End:
  917.          ulRet = XK_End;
  918.          break;
  919.       case XK_KP_Begin:
  920.          ulRet = XK_Begin;
  921.          break;
  922.       case XK_KP_Left:
  923.          ulRet = XK_Left;
  924.          break;
  925.       case XK_KP_Up:
  926.          ulRet = XK_Up;
  927.          break;
  928.       case XK_Control_R:
  929.          ulRet = XK_Control_L;
  930.          break;
  931.       case XK_KP_Right:
  932.          ulRet = XK_Right;
  933.          break;
  934.       case XK_KP_Down:
  935.          ulRet = XK_Down;
  936.          break;
  937.       case XK_KP_Insert:
  938.          ulRet = XK_Insert;
  939.          break;
  940.       case XK_KP_Delete:
  941.          ulRet = XK_Delete;
  942.          break;
  943.       default:
  944.          ulRet = sym;
  945.          break;
  946.    }
  947.    if( ulRet != sym )
  948.    {
  949.       //We have mapped a key from Right hand side, keypad, arrows
  950.       //or other parts of an extended keyboard. Set the flag.
  951.       uFlags |= HX_EXTENDED_KEY_MASK;
  952.    }
  953.    return ulRet;
  954. }
  955. BOOL CHXUnixSite::_ConvertToHXEvent(HXxEvent* pEvent )
  956. {
  957.    // get original events info from pEvent
  958.    XEvent* pXEvent = (XEvent*) pEvent->param2;
  959.    XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent;
  960.    
  961.    //===============================================================
  962.    //   Convert all other event to RMA generic events and pass back.
  963.    //===============================================================
  964.    if( ((pEvent->event == ButtonPress)   ||
  965.         (pEvent->event == ButtonRelease) ||
  966.         (pEvent->event == MotionNotify ) ||
  967.         (pEvent->event == EnterNotify)   ||
  968.         (pEvent->event == FocusIn)       ||
  969.         (pEvent->event == FocusOut)      ||
  970.         (pEvent->event == KeyPress)      ||
  971.         (pEvent->event == KeyRelease)    ||
  972.         (pEvent->event == LeaveNotify))
  973.        )
  974.    {
  975.       // set modifier flags for all events....
  976.       UINT32 flags = 0;
  977.       // create new HXxEvent
  978.       HXxEvent theEvent;
  979.       //XXXgfw ouch....
  980.       static HXxPoint realPt = {0,0};
  981.       //Init certain members. 
  982.       memset(&theEvent, 0, sizeof(HXxEvent));
  983.       theEvent.window  = pEvent->window;
  984.       theEvent.handled = FALSE;
  985.       //
  986.       // NOTE:
  987.       //
  988.       // theEvent must be filled in by *ALL* event types.
  989.       // theEvent will be memcopied into the pEvent passed
  990.       // back to the basesite at the end of the method.
  991.       // 
  992.       //==================================================
  993.       // LEAVE NOTIFY EVENT
  994.       //==================================================            
  995.       if( pEvent->event==LeaveNotify)
  996.       {
  997.          if( m_pTopLevelSite->m_pMouseInSite )
  998.          {
  999.             HXxPoint oobPoint;
  1000.             oobPoint.x = -1;
  1001.             oobPoint.y = -1;
  1002.             HXxEvent Outevent = { HX_MOUSE_LEAVE,
  1003.                                   m_pWindow->window,
  1004.                                   (void*)&oobPoint,
  1005.                                   0, 0,
  1006.                                   FALSE };
  1007.             m_pTopLevelSite->m_pMouseInSite->EventOccurred(&Outevent);
  1008.             m_pTopLevelSite->m_pMouseInSite = NULL;
  1009.          }
  1010.          pEvent->handled=TRUE;
  1011.          return TRUE;
  1012.       }
  1013.       //==================================================
  1014.       // ENTER NOTIFY EVENT
  1015.       //==================================================
  1016.       if( pEvent->event==EnterNotify)
  1017.       {
  1018.          pEvent->handled=TRUE;
  1019.          return TRUE;
  1020.       }
  1021.       //==================================================
  1022.       // KEY PRESS/RELEASE EVENT
  1023.       //==================================================
  1024.       if ( pEvent->event == KeyPress || pEvent->event==KeyRelease )
  1025.       {
  1026.          XKeyEvent* pKeyEvent = (XKeyEvent*)pEvent->param2;
  1027.          //
  1028.          //Set the event type
  1029.          //
  1030.          theEvent.event = pEvent->event==KeyPress?HX_KEY_DOWN:HX_KEY_UP;
  1031.          //
  1032.          // Fill in the scan/key code.
  1033.          //
  1034.          flags =  pKeyEvent->keycode;
  1035.          flags &= 0x000000ff; //the scan code only gets bits 0-7
  1036.                
  1037.          //
  1038.          // build key modifier list...
  1039.          //
  1040.          if( pKeyEvent->state & ShiftMask )
  1041.             flags |= HX_SHIFT_MASK;
  1042.                
  1043.          if( pKeyEvent->state & ControlMask )
  1044.             flags |= HX_CTRL_MASK;
  1045.                
  1046.          if( pKeyEvent->state & LockMask )
  1047.             flags |= HX_CAPS_LOCK_MASK;
  1048.          if( pKeyEvent->state & Mod1Mask)
  1049.             flags |= HX_ALT_MASK;
  1050.                   
  1051.          if( pKeyEvent->state & Mod2Mask)
  1052.             flags |= HX_NUM_LOCK_MASK;
  1053.                   
  1054.          if( pKeyEvent->state & Mod5Mask)
  1055.             flags |= HX_SCROLL_LOCK_MASK;
  1056.          //
  1057.          //Store the char pressed.
  1058.          //
  1059.          KeySym sym;
  1060.          char   szBuf[10]; /* Flawfinder: ignore */
  1061.          int    nNum;
  1062.                   
  1063.          //Save the state of the keys...
  1064.          unsigned int unSave = pKeyEvent->state;
  1065.          pKeyEvent->state=0;
  1066.          //Lookup the key without any state.
  1067.          nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL );
  1068.          if( nNum > 0 )
  1069.          {
  1070.             theEvent.param1 = (void*)*szBuf;
  1071.          }
  1072.          else
  1073.          {
  1074.             theEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags);
  1075.             flags |= HX_VIRTUAL_KEY_MASK;
  1076.          }
  1077.          //restore the state of the event
  1078.          pKeyEvent->state = unSave;
  1079.                
  1080.          //Set the flags...
  1081.          theEvent.param2 = (void*)flags;
  1082.          //Check for HX_CHAR needed or not.
  1083.          if( theEvent.event == HX_KEY_DOWN )
  1084.          {
  1085.             //We have to send an extra HX_CHAR event
  1086.             HXxEvent extraEvent;
  1087.             memcpy( &extraEvent, &theEvent, sizeof( extraEvent ) ); /* Flawfinder: ignore */
  1088.             //Change the type.
  1089.             extraEvent.event = HX_CHAR;
  1090.                   
  1091.             //
  1092.             //Change the keycode to an translated ascii char.
  1093.             //
  1094.             KeySym sym;
  1095.             char   szBuf[10]; /* Flawfinder: ignore */
  1096.             int    nNum;
  1097.                   
  1098.             nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL );
  1099.                   
  1100.             if( nNum > 0 )
  1101.             {
  1102.                extraEvent.param1 = (void*)*szBuf;
  1103.             }
  1104.             else
  1105.             {
  1106.                extraEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags);
  1107.                flags |= HX_VIRTUAL_KEY_MASK;
  1108.             }
  1109.             extraEvent.param2 = (void*)flags;
  1110.             //
  1111.             // Now send the extra event....
  1112.             //
  1113.             CHXBaseSite::EventOccurred(&extraEvent);
  1114.          }
  1115.       }
  1116.             
  1117.       //==================================================
  1118.       // FOCUS OUT EVENT
  1119.       //==================================================            
  1120.       if ( pEvent->event == FocusOut )
  1121.       {
  1122.          theEvent.event = HX_LOSE_FOCUS;
  1123.       }
  1124.       if ( pEvent->event == FocusIn )
  1125.       {
  1126.          theEvent.event = HX_SET_FOCUS;
  1127.       }
  1128.       //==================================================
  1129.       // MOUSE MOVE EVENT
  1130.       //==================================================            
  1131.       if( pEvent->event == MotionNotify )
  1132.       {
  1133.          XMotionEvent* pp = (XMotionEvent*)pEvent->param2;
  1134.          theEvent.event = HX_MOUSE_MOVE; 
  1135.                
  1136.          if( pp->state&Button1Mask )
  1137.             flags |= HX_PRIMARY_BUTTON;
  1138.                
  1139.          if( pp->state&Button2Mask )
  1140.             flags |= HX_CONTEXT_BUTTON;
  1141.                
  1142.          if( pp->state&Button3Mask )
  1143.             flags |= HX_THIRD_BUTTON;
  1144.                
  1145.          if(pp->state & ShiftMask)
  1146.             flags |= HX_SHIFT_KEY;
  1147.                
  1148.          if(pp->state & ControlMask)
  1149.             flags |= HX_CTRL_KEY;
  1150.                
  1151.          if(pp->state & Mod1Mask)
  1152.             flags |= HX_ALT_COMMAND_KEY;
  1153.                
  1154.          theEvent.param2 = (void*) flags;
  1155.                
  1156.          //Grab the X and Y.
  1157.          theEvent.param1 = (void*) &realPt;
  1158.          realPt.x = pp->x;
  1159.          realPt.y = pp->y;
  1160.       }
  1161.             
  1162.       //==================================================
  1163.       // BUTTON PRESS/RELEASE EVENT
  1164.       //==================================================            
  1165.       if((pEvent->event == ButtonPress) || (pEvent->event == ButtonRelease))
  1166.       {
  1167.          // remap event
  1168.          if (pEvent->event == ButtonPress)
  1169.          {
  1170.             if (buttonEvent->button == Button3)
  1171.                theEvent.event = HX_CONTEXT_BUTTON_DOWN;
  1172.             else
  1173.                theEvent.event = HX_PRIMARY_BUTTON_DOWN;
  1174.          }
  1175.          else if (pEvent->event == ButtonRelease)
  1176.          {
  1177.             if (buttonEvent->button == Button3)
  1178.                theEvent.event = HX_CONTEXT_BUTTON_UP;
  1179.             else
  1180.                theEvent.event = HX_PRIMARY_BUTTON_UP;
  1181.          }
  1182.             
  1183.          if(buttonEvent->state & ShiftMask)
  1184.             flags |= HX_SHIFT_KEY;
  1185.                
  1186.          if(buttonEvent->state & ControlMask)
  1187.             flags |= HX_CTRL_KEY;
  1188.                
  1189.          theEvent.param2 = (void*) flags;
  1190.                
  1191.          //Grab the X and Y.
  1192.          theEvent.param1 = (void*) &realPt;
  1193.          realPt.x = buttonEvent->x;
  1194.          realPt.y = buttonEvent->y;
  1195.       }
  1196.             
  1197.       //Copy the new event back into the passed in one for
  1198.       //all events that fall through here...
  1199.       memcpy( pEvent, &theEvent, sizeof(HXxEvent) ); /* Flawfinder: ignore */
  1200. #if defined(_DEBUG)
  1201.       //If the users presses control-primary button
  1202.       //dump info on all sites. If shift-context, then
  1203.       //just this site.
  1204.       if( (buttonEvent->state&ControlMask)&&
  1205.           (theEvent.event==HX_PRIMARY_BUTTON_DOWN))
  1206.       {
  1207.          DisplayAllSiteData();
  1208.       }
  1209.       if( (buttonEvent->state&ShiftMask)&&
  1210.           (theEvent.event==HX_PRIMARY_BUTTON_DOWN))
  1211.       {
  1212.          DisplaySiteData("");
  1213.       }
  1214. #endif            
  1215.    }
  1216.    return pEvent->handled;
  1217. }
  1218. void CHXUnixSite::CheckColorSettings()
  1219. {
  1220. #if !defined(HELIX_FEATURE_HARDWARE_COLOR_CONTROLS)
  1221.     CHXBaseSite::CheckColorSettings();
  1222. #else
  1223.     CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface;
  1224.     if( !pSurf->HasHWColorConrols() )
  1225.     {
  1226.         CHXBaseSite::CheckColorSettings();
  1227.     }
  1228.     else
  1229.     {
  1230.         if (m_pParentSite)
  1231.         {
  1232.             m_pParentSite->CheckColorSettings();
  1233.         }
  1234.         else
  1235.         {
  1236.             pSurf->SetHWColorControls();
  1237.             //We do all color stuff except sharpmess in hardware.
  1238.             float   fCurrentSharpness; 
  1239.             INT16   bInterpolate;
  1240.             zm_pColorAcc->GetSharpnessAdjustments(&fCurrentSharpness, &bInterpolate);
  1241.             if (fCurrentSharpness != m_fSharpness)
  1242.             {
  1243.                 zm_pColorAcc->SetSharpnessAdjustments(m_fSharpness, FALSE);
  1244.             }
  1245.         }
  1246.     }
  1247. #endif
  1248. }
  1249. //
  1250. // OK, here it is. Take care of any OS specific duties, like scrollbar
  1251. // stuff and expose events. Then, if the event isn't handled, convert
  1252. // to an RMA event and return.
  1253. BOOL CHXUnixSite::_HandleOSEvents(HXxEvent* pEvent)
  1254. {
  1255.    HXxPoint position = {0, 0};
  1256.    HXxPoint point;
  1257.    if( NULL==pEvent )
  1258.    {
  1259.       return FALSE;
  1260.    }
  1261.    
  1262. #if defined(_DEBUG) && 0
  1263. //   fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
  1264.    switch( pEvent->event )
  1265.    {
  1266.       case HX_MOUSE_LEAVE:
  1267.          fprintf( stderr, "HX_MOUSE_LEAVEn" );
  1268.          break;
  1269. //        case HX_MOUSE_MOVE:
  1270. //           point.x = ((HXxPoint*)pEvent->param1)->x;
  1271. //           point.y = ((HXxPoint*)pEvent->param1)->y;
  1272. //           fprintf( stderr, "HX_MOUSE_MOVE: %d %dn", point.x, point.y );
  1273. //           break;
  1274.       case HX_MOUSE_ENTER:
  1275.          fprintf( stderr, "HX_MOUSE_ENTERn" );
  1276.          break;
  1277. //        case MotionNotify:
  1278. //           point.x = ((XMotionEvent*)pEvent->param2)->x;
  1279. //           point.y = ((XMotionEvent*)pEvent->param2)->y;
  1280. //           fprintf( stderr, "MotionNotify: %d %dn", point.x, point.y );
  1281. //           break;
  1282.       case Expose:
  1283.          fprintf( stderr, "Exposen" );
  1284.          break;
  1285.       case EnterNotify :
  1286.          fprintf( stderr, "EnterNotifyn" );
  1287.          break;
  1288.       case LeaveNotify:
  1289.          fprintf( stderr, "LeaveNotifyn" );
  1290.          break;
  1291.       case KeyPress:
  1292.          fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
  1293.          fprintf( stderr, "Keypressnn" );
  1294.          break;
  1295.       case KeyRelease:
  1296.          fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
  1297.          fprintf( stderr, "KeyReleasen" );
  1298.          break;
  1299.       default:
  1300.          fprintf( stderr, "Othern" );         
  1301.          break;
  1302.    }
  1303. #endif
  1304.    //Find the ConfigureNotify events so we can drop to RGB from
  1305.    //overlay while we move....
  1306. //     if( pEvent->event == ConfigureNotify && this==m_pTopLevelSite )
  1307. //     {
  1308. //        XConfigureEvent* pev = (XConfigureEvent*)pEvent->param2;
  1309. //        if( m_pWindow && pev->window == (Window)m_pWindow->window )
  1310. //        {
  1311. //           HXxPoint p;
  1312. //           _GetPositionRelativeToActualWindow( p );
  1313. //  //           fprintf( stderr, "wint %p  -- x,y width, height: %d %d %d %d n",
  1314. //  //                    pev->window,
  1315. //  //                    pev->x, pev->y, pev->width, pev->height);
  1316. //  //           fprintf( stderr, "size of site: %d %dn", m_size.cx, m_size.cy); 
  1317. //  //           fprintf( stderr, "pos of site: %d %dn", m_topleft.x, m_topleft.y); 
  1318. //           m_pTopLevelSite->m_pMutex->Lock();
  1319. //           m_pTopLevelSite->SiteMoving(0, 0);
  1320. //           m_pTopLevelSite->m_nLastMoveTime = HX_GET_TICKCOUNT();
  1321. //           m_pTopLevelSite->ScheduleCallback(MOUSE, 100);
  1322. //           m_pTopLevelSite->m_pMutex->Unlock();
  1323. //        }
  1324. //     }
  1325.    //See if we should drop out of full screen
  1326.    if( pEvent->event == FocusOut && IsFullScreen() && !m_bIgnoreFocusOutInFS )
  1327.    {
  1328. //         fprintf( stderr, "_HandleOSEvents: focus out: " );
  1329. //         XEvent* pXEvent = (XEvent*) pEvent->param2;
  1330. //         XFocusChangeEvent* event = (XFocusChangeEvent*) pXEvent;
  1331. //         switch( event->mode )
  1332. //         {
  1333. //            case NotifyAncestor:
  1334. //                fprintf( stderr, "NotifyAncestorn" );
  1335. //                break;
  1336. //            case NotifyVirtual:
  1337. //                fprintf( stderr, "NotifyVirtualn" );
  1338. //                break;
  1339. //            case NotifyInferior:
  1340. //                fprintf( stderr, "NotifyInferiorn" );
  1341. //                break;
  1342. //            case NotifyNonlinear:
  1343. //                fprintf( stderr, "NotifyNonlinearn" );
  1344. //                break;
  1345. //            case NotifyNonlinearVirtual:
  1346. //                fprintf( stderr, "NotifyNonlinearVirtualn" );
  1347. //                break;
  1348. //            case NotifyPointer:
  1349. //                fprintf( stderr, "NotifyPointern" );
  1350. //                break;
  1351. //            case NotifyPointerRoot:
  1352. //                fprintf( stderr, "NotifyPointerRootn" );
  1353. //                break;
  1354. //            case NotifyDetailNone:
  1355. //                fprintf( stderr, "NotifyDetailNonen" );
  1356. //                break;
  1357. //            default:
  1358. //                fprintf( stderr, "screwed.....n" ); 
  1359. //         }
  1360.        ExitFullScreen();
  1361.    }
  1362. #if defined(_DEBUG) && defined(TEST_FULL_SCREEN)
  1363.    if( pEvent->event == KeyPress )
  1364.    {
  1365.       KeySym sym;
  1366.       char   szBuf[10]; /* Flawfinder: ignore */
  1367.       int    nNum;
  1368.       
  1369.       //Lookup the key without any state.
  1370.       nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
  1371.       if( nNum > 0 )
  1372.       {
  1373.          if( 'f' == szBuf[0] && IsFullScreen() )
  1374.          {
  1375.             //Exit full screen if 'f' is pressed.....
  1376.             m_pTopLevelSite->ExitFullScreen();
  1377.          }
  1378.          else if( 'f' == szBuf[0] && !IsFullScreen() )
  1379.          {
  1380.             //Enter full screen if 'f' is pressed.....
  1381.             m_pTopLevelSite->EnterFullScreen();
  1382.          }
  1383.          
  1384.       }
  1385.       
  1386.    }
  1387. #endif
  1388. #if defined(_DEBUG) && defined(_TEST_COLOR_CONTROLS)
  1389.    if( pEvent->event == KeyPress )
  1390.    {
  1391.       KeySym sym;
  1392.       char   szBuf[10]; /* Flawfinder: ignore */
  1393.       int    nNum;
  1394.       
  1395.       //Lookup the key without any state.
  1396.       nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
  1397.       if( nNum > 0 )
  1398.       {
  1399.           if( 'b' == szBuf[0] )
  1400.           {
  1401.               SetBrightness( GetBrightness()-.05);
  1402.           }
  1403.           if( 'B' == szBuf[0] )
  1404.           {
  1405.               SetBrightness( GetBrightness()+.05);
  1406.           }
  1407.           if( 'c' == szBuf[0] )
  1408.           {
  1409.               SetContrast( GetContrast()-.05);
  1410.           }
  1411.           if( 'C' == szBuf[0] )
  1412.           {
  1413.               SetContrast( GetContrast()+.05);
  1414.           }
  1415.           if( 'h' == szBuf[0] )
  1416.           {
  1417.               SetHue( GetHue()-.05);
  1418.           }
  1419.           if( 'H' == szBuf[0] )
  1420.           {
  1421.               SetHue( GetHue()+.05 ); 
  1422.           }
  1423.           
  1424.           if( 's' == szBuf[0] )
  1425.           {
  1426.               SetSaturation( GetSaturation()-.05);
  1427.           }
  1428.           if( 'S' == szBuf[0] ) 
  1429.           {
  1430.               SetSaturation( GetSaturation()+.05);
  1431.           }
  1432.           fprintf( stderr, "colors %f %f %f %fn",
  1433.                    GetBrightness(),
  1434.                    GetContrast(),
  1435.                    GetSaturation(),
  1436.                    GetHue()); 
  1437.       } 
  1438.       
  1439.    }
  1440. #endif
  1441.    //Exit full screen on ESC pressed......
  1442.    if( pEvent->event == KeyPress )
  1443.    {
  1444.       KeySym sym; 
  1445.       char   szBuf[10]; /* Flawfinder: ignore */
  1446.       int    nNum;
  1447.       
  1448.       //Lookup the key without any state.
  1449.       nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
  1450.       if( nNum > 0 )
  1451.       {
  1452.          if( 27 == (int)szBuf[0] && IsFullScreen() )
  1453.          {
  1454.             //Exit full screen if esc is pressed.....
  1455.             m_pTopLevelSite->ExitFullScreen();
  1456.          }
  1457.       }
  1458.    }
  1459.    
  1460.    //Find out if this is an event we are interested in.  Make sure we
  1461.    //are visible, it isn't a button, expose or FocusIn event and also
  1462.    //make sure it is headed for our window.
  1463.    if (!_ShouldProcess(pEvent))
  1464.    {
  1465.       return FALSE;
  1466.    }
  1467.    
  1468.    if(m_pUser && GetWindow() && GetWindow()->window)
  1469.    {
  1470.       //Do not send an update event to a hidden site.
  1471.       if( pEvent->event == Expose ||
  1472.           pEvent->event == FocusIn  ||
  1473.           pEvent->event == HX_SURFACE_UPDATE )
  1474.       {
  1475.          if( (m_ScrollVertButtonT || m_ScrollHorizButtonR) && IsSiteVisible() )
  1476.          {
  1477.             _DrawArrows();
  1478.          }
  1479.          _ForwardUpdateEvent(pEvent);
  1480.          return TRUE;
  1481.       }
  1482.       else
  1483.       {
  1484.          // get original events info from pEvent
  1485.          XEvent* pXEvent = (XEvent*) pEvent->param2;
  1486.          XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent;
  1487.          
  1488.          //XXXgfw all this code sucks! It really need to be written
  1489.          //for just native events or RMA events. With the change to a
  1490.          //common site it is all screwed up. I am leaving it for now
  1491.          //so we can get on with transparancy but get back to it!
  1492.          //If the user clicks MB1 on a scroll button, handle it here and
  1493.          //don't pass it up or let the user handle the event.
  1494.          //Hit detection here.
  1495.          ////////////////////////////////////////////////////////
  1496.          // BEGIN SCROLLING GARBAGE
  1497.          ////////////////////////////////////////////////////////
  1498.          if(
  1499.             ((pEvent->event==ButtonPress || pEvent->event==ButtonRelease) &&
  1500.              buttonEvent->button==Button1) &&
  1501.             (m_ScrollHorizButtonL || m_ScrollVertButtonB )
  1502.              )
  1503.          {
  1504.             int buttonX=0;
  1505.             int buttonY=0;
  1506.             if( pEvent->event==ButtonRelease )
  1507.             {
  1508.                if( m_bScrollingInProgress )
  1509.                {
  1510.                   m_bScrollingInProgress = FALSE;
  1511.                   m_nScrollDir = 0;
  1512.                   return TRUE ;
  1513.                }
  1514.             }
  1515.             else
  1516.             {
  1517.                 buttonX = buttonEvent->x;
  1518.                 buttonY = buttonEvent->y;
  1519.                
  1520.                BOOL bPointInSite = FALSE;
  1521.                if( m_Region )
  1522.                    bPointInSite = HXPointInRegion(m_Region, buttonX, buttonY);
  1523.                     
  1524.                if( bPointInSite )
  1525.                {
  1526.                   if( m_ScrollHorizButtonL )
  1527.                   {
  1528.                      if( _InButton( m_ptScrollHorizPosL, buttonX, buttonY ))
  1529.                      {
  1530.                         m_bScrollingInProgress = TRUE;
  1531.                         m_nScrollDir = 1;
  1532.                      }
  1533.                      if( _InButton( m_ptScrollHorizPosR, buttonX, buttonY ))
  1534.                      {
  1535.                         m_bScrollingInProgress = TRUE;
  1536.                         m_nScrollDir = 2;
  1537.                      }
  1538.                   }
  1539.                   if( m_ScrollVertButtonT )
  1540.                   {
  1541.                      if( _InButton( m_ptScrollVertPosT, buttonX, buttonY ))
  1542.                      {
  1543.                         m_bScrollingInProgress = TRUE;
  1544.                         m_nScrollDir = 3;
  1545.                      }
  1546.                      if( _InButton( m_ptScrollVertPosB, buttonX, buttonY ))
  1547.                      {
  1548.                         m_bScrollingInProgress = TRUE;
  1549.                         m_nScrollDir = 4;
  1550.                      }                        
  1551.                   }
  1552.                }
  1553.             }
  1554.             if( (m_ScrollHorizButtonL||m_ScrollVertButtonT) && m_bScrollingInProgress)
  1555.             {
  1556.                int xx=0;
  1557.                int yy=0;
  1558.                HXxWindow* pParentWindow = GetParentSite()->GetWindow();
  1559.                //Make it scroll 10% of the parent window each click.
  1560.                HXxSize sizeTmp;
  1561.                GetParentSite()->GetSize(sizeTmp);
  1562.                //Set it to a percentage of the slider range.
  1563.                int incX = sizeTmp.cx/10;
  1564.                int incY = sizeTmp.cy/10;
  1565.                 
  1566.                HX_ASSERT( pParentWindow );
  1567.                 
  1568.                xx = m_XSliderPos;
  1569.                yy = m_YSliderPos;
  1570.                if( m_nScrollDir == 1 )
  1571.                   xx-=incX;
  1572.                if( m_nScrollDir == 2 )
  1573.                   xx+=incX;
  1574.                if( m_nScrollDir == 3 )
  1575.                   yy-=incY;
  1576.                if( m_nScrollDir == 4 )
  1577.                   yy+=incY;
  1578.                
  1579.                if( xx > m_size.cx-sizeTmp.cx )
  1580.                   xx = m_size.cx-sizeTmp.cx;
  1581.                if( yy > m_size.cy-sizeTmp.cy)
  1582.                   yy = m_size.cy-sizeTmp.cy;
  1583.                
  1584.                if( xx < 0 )
  1585.                   xx = 0;
  1586.                if( yy < 0 )
  1587.                   yy = 0;
  1588.                m_XSliderPos = xx;
  1589.                m_YSliderPos = yy;
  1590.                
  1591.                HXxRect rect;
  1592.                DamageRect(rect);
  1593.                
  1594.                InternalForceRedraw();
  1595.             }
  1596.             //Only throw away the event if it had something to do with
  1597.             //scolling.
  1598.             if( m_bScrollingInProgress )
  1599.             {
  1600.                 m_bScrollingInProgress = FALSE;
  1601.                 m_nScrollDir = 0;
  1602.                return TRUE;
  1603.             }
  1604.          }
  1605.          ////////////////////////////////////////////////////////
  1606.          // END SCROLLING GARBAGE
  1607.          ////////////////////////////////////////////////////////
  1608.          point.x = -1;
  1609.          point.y = -1;
  1610.          if( pEvent->event == MotionNotify)
  1611.          {
  1612.             point.x = ((XMotionEvent*)pXEvent)->x;
  1613.             point.y = ((XMotionEvent*)pXEvent)->y;
  1614.          }
  1615.          else if( pEvent->event == ButtonPress )
  1616.          {
  1617.             point.x = ((XMotionEvent*)pXEvent)->x;
  1618.             point.y = ((XMotionEvent*)pXEvent)->y;
  1619.          }
  1620.          //
  1621.          //Give the user a chance at the native event.
  1622.          //
  1623.          if( m_RegionWithoutChildren && HXPointInRegion(m_RegionWithoutChildren, point.x, point.y ))
  1624.          {
  1625.             if( m_Region && HXPointInRegion(m_Region, point.x, point.y) )
  1626.             {
  1627.                 if (m_pUser)
  1628.                     m_pUser->HandleEvent(pEvent);
  1629.             }
  1630.             else
  1631.             {
  1632.                INT32 handledCount = 0;
  1633.                INT32 mapCount     = 0;
  1634.                
  1635.                //try send this to all of our children
  1636.               _unixsitecpp1: 
  1637.                mapCount = m_ChildrenMap.GetCount();
  1638.                CHXMapPtrToPtr::Iterator i;
  1639.                for(i=m_ChildrenMap.Begin() ; i!=m_ChildrenMap.End() ; ++i)
  1640.                {
  1641.                   CHXBaseSite* pSite = (CHXBaseSite*) *i;
  1642.                   pSite->_HandleOSEvents(pEvent);
  1643.                   if (pEvent->handled)
  1644.                   {                      
  1645.                      break;
  1646.                   }
  1647.                   handledCount+=pEvent->handled;
  1648.                   pEvent->handled=0;
  1649.                   
  1650.                   if (m_ChildrenMap.GetCount() != mapCount)
  1651.                   {
  1652.                      goto _unixsitecpp1;
  1653.                   }
  1654.                }
  1655.                if (handledCount)
  1656.                {
  1657.                   pEvent->handled = 1;
  1658.                }
  1659.                HX_ASSERT(handledCount<2);
  1660.             }
  1661.          }
  1662.          pEvent->handled=FALSE;
  1663.       }
  1664.    }
  1665.    
  1666.    return FALSE;
  1667. }
  1668. void CHXUnixSite::_GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2)
  1669. {
  1670.    //XXXgfw Not needed on UNIX I guess???
  1671. }
  1672. void CHXUnixSite::_GenerateSetCursorEvent()
  1673. {
  1674. #ifdef _DEBUG   
  1675.    fprintf( stderr, "CHXUnixSite::_GenerateSetCursorEventn" );
  1676. #endif   
  1677.    //XXXgfw do we need this??
  1678. }
  1679. void CHXUnixSite::_TryCreateXSlider()
  1680. {
  1681.    if( !m_ScrollHorizButtonL && IsSiteVisible() )
  1682.       _CreateHorizScrollBar();
  1683. }
  1684. void CHXUnixSite::_SetXSliderValues(INT32 range, INT32 pageSize)
  1685. {
  1686.    //XXXgfw this is a do nothing as long as we only have
  1687.    //scroll buttons on unix and not real scroll bars.
  1688. }
  1689. void CHXUnixSite::_TryCreateYSlider()
  1690. {
  1691.    if( !m_ScrollVertButtonT && IsSiteVisible() )
  1692.       _CreateVertScrollBar();
  1693. }
  1694. void CHXUnixSite::_SetYSliderValues(INT32 range, INT32 pageSize)
  1695. {
  1696.    //XXXgfw this is a do nothing as long as we only have
  1697.    //scroll buttons on unix and not real scroll bars.
  1698. }
  1699. void CHXUnixSite::_GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight)
  1700. {
  1701.    *pWidth = *pHeight = SCROLL_BAR_WIDTH;
  1702. }
  1703. BOOL CHXUnixSite::_IsWindowVisible()
  1704. {
  1705.    HX_RESULT retVal = FALSE;
  1706.    //XXXgfw do this for now...
  1707.    retVal = IsSiteVisible();
  1708.    return retVal;
  1709. }
  1710. void CHXUnixSite::_ShowXSlider(BOOL bShow)
  1711. {
  1712.    if( GetWindow() )
  1713.    {
  1714.       if( bShow )
  1715.          _MapHorzScroll();
  1716.       else
  1717.          _UnmapHorzScroll();
  1718.    }
  1719. }
  1720. void CHXUnixSite::_MoveXSlider( INT32 left,
  1721.                                 INT32 top,
  1722.                                 INT32 right,
  1723.                                 INT32 bottom,
  1724.                                 BOOL bRedraw )
  1725. {
  1726.    //Do nothing right now....
  1727. }
  1728. void CHXUnixSite::_ShowYSlider(BOOL bShow)
  1729. {
  1730.    if( GetWindow() )
  1731.    {
  1732.       if( bShow )
  1733.          _MapVertScroll();
  1734.       else
  1735.          _UnmapVertScroll();
  1736.    }
  1737. }
  1738. void CHXUnixSite::_MoveYSlider( INT32 left,
  1739.                                 INT32 top,
  1740.                                 INT32 right,
  1741.                                 INT32 bottom,
  1742.                                 BOOL bRedraw)
  1743. {
  1744.    //do nothing right now...
  1745. }
  1746. BOOL CHXUnixSite::_DoesXSliderExist()
  1747. {
  1748.    return (m_ScrollHorizButtonL!=0);
  1749. }
  1750. void* CHXUnixSite::_GetContainingWindow()
  1751. {
  1752.    //XXXgfw Do we need this???
  1753.    return NULL;
  1754. }
  1755. void CHXUnixSite::_GetCursorPos(HXxPoint* pPoint)
  1756. {
  1757.    //Return the cursor pos in screen coords.
  1758.    Window rootWin;
  1759.    Window childWin;
  1760.    int rootX=0;
  1761.    int rootY=0;
  1762.    int childX=0;
  1763.    int childY=0;
  1764.    unsigned int mask=0;
  1765.    Bool ret=FALSE;
  1766.    
  1767.    HX_ASSERT(GetWindow());
  1768.    Display* pDis = (Display*)GetWindow()->display;
  1769.    XLockDisplay(pDis);
  1770.    ret = XQueryPointer(pDis,
  1771.                        (Window)GetWindow()->window,
  1772.                        &rootWin,
  1773.                        &childWin,
  1774.                        &rootX, &rootY,
  1775.                        &childX, &childY,
  1776.                        &mask);
  1777.    XUnlockDisplay(pDis);
  1778.    if(ret)
  1779.    {
  1780.       pPoint->x = rootX;
  1781.       pPoint->y = rootY;
  1782.    }
  1783. }
  1784. void* CHXUnixSite::_GetWindowWithCursor()
  1785. {
  1786.    //Return the cursor pos in screen coords.
  1787.    void*        pRet  = NULL;
  1788.    int          rootX = 0;
  1789.    int          rootY = 0;
  1790.    int          childX= 0;
  1791.    int          childY= 0;
  1792.    unsigned int mask  = 0;
  1793.    Bool         ret   = FALSE;
  1794.    Window       rootWin;
  1795.    Window       childWin;
  1796.    
  1797.    HX_ASSERT(GetWindow());
  1798.    Display* pDis = (Display*)GetWindow()->display;
  1799.    XLockDisplay(pDis);
  1800.    ret = XQueryPointer(pDis,
  1801.                        (Window)GetWindow()->window,
  1802.                        &rootWin,
  1803.                        &childWin,
  1804.                        &rootX, &rootY,
  1805.                        &childX, &childY,
  1806.                        &mask);
  1807.    XUnlockDisplay(pDis);
  1808.    if(ret)
  1809.    {
  1810.       pRet = (void*)childWin;
  1811.    }
  1812.    return pRet;
  1813. }
  1814. void CHXUnixSite::_MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle)
  1815. {
  1816.    //XXXgfw we could query the window tree and traverse down but that
  1817.    //is really slow and this isn't used right now.
  1818.    HX_ASSERT( "Not implemented..." == NULL );
  1819. }
  1820. void CHXUnixSite::_ReInitPrimarySurface()
  1821. {
  1822.    //Nothing to do in unix here right?
  1823. }
  1824. BOOL CHXUnixSite::_MoveWindow( void* win,
  1825.                                INT32 X,
  1826.                                INT32 Y,
  1827.                                INT32 nWidth,
  1828.                                INT32 nHeight,
  1829.                                BOOL bRepaint)
  1830. {
  1831.    //XXXgfw we still have to do bRepaint....
  1832.    HX_ASSERT( m_pWindow && m_pWindow->window && m_pWindow->display);
  1833.    _DestroyScrollButtons();
  1834.    XLockDisplay((Display*) m_pWindow->display);
  1835.    XMoveResizeWindow( (Display*)m_pWindow->display,
  1836.                       (Window)m_pWindow->window,
  1837.                       X,
  1838.                       Y,
  1839.                       nWidth,
  1840.                       nHeight
  1841.                       );
  1842.    XUnlockDisplay((Display*) m_pWindow->display);
  1843.    return TRUE;
  1844. }
  1845. BOOL CHXUnixSite::_UpdateWindow(void* hWnd)
  1846. {
  1847.    //We need to generate a repaint here of the window....
  1848.    return TRUE;
  1849. }
  1850. BOOL CHXUnixSite::_ShowWindow(void* hWnd, INT32 nCmdShow)
  1851. {
  1852.    HX_ASSERT( nCmdShow==HX_SHOW_WINDOW || nCmdShow==HX_HIDE_WINDOW);
  1853.    if( !m_pWindow || !m_pWindow->window || !m_pWindow->display )
  1854.       return FALSE;
  1855.    if( nCmdShow == HX_SHOW_WINDOW )
  1856.    {
  1857.       _MapScrollButtons();
  1858.       XLockDisplay((Display*) m_pWindow->display);
  1859.       XMapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window );
  1860.       XUnlockDisplay((Display*) m_pWindow->display);
  1861.    }
  1862.    else
  1863.    {
  1864.       _UnmapScrollButtons();
  1865.       XLockDisplay((Display*) m_pWindow->display);
  1866.       XUnmapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window );
  1867.       XUnlockDisplay((Display*) m_pWindow->display);
  1868.    }
  1869.    return TRUE;
  1870. }
  1871. BOOL CHXUnixSite::_SetWindowPos(void* hWnd,
  1872.                                 void* hWndInsertAfter,
  1873.                                 INT32 X,
  1874.                                 INT32 Y,
  1875.                                 INT32 cx,
  1876.                                 INT32 cy,
  1877.                                 INT32 uFlags)
  1878. {
  1879. #ifdef _DEBUG
  1880.    fprintf( stderr, "Now what on earth is this suppose to do??n" );
  1881. #endif
  1882.    return TRUE;
  1883. }
  1884. BOOL CHXUnixSite::_SetWindowRgn(void* hWnd, HXREGION* hRgn, BOOL bRedraw)
  1885. {
  1886.    HX_ASSERT( GetWindow() );
  1887.    Display* pDis = (Display*)GetWindow()->display;
  1888.    XLockDisplay(pDis);
  1889.    XSetRegion( pDis,
  1890.                (GC)m_pVideoSurface->_GetDC(NULL),
  1891.                (Region)hRgn
  1892.                );
  1893.    XUnlockDisplay(pDis);
  1894.    if( bRedraw )
  1895.    {
  1896.       HX_ASSERT("Redraw asked for here"==NULL );
  1897.    }
  1898.    
  1899.    return TRUE;
  1900. }
  1901. void CHXUnixSite::_SetFocus(void* pWindow)
  1902. {
  1903.    XWindowAttributes attr;
  1904.    HXxWindow*        pWin = GetWindow();
  1905.    
  1906.    HX_ASSERT(pWin);
  1907.    HX_ASSERT(pWindow);
  1908.   
  1909.    XLockDisplay((Display*) pWin->display);
  1910.    XGetWindowAttributes((Display*)pWin->display, (Window)pWindow, &attr);
  1911.    XUnlockDisplay((Display*) pWin->display);
  1912.    if( attr.map_state == IsViewable )
  1913.    {
  1914.       XLockDisplay((Display*) pWin->display);
  1915.       XSetInputFocus( (Display*)pWin->display,
  1916.                       (Window)pWindow,
  1917.                       RevertToParent,
  1918.                       CurrentTime
  1919.                       );
  1920.       XUnlockDisplay((Display*) pWin->display);
  1921.    }
  1922.    
  1923.    return;
  1924. }
  1925. HX_RESULT CHXUnixSite::_EnterFullScreen()
  1926. {
  1927.    HXxWindow* pWin = GetWindow();
  1928.    HX_ASSERT( pWin && pWin->display && pWin->display);
  1929.    HX_ASSERT( this == m_pTopLevelSite );
  1930.    if( 0 != m_winFullScreenWindow || IsFullScreen() )
  1931.    {
  1932.       //We are already in full screen
  1933.       return HXR_FAIL;
  1934.    }
  1935.    
  1936.    //Create a override redirect window to fill the root.
  1937.    XSizeHints           size_hints;
  1938.    XLockDisplay((Display*) pWin->display);
  1939.    Screen*              pScreen = XDefaultScreenOfDisplay((Display*)pWin->display);
  1940.    XUnlockDisplay((Display*) pWin->display);
  1941.    UINT16               uHorzRes = WidthOfScreen(pScreen);
  1942.    UINT16               uVertRes = HeightOfScreen(pScreen);
  1943.    int                  attrMask = 0;
  1944.    XSetWindowAttributes attr;
  1945.     
  1946.    memset(&attr, 0, sizeof(XSetWindowAttributes));
  1947.    attrMask = CWOverrideRedirect | CWBorderPixel |
  1948.       CWBackPixel | CWCursor;
  1949.    attr.cursor = None;
  1950.    attr.override_redirect = True;
  1951.    XLockDisplay((Display*)pWin->display);
  1952.    attr.background_pixel = BlackPixel((Display*)pWin->display,
  1953.                                       DefaultScreen((Display*)pWin->display));
  1954.    attr.border_pixel     = BlackPixel((Display*)pWin->display,
  1955.                                       DefaultScreen((Display*)pWin->display));
  1956.    XUnlockDisplay((Display*)pWin->display);
  1957.    size_hints.flags  = PPosition | PSize;
  1958.    size_hints.x      = 0;
  1959.    size_hints.y      = 0;
  1960.    size_hints.width  = uHorzRes;
  1961.    size_hints.height = uVertRes;
  1962.    //Create it.
  1963.    XLockDisplay((Display*) pWin->display);
  1964.    Window window = XCreateWindow((Display*)pWin->display, 
  1965.                                  DefaultRootWindow((Display*)pWin->display),
  1966.                                  size_hints.x,
  1967.                                  size_hints.y,
  1968.                                  size_hints.width,
  1969.                                  size_hints.height, 
  1970.                                  0,
  1971.                                  CopyFromParent,
  1972.                                  InputOutput,
  1973.                                  CopyFromParent,
  1974.                                  attrMask,
  1975.                                  &attr);
  1976.    
  1977.    //Tell the WM about this window.
  1978.    XSetStandardProperties( (Display*)pWin->display,
  1979.                            window,
  1980.                            "unixfullscreen",
  1981.                            "unixfullscreen",
  1982.                            None,
  1983.                            NULL, 0,
  1984.                            &size_hints
  1985.                            );
  1986.    
  1987.    int result = XSelectInput( zm_display, window,
  1988.                               ButtonPressMask   | ButtonReleaseMask | KeyPressMask    |
  1989.                               KeyReleaseMask    | EnterWindowMask   | LeaveWindowMask |
  1990.                               PointerMotionMask | ButtonMotionMask  | KeymapStateMask |
  1991.                               ExposureMask      | StructureNotifyMask | FocusChangeMask
  1992.                               );
  1993.    //Map the window.
  1994.    XMapWindow((Display*)pWin->display, window);
  1995.    XUnlockDisplay((Display*) pWin->display);
  1996.    //Get ready to resize the presentation....
  1997.    m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
  1998.    //Maintain aspect ratio and Scale it.
  1999.    float fXScale   = (float)uHorzRes/(float)(m_size.cx);
  2000.    float fYScale   = (float)uVertRes/(float)(m_size.cy);
  2001.    float fScale    = (fXScale<fYScale) ? fXScale : fYScale;
  2002.    int nWidth      = (int)(fScale*m_size.cx+.5);
  2003.    int nHeight     = (int)(fScale*m_size.cy+.5);
  2004.    //Center the presentation and save the old size
  2005.    memcpy( &m_PreFullScreenSize, &m_size, sizeof( HXxSize) ); /* Flawfinder: ignore */
  2006.    HXxSize size = {nWidth, nHeight};
  2007.    
  2008.    if( nWidth<uHorzRes )
  2009.       m_ptFullScreenOffset.x = (uHorzRes-nWidth)/2;
  2010.    
  2011.    if( nHeight<uVertRes )
  2012.       m_ptFullScreenOffset.y = (uVertRes-nHeight)/2;
  2013.    //Reparent our main window.......
  2014.    Window       winRootParent = 0;
  2015.    Window       winParent     = 0;
  2016.    Window*      pwinChildren  = NULL;
  2017.    unsigned int nNumChildren  = 0;
  2018.    XLockDisplay((Display*) pWin->display);
  2019.    XQueryTree( (Display*)pWin->display,
  2020.                (Window)pWin->window,
  2021.                &winRootParent,
  2022.                &winParent,
  2023.                &pwinChildren,
  2024.                &nNumChildren
  2025.                );
  2026.    //Free unused children list.
  2027.    XFree( pwinChildren );
  2028.    XUnlockDisplay((Display*) pWin->display);
  2029.    HX_ASSERT( winParent );
  2030.    m_winOldParent = winParent;
  2031.    XLockDisplay((Display*) pWin->display);
  2032.    XReparentWindow( (Display*)pWin->display,
  2033.                     (Window)pWin->window,
  2034.                     window,
  2035.                     m_ptFullScreenOffset.x,
  2036.                     m_ptFullScreenOffset.y
  2037.                     );
  2038.    
  2039.    //Flush event queue.
  2040.    XSync((Display*)pWin->display, False);
  2041.    XUnlockDisplay((Display*) pWin->display);
  2042.    //Save it
  2043.    m_winFullScreenWindow = window;
  2044.    m_bInFullScreen = TRUE;
  2045.       //Now resize it...
  2046.    SetSize(m_size);
  2047.    //Redraw the presentation....
  2048.    m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
  2049.    _ForceRedrawAll();
  2050.    //Give it focus....
  2051.    _SetFocus( (void*)pWin->window );
  2052.    
  2053.    // now eat all the focusouts that came as a result of this reparent...
  2054.    XEvent event;
  2055.    XLockDisplay((Display*) pWin->display);
  2056.    BOOL status   =  XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
  2057.       FocusOut, &event);
  2058.    XUnlockDisplay((Display*) pWin->display);
  2059.    while (m_bWindowCreatedByCreate && status)
  2060.    {
  2061.        // just discarding these
  2062.       XLockDisplay((Display*) pWin->display);
  2063.       status   =  XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
  2064.                               FocusOut, &event);
  2065.       XUnlockDisplay((Display*) pWin->display);
  2066.    }
  2067.    //Update the status text...
  2068.    if(m_pStatusText)
  2069.    {
  2070.       m_pStatusText->ParentChangedSize();
  2071.       m_pStatusText->Show();
  2072.    }
  2073.    return HXR_OK;
  2074. }
  2075. HX_RESULT CHXUnixSite::_ExitFullScreen()
  2076. {
  2077.    HX_ASSERT( this == m_pTopLevelSite );
  2078.    HXxWindow* pWin = GetWindow();
  2079.    HX_ASSERT( pWin && pWin->display && pWin->window );
  2080.    //Give the window back to the TLC.
  2081.    XLockDisplay((Display*) pWin->display);
  2082.    XReparentWindow( (Display*)pWin->display,
  2083.                     (Window)pWin->window,
  2084.                     m_winOldParent,
  2085.                     m_position.x, m_position.y
  2086.                     );
  2087.    XUnlockDisplay((Display*) pWin->display);
  2088.    //Just kill our window and take us out of full screen....
  2089.    if( 0 != m_winFullScreenWindow )
  2090.    {
  2091.       XLockDisplay((Display*) pWin->display);
  2092.       XDestroyWindow( (Display*)pWin->display, m_winFullScreenWindow );
  2093.       XUnlockDisplay((Display*) pWin->display);
  2094.       m_winFullScreenWindow = 0;
  2095.    }
  2096.    m_bDisableForceRedraw = TRUE;
  2097.    m_bInFullScreen = FALSE;
  2098.    HXxSize size = {0,0};
  2099.    memcpy( &size, &m_PreFullScreenSize, sizeof(HXxSize) ); /* Flawfinder: ignore */
  2100.    m_PreFullScreenSize.cx = m_PreFullScreenSize.cy = 0;
  2101.    SetSize(size);
  2102.    _SetFocus( (void*)pWin->window );
  2103.    m_ptFullScreenOffset.x = 0;
  2104.    m_ptFullScreenOffset.y = 0;
  2105.    
  2106.    m_bDisableForceRedraw = FALSE;
  2107.    _ForceRedrawAll();
  2108.    
  2109.    if(m_pStatusText)
  2110.    {
  2111.       m_pStatusText->ParentChangedSize();
  2112.       m_pStatusText->Hide();
  2113.    }
  2114.    //move the site back to where it was.
  2115.    if( m_pTopLevelSite )
  2116.    {
  2117.        m_pTopLevelSite->_SetPosition(m_CreateWindowPos);
  2118.    }
  2119.    
  2120.    return HXR_OK;
  2121. }
  2122. HX_RESULT CHXUnixSite::_EventOccurred(HXxEvent* pEvent)
  2123. {
  2124.    return HXR_OK;
  2125. }
  2126. HX_RESULT CHXUnixSite::_TestFullScreen( void* hTestBitmap,
  2127.                                         const char* pszStatusText )
  2128. {
  2129. #ifdef _DEBUG   
  2130.    fprintf( stderr, "Going to test full screen....n" );
  2131. #endif   
  2132.    return HXR_OK;
  2133. }
  2134. void CHXUnixSite::ProcessEvent(HXxEvent* pEvent)
  2135. {
  2136.    if(pEvent)
  2137.    {
  2138.        //Expose event compression. Combine all outstanding expose events
  2139.        //into one big region.
  2140.        if(Expose==pEvent->event)
  2141.        {  
  2142.            _CollapseExposeEvents((XEvent*)pEvent->param2);
  2143.        }
  2144.    }
  2145.    //Send the event to each registered UnixSite.
  2146.    void* pSite   = NULL; 
  2147.    void* pWindow = NULL;
  2148.    POSITION  pos = z_mapSiteToWindow.GetStartPosition();
  2149.    while( pos )
  2150.    {
  2151.       z_mapSiteToWindow.GetNextAssoc(pos, pSite, pWindow);
  2152.       CHXUnixSite* pSiteWindowed = (CHXUnixSite*)pSite;
  2153.       CHXUnixSite* pTopLevel = NULL;
  2154.       HX_ASSERT(pSiteWindowed);
  2155.       pSiteWindowed->AddRef();
  2156.       pTopLevel = (CHXUnixSite*)pSiteWindowed->GetTopLevelSite();
  2157.       
  2158.       if(pEvent)
  2159.       {
  2160.           //Call back into the basesite's event loop.
  2161.           pTopLevel->EventOccurred(pEvent);
  2162.       }
  2163.       //XXXgfw As a workaround for the overlay not moving while the
  2164.       //player is paused, we will check it here and update it if needed.
  2165.       //XXXRGG We might be able to use X's ConfigureNotify messages instead
  2166.       //of doing a refresh every 50 ms.
  2167.       pTopLevel->_UpdateOverlayIfNeeded();
  2168.       pSiteWindowed->Release();
  2169.    }
  2170. }
  2171. void CHXUnixSite::_CollapseExposeEvents(XEvent* xevent)
  2172. {
  2173.    Display*      display = xevent->xany.display;
  2174.    Window        window  = xevent->xany.window;
  2175.    XExposeEvent* expose_event = (XExposeEvent*)xevent;
  2176.    XEvent        new_event;
  2177.    XExposeEvent* new_expose_event = (XExposeEvent*)&new_event;
  2178.    ushort        x1;
  2179.    ushort        y1;
  2180.    ushort        x2;
  2181.    ushort        y2;
  2182.    ushort        x3;
  2183.    ushort        y3;
  2184.    x1 = expose_event->x;
  2185.    y1 = expose_event->y;
  2186.    x2 = x1 + expose_event->width;
  2187.    y2 = y1 + expose_event->height;
  2188.    XLockDisplay(display);
  2189.    BOOL status = XCheckWindowEvent(display, window, ExposureMask, &new_event);
  2190.    XUnlockDisplay(display);   
  2191.    while( status)
  2192.    { 
  2193.       if (new_expose_event->x < x1)
  2194.          x1 = new_expose_event->x;
  2195.         
  2196.       if (new_expose_event->y < y1)
  2197.          y1 = new_expose_event->y;
  2198.                 
  2199.       x3 = new_expose_event->x + new_expose_event->width;
  2200.       if (x3 > x2)
  2201.          x2 = x3;
  2202.                 
  2203.       y3 = new_expose_event->y + new_expose_event->height;
  2204.       if (y3 > y2)
  2205.          y2 = y3;
  2206.       XLockDisplay(display);
  2207.       status = XCheckWindowEvent(display, window, ExposureMask, &new_event);
  2208.       XUnlockDisplay(display);
  2209.    }
  2210.             
  2211.    expose_event->x = x1;
  2212.    expose_event->y = y1;
  2213.    expose_event->width = x2 - x1;
  2214.    expose_event->height = y2 - y1;
  2215.    expose_event->count = new_expose_event->count;
  2216. }
  2217. BOOL CHXUnixSite::_ShouldProcess(HXxEvent* pEvent)
  2218. {
  2219.    BOOL bShouldProcessThisEvent = TRUE;
  2220.    
  2221.    if( !IsSiteVisible() )
  2222.    {
  2223.       switch (pEvent->event)
  2224.       {
  2225.          case ButtonPress:
  2226.          case ButtonRelease:
  2227.          case Expose:
  2228.          case FocusIn:
  2229.             bShouldProcessThisEvent = FALSE;
  2230.             break;
  2231.          default:
  2232.             break;
  2233.       }
  2234.    }
  2235.    if(m_pWindow && m_pWindow->window!=pEvent->window)
  2236.    {
  2237.       bShouldProcessThisEvent = FALSE;
  2238.    }
  2239.    return bShouldProcessThisEvent;
  2240. }
  2241. ///////////////////////////////////////////////////////
  2242. //
  2243. // UnixEventHandler methods...
  2244. //
  2245. CHXUnixSite::UnixEventHandler::UnixEventHandler(CHXUnixSite* pParent)
  2246.    : m_pParent(pParent),
  2247.      m_lRefCount(0),
  2248.      m_cbHandle(0)
  2249. {
  2250.    HX_ASSERT(m_pParent);
  2251.    HX_ASSERT(m_pParent->m_pScheduler);
  2252.    m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30);
  2253. }
  2254. CHXUnixSite::UnixEventHandler::~UnixEventHandler()
  2255. {
  2256.     CancelCallback();
  2257. }
  2258. void
  2259. CHXUnixSite::UnixEventHandler::CancelCallback()
  2260. {
  2261.    if( m_cbHandle && m_pParent && m_pParent->m_pScheduler )
  2262.    {
  2263.       UINT32 tempHandle = m_cbHandle;
  2264.       m_cbHandle = 0;
  2265.       m_pParent->m_pScheduler->Remove(tempHandle);
  2266.    }
  2267. }
  2268.     
  2269. HX_RESULT CHXUnixSite::UnixEventHandler::QueryInterface(REFIID riid, void** ppvObj)
  2270. {
  2271.    if (IsEqualIID(riid, IID_IHXCallback))
  2272.    {
  2273.       AddRef();
  2274.       *ppvObj = (IHXCallback*)this;
  2275.       return HXR_OK;
  2276.    }
  2277.    else if (IsEqualIID(riid, IID_IUnknown))
  2278.    {
  2279.       AddRef();
  2280.       *ppvObj = this;
  2281.       return HXR_OK;
  2282.    }
  2283.     
  2284.    *ppvObj = NULL;
  2285.    return HXR_NOINTERFACE;
  2286. }
  2287. ULONG32 CHXUnixSite::UnixEventHandler::AddRef()
  2288. {
  2289.    return InterlockedIncrement(&m_lRefCount);
  2290. }
  2291. ULONG32 CHXUnixSite::UnixEventHandler::Release()
  2292. {
  2293.    HX_ASSERT(m_lRefCount>0);
  2294.    if( InterlockedDecrement(&m_lRefCount)>0 )
  2295.    {
  2296.       return m_lRefCount;
  2297.    }
  2298.    delete this;
  2299.    return 0;
  2300. }
  2301. //IHXCallback methods
  2302. HX_RESULT CHXUnixSite::UnixEventHandler::Func()
  2303. {
  2304.     XEvent xevent;
  2305.     static HXxEvent pnevent;
  2306.     
  2307.     m_cbHandle = 0;
  2308.     XLockDisplay(m_pParent->zm_display);
  2309.     int status = XPending(m_pParent->zm_display);
  2310.     XUnlockDisplay(m_pParent->zm_display);
  2311.     while(status)
  2312.     {
  2313. XLockDisplay(m_pParent->zm_display);
  2314.         XNextEvent(m_pParent->zm_display, &xevent);
  2315. XUnlockDisplay(m_pParent->zm_display);
  2316.         
  2317.         // package native event in HXxEvent and send to dispatcher
  2318.         pnevent.event = xevent.type;
  2319.         pnevent.window = (void *)xevent.xany.window;
  2320.         pnevent.param1 = xevent.xany.display;
  2321.         pnevent.param2 = &xevent;
  2322.         m_pParent->ProcessEvent(&pnevent);
  2323. XLockDisplay(m_pParent->zm_display);
  2324. status = XPending(m_pParent->zm_display);
  2325. XUnlockDisplay(m_pParent->zm_display);
  2326.     }
  2327.     
  2328.     if (m_pParent && m_pParent->m_pScheduler)
  2329.     {
  2330.         m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30);
  2331.     }
  2332.     return HXR_OK;
  2333. }
  2334. void CHXUnixSite::_UpdateOverlayIfNeeded()
  2335. {
  2336.     if( m_pVideoSurface )
  2337.     {
  2338.         if( m_pVideoSurface->m_nBltMode == HX_OVERLAY_BLT )
  2339.         {
  2340.             ULONG32 ulNow = HX_GET_BETTERTICKCOUNT();
  2341.             CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface;
  2342.             if( ulNow- pSurf->m_ulLastOverlayUpdateTime > 50 )
  2343.             {
  2344.                 SiteMoving(0,0);
  2345.             }
  2346.         }
  2347.     }
  2348.     LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  2349.     while(pos)
  2350.     {
  2351.         CHXUnixSite* pSite = (CHXUnixSite*)m_ChildrenInZOrder.GetNext(pos);
  2352.         pSite->_UpdateOverlayIfNeeded();
  2353.     }
  2354. }
  2355. BOOL  CHXUnixSite::_ShouldEnterForceRedraw()
  2356. {
  2357.    if( !m_bDamaged || !m_pUser || !IsSiteVisible() )
  2358.    {
  2359.       return FALSE;
  2360.    }
  2361.    if(InterlockedIncrement(&m_lBltEntryCount)>1)
  2362.    {
  2363.       InterlockedDecrement(&m_lBltEntryCount);
  2364.       return FALSE;
  2365.    }
  2366.          
  2367.    return TRUE;
  2368. }
  2369. void  CHXUnixSite::_ExitForceRedraw()
  2370. {
  2371.    InterlockedDecrement(&m_lBltEntryCount);
  2372. }
  2373. /////////////////////////////////////////////////////////
  2374. //
  2375. // CHXSiteEventHandler
  2376. //
  2377. /////////////////////////////////////////////////////////
  2378. CHXSiteEventHandler::CHXSiteEventHandler(IUnknown* pContext)
  2379.    : m_lRefCount(0)
  2380.    , m_pContext(NULL)
  2381. {
  2382.    if (pContext)
  2383.    {
  2384.       m_pContext = pContext;
  2385.       m_pContext->AddRef();
  2386.    }
  2387. CHXSiteEventHandler::~CHXSiteEventHandler()
  2388. {
  2389.    HX_RELEASE(m_pContext);
  2390. }
  2391. HX_RESULT CHXSiteEventHandler::QueryInterface(REFIID riid, void** ppvObj)
  2392. {
  2393.    if (IsEqualIID(riid, IID_IUnknown))
  2394.    {
  2395.       AddRef();
  2396.       *ppvObj = (IUnknown*)(IHXSiteEventHandler*)this;
  2397.       return HXR_OK;
  2398.    }
  2399.    else if (IsEqualIID(riid, IID_IHXSiteEventHandler))
  2400.    {
  2401.       AddRef();
  2402.       *ppvObj = (IHXSiteEventHandler*)this;
  2403.       return HXR_OK;
  2404.    }
  2405.    *ppvObj = NULL;
  2406.    return HXR_NOINTERFACE;
  2407. }
  2408. ULONG32 CHXSiteEventHandler::AddRef()
  2409. {
  2410.    return InterlockedIncrement(&m_lRefCount);
  2411. }
  2412. ULONG32 CHXSiteEventHandler::Release()
  2413. {
  2414.    if (InterlockedDecrement(&m_lRefCount) > 0)
  2415.    {
  2416.       return m_lRefCount;
  2417.    }
  2418.    delete this;
  2419.    return 0;
  2420. }
  2421. HX_RESULT CHXSiteEventHandler::EventOccurred(HXxEvent* pEvent)
  2422. {
  2423.    CHXUnixSite::ProcessEvent(pEvent);
  2424.    return HXR_OK;
  2425. }