]> git.sesse.net Git - vlc/commitdiff
Handle removal
authorClément Stenac <zorglub@videolan.org>
Sun, 11 Dec 2005 19:59:14 +0000 (19:59 +0000)
committerClément Stenac <zorglub@videolan.org>
Sun, 11 Dec 2005 19:59:14 +0000 (19:59 +0000)
Improve non-handling by interfaces without interaction

modules/gui/wxwidgets/dialogs.cpp
modules/gui/wxwidgets/dialogs/interaction.cpp
modules/gui/wxwidgets/dialogs/interaction.hpp
modules/gui/wxwidgets/interface.cpp
src/interface/interaction.c
src/playlist/playlist.c

index e765dd9838dbc87465447af67469d9e2ed8985da..ec219cd0b6c9f86a1d6746da0fe27709da084925 100644 (file)
@@ -549,7 +549,6 @@ void DialogsProvider::OnInteraction( wxCommandEvent& event )
     }
     p_dialog = p_arg->p_dialog;
 
-
     /** \bug We store the interface object for the dialog in the p_private
      * field of the core dialog object. This is not safe if we change
      * interface while a dialog is loaded */
@@ -568,6 +567,12 @@ void DialogsProvider::OnInteraction( wxCommandEvent& event )
     case INTERACT_HIDE:
         p_wxdialog = (InteractionDialog*)(p_dialog->p_private);
         p_wxdialog->Hide();
+        p_dialog->i_status = HIDDEN_DIALOG;
+        break;
+    case INTERACT_DESTROY:
+        p_wxdialog = (InteractionDialog*)(p_dialog->p_private);
+        /// \todo
+        p_dialog->i_status = DESTROYED_DIALOG;
         break;
     }
 }
index b2c4e1516cd01e013e3b7cbb7c4eaac51f6df97d..73dee44395cff1013519baf9fd1edca163009563 100644 (file)
@@ -118,6 +118,7 @@ void InteractionDialog::Render()
             InputWidget widget;
             widget.control = input;
             widget.val = &p_widget->val;
+            widget.i_type = WIDGET_INPUT_TEXT;
             input_widgets.push_back( widget );
         }
     }
@@ -167,7 +168,8 @@ void InteractionDialog::Finish( int i_ret )
     vector<InputWidget>::iterator it = input_widgets.begin();
     while ( it < input_widgets.end() )
     {
-        (*it).val->psz_string = strdup( (*it).control->GetValue().mb_str() );
+        if( (*it).i_type == WIDGET_INPUT_TEXT )
+            (*it).val->psz_string = strdup( (*it).control->GetValue().mb_str() );
         it++;
     }
     Hide();
index 23dbd6f9e70a463f1c4cbb1f2336692bed5fa192..f73478b8b1d8acb0f42de5b3286b8ec41b6c5818 100644 (file)
@@ -38,6 +38,7 @@ namespace wxvlc
         /// \todo Clean up
         wxTextCtrl *control;
         vlc_value_t *val;
+        int i_type;
     };
 
     class InteractionDialog: public wxFrame
index 0a0d8d9dc918dc49107728a56376568e845a7ebf..6db430e9b46f8a873809e70f5734b3b0dccb4099 100644 (file)
@@ -1217,13 +1217,6 @@ static int InteractCallback( vlc_object_t *p_this,
     Interface *p_interface = (Interface*)param;
     interaction_dialog_t *p_dialog = (interaction_dialog_t*)(new_val.p_address);
 
-    /// Not handled
-    if( p_dialog->i_action == INTERACT_HIDE )
-    {
-        p_dialog->i_status = HIDDEN_DIALOG;
-        return 0;
-    }
-
     wxCommandEvent event( wxEVT_INTERACTION, -1 );
     event.SetClientData( new_val.p_address );
     p_interface->AddPendingEvent( event );
index 2cfcb3e987f00d15adb7a8dafa8e480a5430abe3..81f921863a93f4b4cb2bb03815aa06231001c133 100644 (file)
@@ -52,6 +52,8 @@ static int                   intf_WaitAnswer( interaction_t *p_interact,
 static int                   intf_Send( interaction_t *p_interact,
                              interaction_dialog_t *p_dialog );
 static interaction_dialog_t *intf_InteractionGetById( vlc_object_t* , int );
+static void                  intf_InteractionDialogDestroy(
+                                              interaction_dialog_t *p_dialog );
 
 /**
  * Send an interaction element to the user
@@ -90,7 +92,18 @@ int  __intf_Interact( vlc_object_t *p_this, interaction_dialog_t *
  */
 void intf_InteractionDestroy( interaction_t *p_interaction )
 {
-    /// \todo Code this, and call it
+    int i;
+
+    // Remove all dialogs - Interfaces must be able to clean up their data
+
+    for( i = p_interaction->i_dialogs -1 ; i >= 0; i-- )
+    {
+        interaction_dialog_t * p_dialog = p_interaction->pp_dialogs[i];
+        intf_InteractionDialogDestroy( p_dialog );
+        REMOVE_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs, i );
+    }
+
+    vlc_object_destroy( p_interaction );
 }
 
 /**
@@ -121,12 +134,23 @@ void intf_InteractionManage( playlist_t *p_playlist )
         for( i_index = 0 ; i_index < p_interaction->i_dialogs; i_index ++ )
         {
             interaction_dialog_t *p_dialog = p_interaction->pp_dialogs[i_index];
+
+            // Give default answer
             p_dialog->i_return = DIALOG_DEFAULT;
             if( p_dialog->i_flags & DIALOG_OK_CANCEL )
                 p_dialog->i_return = DIALOG_CANCELLED;
             if( p_dialog->i_flags & DIALOG_YES_NO_CANCEL )
                 p_dialog->i_return = DIALOG_CANCELLED;
-            p_dialog->i_status = ANSWERED_DIALOG;
+
+            // Pretend we have hidden and destroyed it
+            if( p_dialog->i_status == HIDDEN_DIALOG )
+            {
+                p_dialog->i_status = DESTROYED_DIALOG;
+            }
+            else
+            {
+                p_dialog->i_status = HIDING_DIALOG;
+            }
         }
     }
     else
@@ -170,10 +194,14 @@ void intf_InteractionManage( playlist_t *p_playlist )
             }
             break;
         case DESTROYED_DIALOG:
+            msg_Dbg( p_interaction, "Removing dialog %i",
+                                    p_dialog->i_id );
             // Interface has now destroyed it, remove it
-            /// \todo Remove it from the list
-            /// \todo Free data fields
-            free( p_dialog );
+            REMOVE_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs,
+                         i_index);
+            i_index--;
+            intf_InteractionDialogDestroy( p_dialog );
+            break;
         case NEW_DIALOG:
             // This is truly a new dialog, send it.
             p_dialog->i_action = INTERACT_NEW;
@@ -203,6 +231,7 @@ void intf_InteractionManage( playlist_t *p_playlist )
         new->psz_title = NULL;                                          \
         new->psz_description = NULL;                                    \
         new->i_id = 0;                                                  \
+        new->i_flags = 0;                                               \
         new->i_status = NEW_DIALOG;
 
 #define INTERACT_FREE( new )                                            \
@@ -246,6 +275,7 @@ void __intf_UserFatal( vlc_object_t *p_this,
     p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) );
 
     p_widget->i_type = WIDGET_TEXT;
+    p_widget->val.psz_string = NULL;
 
     va_start( args, psz_format );
     vasprintf( &p_widget->psz_text, psz_format, args );
@@ -286,6 +316,7 @@ int __intf_UserLoginPassword( vlc_object_t *p_this,
     p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) );
     p_widget->i_type = WIDGET_TEXT;
     p_widget->psz_text = strdup( psz_description );
+    p_widget->val.psz_string = NULL;
     INSERT_ELEM ( p_new->pp_widgets, p_new->i_widgets,
                   p_new->i_widgets,  p_widget );
 
@@ -309,7 +340,7 @@ int __intf_UserLoginPassword( vlc_object_t *p_this,
 
     i_ret = intf_Interact( p_this, p_new );
 
-    if( i_ret == DIALOG_OK_YES )
+    if( i_ret != DIALOG_CANCELLED )
     {
         *ppsz_login = strdup( p_new->pp_widgets[1]->val.psz_string );
         *ppsz_password = strdup( p_new->pp_widgets[2]->val.psz_string );
@@ -427,6 +458,7 @@ static int intf_WaitAnswer( interaction_t *p_interact, interaction_dialog_t *p_d
     /// \todo Check that the initiating object is not dying
     while( p_dialog->i_status != ANSWERED_DIALOG &&
            p_dialog->i_status != HIDING_DIALOG &&
+           p_dialog->i_status != HIDDEN_DIALOG &&
            !p_dialog->p_parent->b_die )
     {
         msleep( 100000 );
@@ -464,6 +496,8 @@ static int intf_Send( interaction_t *p_interact, interaction_dialog_t *p_dialog
     }
     else
         p_dialog->i_status = UPDATED_DIALOG;
+    // Pretend we already retrieved the "answer"
+    p_dialog->i_flags |= DIALOG_GOT_ANSWER;
     vlc_mutex_unlock( &p_interact->object_lock );
     return VLC_SUCCESS;
 }
@@ -486,3 +520,23 @@ static interaction_dialog_t *intf_InteractionGetById( vlc_object_t* p_this,
     }
     return NULL;
 }
+
+#define FREE( i ) { if( i ) free( i ); i = NULL; }
+
+static void intf_InteractionDialogDestroy( interaction_dialog_t *p_dialog )
+{
+    int i;
+    for( i = p_dialog->i_widgets - 1 ; i >= 0 ; i-- )
+    {
+        user_widget_t *p_widget = p_dialog->pp_widgets[i];
+        FREE( p_widget->psz_text );
+        FREE( p_widget->val.psz_string );
+
+        REMOVE_ELEM( p_dialog->pp_widgets, p_dialog->i_widgets, i );
+        free( p_widget );
+    }
+    FREE( p_dialog->psz_title );
+    FREE( p_dialog->psz_description );
+
+    free( p_dialog );
+}
index 32a4cb1e33516e57099c9792b418517252db9f47..93c2bd901ab8bae3fe81ab77e759b828c46464fb 100644 (file)
@@ -237,6 +237,11 @@ int playlist_Destroy( playlist_t * p_playlist )
                                           p_playlist->pp_sds[0]->psz_module );
     }
 
+    if( p_playlist->p_interaction )
+    {
+        intf_InteractionDestroy( p_playlist->p_interaction );
+    }
+
     vlc_thread_join( p_playlist->p_preparse );
     vlc_thread_join( p_playlist );