munixsite.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "minisite.h"
  36. #include "munixsite.h"
  37. #include "munixsurf.h"
  38. #include "visuals.h"
  39. Display* CHXUnixSite::zm_display = NULL;
  40. CHXUnixSite::CHXUnixSite(IUnknown* pContext, IUnknown* pUnkOuter, INT32 lZorder)
  41.     :  CMiniBaseSite(pContext, pUnkOuter, lZorder) ,
  42.        m_bIsChildWindow(FALSE)
  43. {
  44. }
  45. CHXUnixSite::~CHXUnixSite()
  46. {
  47. }
  48. void* CHXUnixSite::_Create(void* pParentWindow, UINT32 style)
  49. {
  50.     HRESULT result = HXR_OK;
  51.     if( m_pWindow && m_pWindow->window )
  52.     {
  53.         HX_ASSERT( "We already have created a window"==NULL);
  54.         return NULL;
  55.     }
  56.     if (pParentWindow==NULL || style)
  57.     {
  58.         m_bIsChildWindow = FALSE;
  59.     }
  60.     else
  61.     {
  62.         m_bIsChildWindow = TRUE;
  63.     }
  64.     if( _OpenXDisplay(NULL) != HXR_OK )
  65.     {
  66.         return NULL;
  67.     }
  68.     return (void*)CreateXWindow((Window)pParentWindow);
  69. }
  70. void  CHXUnixSite::_Destroy(HXxWindow* pWindow)
  71. {
  72.     HX_ASSERT( pWindow && pWindow->display && pWindow->window );
  73.     XDestroyWindow( (Display*)pWindow->display, (Window)pWindow->window );
  74. }
  75. void  CHXUnixSite::_SetSize(HXxSize size)
  76. {
  77.     HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  78.     XResizeWindow((Display*) m_pWindow->display,
  79.                   (Window) m_pWindow->window,
  80.                   size.cx,
  81.                   size.cy);
  82. }
  83. void  CHXUnixSite::_SetPosition(HXxPoint position)
  84. {
  85.     HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  86.     XMoveWindow((Display*)m_pWindow->display,
  87.                 (Window)m_pWindow->window,
  88.                 position.x,
  89.                 position.y);
  90. }
  91. //This returns the OS specific window handle, as void*, that the
  92. //pointer is currently in.
  93. BOOL  CHXUnixSite::_MoveWindow(void* pParent ,
  94.                                INT32 X,
  95.                                INT32 Y,
  96.                                INT32 nWidth,
  97.                                INT32 nHeight,
  98.                                BOOL bRepaint)
  99. {   //XXXgfw we still have to do bRepaint....
  100.     HX_ASSERT( m_pWindow && m_pWindow->window && m_pWindow->display);
  101.     XMoveResizeWindow( (Display*)m_pWindow->display,
  102.                        (Window)m_pWindow->window,
  103.                        X,
  104.                        Y,
  105.                        nWidth,
  106.                        nHeight
  107.                        );
  108.     return TRUE;
  109. }
  110. HX_RESULT CHXUnixSite::_OpenXDisplay(char* pszDisplayString)
  111. {
  112.     HX_RESULT retVal = HXR_OK;
  113.     
  114.     //Is the connection open already?
  115.     if( NULL==zm_display )
  116.     {
  117.         zm_display = XOpenDisplay(pszDisplayString);
  118.       
  119.         //If you can't open the display your done.
  120.         if(NULL == zm_display )
  121.         {
  122.             HX_ASSERT("Can't open X Display..."==NULL);
  123.             retVal = HXR_FAIL;
  124.         }
  125.     }
  126.     return retVal;
  127. }
  128. Window CHXUnixSite::CreateXWindow( Window win )
  129. {
  130.    Window     parentWindow;
  131.    HXxWindow* pWindow = NULL;
  132.    //If parentWin is NULL then we belong to the root window.    
  133.    if( win )
  134.    {
  135.       parentWindow = win;
  136.    }
  137.    else
  138.    {
  139.       HX_ASSERT(zm_display);
  140.       parentWindow = RootWindow(zm_display, DefaultScreen(zm_display));
  141.    }
  142.     
  143.    //Find the best visual to use on this display.
  144.    Visual* visual = GetBestVisual(zm_display);
  145.    //Get the visual info.
  146.    int         nNotUsed=0;
  147.    XVisualInfo stVisInfo;
  148.     
  149.    memset(&stVisInfo, 0, sizeof(XVisualInfo));
  150.    stVisInfo.visualid = XVisualIDFromVisual(visual);
  151.    XVisualInfo* pVisual = XGetVisualInfo( zm_display,
  152.                                           VisualIDMask,
  153.                                           &stVisInfo,
  154.                                           &nNotUsed );
  155.    // Set up attributes of the window.
  156.    int                  attrMask = CWBackPixel | CWBorderPixel;
  157.    XSetWindowAttributes attr;
  158.     
  159.    memset(&attr, 0, sizeof(XSetWindowAttributes));
  160.    attr.background_pixel = BlackPixel(zm_display, DefaultScreen(zm_display));
  161.    attr.border_pixel     = BlackPixel(zm_display, DefaultScreen(zm_display));
  162.    
  163.    //See if the default visaul of hte screen is the same one we Want
  164.    //to use. If not, create a new one and install it.
  165.    Colormap cmap;
  166.    Visual*  defVisual = DefaultVisual(zm_display, DefaultScreen(zm_display));
  167.    if( defVisual->visualid != stVisInfo.visualid )
  168.    {
  169.       //XXXgfw Are we leaking this colormap????
  170.       cmap = XCreateColormap(zm_display, parentWindow, visual, AllocNone);
  171.       attr.colormap = cmap;
  172.       attrMask |= CWColormap;
  173.    }
  174.    // Set the size/position of the window before creating.
  175.    XSizeHints size_hints;
  176.    size_hints.flags  = PPosition | PSize;
  177.    size_hints.x      = m_position.x;
  178.    size_hints.y      = m_position.y;
  179.    size_hints.width  = 1;
  180.    size_hints.height = 1;
  181.    //Create it.
  182.    Window window = XCreateWindow(zm_display, 
  183.                                  parentWindow,
  184.                                  size_hints.x,
  185.                                  size_hints.y,
  186.                                  size_hints.width,
  187.                                  size_hints.height, 
  188.                                  0,
  189.                                  pVisual->depth,
  190.                                  InputOutput,
  191.                                  visual,
  192.                                  attrMask,
  193.                                  &attr);
  194.    XFree(pVisual);
  195.    //Tell the WM about this window.
  196. #if 0
  197.    XSetStandardProperties( zm_display,
  198.                            window,
  199.                            "CHXUnixSite",
  200.                            "CHXUnixSite",
  201.                            None,
  202.                            NULL, 0,
  203.                            &size_hints
  204.                            );
  205. #endif
  206.    //Select all input events on the window since the other platforms
  207.    //we work with have no concept of event masks
  208.    int result = XSelectInput( zm_display, window,
  209.                               ButtonPressMask   | ButtonReleaseMask | KeyPressMask    |
  210.                               KeyReleaseMask    | EnterWindowMask   | LeaveWindowMask |
  211.                               PointerMotionMask | ButtonMotionMask  | KeymapStateMask |
  212.                               ExposureMask      | StructureNotifyMask | FocusChangeMask
  213.                               );
  214.    if( BadWindow == result )
  215.    {
  216. #ifdef _DEBUG
  217.       fprintf( stderr, "Can select events.n" );
  218. #endif      
  219.    }
  220.    
  221.    //Map the window.
  222.    XMapWindow(zm_display, window);
  223.    //Flush event queue.
  224.    XFlush(zm_display);
  225.    return window;
  226. }
  227. void CHXUnixSite::_AttachWindow()
  228. {
  229.    void* pDummy=NULL; 
  230.    
  231.    //Set the display variable.
  232.    if( m_pWindow->display == NULL )
  233.    {
  234.       HX_ASSERT(zm_display);
  235.       m_pWindow->display = zm_display;
  236.    }
  237.    
  238.    //Now that we have a window be sure to init the CUnixRootSurf.
  239.    //this lets it set up the display, colormap, etc.
  240.    ((CMiniUnixSurface*)m_pVideoSurface)->_init();
  241. }