x11_factory.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:5k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * x11_factory.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: x11_factory.cpp 8116 2004-07-04 22:22:10Z adn $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teuli鑢e <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #ifdef X11_SKINS
  25. #include <unistd.h>
  26. #include <dirent.h>
  27. #include <sys/stat.h>
  28. #include <X11/Xlib.h>
  29. #include "x11_factory.hpp"
  30. #include "x11_display.hpp"
  31. #include "x11_graphics.hpp"
  32. #include "x11_loop.hpp"
  33. #include "x11_timer.hpp"
  34. #include "x11_window.hpp"
  35. #include "x11_tooltip.hpp"
  36. X11Factory::X11Factory( intf_thread_t *pIntf ): OSFactory( pIntf ),
  37.     m_pDisplay( NULL ), m_pTimerLoop( NULL ), m_dirSep( "/" )
  38. {
  39.     // see init()
  40. }
  41. X11Factory::~X11Factory()
  42. {
  43.     delete m_pTimerLoop;
  44.     delete m_pDisplay;
  45. }
  46. bool X11Factory::init()
  47. {
  48.     // Create the X11 display
  49.     m_pDisplay = new X11Display( getIntf() );
  50.     // Get the display
  51.     Display *pDisplay = m_pDisplay->getDisplay();
  52.     if( pDisplay == NULL )
  53.     {
  54.         // Initialization failed
  55.         return false;
  56.     }
  57.     // Create the timer loop
  58.     m_pTimerLoop = new X11TimerLoop( getIntf(),
  59.                                      ConnectionNumber( pDisplay ) );
  60.     // Initialize the resource path
  61.     m_resourcePath.push_back( (string)getIntf()->p_vlc->psz_homedir +
  62.         m_dirSep + CONFIG_DIR + "/skins2" );
  63.     m_resourcePath.push_back( (string)"share/skins2" );
  64.     m_resourcePath.push_back( (string)DATA_PATH + "/skins2" );
  65.     return true;
  66. }
  67. OSGraphics *X11Factory::createOSGraphics( int width, int height )
  68. {
  69.     return new X11Graphics( getIntf(), *m_pDisplay, width, height );
  70. }
  71. OSLoop *X11Factory::getOSLoop()
  72. {
  73.     return X11Loop::instance( getIntf(), *m_pDisplay );
  74. }
  75. void X11Factory::destroyOSLoop()
  76. {
  77.     X11Loop::destroy( getIntf() );
  78. }
  79. void X11Factory::minimize()
  80. {
  81.     XIconifyWindow( m_pDisplay->getDisplay(), m_pDisplay->getMainWindow(),
  82.                     DefaultScreen( m_pDisplay->getDisplay() ) );
  83. }
  84. OSTimer *X11Factory::createOSTimer( const Callback &rCallback )
  85. {
  86.     return new X11Timer( getIntf(), rCallback );
  87. }
  88. OSWindow *X11Factory::createOSWindow( GenericWindow &rWindow, bool dragDrop,
  89.                                       bool playOnDrop, OSWindow *pParent )
  90. {
  91.     return new X11Window( getIntf(), rWindow, *m_pDisplay, dragDrop,
  92.                           playOnDrop, (X11Window*)pParent );
  93. }
  94. OSTooltip *X11Factory::createOSTooltip()
  95. {
  96.     return new X11Tooltip( getIntf(), *m_pDisplay );
  97. }
  98. int X11Factory::getScreenWidth() const
  99. {
  100.     Display *pDisplay = m_pDisplay->getDisplay();
  101.     int screen = DefaultScreen( pDisplay );
  102.     return DisplayWidth( pDisplay, screen );
  103. }
  104. int X11Factory::getScreenHeight() const
  105. {
  106.     Display *pDisplay = m_pDisplay->getDisplay();
  107.     int screen = DefaultScreen( pDisplay );
  108.     return DisplayHeight( pDisplay, screen );
  109. }
  110. Rect X11Factory::getWorkArea() const
  111. {
  112.     // XXX
  113.     return Rect( 0, 0, getScreenWidth(), getScreenHeight() );
  114. }
  115. void X11Factory::getMousePos( int &rXPos, int &rYPos ) const
  116. {
  117.     Window rootReturn, childReturn;
  118.     int winx, winy;
  119.     unsigned int xmask;
  120.     Display *pDisplay = m_pDisplay->getDisplay();
  121.     Window root = DefaultRootWindow( pDisplay );
  122.     XQueryPointer( pDisplay, root, &rootReturn, &childReturn,
  123.                    &rXPos, &rYPos, &winx, &winy, &xmask );
  124. }
  125. void X11Factory::rmDir( const string &rPath )
  126. {
  127.     struct dirent *file;
  128.     DIR *dir;
  129.     dir = opendir( rPath.c_str() );
  130.     if( !dir ) return;
  131.     // Parse the directory and remove everything it contains
  132.     while( (file = readdir( dir )) )
  133.     {
  134.         struct stat statbuf;
  135.         string filename = file->d_name;
  136.         // Skip "." and ".."
  137.         if( filename == "." || filename == ".." )
  138.         {
  139.             continue;
  140.         }
  141.         filename = rPath + "/" + filename;
  142.         if( !stat( filename.c_str(), &statbuf ) && statbuf.st_mode & S_IFDIR )
  143.         {
  144.             rmDir( filename );
  145.         }
  146.         else
  147.         {
  148.             unlink( filename.c_str() );
  149.         }
  150.     }
  151.     // Close the directory
  152.     closedir( dir );
  153.     // And delete it
  154.     rmdir( rPath.c_str() );
  155. }
  156. #endif