]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/input_manager.cpp
macosx: Fix controller playlist toggling to use the contentRect and not the window...
[vlc] / modules / gui / qt4 / input_manager.cpp
index b4b0a90e762aff473e993fecd2bbebe2aea66828..880f8ce8057dbf79d0cd03f714823f54c1094ad9 100644 (file)
 
 static int ChangeSPU( vlc_object_t *p_this, const char *var, vlc_value_t o,
                       vlc_value_t n, void *param );
+
+static int ChangeTeletext( vlc_object_t *p_this, const char *var, vlc_value_t o,
+                           vlc_value_t n, void *param );
+
 static int ItemChanged( vlc_object_t *, const char *,
                         vlc_value_t, vlc_value_t, void * );
 static int PLItemChanged( vlc_object_t *, const char *,
@@ -85,6 +89,7 @@ void InputManager::setInput( input_thread_t *_p_input )
         UpdateMeta();
         UpdateArt();
         UpdateSPU();
+        UpdateTeletext();
         UpdateNavigation();
         addCallbacks();
         i_input_id = input_GetItem( p_input )->i_id;
@@ -94,7 +99,6 @@ void InputManager::setInput( input_thread_t *_p_input )
         p_input = NULL;
         i_input_id = 0;
         emit rateChanged( INPUT_RATE_DEFAULT );
-        emit inputUnset();
     }
 }
 
@@ -118,6 +122,7 @@ void InputManager::delInput()
         vlc_object_release( p_input );
         p_input = NULL;
         UpdateSPU();
+        UpdateTeletext();
     }
 }
 
@@ -136,6 +141,8 @@ void InputManager::addCallbacks()
     var_AddCallback( p_input, "state", ItemStateChanged, this );
     /* src/input/es-out.c:552 */
     var_AddCallback( p_input, "spu-es", ChangeSPU, this );
+    /* src/input/es-out.c: */
+    var_AddCallback( p_input, "teletext-es", ChangeTeletext, this );
     /* src/input/input.c:1765 */
     var_AddCallback( p_input, "rate-change", ItemRateChanged, this );
     /* src/input/input.c:2003 */
@@ -148,6 +155,7 @@ void InputManager::addCallbacks()
 void InputManager::delCallbacks()
 {
     var_DelCallback( p_input, "spu-es", ChangeSPU, this );
+    var_DelCallback( p_input, "teletext-es", ChangeTeletext, this );
     var_DelCallback( p_input, "state", ItemStateChanged, this );
     var_DelCallback( p_input, "rate-change", ItemRateChanged, this );
     var_DelCallback( p_input, "title", ItemTitleChanged, this );
@@ -165,6 +173,7 @@ void InputManager::customEvent( QEvent *event )
          type != ItemRateChanged_Type &&
          type != ItemTitleChanged_Type &&
          type != ItemSpuChanged_Type &&
+         type != ItemTeletextChanged_Type &&
          type != ItemStateChanged_Type )
         return;
 
@@ -173,6 +182,7 @@ void InputManager::customEvent( QEvent *event )
     if( ( type != PositionUpdate_Type  &&
           type != ItemRateChanged_Type &&
           type != ItemSpuChanged_Type &&
+          type != ItemTeletextChanged_Type &&
           type != ItemStateChanged_Type
         )
         && ( i_input_id != ple->i_id ) )
@@ -207,6 +217,9 @@ void InputManager::customEvent( QEvent *event )
     case ItemSpuChanged_Type:
         UpdateSPU();
         break;
+    case ItemTeletextChanged_Type:
+        UpdateTeletext();
+        break;
     }
 }
 
@@ -327,19 +340,20 @@ bool InputManager::hasVideo()
 }
 
 void InputManager::UpdateSPU()
+{
+    UpdateTeletext();
+}
+
+void InputManager::UpdateTeletext()
 {
     if( hasInput() )
-    {
-        vlc_value_t val;
-        var_Change( p_input, "spu-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
-        telexToggle( val.i_int > 0 );
-    }
+        telexToggle( var_GetInteger( p_input, "teletext-es" ) >= 0 );
     else
-    {
         telexToggle( false );
-    }
 }
 
+
+
 void InputManager::UpdateArt()
 {
     /* Update Art meta */
@@ -409,13 +423,19 @@ void InputManager::telexGotoPage( int page )
 {
     if( hasInput() )
     {
-        vlc_object_t *p_vbi;
-        p_vbi = (vlc_object_t *) vlc_object_find_name( p_input,
-                    "zvbi", FIND_ANYWHERE );
-        if( p_vbi )
+        const int i_teletext_es = var_GetInteger( p_input, "teletext-es" );
+        const int i_spu_es = var_GetInteger( p_input, "spu-es" );
+
+        if( i_teletext_es >= 0 && i_teletext_es == i_spu_es )
         {
-            var_SetInteger( p_vbi, "vbi-page", page );
-            vlc_object_release( p_vbi );
+            vlc_object_t *p_vbi;
+            p_vbi = (vlc_object_t *) vlc_object_find_name( p_input,
+                        "zvbi", FIND_ANYWHERE );
+            if( p_vbi )
+            {
+                var_SetInteger( p_vbi, "vbi-page", page );
+                vlc_object_release( p_vbi );
+            }
         }
     }
     emit setNewTelexPage( page );
@@ -423,30 +443,48 @@ void InputManager::telexGotoPage( int page )
 
 void InputManager::telexToggle( bool b_enabled )
 {
-    int i_page = 100;
-
     if( hasInput() )
     {
-        vlc_value_t val;
-        vlc_object_t *p_vbi;
-        var_Change( p_input, "spu-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
-        b_enabled = (val.i_int > 0);
-        p_vbi = (vlc_object_t *) vlc_object_find_name( p_input,
-                    "zvbi", FIND_ANYWHERE );
-        if( p_vbi )
+        const int i_teletext_es = var_GetInteger( p_input, "teletext-es" );
+        const int i_spu_es = var_GetInteger( p_input, "spu-es" );
+
+        b_enabled = (i_teletext_es >= 0);
+        emit teletextEnabled( b_enabled );
+        if( b_enabled && (i_teletext_es == i_spu_es) )
         {
-            i_page = var_GetInteger( p_vbi, "vbi-page" );
-            vlc_object_release( p_vbi );
-            i_page = b_enabled ? i_page : 0;
-            telexGotoPage( i_page );
+            vlc_object_t *p_vbi;
+            int i_page = 100;
+            p_vbi = (vlc_object_t *) vlc_object_find_name( p_input,
+                        "zvbi", FIND_ANYWHERE );
+            if( p_vbi )
+            {
+                i_page = var_GetInteger( p_vbi, "vbi-page" );
+                vlc_object_release( p_vbi );
+                i_page = b_enabled ? i_page : 0;
+                telexGotoPage( i_page );
+            }
         }
     }
-    emit teletextEnabled( b_enabled );
+    else emit teletextEnabled( b_enabled );
 }
 
 void InputManager::telexToggleButtons()
 {
-    emit toggleTelexButtons();
+    if( hasInput() )
+    {
+        const int i_teletext_es = var_GetInteger( p_input, "teletext-es" );
+        if( i_teletext_es >= 0 )
+        {
+            const int i_spu_es = var_GetInteger( p_input, "spu-es" );
+
+            if( i_teletext_es == i_spu_es )
+                var_SetInteger( p_input, "spu-es", -1 );
+            else
+                var_SetInteger( p_input, "spu-es", i_teletext_es );
+
+            emit toggleTelexButtons();
+        }
+    }
 }
 
 void InputManager::telexSetTransparency()
@@ -593,6 +631,7 @@ void MainInputManager::customEvent( QEvent *event )
         p_input = playlist_CurrentInput( p_playlist );
         emit inputChanged( p_input );
         vlc_object_release( p_input );
+        pl_Release( p_intf );
     }
 }
 
@@ -627,17 +666,10 @@ bool MainInputManager::teletextState()
     im = getIM();
     if( im->hasInput() )
     {
-        vlc_value_t val;
-        vlc_object_t *p_vbi;
-        p_vbi = (vlc_object_t *) vlc_object_find_name( getInput(),
-                    "zvbi", FIND_ANYWHERE );
-        if( p_vbi )
-        {
-            vlc_object_release( p_vbi );
-            return true;
-        }
-        var_Change( getInput(), "spu-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
-        return (val.i_int > 0);
+        const int i_teletext_es = var_GetInteger( getInput(), "teletext-es" );
+        const int i_spu_es = var_GetInteger( getInput(), "spu-es" );
+
+        return i_teletext_es >= 0 && i_teletext_es == i_spu_es;
     }
     return false;
 }
@@ -706,7 +738,16 @@ static int ChangeSPU( vlc_object_t *p_this, const char *var, vlc_value_t o,
     IMEvent *event = new IMEvent( ItemSpuChanged_Type, 0 );
     QApplication::postEvent( im, static_cast<QEvent*>(event) );
     return VLC_SUCCESS;
+}
+
+static int ChangeTeletext( vlc_object_t *p_this, const char *var, vlc_value_t o,
+                           vlc_value_t n, void *param )
+{
 
+    InputManager *im = (InputManager*)param;
+    IMEvent *event = new IMEvent( ItemTeletextChanged_Type, 0 );
+    QApplication::postEvent( im, static_cast<QEvent*>(event) );
+    return VLC_SUCCESS;
 }
 
 /* MIM */