-<?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">
<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>
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:
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);
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);
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);
+ }
+}
+
+
<?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>
<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>
<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>
<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>
</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>
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>