x11_factory.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * x11_factory.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: fe80a7b768876803fdf63ae4679058e555824e87 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teulière <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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 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_popup.hpp"
  34. #include "x11_timer.hpp"
  35. #include "x11_window.hpp"
  36. #include "x11_tooltip.hpp"
  37. X11Factory::X11Factory( intf_thread_t *pIntf ): OSFactory( pIntf ),
  38.     m_pDisplay( NULL ), m_pTimerLoop( NULL ), m_dirSep( "/" )
  39. {
  40.     // see init()
  41. }
  42. X11Factory::~X11Factory()
  43. {
  44.     delete m_pTimerLoop;
  45.     delete m_pDisplay;
  46. }
  47. bool X11Factory::init()
  48. {
  49.     // make sure xlib is safe-thread
  50.     if( !XInitThreads() )
  51.         msg_Err( getIntf(), "initializing xlib for multi-threading failed" );
  52.     // Create the X11 display
  53.     m_pDisplay = new X11Display( getIntf() );
  54.     // Get the display
  55.     Display *pDisplay = m_pDisplay->getDisplay();
  56.     if( pDisplay == NULL )
  57.     {
  58.         // Initialization failed
  59.         return false;
  60.     }
  61.     // Create the timer loop
  62.     m_pTimerLoop = new X11TimerLoop( getIntf(),
  63.                                      ConnectionNumber( pDisplay ) );
  64.     // Initialize the resource path
  65.     char *datadir = config_GetUserDataDir();
  66.     m_resourcePath.push_back( (string)datadir + "/skins2" );
  67.     free( datadir );
  68.     m_resourcePath.push_back( (string)"share/skins2" );
  69.     m_resourcePath.push_back( (string)config_GetDataDir () + "/skins2" );
  70.     return true;
  71. }
  72. OSGraphics *X11Factory::createOSGraphics( int width, int height )
  73. {
  74.     return new X11Graphics( getIntf(), *m_pDisplay, width, height );
  75. }
  76. OSLoop *X11Factory::getOSLoop()
  77. {
  78.     return X11Loop::instance( getIntf(), *m_pDisplay );
  79. }
  80. void X11Factory::destroyOSLoop()
  81. {
  82.     X11Loop::destroy( getIntf() );
  83. }
  84. void X11Factory::minimize()
  85. {
  86.     XIconifyWindow( m_pDisplay->getDisplay(), m_pDisplay->getMainWindow(),
  87.                     DefaultScreen( m_pDisplay->getDisplay() ) );
  88. }
  89. void X11Factory::restore()
  90. {
  91.     // TODO
  92. }
  93. void X11Factory::addInTray()
  94. {
  95.     // TODO
  96. }
  97. void X11Factory::removeFromTray()
  98. {
  99.     // TODO
  100. }
  101. void X11Factory::addInTaskBar()
  102. {
  103.     // TODO
  104. }
  105. void X11Factory::removeFromTaskBar()
  106. {
  107.     // TODO
  108. }
  109. OSTimer *X11Factory::createOSTimer( CmdGeneric &rCmd )
  110. {
  111.     return new X11Timer( getIntf(), rCmd );
  112. }
  113. OSWindow *X11Factory::createOSWindow( GenericWindow &rWindow, bool dragDrop,
  114.                                       bool playOnDrop, OSWindow *pParent )
  115. {
  116.     return new X11Window( getIntf(), rWindow, *m_pDisplay, dragDrop,
  117.                           playOnDrop, (X11Window*)pParent );
  118. }
  119. OSTooltip *X11Factory::createOSTooltip()
  120. {
  121.     return new X11Tooltip( getIntf(), *m_pDisplay );
  122. }
  123. OSPopup *X11Factory::createOSPopup()
  124. {
  125.     return new X11Popup( getIntf(), *m_pDisplay );
  126. }
  127. int X11Factory::getScreenWidth() const
  128. {
  129.     Display *pDisplay = m_pDisplay->getDisplay();
  130.     int screen = DefaultScreen( pDisplay );
  131.     return DisplayWidth( pDisplay, screen );
  132. }
  133. int X11Factory::getScreenHeight() const
  134. {
  135.     Display *pDisplay = m_pDisplay->getDisplay();
  136.     int screen = DefaultScreen( pDisplay );
  137.     return DisplayHeight( pDisplay, screen );
  138. }
  139. SkinsRect X11Factory::getWorkArea() const
  140. {
  141.     // XXX
  142.     return SkinsRect( 0, 0, getScreenWidth(), getScreenHeight() );
  143. }
  144. void X11Factory::getMousePos( int &rXPos, int &rYPos ) const
  145. {
  146.     Window rootReturn, childReturn;
  147.     int winx, winy;
  148.     unsigned int xmask;
  149.     Display *pDisplay = m_pDisplay->getDisplay();
  150.     Window root = DefaultRootWindow( pDisplay );
  151.     XQueryPointer( pDisplay, root, &rootReturn, &childReturn,
  152.                    &rXPos, &rYPos, &winx, &winy, &xmask );
  153. }
  154. void X11Factory::rmDir( const string &rPath )
  155. {
  156.     struct dirent *file;
  157.     DIR *dir;
  158.     dir = opendir( rPath.c_str() );
  159.     if( !dir ) return;
  160.     // Parse the directory and remove everything it contains
  161.     while( (file = readdir( dir )) )
  162.     {
  163.         struct stat statbuf;
  164.         string filename = file->d_name;
  165.         // Skip "." and ".."
  166.         if( filename == "." || filename == ".." )
  167.         {
  168.             continue;
  169.         }
  170.         filename = rPath + "/" + filename;
  171.         if( !stat( filename.c_str(), &statbuf ) && statbuf.st_mode & S_IFDIR )
  172.         {
  173.             rmDir( filename );
  174.         }
  175.         else
  176.         {
  177.             unlink( filename.c_str() );
  178.         }
  179.     }
  180.     // Close the directory
  181.     closedir( dir );
  182.     // And delete it
  183.     rmdir( rPath.c_str() );
  184. }
  185. #endif