Commit 71ea4eb9 authored by Eric Petit's avatar Eric Petit

Move the messages update function to another thread. It prevents it from

 freezing the main window (cannot seek anymore, etc).
parent 2d68f9c1
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* InterfaceWindow.cpp: beos interface * InterfaceWindow.cpp: beos interface
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.cpp,v 1.29 2003/02/09 17:10:52 stippi Exp $ * $Id: InterfaceWindow.cpp,v 1.30 2003/02/10 15:23:46 titer Exp $
* *
* Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -791,11 +791,6 @@ void InterfaceWindow::UpdateInterface() ...@@ -791,11 +791,6 @@ void InterfaceWindow::UpdateInterface()
} }
} }
// strangly, someone is calling this function even after the object has been destructed!
// even more strangly, this workarround seems to work
if (fMessagesWindow)
fMessagesWindow->UpdateMessages();
fLastUpdateTime = system_time(); fLastUpdateTime = system_time();
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* InterfaceWindow.h: BeOS interface window class prototype * InterfaceWindow.h: BeOS interface window class prototype
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.h,v 1.12 2003/02/09 17:10:52 stippi Exp $ * $Id: InterfaceWindow.h,v 1.13 2003/02/10 15:23:46 titer Exp $
* *
* Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au> * Tony Castley <tcastley@mail.powerup.com.au>
...@@ -106,6 +106,7 @@ class InterfaceWindow : public BWindow ...@@ -106,6 +106,7 @@ class InterfaceWindow : public BWindow
bool IsStopped() const; bool IsStopped() const;
MediaControlView* p_mediaControl; MediaControlView* p_mediaControl;
MessagesWindow* fMessagesWindow;
private: private:
void _UpdatePlaylist(); void _UpdatePlaylist();
...@@ -126,7 +127,6 @@ class InterfaceWindow : public BWindow ...@@ -126,7 +127,6 @@ class InterfaceWindow : public BWindow
BFilePanel* fFilePanel; BFilePanel* fFilePanel;
PlayListWindow* fPlaylistWindow; PlayListWindow* fPlaylistWindow;
PreferencesWindow* fPreferencesWindow; PreferencesWindow* fPreferencesWindow;
MessagesWindow* fMessagesWindow;
BMenuBar* fMenuBar; BMenuBar* fMenuBar;
BMenuItem* fGotoMenuMI; BMenuItem* fGotoMenuMI;
BMenuItem* fNextTitleMI; BMenuItem* fNextTitleMI;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* MessagesWindow.cpp: beos interface * MessagesWindow.cpp: beos interface
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: MessagesWindow.cpp,v 1.6 2003/02/01 12:01:11 stippi Exp $ * $Id: MessagesWindow.cpp,v 1.7 2003/02/10 15:23:46 titer Exp $
* *
* Authors: Eric Petit <titer@videolan.org> * Authors: Eric Petit <titer@videolan.org>
* *
...@@ -31,8 +31,11 @@ ...@@ -31,8 +31,11 @@
/* BeOS module headers */ /* BeOS module headers */
#include "VlcWrapper.h" #include "VlcWrapper.h"
#include "InterfaceWindow.h"
#include "MessagesWindow.h" #include "MessagesWindow.h"
static int UpdateMessages( intf_thread_t * p_intf );
/***************************************************************************** /*****************************************************************************
* MessagesWindow::MessagesWindow * MessagesWindow::MessagesWindow
*****************************************************************************/ *****************************************************************************/
...@@ -42,7 +45,6 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf, ...@@ -42,7 +45,6 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf,
B_NOT_ZOOMABLE ) B_NOT_ZOOMABLE )
{ {
this->p_intf = p_intf; this->p_intf = p_intf;
p_sub = p_intf->p_sys->p_sub;
BRect rect, textRect; BRect rect, textRect;
...@@ -62,6 +64,13 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf, ...@@ -62,6 +64,13 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf,
/* start window thread in hidden state */ /* start window thread in hidden state */
Hide(); Hide();
Show(); Show();
/* update it */
if( vlc_thread_create( p_intf, "update messages", UpdateMessages,
VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) )
{
msg_Err( p_intf, "cannot create update messages thread" );
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -69,6 +78,7 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf, ...@@ -69,6 +78,7 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf,
*****************************************************************************/ *****************************************************************************/
MessagesWindow::~MessagesWindow() MessagesWindow::~MessagesWindow()
{ {
vlc_thread_join( p_intf );
} }
/***************************************************************************** /*****************************************************************************
...@@ -101,78 +111,93 @@ void MessagesWindow::ReallyQuit() ...@@ -101,78 +111,93 @@ void MessagesWindow::ReallyQuit()
} }
/***************************************************************************** /*****************************************************************************
* MessagesWindow::UpdateMessages * UpdateMessages
*****************************************************************************/ *****************************************************************************/
void MessagesWindow::UpdateMessages() static int UpdateMessages( intf_thread_t * p_intf )
{ {
int i_start, oldLength; /* workaround: wait a bit or it'll crash */
char * psz_module_type = NULL; msleep( 500000 );
rgb_color red = { 200, 0, 0 };
rgb_color gray = { 150, 150, 150 }; intf_sys_t * p_sys = (intf_sys_t*)p_intf->p_sys;
rgb_color green = { 0, 150, 0 }; msg_subscription_t * p_sub = p_sys->p_sub;
rgb_color orange = { 230, 180, 00 }; MessagesWindow * messagesWindow = p_sys->p_window->fMessagesWindow;
rgb_color color; BTextView * messagesView = messagesWindow->fMessagesView;
BScrollBar * scrollBar = messagesWindow->fScrollBar;
vlc_mutex_lock( p_sub->p_lock );
int i_stop = *p_sub->pi_stop;
vlc_mutex_unlock( p_sub->p_lock );
if( p_sub->i_start != i_stop ) while( !p_intf->b_die )
{ {
for( i_start = p_sub->i_start; int i_start, oldLength;
i_start != i_stop; char * psz_module_type = NULL;
i_start = (i_start+1) % VLC_MSG_QSIZE ) rgb_color red = { 200, 0, 0 };
rgb_color gray = { 150, 150, 150 };
rgb_color green = { 0, 150, 0 };
rgb_color orange = { 230, 180, 00 };
rgb_color color;
vlc_mutex_lock( p_sub->p_lock );
int i_stop = *p_sub->pi_stop;
vlc_mutex_unlock( p_sub->p_lock );
if( p_sub->i_start != i_stop )
{ {
/* Add message */ for( i_start = p_sub->i_start;
switch( p_sub->p_msg[i_start].i_type ) i_start != i_stop;
i_start = (i_start+1) % VLC_MSG_QSIZE )
{ {
case VLC_MSG_INFO: color = green; break; /* Add message */
case VLC_MSG_WARN: color = orange; break; switch( p_sub->p_msg[i_start].i_type )
case VLC_MSG_ERR: color = red; break; {
case VLC_MSG_DBG: color = gray; break; case VLC_MSG_INFO: color = green; break;
} case VLC_MSG_WARN: color = orange; break;
case VLC_MSG_ERR: color = red; break;
case VLC_MSG_DBG: color = gray; break;
}
switch( p_sub->p_msg[i_start].i_object_type ) switch( p_sub->p_msg[i_start].i_object_type )
{ {
case VLC_OBJECT_ROOT: psz_module_type = "root"; break; case VLC_OBJECT_ROOT: psz_module_type = "root"; break;
case VLC_OBJECT_VLC: psz_module_type = "vlc"; break; case VLC_OBJECT_VLC: psz_module_type = "vlc"; break;
case VLC_OBJECT_MODULE: psz_module_type = "module"; break; case VLC_OBJECT_MODULE: psz_module_type = "module"; break;
case VLC_OBJECT_INTF: psz_module_type = "interface"; break; case VLC_OBJECT_INTF: psz_module_type = "interface"; break;
case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break; case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break;
case VLC_OBJECT_ITEM: psz_module_type = "item"; break; case VLC_OBJECT_ITEM: psz_module_type = "item"; break;
case VLC_OBJECT_INPUT: psz_module_type = "input"; break; case VLC_OBJECT_INPUT: psz_module_type = "input"; break;
case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break; case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break;
case VLC_OBJECT_VOUT: psz_module_type = "video output"; break; case VLC_OBJECT_VOUT: psz_module_type = "video output"; break;
case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break; case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break;
case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break; case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break;
} }
if ( fMessagesView->LockLooper() ) if ( messagesView->LockLooper() )
{ {
oldLength = fMessagesView->TextLength(); oldLength = messagesView->TextLength();
BString string; BString string;
string << p_sub->p_msg[i_start].psz_module << " " << psz_module_type << " : " << string << p_sub->p_msg[i_start].psz_module << " " << psz_module_type << " : " <<
p_sub->p_msg[i_start].psz_msg << "\n"; p_sub->p_msg[i_start].psz_msg << "\n";
fMessagesView->Insert( string.String() ); messagesView->Insert( string.String() );
fMessagesView->SetFontAndColor( oldLength, messagesView->SetFontAndColor( oldLength,
fMessagesView->TextLength(), messagesView->TextLength(),
NULL, 0, &color ); NULL, 0, &color );
fMessagesView->Draw( fMessagesView->Bounds() ); messagesView->Draw( messagesView->Bounds() );
fMessagesView->UnlockLooper(); messagesView->UnlockLooper();
} }
/* Scroll at the end */ /* Scroll at the end */
if( fScrollBar->LockLooper() ) if( scrollBar->LockLooper() )
{ {
float min, max; float min, max;
fScrollBar->GetRange( &min, &max ); scrollBar->GetRange( &min, &max );
fScrollBar->SetValue( max ); scrollBar->SetValue( max );
fScrollBar->UnlockLooper(); scrollBar->UnlockLooper();
}
} }
}
vlc_mutex_lock( p_sub->p_lock ); vlc_mutex_lock( p_sub->p_lock );
p_sub->i_start = i_start; p_sub->i_start = i_start;
vlc_mutex_unlock( p_sub->p_lock ); vlc_mutex_unlock( p_sub->p_lock );
}
/* Wait a bit */
msleep( INTF_IDLE_SLEEP );
} }
return 0;
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* MessagesWindow.h * MessagesWindow.h
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: MessagesWindow.h,v 1.2 2003/01/26 08:28:20 titer Exp $ * $Id: MessagesWindow.h,v 1.3 2003/02/10 15:23:46 titer Exp $
* *
* Authors: Eric Petit <titer@videolan.org> * Authors: Eric Petit <titer@videolan.org>
* *
...@@ -36,11 +36,8 @@ class MessagesWindow : public BWindow ...@@ -36,11 +36,8 @@ class MessagesWindow : public BWindow
virtual bool QuitRequested(); virtual bool QuitRequested();
void ReallyQuit(); void ReallyQuit();
void UpdateMessages();
private:
intf_thread_t * p_intf; intf_thread_t * p_intf;
msg_subscription_t * p_sub;
BView * fBackgroundView; BView * fBackgroundView;
BTextView * fMessagesView; BTextView * fMessagesView;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment