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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: munixsite.cpp,v 1.1.1.1.42.1 2004/07/09 01:59:14 hubbe 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.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "minisite.h"
  50. #include "munixsite.h"
  51. #include "munixsurf.h"
  52. #include "visuals.h"
  53. Display* CHXUnixSite::zm_display = NULL;
  54. CHXUnixSite::CHXUnixSite(IUnknown* pContext, IUnknown* pUnkOuter, INT32 lZorder)
  55.     :  CMiniBaseSite(pContext, pUnkOuter, lZorder) ,
  56.        m_bIsChildWindow(FALSE)
  57. {
  58. }
  59. CHXUnixSite::~CHXUnixSite()
  60. {
  61. }
  62. void* CHXUnixSite::_Create(void* pParentWindow, UINT32 style)
  63. {
  64.     HRESULT result = HXR_OK;
  65.     if( m_pWindow && m_pWindow->window )
  66.     {
  67.         HX_ASSERT( "We already have created a window"==NULL);
  68.         return NULL;
  69.     }
  70.     if (pParentWindow==NULL || style)
  71.     {
  72.         m_bIsChildWindow = FALSE;
  73.     }
  74.     else
  75.     {
  76.         m_bIsChildWindow = TRUE;
  77.     }
  78.     if( _OpenXDisplay(NULL) != HXR_OK )
  79.     {
  80.         return NULL;
  81.     }
  82.     return (void*)CreateXWindow((Window)pParentWindow);
  83. }
  84. void  CHXUnixSite::_Destroy(HXxWindow* pWindow)
  85. {
  86.     HX_ASSERT( pWindow && pWindow->display && pWindow->window );
  87.     XDestroyWindow( (Display*)pWindow->display, (Window)pWindow->window );
  88. }
  89. void  CHXUnixSite::_SetSize(HXxSize size)
  90. {
  91.     HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  92.     XResizeWindow((Display*) m_pWindow->display,
  93.                   (Window) m_pWindow->window,
  94.                   size.cx,
  95.                   size.cy);
  96. }
  97. void  CHXUnixSite::_SetPosition(HXxPoint position)
  98. {
  99.     HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
  100.     XMoveWindow((Display*)m_pWindow->display,
  101.                 (Window)m_pWindow->window,
  102.                 position.x,
  103.                 position.y);
  104. }
  105. //This returns the OS specific window handle, as void*, that the
  106. //pointer is currently in.
  107. BOOL  CHXUnixSite::_MoveWindow(void* pParent ,
  108.                                INT32 X,
  109.                                INT32 Y,
  110.                                INT32 nWidth,
  111.                                INT32 nHeight,
  112.                                BOOL bRepaint)
  113. {   //XXXgfw we still have to do bRepaint....
  114.     HX_ASSERT( m_pWindow && m_pWindow->window && m_pWindow->display);
  115.     XMoveResizeWindow( (Display*)m_pWindow->display,
  116.                        (Window)m_pWindow->window,
  117.                        X,
  118.                        Y,
  119.                        nWidth,
  120.                        nHeight
  121.                        );
  122.     return TRUE;
  123. }
  124. HX_RESULT CHXUnixSite::_OpenXDisplay(char* pszDisplayString)
  125. {
  126.     HX_RESULT retVal = HXR_OK;
  127.     
  128.     //Is the connection open already?
  129.     if( NULL==zm_display )
  130.     {
  131.         zm_display = XOpenDisplay(pszDisplayString);
  132.       
  133.         //If you can't open the display your done.
  134.         if(NULL == zm_display )
  135.         {
  136.             HX_ASSERT("Can't open X Display..."==NULL);
  137.             retVal = HXR_FAIL;
  138.         }
  139.     }
  140.     return retVal;
  141. }
  142. Window CHXUnixSite::CreateXWindow( Window win )
  143. {
  144.    Window     parentWindow;
  145.    HXxWindow* pWindow = NULL;
  146.    //If parentWin is NULL then we belong to the root window.    
  147.    if( win )
  148.    {
  149.       parentWindow = win;
  150.    }
  151.    else
  152.    {
  153.       HX_ASSERT(zm_display);
  154.       parentWindow = RootWindow(zm_display, DefaultScreen(zm_display));
  155.    }
  156.     
  157.    //Find the best visual to use on this display.
  158.    Visual* visual = GetBestVisual(zm_display);
  159.    //Get the visual info.
  160.    int         nNotUsed=0;
  161.    XVisualInfo stVisInfo;
  162.     
  163.    memset(&stVisInfo, 0, sizeof(XVisualInfo));
  164.    stVisInfo.visualid = XVisualIDFromVisual(visual);
  165.    XVisualInfo* pVisual = XGetVisualInfo( zm_display,
  166.                                           VisualIDMask,
  167.                                           &stVisInfo,
  168.                                           &nNotUsed );
  169.    // Set up attributes of the window.
  170.    int                  attrMask = CWBackPixel | CWBorderPixel;
  171.    XSetWindowAttributes attr;
  172.     
  173.    memset(&attr, 0, sizeof(XSetWindowAttributes));
  174.    attr.background_pixel = BlackPixel(zm_display, DefaultScreen(zm_display));
  175.    attr.border_pixel     = BlackPixel(zm_display, DefaultScreen(zm_display));
  176.    
  177.    //See if the default visaul of hte screen is the same one we Want
  178.    //to use. If not, create a new one and install it.
  179.    Colormap cmap;
  180.    Visual*  defVisual = DefaultVisual(zm_display, DefaultScreen(zm_display));
  181.    if( defVisual->visualid != stVisInfo.visualid )
  182.    {
  183.       //XXXgfw Are we leaking this colormap????
  184.       cmap = XCreateColormap(zm_display, parentWindow, visual, AllocNone);
  185.       attr.colormap = cmap;
  186.       attrMask |= CWColormap;
  187.    }
  188.    // Set the size/position of the window before creating.
  189.    XSizeHints size_hints;
  190.    size_hints.flags  = PPosition | PSize;
  191.    size_hints.x      = m_position.x;
  192.    size_hints.y      = m_position.y;
  193.    size_hints.width  = 1;
  194.    size_hints.height = 1;
  195.    //Create it.
  196.    Window window = XCreateWindow(zm_display, 
  197.                                  parentWindow,
  198.                                  size_hints.x,
  199.                                  size_hints.y,
  200.                                  size_hints.width,
  201.                                  size_hints.height, 
  202.                                  0,
  203.                                  pVisual->depth,
  204.                                  InputOutput,
  205.                                  visual,
  206.                                  attrMask,
  207.                                  &attr);
  208.    XFree(pVisual);
  209.    //Tell the WM about this window.
  210. #if 0
  211.    XSetStandardProperties( zm_display,
  212.                            window,
  213.                            "CHXUnixSite",
  214.                            "CHXUnixSite",
  215.                            None,
  216.                            NULL, 0,
  217.                            &size_hints
  218.                            );
  219. #endif
  220.    //Select all input events on the window since the other platforms
  221.    //we work with have no concept of event masks
  222.    int result = XSelectInput( zm_display, window,
  223.                               ButtonPressMask   | ButtonReleaseMask | KeyPressMask    |
  224.                               KeyReleaseMask    | EnterWindowMask   | LeaveWindowMask |
  225.                               PointerMotionMask | ButtonMotionMask  | KeymapStateMask |
  226.                               ExposureMask      | StructureNotifyMask | FocusChangeMask
  227.                               );
  228.    if( BadWindow == result )
  229.    {
  230. #ifdef _DEBUG
  231.       fprintf( stderr, "Can select events.n" );
  232. #endif      
  233.    }
  234.    
  235.    //Map the window.
  236.    XMapWindow(zm_display, window);
  237.    //Flush event queue.
  238.    XFlush(zm_display);
  239.    return window;
  240. }
  241. void CHXUnixSite::_AttachWindow()
  242. {
  243.    void* pDummy=NULL; 
  244.    
  245.    //Set the display variable.
  246.    if( m_pWindow->display == NULL )
  247.    {
  248.       HX_ASSERT(zm_display);
  249.       m_pWindow->display = zm_display;
  250.    }
  251.    
  252.    //Now that we have a window be sure to init the CUnixRootSurf.
  253.    //this lets it set up the display, colormap, etc.
  254.    ((CMiniUnixSurface*)m_pVideoSurface)->_init();
  255. }