X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fbeos%2FMessagesWindow.cpp;h=7884d55da7f681d5dc3ef7ba770b770c274251f6;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=5de3377a65e80a15dad0d43c7a7a41e1f59979ab;hpb=a07642791e0b772455e0034e3365d1dc73db679d;p=vlc diff --git a/modules/gui/beos/MessagesWindow.cpp b/modules/gui/beos/MessagesWindow.cpp index 5de3377a65..7884d55da7 100644 --- a/modules/gui/beos/MessagesWindow.cpp +++ b/modules/gui/beos/MessagesWindow.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * MessagesWindow.cpp: beos interface ***************************************************************************** - * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: MessagesWindow.cpp,v 1.8 2003/05/07 17:27:30 titer Exp $ + * Copyright (C) 1999, 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Eric Petit * @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /* BeOS headers */ @@ -27,53 +27,135 @@ /* VLC headers */ #include -#include +#include /* BeOS module headers */ -#include "VlcWrapper.h" #include "InterfaceWindow.h" #include "MessagesWindow.h" -static int UpdateMessages( intf_thread_t * p_intf ); +/***************************************************************************** + * MessagesView::Pulse + *****************************************************************************/ +void MessagesView::Pulse() +{ + bool isScrolling = false; + if( fScrollBar->LockLooper() ) + { + float min, max; + fScrollBar->GetRange( &min, &max ); + if( fScrollBar->Value() != max ) + isScrolling = true; + fScrollBar->UnlockLooper(); + + } + + int i_start, oldLength; + char * psz_module_type = NULL; + 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 ) + { + for( i_start = p_sub->i_start; + i_start != i_stop; + i_start = (i_start+1) % VLC_MSG_QSIZE ) + { + /* Add message */ + switch( p_sub->p_msg[i_start].i_type ) + { + 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 ) + { + case VLC_OBJECT_ROOT: psz_module_type = "root"; break; + case VLC_OBJECT_VLC: psz_module_type = "vlc"; break; + case VLC_OBJECT_MODULE: psz_module_type = "module"; break; + case VLC_OBJECT_INTF: psz_module_type = "interface"; break; + case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break; + case VLC_OBJECT_ITEM: psz_module_type = "item"; break; + case VLC_OBJECT_INPUT: psz_module_type = "input"; break; + case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break; + case VLC_OBJECT_VOUT: psz_module_type = "video output"; break; + case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break; + case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break; + } + + if( LockLooper() ) + { + oldLength = TextLength(); + BString string; + string << p_sub->p_msg[i_start].psz_module + << " " << psz_module_type << " : " + << p_sub->p_msg[i_start].psz_msg << "\n"; + Insert( TextLength(), string.String(), strlen( string.String() ) ); + SetFontAndColor( oldLength, TextLength(), NULL, 0, &color ); + Draw( Bounds() ); + UnlockLooper(); + } + } + + vlc_mutex_lock( p_sub->p_lock ); + p_sub->i_start = i_start; + vlc_mutex_unlock( p_sub->p_lock ); + } + + /* Scroll at the end unless the is user is scrolling or selecting something */ + int32 start, end; + GetSelection( &start, &end ); + if( !isScrolling && start == end && fScrollBar->LockLooper() ) + { + float min, max; + fScrollBar->GetRange( &min, &max ); + fScrollBar->SetValue( max ); + fScrollBar->UnlockLooper(); + } + + BTextView::Pulse(); +} /***************************************************************************** * MessagesWindow::MessagesWindow *****************************************************************************/ -MessagesWindow::MessagesWindow( intf_thread_t * p_intf, +MessagesWindow::MessagesWindow( intf_thread_t * _p_intf, BRect frame, const char * name ) - : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, - B_NOT_ZOOMABLE ) + : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, + B_NOT_ZOOMABLE ), + p_intf(_p_intf) { - this->p_intf = p_intf; - - SetSizeLimits( 200, 2000, 200, 2000 ); - - BRect rect, textRect; - - rect = Bounds(); - rect.right -= B_V_SCROLL_BAR_WIDTH; - textRect = rect; - textRect.InsetBy( 5, 5 ); - fMessagesView = new BTextView( rect, "messages", textRect, - B_FOLLOW_ALL, B_WILL_DRAW ); - fMessagesView->MakeEditable( false ); - fMessagesView->MakeSelectable( false ); - fMessagesView->SetStylable( true ); - fScrollView = new BScrollView( "scrollview", fMessagesView, B_WILL_DRAW, - B_FOLLOW_ALL, false, true ); - fScrollBar = fScrollView->ScrollBar( B_VERTICAL ); - AddChild( fScrollView ); - + SetSizeLimits( 400, 2000, 200, 2000 ); + + p_sub = msg_Subscribe( p_intf, MSG_QUEUE_NORMAL ); + + BRect rect, textRect; + + rect = Bounds(); + rect.right -= B_V_SCROLL_BAR_WIDTH; + textRect = rect; + textRect.InsetBy( 5, 5 ); + fMessagesView = new MessagesView( p_sub, + rect, "messages", textRect, + B_FOLLOW_ALL, B_WILL_DRAW ); + fMessagesView->MakeEditable( false ); + fMessagesView->SetStylable( true ); + fScrollView = new BScrollView( "scrollview", fMessagesView, B_WILL_DRAW, + B_FOLLOW_ALL, false, true ); + fMessagesView->fScrollBar = fScrollView->ScrollBar( B_VERTICAL ); + AddChild( fScrollView ); + /* start window thread in hidden state */ Hide(); 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" ); - } } /***************************************************************************** @@ -81,14 +163,15 @@ MessagesWindow::MessagesWindow( intf_thread_t * p_intf, *****************************************************************************/ MessagesWindow::~MessagesWindow() { - vlc_thread_join( p_intf ); + msg_Unsubscribe( p_intf, p_sub ); } /***************************************************************************** * MessagesWindow::FrameResized *****************************************************************************/ -void MessagesWindow::FrameResized( float, float ) +void MessagesWindow::FrameResized( float width, float height ) { + BWindow::FrameResized( width, height ); BRect rect = fMessagesView->Bounds(); rect.InsetBy( 5, 5 ); fMessagesView->SetTextRect( rect ); @@ -112,96 +195,3 @@ void MessagesWindow::ReallyQuit() Hide(); Quit(); } - -/***************************************************************************** - * UpdateMessages - *****************************************************************************/ -static int UpdateMessages( intf_thread_t * p_intf ) -{ - /* workaround: wait a bit or it'll crash */ - msleep( 500000 ); - - intf_sys_t * p_sys = (intf_sys_t*)p_intf->p_sys; - msg_subscription_t * p_sub = p_sys->p_sub; - MessagesWindow * messagesWindow = p_sys->p_window->fMessagesWindow; - BTextView * messagesView = messagesWindow->fMessagesView; - BScrollBar * scrollBar = messagesWindow->fScrollBar; - - while( !p_intf->b_die ) - { - int i_start, oldLength; - char * psz_module_type = NULL; - 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 ) - { - for( i_start = p_sub->i_start; - i_start != i_stop; - i_start = (i_start+1) % VLC_MSG_QSIZE ) - { - /* Add message */ - switch( p_sub->p_msg[i_start].i_type ) - { - 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 ) - { - case VLC_OBJECT_ROOT: psz_module_type = "root"; break; - case VLC_OBJECT_VLC: psz_module_type = "vlc"; break; - case VLC_OBJECT_MODULE: psz_module_type = "module"; break; - case VLC_OBJECT_INTF: psz_module_type = "interface"; break; - case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break; - case VLC_OBJECT_ITEM: psz_module_type = "item"; break; - case VLC_OBJECT_INPUT: psz_module_type = "input"; break; - case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break; - case VLC_OBJECT_VOUT: psz_module_type = "video output"; break; - case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break; - case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break; - } - - if ( messagesView->LockLooper() ) - { - oldLength = messagesView->TextLength(); - BString string; - string << p_sub->p_msg[i_start].psz_module << " " << psz_module_type << " : " << - p_sub->p_msg[i_start].psz_msg << "\n"; - messagesView->Insert( string.String() ); - messagesView->SetFontAndColor( oldLength, - messagesView->TextLength(), - NULL, 0, &color ); - messagesView->Draw( messagesView->Bounds() ); - messagesView->UnlockLooper(); - } - - /* Scroll at the end */ - - if( scrollBar->LockLooper() ) - { - float min, max; - scrollBar->GetRange( &min, &max ); - scrollBar->SetValue( max ); - scrollBar->UnlockLooper(); - } - } - - vlc_mutex_lock( p_sub->p_lock ); - p_sub->i_start = i_start; - vlc_mutex_unlock( p_sub->p_lock ); - } - /* Wait a bit */ - msleep( INTF_IDLE_SLEEP ); - } - return 0; -}