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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * qt4.cpp : QT4 interface
  3.  ****************************************************************************
  4.  * Copyright © 2006-2009 the VideoLAN team
  5.  * $Id: 25978af096d6276f8a006dc8c113b4f7555f39b6 $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *          Jean-Baptiste Kempf <jb@videolan.org>
  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 HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <QApplication>
  28. #include <QLocale>
  29. #include <QTranslator>
  30. #include <QDate>
  31. #include <QMutex>
  32. #include <QMutexLocker>
  33. #include <QWaitCondition>
  34. #include "qt4.hpp"
  35. #include "input_manager.hpp"    /* THEMIM creation */
  36. #include "dialogs_provider.hpp" /* THEDP creation */
  37. #include "main_interface.hpp"   /* MainInterface creation */
  38. #include "dialogs/help.hpp"     /* Launch Update */
  39. #include "recents.hpp"          /* Recents Item destruction */
  40. #include "util/qvlcapp.hpp"     /* QVLCApplication definition */
  41. #ifdef HAVE_X11_XLIB_H
  42.  #include <X11/Xlib.h>
  43. #endif
  44. #include "../../../share/vlc32x32.xpm"
  45. #include "../../../share/vlc32x32-christmas.xpm"
  46. #include <vlc_plugin.h>
  47. #ifdef WIN32
  48.  #include <QtPlugin>
  49.  Q_IMPORT_PLUGIN(qjpeg)
  50.  Q_IMPORT_PLUGIN(qtaccessiblewidgets)
  51. #endif
  52. /*****************************************************************************
  53.  * Local prototypes.
  54.  *****************************************************************************/
  55. static int  Open         ( vlc_object_t * );
  56. static void Close        ( vlc_object_t * );
  57. static int  OpenDialogs  ( vlc_object_t * );
  58. static int  WindowOpen   ( vlc_object_t * );
  59. static void WindowClose  ( vlc_object_t * );
  60. static void *Thread      ( void * );
  61. static void ShowDialog   ( intf_thread_t *, int, int, intf_dialog_args_t * );
  62. /*****************************************************************************
  63.  * Module descriptor
  64.  *****************************************************************************/
  65. #define ADVANCED_PREFS_TEXT N_( "Show advanced preferences over simple ones" )
  66. #define ADVANCED_PREFS_LONGTEXT N_( "Show advanced preferences and not simple "
  67.                                     "preferences when opening the preferences "
  68.                                     "dialog." )
  69. #define SYSTRAY_TEXT N_( "Systray icon" )
  70. #define SYSTRAY_LONGTEXT N_( "Show an icon in the systray " 
  71.                              "allowing you to control VLC media player " 
  72.                              "for basic actions." )
  73. #define MINIMIZED_TEXT N_( "Start VLC with only a systray icon" )
  74. #define MINIMIZED_LONGTEXT N_( "VLC will start with just an icon in " 
  75.                                "your taskbar" )
  76. #define KEEPSIZE_TEXT N_( "Resize interface to the native video size" )
  77. #define KEEPSIZE_LONGTEXT N_( "You have two choices:n" 
  78.             " - The interface will resize to the native video sizen" 
  79.             " - The video will fit to the interface sizen " 
  80.             "By default, interface resize to the native video size." )
  81. #define TITLE_TEXT N_( "Show playing item name in window title" )
  82. #define TITLE_LONGTEXT N_( "Show the name of the song or video in the " 
  83.                            "controler window title." )
  84. #define NOTIFICATION_TEXT N_( "Show notification popup on track change" )
  85. #define NOTIFICATION_LONGTEXT N_( 
  86.     "Show a notification popup with the artist and track name when " 
  87.     "the current playlist item changes, when VLC is minimized or hidden." )
  88. #define ADVANCED_OPTIONS_TEXT N_( "Advanced options" )
  89. #define ADVANCED_OPTIONS_LONGTEXT N_( "Show all the advanced options " 
  90.                                       "in the dialogs." )
  91. #define OPACITY_TEXT N_( "Windows opacity between 0.1 and 1." )
  92. #define OPACITY_LONGTEXT N_( "Sets the windows opacity between 0.1 and 1 " 
  93.                              "for main interface, playlist and extended panel."
  94.                              " This option only works with Windows and " 
  95.                              "X11 with composite extensions." )
  96. #define OPACITY_FS_TEXT N_( "Fullscreen controller opacity opacity between 0.1 and 1." )
  97. #define OPACITY_FS_LONGTEXT N_( "Sets the fullscreen controller opacity between 0.1 and 1 " 
  98.                              "for main interface, playlist and extended panel."
  99.                              " This option only works with Windows and " 
  100.                              "X11 with composite extensions." )
  101. #define ERROR_TEXT N_( "Show unimportant error and warnings dialogs" )
  102. #define UPDATER_TEXT N_( "Activate the updates availability notification" )
  103. #define UPDATER_LONGTEXT N_( "Activate the automatic notification of new " 
  104.                             "versions of the software. It runs once every " 
  105.                             "two weeks." )
  106. #define UPDATER_DAYS_TEXT N_("Number of days between two update checks")
  107. #define COMPLETEVOL_TEXT N_( "Allow the volume to be set to 400%" )
  108. #define COMPLETEVOL_LONGTEXT N_( "Allow the volume to have range from 0% to " 
  109.                                  "400%, instead of 0% to 200%. This option " 
  110.                                  "can distort the audio, since it uses " 
  111.                                  "software amplification." )
  112. #define SAVEVOL_TEXT N_( "Automatically save the volume on exit" )
  113. #define PRIVACY_TEXT N_( "Ask for network policy at start" )
  114. #define RECENTPLAY_TEXT N_( "Save the recently played items in the menu" )
  115. #define RECENTPLAY_FILTER_TEXT N_( "List of words separated by | to filter" )
  116. #define RECENTPLAY_FILTER_LONGTEXT N_( "Regular expression used to filter " 
  117.         "the recent items played in the player" )
  118. #define SLIDERCOL_TEXT N_( "Define the colors of the volume slider " )
  119. #define SLIDERCOL_LONGTEXT N_( "Define the colors of the volume slidern" 
  120.                        "By specifying the 12 numbers separated by a ';'n" 
  121.             "Default is '255;255;255;20;226;20;255;176;15;235;30;20'n" 
  122.             "An alternative can be '30;30;50;40;40;100;50;50;160;150;150;255' ")
  123. #define QT_MODE_TEXT N_( "Selection of the starting mode and look " )
  124. #define QT_MODE_LONGTEXT N_( "Start VLC with:n" 
  125.                              " - normal moden"  
  126.                              " - a zone always present to show information " 
  127.                                   "as lyrics, album arts...n" 
  128.                              " - minimal mode with limited controls" )
  129. #define QT_NORMAL_MODE_TEXT N_( "Classic look" )
  130. #define QT_ALWAYS_VIDEO_MODE_TEXT N_( "Complete look with information area" )
  131. #define QT_MINIMAL_MODE_TEXT N_( "Minimal look with no menus" )
  132. #define QT_FULLSCREEN_TEXT N_( "Show a controller in fullscreen mode" )
  133. #define QT_NATIVEOPEN_TEXT N_( "Embed the file browser in open dialog" )
  134. /* Various modes definition */
  135. static const int i_mode_list[] =
  136.     { QT_NORMAL_MODE, QT_ALWAYS_VIDEO_MODE, QT_MINIMAL_MODE };
  137. static const char *const psz_mode_list_text[] =
  138.     { QT_NORMAL_MODE_TEXT, QT_ALWAYS_VIDEO_MODE_TEXT, QT_MINIMAL_MODE_TEXT };
  139. /**********************************************************************/
  140. vlc_module_begin ()
  141.     set_shortname( "Qt" )
  142.     set_description( N_("Qt interface") )
  143.     set_category( CAT_INTERFACE )
  144.     set_subcategory( SUBCAT_INTERFACE_MAIN )
  145.     set_capability( "interface", 151 )
  146.     set_callbacks( Open, Close )
  147.     add_shortcut("qt")
  148.     add_integer( "qt-display-mode", QT_NORMAL_MODE, NULL,
  149.                  QT_MODE_TEXT, QT_MODE_LONGTEXT, false )
  150.         change_integer_list( i_mode_list, psz_mode_list_text, NULL )
  151.     add_bool( "qt-notification", true, NULL, NOTIFICATION_TEXT,
  152.               NOTIFICATION_LONGTEXT, false )
  153.     add_float_with_range( "qt-opacity", 1., 0.1, 1., NULL, OPACITY_TEXT,
  154.                           OPACITY_LONGTEXT, false )
  155.     add_float_with_range( "qt-fs-opacity", 0.8, 0.1, 1., NULL, OPACITY_FS_TEXT,
  156.                           OPACITY_FS_LONGTEXT, false )
  157.     add_bool( "qt-system-tray", true, NULL, SYSTRAY_TEXT,
  158.               SYSTRAY_LONGTEXT, false)
  159.     add_bool( "qt-start-minimized", false, NULL, MINIMIZED_TEXT,
  160.               MINIMIZED_LONGTEXT, true)
  161.     add_bool( "qt-video-autoresize", true, NULL, KEEPSIZE_TEXT,
  162.               KEEPSIZE_LONGTEXT, false )
  163.     add_bool( "qt-name-in-title", true, NULL, TITLE_TEXT,
  164.               TITLE_LONGTEXT, false )
  165.     add_bool( "qt-fs-controller", true, NULL, QT_FULLSCREEN_TEXT,
  166.               QT_FULLSCREEN_TEXT, false )
  167.     add_bool( "qt-volume-complete", false, NULL, COMPLETEVOL_TEXT,
  168.               COMPLETEVOL_LONGTEXT, true )
  169.     add_bool( "qt-autosave-volume", false, NULL, SAVEVOL_TEXT,
  170.               SAVEVOL_TEXT, true )
  171.     add_bool( "qt-embedded-open", false, NULL, QT_NATIVEOPEN_TEXT,
  172.                QT_NATIVEOPEN_TEXT, false )
  173.     add_bool( "qt-recentplay", true, NULL, RECENTPLAY_TEXT,
  174.               RECENTPLAY_TEXT, false )
  175.     add_string( "qt-recentplay-filter", "", NULL,
  176.                 RECENTPLAY_FILTER_TEXT, RECENTPLAY_FILTER_LONGTEXT, false )
  177.     add_bool( "qt-adv-options", false, NULL, ADVANCED_OPTIONS_TEXT,
  178.               ADVANCED_OPTIONS_LONGTEXT, true )
  179.     add_bool( "qt-advanced-pref", false, NULL, ADVANCED_PREFS_TEXT,
  180.               ADVANCED_PREFS_LONGTEXT, false )
  181.     add_bool( "qt-error-dialogs", true, NULL, ERROR_TEXT,
  182.               ERROR_TEXT, false )
  183. #ifdef UPDATE_CHECK
  184.     add_bool( "qt-updates-notif", true, NULL, UPDATER_TEXT,
  185.               UPDATER_LONGTEXT, false )
  186.     add_integer( "qt-updates-days", 7, NULL, UPDATER_DAYS_TEXT,
  187.                  UPDATER_DAYS_TEXT, false )
  188. #endif
  189.     add_string( "qt-slider-colours",
  190.                 "255;255;255;20;210;20;255;199;15;245;39;29",
  191.                 NULL, SLIDERCOL_TEXT, SLIDERCOL_LONGTEXT, false )
  192.     add_bool( "qt-privacy-ask", true, NULL, PRIVACY_TEXT, PRIVACY_TEXT,
  193.               false )
  194.         change_internal ()
  195.     add_obsolete_bool( "qt-blingbling" ) /* Suppressed since 1.0.0 */
  196.     add_submodule ()
  197.         set_description( "Dialogs provider" )
  198.         set_capability( "dialogs provider", 51 )
  199.         set_callbacks( OpenDialogs, Close )
  200. #if defined (Q_WS_X11)
  201. # define WID_CAPABILITY "xwindow"
  202. #elif defined (WIN32)
  203. # define WID_CAPABILITY "hwnd"
  204. #endif
  205. #ifdef WID_CAPABILITY
  206.     add_submodule ()
  207.         set_capability( WID_CAPABILITY, 50 )
  208.         set_callbacks( WindowOpen, WindowClose )
  209. #endif
  210. vlc_module_end ()
  211. /*****************************************/
  212. /* Ugly, but the Qt4 interface assumes single instance anyway */
  213. static struct
  214. {
  215.     QMutex lock;
  216.     QWaitCondition ready;
  217. } iface;
  218. /*****************************************************************************
  219.  * Module callbacks
  220.  *****************************************************************************/
  221. /* Open Interface */
  222. static int Open( vlc_object_t *p_this )
  223. {
  224.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  225. #ifdef Q_WS_X11
  226.     char *psz_display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
  227.     Display *p_display = XOpenDisplay( psz_display );
  228.     free( psz_display );
  229.     if( !p_display )
  230.     {
  231.         msg_Err( p_intf, "Could not connect to X server" );
  232.         return VLC_EGENERIC;
  233.     }
  234.     XCloseDisplay( p_display );
  235.     putenv( (char *)"XLIB_SKIP_ARGB_VISUALS=1" );
  236. #endif
  237.     /* Allocations of p_sys */
  238.     intf_sys_t *p_sys = p_intf->p_sys = new intf_sys_t;
  239.     p_sys->b_isDialogProvider = false;
  240.     p_sys->p_popup_menu = NULL;
  241.     p_sys->p_mi = NULL;
  242.     p_sys->p_playlist = pl_Hold( p_intf );
  243.     /* */
  244.     if( vlc_clone( &p_sys->thread, Thread, p_intf, VLC_THREAD_PRIORITY_LOW ) )
  245.     {
  246.         pl_Release (p_sys->p_playlist);
  247.         delete p_sys;
  248.         return VLC_ENOMEM;
  249.     }
  250.     /* */
  251.     QMutexLocker locker (&iface.lock);
  252.     vlc_value_t val;
  253.     while( p_sys->p_mi == NULL && !p_sys->b_isDialogProvider )
  254.         iface.ready.wait( &iface.lock );
  255.     if( !p_sys->b_isDialogProvider )
  256.     {
  257.         var_Create (p_this->p_libvlc, "qt4-iface", VLC_VAR_ADDRESS);
  258.         val.p_address = p_this;
  259.         var_Set (p_this->p_libvlc, "qt4-iface", val);
  260.     }
  261.     return VLC_SUCCESS;
  262. }
  263. /* Open Dialog Provider */
  264. static int OpenDialogs( vlc_object_t *p_this )
  265. {
  266.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  267.     p_intf->pf_show_dialog = ShowDialog;
  268.     int val = Open( p_this );
  269.     if( val )
  270.         return val;
  271.     return VLC_SUCCESS;
  272. }
  273. static void Close( vlc_object_t *p_this )
  274. {
  275.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  276.     intf_sys_t *p_sys = p_intf->p_sys;
  277.     var_Destroy (p_this->p_libvlc, "qt4-iface");
  278.     QVLCApp::triggerQuit();
  279.     vlc_join (p_sys->thread, NULL);
  280.     pl_Release (p_this);
  281.     delete p_sys;
  282. }
  283. static void *Thread( void *obj )
  284. {
  285.     intf_thread_t *p_intf = (intf_thread_t *)obj;
  286.     MainInterface *p_mi;
  287.     char dummy[] = "vlc"; /* for WM_CLASS */
  288.     char *argv[4] = { dummy, NULL, };
  289.     int argc = 1;
  290.     Q_INIT_RESOURCE( vlc );
  291. #if !defined(WIN32) && !defined(__APPLE__)
  292.     /* KLUDGE:
  293.      * disables icon theme use because that makes Cleanlooks style bug
  294.      * because it asks gconf for some settings that timeout because of threads
  295.      * see commits 21610 21622 21654 for reference */
  296.     /* If you don't have a gconftool-2 binary, you should comment this line */
  297.     if( strcmp( qVersion(), "4.4.0" ) < 0 ) /* fixed in Qt 4.4.0 */
  298.         QApplication::setDesktopSettingsAware( false );
  299. #endif
  300.     /* Start the QApplication here */
  301. #ifdef Q_WS_X11
  302.     char *display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
  303.     if( display )
  304.     {
  305.         argv[argc++] = const_cast<char *>("-display");
  306.         argv[argc++] = display;
  307.         argv[argc] = NULL;
  308.     }
  309. #endif
  310.     QVLCApp app( argc, argv );
  311.     p_intf->p_sys->p_app = &app;
  312.     /* All the settings are in the .conf/.ini style */
  313.     p_intf->p_sys->mainSettings = new QSettings(
  314. #ifdef WIN32
  315.             QSettings::IniFormat,
  316. #else
  317.             QSettings::NativeFormat,
  318. #endif
  319.             QSettings::UserScope, "vlc", "vlc-qt-interface" );
  320.     /* Icon setting */
  321.     if( QDate::currentDate().dayOfYear() >= 352 ) /* One Week before Xmas */
  322.         app.setWindowIcon( QIcon( QPixmap(vlc_christmas_xpm) ) );
  323.     else
  324.         app.setWindowIcon( QIcon( QPixmap(vlc_xpm) ) );
  325.     /* Initialize timers and the Dialog Provider */
  326.     DialogsProvider::getInstance( p_intf );
  327.     /* Detect screensize for small screens like TV or EEEpc*/
  328.     p_intf->p_sys->i_screenHeight =
  329.         app.QApplication::desktop()->availableGeometry().height();
  330. #ifdef UPDATE_CHECK
  331.     /* Checking for VLC updates */
  332.     if( config_GetInt( p_intf, "qt-updates-notif" ) &&
  333.         !config_GetInt( p_intf, "qt-privacy-ask" ) )
  334.     {
  335.         int interval = config_GetInt( p_intf, "qt-updates-days" );
  336.         if( QDate::currentDate() >
  337.              getSettings()->value( "updatedate" ).toDate().addDays( interval ) )
  338.         {
  339.             /* The constructor of the update Dialog will do the 1st request */
  340.             UpdateDialog::getInstance( p_intf );
  341.             getSettings()->setValue( "updatedate", QDate::currentDate() );
  342.         }
  343.     }
  344. #endif
  345.     /* Create the normal interface in non-DP mode */
  346.     if( !p_intf->pf_show_dialog )
  347.         p_mi = new MainInterface( p_intf );
  348.     else
  349.         p_mi = NULL;
  350.     /* */
  351.     iface.lock.lock();
  352.     p_intf->p_sys->p_mi = p_mi;
  353.     p_intf->p_sys->b_isDialogProvider = p_mi == NULL;
  354.     iface.ready.wakeAll();
  355.     iface.lock.unlock();
  356.     /* Explain to the core how to show a dialog :D */
  357.     p_intf->pf_show_dialog = ShowDialog;
  358. #ifdef ENABLE_NLS
  359.     // Translation - get locale
  360. #   if defined (WIN32) || defined (__APPLE__)
  361.     char* psz_tmp = config_GetPsz( p_intf, "language" );
  362.     QString lang = qfu( psz_tmp );
  363.     free( psz_tmp);
  364.     if (lang == "auto")
  365.         lang = QLocale::system().name();
  366. #   else
  367.     QString lang = QLocale::system().name();
  368. #   endif
  369.     // Translations for qt's own dialogs
  370.     QTranslator qtTranslator( 0 );
  371.     // Let's find the right path for the translation file
  372. #if !defined( WIN32 )
  373.     QString path =  QString( QT4LOCALEDIR );
  374. #else
  375.     QString path = QString( QString(config_GetDataDir()) + DIR_SEP +
  376.                             "locale" + DIR_SEP + "qt4" + DIR_SEP );
  377. #endif
  378.     // files depending on locale
  379.     bool b_loaded = qtTranslator.load( path + "qt_" + lang );
  380.     if (!b_loaded)
  381.         msg_Dbg( p_intf, "Error while initializing qt-specific localization" );
  382.     app.installTranslator( &qtTranslator );
  383. #endif  //ENABLE_NLS
  384.     /* Last settings */
  385.     app.setQuitOnLastWindowClosed( false );
  386.     /* Retrieve last known path used in file browsing */
  387.     p_intf->p_sys->filepath =
  388.          getSettings()->value( "filedialog-path", config_GetHomeDir() ).toString();
  389.     /* Launch */
  390.     app.exec();
  391.     /* And quit */
  392.     msg_Dbg( p_intf, "Quitting the Qt4 Interface" );
  393.     QApplication::closeAllWindows();
  394.     if (p_mi != NULL)
  395.     {
  396.         QMutexLocker locker (&iface.lock);
  397.         msg_Dbg (p_intf, "destroying the main Qt4 interface");
  398.         p_intf->p_sys->p_mi = NULL;
  399.         /* Destroy first the main interface because it is connected to some
  400.            slots in the MainInputManager */
  401.         delete p_mi;
  402.     }
  403.     /* Destroy all remaining windows,
  404.        because some are connected to some slots
  405.        in the MainInputManager
  406.        Settings must be destroyed after that.
  407.      */
  408.     DialogsProvider::killInstance();
  409.     /* Delete the recentsMRL object before the configuration */
  410.     RecentsMRL::killInstance();
  411.     /* Save the path */
  412.     getSettings()->setValue( "filedialog-path", p_intf->p_sys->filepath );
  413.     /* Delete the configuration. Application has to be deleted after that. */
  414.     delete p_intf->p_sys->mainSettings;
  415.     /* Destroy the MainInputManager */
  416.     MainInputManager::killInstance();
  417.     /* Delete the application automatically */
  418. #ifdef Q_WS_X11
  419.     free( display );
  420. #endif
  421.     return NULL;
  422. }
  423. /*****************************************************************************
  424.  * Callback to show a dialog
  425.  *****************************************************************************/
  426. static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
  427.                         intf_dialog_args_t *p_arg )
  428. {
  429.     VLC_UNUSED( p_intf );
  430.     DialogEvent *event = new DialogEvent( i_dialog_event, i_arg, p_arg );
  431.     QApplication::postEvent( THEDP, event );
  432. }
  433. /**
  434.  * Video output window provider
  435.  */
  436. #include <vlc_window.h>
  437. static int WindowControl (vout_window_t *, int, va_list);
  438. static int WindowOpen (vlc_object_t *obj)
  439. {
  440.     vout_window_t *wnd = (vout_window_t *)obj;
  441.     intf_thread_t *intf = NULL;
  442.     vlc_value_t val;
  443.     if (config_GetInt (obj, "embedded-video") <= 0)
  444.         return VLC_EGENERIC;
  445.     QMutexLocker (&iface.lock);
  446.     if (var_Get (obj->p_libvlc, "qt4-iface", &val) == 0)
  447.         intf = (intf_thread_t *)val.p_address;
  448.     if (intf == NULL)
  449.     {   /* If another interface is used, this plugin cannot work */
  450.         msg_Dbg (obj, "Qt4 interface not found");
  451.         return VLC_EGENERIC;
  452.     }
  453.     MainInterface *p_mi = intf->p_sys->p_mi;
  454.     msg_Dbg (obj, "requesting video...");
  455. #if defined (Q_WS_X11)
  456.     wnd->handle.xid = p_mi->getVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y,
  457.                                       &wnd->width, &wnd->height);
  458.     if (!wnd->handle.xid)
  459.         return VLC_EGENERIC;
  460. #elif defined (WIN32)
  461.     wnd->handle.hwnd = p_mi->getVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y,
  462.                                        &wnd->width, &wnd->height);
  463.     if (!wnd->handle.hwnd)
  464.         return VLC_EGENERIC;
  465. #else
  466.     return VLC_EGENERIC;
  467. #endif
  468.     wnd->control = WindowControl;
  469.     wnd->p_private = p_mi;
  470.     return VLC_SUCCESS;
  471. }
  472. static int WindowControl (vout_window_t *wnd, int query, va_list args)
  473. {
  474.     MainInterface *p_mi = (MainInterface *)wnd->p_private;
  475.     QMutexLocker locker (&iface.lock);
  476.     return p_mi->controlVideo (query, args);
  477. }
  478. static void WindowClose (vlc_object_t *obj)
  479. {
  480.     vout_window_t *wnd = (vout_window_t *)obj;
  481.     MainInterface *p_mi = (MainInterface *)wnd->p_private;
  482.     QMutexLocker locker (&iface.lock);
  483.     msg_Dbg (obj, "releasing video...");
  484.     p_mi->releaseVideo ();
  485. }