From c79c85835a253aff55e49f917f2f7c6fb69d31df Mon Sep 17 00:00:00 2001 From: Simon Morlat <simon.morlat@linphone.org> Date: Mon, 6 Feb 2012 13:20:40 +0100 Subject: [PATCH] improve log window --- gtk/log.ui | 96 +++++++++++++++++++---------- gtk/logging.c | 56 +++++++++++++---- gtk/parameters.ui | 149 +++++++++++++++++++++------------------------- 3 files changed, 179 insertions(+), 122 deletions(-) diff --git a/gtk/log.ui b/gtk/log.ui index 1192534a4a..4fe887e26b 100644 --- a/gtk/log.ui +++ b/gtk/log.ui @@ -1,50 +1,60 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> <object class="GtkDialog" id="log"> <property name="width_request">540</property> <property name="height_request">290</property> + <property name="can_focus">False</property> <property name="border_width">5</property> <property name="title" translatable="yes">Linphone debug window</property> <property name="window_position">center-on-parent</property> <property name="type_hint">normal</property> <property name="deletable">False</property> - <property name="has_separator">False</property> - <signal name="response" handler="gtk_widget_hide"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox1"> + <object class="GtkBox" id="dialog-vbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> - <property name="window_placement">bottom-left</property> - <property name="window_placement_set">True</property> - <property name="shadow_type">in</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <property name="layout_style">spread</property> <child> - <object class="GtkTextView" id="textview"> + <object class="GtkCheckButton" id="scroll_to_end"> + <property name="label" translatable="yes">Scroll to end</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="wrap_mode">word</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="xalign">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="linphone_gtk_log_scroll_to_end" swapped="no"/> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> <child> - <placeholder/> + <object class="GtkButton" id="button2"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="linphone_gtk_log_clear" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> <child> <object class="GtkButton" id="button1"> @@ -52,25 +62,51 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="linphone_gtk_log_hide"/> + <signal name="clicked" handler="linphone_gtk_log_hide" swapped="no"/> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> + <property name="fill">True</property> + <property name="position">2</property> </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="pack_type">end</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> + <property name="window_placement">bottom-left</property> + <property name="window_placement_set">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTextView" id="textview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + <property name="wrap_mode">word</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> </object> </child> <action-widgets> + <action-widget response="0">scroll_to_end</action-widget> + <action-widget response="0">button2</action-widget> <action-widget response="0">button1</action-widget> </action-widgets> </object> diff --git a/gtk/logging.c b/gtk/logging.c index ebadeedfc0..e2a9da600a 100644 --- a/gtk/logging.c +++ b/gtk/logging.c @@ -239,18 +239,12 @@ void linphone_gtk_log_show(void){ gtk_window_present(GTK_WINDOW(log_window)); } -static void linphone_gtk_display_log(OrtpLogLevel lev, const char *msg){ +static void linphone_gtk_display_log(GtkTextView *v, OrtpLogLevel lev, const char *msg){ GtkTextIter iter,begin; int off; - static GtkTextView *v=NULL; GtkTextBuffer *b; const char *lname="undef"; - if (log_window==NULL) { - return; - } - - if (v==NULL) v=GTK_TEXT_VIEW(linphone_gtk_get_widget(log_window,"textview")); b=gtk_text_view_get_buffer(v); switch(lev){ case ORTP_DEBUG: @@ -285,10 +279,7 @@ static void linphone_gtk_display_log(OrtpLogLevel lev, const char *msg){ gtk_text_buffer_get_iter_at_offset(b,&begin,off); if (lev==ORTP_ERROR || lev==ORTP_FATAL) gtk_text_buffer_apply_tag_by_name(b,"red",&begin,&iter); else if (lev==ORTP_WARNING) gtk_text_buffer_apply_tag_by_name(b,"orange",&begin,&iter); - /* - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_view_scroll_to_iter(v,&iter,0,FALSE,0,0); - */ + while(gtk_text_buffer_get_char_count(b)>LOG_MAX_CHARS){ GtkTextIter iter_line_after; gtk_text_buffer_get_start_iter(b,&iter); @@ -297,23 +288,50 @@ static void linphone_gtk_display_log(OrtpLogLevel lev, const char *msg){ gtk_text_buffer_delete(b,&iter,&iter_line_after); } } + +} + +static void stick_to_end(GtkTextView *v){ + GtkTextBuffer *b; + GtkTextIter iter; + b=gtk_text_view_get_buffer(v); + gtk_text_buffer_get_end_iter(b,&iter); + gtk_text_view_scroll_to_iter(v,&iter,0,FALSE,1.0,0); +} + +void linphone_gtk_log_scroll_to_end(GtkToggleButton *button){ + if (gtk_toggle_button_get_active(button)){ + GtkTextView *v=GTK_TEXT_VIEW(linphone_gtk_get_widget(log_window,"textview")); + stick_to_end(v); + } } +/* + * called from Gtk main loop. +**/ gboolean linphone_gtk_check_logs(){ GList *elem; + GtkTextView *v=NULL; + if (log_window) v=GTK_TEXT_VIEW(linphone_gtk_get_widget(log_window,"textview")); g_static_mutex_lock(&log_mutex); for(elem=log_queue;elem!=NULL;elem=elem->next){ LinphoneGtkLog *lgl=(LinphoneGtkLog*)elem->data; - linphone_gtk_display_log(lgl->lev,lgl->msg); + if (v) linphone_gtk_display_log(v,lgl->lev,lgl->msg); g_free(lgl->msg); g_free(lgl); } if (log_queue) g_list_free(log_queue); log_queue=NULL; g_static_mutex_unlock(&log_mutex); + if (v) + linphone_gtk_log_scroll_to_end(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(log_window,"scroll_to_end"))); return TRUE; } + +/* + * Called from any linphone thread. + */ void linphone_gtk_log_push(OrtpLogLevel lev, const char *fmt, va_list args){ gchar *msg=g_strdup_vprintf(fmt,args); LinphoneGtkLog *lgl=g_new(LinphoneGtkLog,1); @@ -325,3 +343,17 @@ void linphone_gtk_log_push(OrtpLogLevel lev, const char *fmt, va_list args){ g_static_mutex_unlock(&log_mutex); } +void linphone_gtk_log_clear(void){ + if (log_window){ + GtkTextIter end,begin; + GtkTextView *v; + GtkTextBuffer *b; + v=GTK_TEXT_VIEW(linphone_gtk_get_widget(log_window,"textview")); + b=gtk_text_view_get_buffer(v); + gtk_text_buffer_get_start_iter(b,&begin); + gtk_text_buffer_get_end_iter(b,&end); + gtk_text_buffer_delete(b,&begin,&end); + } +} + + diff --git a/gtk/parameters.ui b/gtk/parameters.ui index dcea80e264..4a6748f763 100644 --- a/gtk/parameters.ui +++ b/gtk/parameters.ui @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <interface> <requires lib="gtk+" version="2.18"/> - <!-- interface-naming-policy toplevel-contextual --> <object class="GtkAdjustment" id="adjustment1"> <property name="lower">500</property> <property name="upper">3001</property> @@ -48,12 +47,22 @@ <property name="step_increment">1</property> <property name="page_increment">9.9999999995529656</property> </object> + <object class="GtkAdjustment" id="adjustment_audio_port"> + <property name="upper">65535</property> + <property name="step_increment">2</property> + <property name="page_increment">10</property> + </object> <object class="GtkAdjustment" id="adjustment_tcp_port"> <property name="upper">65535</property> <property name="value">1</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> + <object class="GtkAdjustment" id="adjustment_video_port"> + <property name="upper">65535</property> + <property name="step_increment">2</property> + <property name="page_increment">10</property> + </object> <object class="GtkListStore" id="liststore1"/> <object class="GtkListStore" id="model1"> <columns> @@ -215,8 +224,6 @@ <property name="can_focus">True</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <property name="adjustment">adjustment1</property> <signal name="value-changed" handler="linphone_gtk_mtu_changed" swapped="no"/> </object> @@ -327,8 +334,6 @@ <property name="invisible_char_set">True</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <property name="adjustment">adjustment7</property> </object> <packing> @@ -337,62 +342,60 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="video_rtp_port"> + <object class="GtkLabel" id="media_encryption_label"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="primary_icon_activatable">False</property> - <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Media encryption type</property> </object> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> </packing> </child> <child> - <object class="GtkSpinButton" id="audio_rtp_port"> + <object class="GtkComboBox" id="media_encryption_combo"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="invisible_char">•</property> - <property name="invisible_char_set">True</property> - <property name="primary_icon_activatable">False</property> - <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> - <property name="adjustment">adjustment3</property> - <signal name="value-changed" handler="linphone_gtk_audio_port_changed" swapped="no"/> + <property name="can_focus">False</property> + <property name="active">0</property> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> </packing> </child> <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> + <object class="GtkLabel" id="tunnel_label"> <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">Video RTP/UDP:</property> - <property name="justify">right</property> + <property name="label" translatable="yes">Tunnel</property> </object> <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> </packing> </child> <child> - <object class="GtkLabel" id="label6"> + <object class="GtkButton" id="tunnel_edit_button"> + <property name="label" translatable="yes">edit</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="linphone_gtk_edit_tunnel" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">Audio RTP/UDP:</property> + <property name="label" translatable="yes">Video RTP/UDP:</property> <property name="justify">right</property> </object> <packing> @@ -401,52 +404,48 @@ </packing> </child> <child> - <object class="GtkLabel" id="media_encryption_label"> + <object class="GtkLabel" id="label6"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Media encryption type</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Audio RTP/UDP:</property> + <property name="justify">right</property> </object> <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> </packing> </child> <child> - <object class="GtkComboBox" id="media_encryption_combo"> + <object class="GtkSpinButton" id="audio_rtp_port"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="active">0</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="adjustment">adjustment_audio_port</property> + <property name="numeric">True</property> + <signal name="value-changed" handler="linphone_gtk_audio_port_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="tunnel_label"> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Tunnel</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> </packing> </child> <child> - <object class="GtkButton" id="tunnel_edit_button"> - <property name="label" translatable="yes">edit</property> + <object class="GtkSpinButton" id="video_rtp_port"> + <property name="visible">True</property> <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_action_appearance">False</property> - <signal name="clicked" handler="linphone_gtk_edit_tunnel" swapped="no"/> + <property name="invisible_char">•</property> + <property name="adjustment">adjustment_video_port</property> + <property name="numeric">True</property> + <signal name="value-changed" handler="linphone_gtk_video_port_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> </packing> </child> </object> @@ -545,8 +544,6 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="linphone_gtk_nat_address_changed" swapped="no"/> </object> <packing> @@ -617,8 +614,6 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="linphone_gtk_stun_server_changed" swapped="no"/> </object> <packing> @@ -786,8 +781,6 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <signal name="editing-done" handler="linphone_gtk_alsa_special_device_changed" swapped="no"/> </object> <packing> @@ -1138,8 +1131,6 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="linphone_gtk_update_my_contact" swapped="no"/> </object> <packing> @@ -1178,8 +1169,6 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="linphone_gtk_update_my_contact" swapped="no"/> </object> <packing> @@ -1197,8 +1186,6 @@ <property name="editable">False</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> </object> <packing> <property name="left_attach">1</property> @@ -1255,6 +1242,9 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> </object> </child> </object> @@ -1720,6 +1710,9 @@ virtual network !</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="has_tooltip">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection2"/> + </child> </object> </child> </object> @@ -1926,8 +1919,6 @@ virtual network !</property> <property name="tooltip_text" translatable="yes">0 stands for "unlimited"</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <property name="adjustment">adjustment5</property> <signal name="value-changed" handler="linphone_gtk_upload_bw_changed" swapped="no"/> </object> @@ -1948,8 +1939,6 @@ virtual network !</property> <property name="tooltip_text" translatable="yes">0 stands for "unlimited"</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> <property name="adjustment">adjustment6</property> <signal name="value-changed" handler="linphone_gtk_download_bw_changed" swapped="no"/> </object> -- GitLab