diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 9243be084..a714ad7f7 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1732,12 +1732,17 @@ const LinphoneCallStats *linphone_call_get_video_stats(const LinphoneCall *call) * @} **/ -static void display_bandwidth(RtpSession *as, RtpSession *vs){ +static void report_bandwidth(LinphoneCall *call, RtpSession *as, RtpSession *vs){ + call->stats[LINPHONE_CALL_STATS_AUDIO].download_bandwidth=(as!=NULL) ? (rtp_session_compute_recv_bandwidth(as)*1e-3) : 0; + call->stats[LINPHONE_CALL_STATS_AUDIO].upload_bandwidth=(as!=NULL) ? (rtp_session_compute_send_bandwidth(as)*1e-3) : 0; + call->stats[LINPHONE_CALL_STATS_VIDEO].download_bandwidth=(vs!=NULL) ? (rtp_session_compute_recv_bandwidth(vs)*1e-3) : 0; + call->stats[LINPHONE_CALL_STATS_VIDEO].upload_bandwidth=(vs!=NULL) ? (rtp_session_compute_send_bandwidth(vs)*1e-3) : 0; ms_message("bandwidth usage: audio=[d=%.1f,u=%.1f] video=[d=%.1f,u=%.1f] kbit/sec", - (as!=NULL) ? (rtp_session_compute_recv_bandwidth(as)*1e-3) : 0, - (as!=NULL) ? (rtp_session_compute_send_bandwidth(as)*1e-3) : 0, - (vs!=NULL) ? (rtp_session_compute_recv_bandwidth(vs)*1e-3) : 0, - (vs!=NULL) ? (rtp_session_compute_send_bandwidth(vs)*1e-3) : 0); + call->stats[LINPHONE_CALL_STATS_AUDIO].download_bandwidth, + call->stats[LINPHONE_CALL_STATS_AUDIO].upload_bandwidth , + call->stats[LINPHONE_CALL_STATS_VIDEO].download_bandwidth, + call->stats[LINPHONE_CALL_STATS_VIDEO].upload_bandwidth + ); } static void linphone_core_disconnected(LinphoneCore *lc, LinphoneCall *call){ @@ -1848,7 +1853,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse video_load=ms_ticker_get_average_load(call->videostream->ticker); vs=call->videostream->session; } - display_bandwidth(as,vs); + report_bandwidth(call,as,vs); ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load); } #ifdef VIDEO_ENABLED diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index acf81f1df..9a5792a75 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -304,6 +304,8 @@ struct _LinphoneCallStats { mblk_t* sent_rtcp;/** + + + + + False + 5 + Call statistics + dialog + + + + True + False + 2 + + + True + False + end + + + + + + gtk-close + True + True + True + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + False + 6 + 2 + True + + + True + False + Audio codec + + + + + + + + True + False + Video codec + + + 1 + 2 + + + + + + True + False + Audio IP bandwidth usage + + + 2 + 3 + + + + + + True + False + + + 1 + 2 + + + + + True + False + + + 1 + 2 + 1 + 2 + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + True + False + Media connectivity + + + 4 + 5 + + + + + + + + + + + + True + False + + + 1 + 2 + 4 + 5 + + + + + True + False + Video IP bandwidth usage + + + 3 + 4 + + + + + + True + False + + + 1 + 2 + 3 + 4 + + + + + + + + + True + False + <b>Call statistics and information</b> + True + + + + + False + False + 1 + + + + + + button1 + + + diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 7e8eb683f..90c080be1 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -193,6 +193,100 @@ void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value){ } } +static void show_used_codecs(GtkWidget *callstats, LinphoneCall *call){ + const LinphoneCallParams *params=linphone_call_get_current_params(call); + if (params){ + const PayloadType *acodec=linphone_call_params_get_used_audio_codec(params); + const PayloadType *vcodec=linphone_call_params_get_used_video_codec(params); + GtkWidget *acodec_ui=linphone_gtk_get_widget(callstats,"audio_codec"); + GtkWidget *vcodec_ui=linphone_gtk_get_widget(callstats,"video_codec"); + if (acodec){ + + char tmp[64]={0}; + snprintf(tmp,sizeof(tmp)-1,"%s/%i/%i",acodec->mime_type,acodec->clock_rate,acodec->channels); + gtk_label_set_label(GTK_LABEL(acodec_ui),tmp); + }else gtk_label_set_label(GTK_LABEL(acodec_ui),_("Not used")); + if (vcodec){ + gtk_label_set_label(GTK_LABEL(vcodec_ui),vcodec->mime_type); + }else gtk_label_set_label(GTK_LABEL(vcodec_ui),_("Not used")); + } +} + +static const char *ice_state_to_string(LinphoneIceState ice_state){ + switch(ice_state){ + case LinphoneIceStateNotActivated: + return _("Ice not activated"); + case LinphoneIceStateInProgress: + return _("ICE in progress"); + case LinphoneIceStateReflexiveConnection: + return _("Going through one or more NATs"); + case LinphoneIceStateHostConnection: + return _("Direct"); + case LinphoneIceStateRelayConnection: + return _("Through a relay server"); + } + return "invalid"; +} + +static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){ + const LinphoneCallStats *as=linphone_call_get_audio_stats(call); + const LinphoneCallStats *vs=linphone_call_get_video_stats(call); + LinphoneIceState ice_state=as->ice_state; + gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"), + as->download_bandwidth,as->upload_bandwidth); + gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp); + g_free(tmp); + tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"), + vs->download_bandwidth,vs->upload_bandwidth); + gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp); + g_free(tmp); + gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"media_connectivity")),ice_state_to_string(ice_state)); +} + +static gboolean refresh_call_stats(GtkWidget *callstats){ + LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(callstats),"call"); + switch (linphone_call_get_state(call)){ + case LinphoneCallError: + case LinphoneCallEnd: + case LinphoneCallReleased: + gtk_widget_destroy(callstats); + return FALSE; + break; + case LinphoneCallStreamsRunning: + _refresh_call_stats(callstats,call); + break; + default: + break; + } + return TRUE; +} + +static void on_call_stats_destroyed(GtkWidget *call_view){ + GtkWidget *call_stats=(GtkWidget*)g_object_get_data(G_OBJECT(call_view),"call_stats"); + LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(call_stats),"call"); + g_source_remove(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(call_stats),"tid"))); + g_object_set_data(G_OBJECT(call_view),"call_stats",NULL); + linphone_call_unref(call); +} + +static void linphone_gtk_show_call_stats(LinphoneCall *call){ + GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); + GtkWidget *call_stats=(GtkWidget*)g_object_get_data(G_OBJECT(w),"call_stats"); + if (call_stats==NULL){ + guint tid; + call_stats=linphone_gtk_create_window("call_statistics"); + g_object_set_data(G_OBJECT(w),"call_stats",call_stats); + g_object_set_data(G_OBJECT(call_stats),"call",linphone_call_ref(call)); + tid=g_timeout_add(1000,(GSourceFunc)refresh_call_stats,call_stats); + g_object_set_data(G_OBJECT(call_stats),"tid",GINT_TO_POINTER(tid)); + g_signal_connect_swapped(G_OBJECT(call_stats),"destroy",(GCallback)on_call_stats_destroyed,(gpointer)w); + show_used_codecs(call_stats,call); + refresh_call_stats(call_stats); + gtk_widget_show(call_stats); + } + +} + void linphone_gtk_create_in_call_view(LinphoneCall *call){ GtkWidget *call_view=linphone_gtk_create_widget("main","in_call_frame"); GtkWidget *main_window=linphone_gtk_get_main_window (); @@ -217,6 +311,7 @@ void linphone_gtk_create_in_call_view(LinphoneCall *call){ linphone_gtk_enable_hold_button (call,FALSE,TRUE); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(call_view,"incall_mute")),FALSE); + g_signal_connect_swapped(G_OBJECT(linphone_gtk_get_widget(call_view,"quality_indicator")),"button-press-event",(GCallback)linphone_gtk_show_call_stats,call); } static void video_button_clicked(GtkWidget *button, LinphoneCall *call){ @@ -506,6 +601,7 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ GtkWidget *duration=linphone_gtk_get_widget(callview,"in_call_duration"); guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid")); gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call)); + GtkWidget *call_stats=(GtkWidget*)g_object_get_data(G_OBJECT(callview),"call_stats"); display_peer_name_in_label(callee,linphone_call_get_remote_address (call)); @@ -524,6 +620,7 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ linphone_gtk_in_call_view_enable_audio_view(call, !in_conf); linphone_gtk_in_call_view_show_encryption(call); if (in_conf) linphone_gtk_set_in_conference(call); + if (call_stats) show_used_codecs(call_stats,call); } void linphone_gtk_in_call_view_set_paused(LinphoneCall *call){ @@ -676,3 +773,8 @@ void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gbo gtk_widget_set_visible(GTK_WIDGET(button),sensitive); linphone_gtk_draw_hold_button(GTK_BUTTON(button),!holdon); } + +void linphone_gtk_call_statistics_closed(GtkWidget *call_stats){ + gtk_widget_destroy(call_stats); +} + diff --git a/gtk/main.ui b/gtk/main.ui index 9a458dbc0..a57b79966 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -1,27 +1,49 @@ - + + False True + False 0 none True + False 12 True + False True + False + + + True + False + <b>Callee name</b> + True + right + end + + + True + True + end + 0 + + True True + False False @@ -29,21 +51,10 @@ 1 - - - True - <b>Callee name</b> - True - right - end - - - end - 0 - - + True + True 0 @@ -52,6 +63,7 @@ 170 30 True + False False @@ -71,21 +83,26 @@ + False + False 0.5 none True + False 12 12 True + False True + False @@ -99,18 +116,23 @@ True + False label center + True + True 1 + False True + False gtk-dialog-authentication 1 @@ -123,6 +145,7 @@ True + False gtk-apply @@ -134,9 +157,12 @@ True + False label + True + True 2 @@ -146,7 +172,8 @@ True True True - + False + False @@ -163,14 +190,17 @@ + False True True + False half - + + True False 0 @@ -178,6 +208,7 @@ True + False False @@ -188,10 +219,12 @@ True + False gtk-missing-image 1 + True False 2 @@ -199,6 +232,7 @@ True + False False @@ -216,6 +250,7 @@ + False spread @@ -223,7 +258,8 @@ True True True - + False + False @@ -237,7 +273,8 @@ True True True - + False + False @@ -255,6 +292,7 @@ True + False True spread @@ -262,7 +300,8 @@ Pause True True - + False + False @@ -276,6 +315,7 @@ True True True + False False @@ -297,34 +337,45 @@ True + False True True + False In call True center + True + True 0 True + False Duration center + True + True 1 True + False + GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK Call quality rating + True + True 2 @@ -335,52 +386,1409 @@ True + False gtk-info True + False gtk-add True + False gtk-clear True + False gtk-connect True + False gtk-refresh True + False gtk-properties True + False gtk-home True + False gtk-execute True + False gtk-add True + False gtk-add True + False gtk-add True + False gtk-add + + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + + + True + False + False + _Options + True + + + + True + False + + + gtk-preferences + True + False + False + True + True + + + + + + gtk-disconnect + False + False + True + True + + + + + + True + False + + + + + True + False + False + Always start video + True + + + + + + True + False + False + Enable self-view + True + True + + + + + + True + False + + + + + gtk-quit + False + False + True + True + + + + + + + + + + True + False + False + _Help + True + + + True + False + + + gtk-about + True + False + False + True + True + + + + + + Show debug window + True + False + False + image1 + False + + + + + + _Homepage + True + False + False + True + image4 + False + + + + + + Check _Updates + False + False + True + image5 + False + + + + + + Account assistant + False + False + image12 + False + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + + + True + True + True + False + + + + False + False + 0 + + + + + True + True + Initiate a new call + False + + + + False + False + 1 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + none + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + 5 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + True + Enter username, phone number, or full sip address + + False + False + True + True + + + + True + True + 0 + + + + + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + SIP address or phone number: + True + + + + + True + True + 2 + + + + + True + True + True + False + + + + False + False + 3 + + + + + False + True + 8 + 0 + + + + + True + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Lookup: + + + True + True + 12 + 0 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True + False + False + True + True + + + + True + True + 4 + 1 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + in + + + True + True + 8 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + model1 + 0 + + + + + 0 + + + + + True + True + 4 + 3 + + + + + False + True + 0 + + + + + True + True + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + 0 + + + + + + + + + True + True + 1 + + + + + False + 0 + none + + + False + + + True + True + + True + False + False + True + True + + + + + + + True + True + 0 + + + + + True + True + True + False + none + + + + True + False + + + True + False + gtk-find + + + True + True + 0 + + + + + True + False + Search + + + True + True + 1 + + + + + + + False + True + 1 + + + + + + + True + False + <b>Add contacts from directory</b> + True + + + + + False + False + 5 + 2 + + + + + True + False + + + Add contact + True + True + False + image10 + + + + False + False + 0 + + + + + False + False + 3 + + + + + True + True + 0 + + + + + + + True + False + + + True + False + gtk-directory + 1 + + + True + True + 0 + + + + + True + False + Contacts + + + True + True + 1 + + + + + False + + + + + True + False + + + True + False + 2 + + + True + False + end + + + gtk-clear + True + True + True + False + True + + + + False + False + 0 + + + + + + + + + + + False + True + end + 0 + + + + + True + True + never + + + True + True + False + + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + 1 + + + + + True + False + + + True + False + gtk-refresh + 1 + + + True + True + 0 + + + + + True + False + 0.49000000953674316 + Recent calls + + + True + True + 1 + + + + + 1 + False + + + + + True + False + 0.5 + none + + + True + False + 0 + 0 + + + True + False + 0 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 4 + 4 + 4 + True + + + D + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 3 + 4 + + + + + # + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 3 + 4 + + + + + 0 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 3 + 4 + + + + + * + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + + + + + C + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 2 + 3 + + + + + 9 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 2 + 3 + + + + + 8 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 2 + 3 + + + + + 7 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + + + + + B + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 1 + 2 + + + + + 6 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 1 + 2 + + + + + 5 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 1 + 2 + + + + + 4 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + + + + + A + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + + + + + 3 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + + + + + 2 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + + + + + 1 + 40 + 40 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + + + + + + + + + + + + 2 + + + + + True + False + + + True + False + gtk-missing-image + 1 + + + True + True + 0 + + + + + True + False + Keypad + + + True + True + 1 + + + + + 2 + False + + + + + True + True + 1 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + none + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + model3 + 0 + + + + + 0 + + + + + + + True + False + 5 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + My current identity: + True + + + True + True + 0 + + + + + True + True + False + none + + + + True + False + gtk-refresh + + + + + True + True + 1 + + + + + + + False + False + 2 + + + + + True + True + 0 + + + + + False + 0 + etched-out + + + True + False + 12 + + + True + False + + + True + False + gtk-missing-image + + + True + True + 0 + + + + + True + False + 0 + none + + + True + False + 12 + 12 + + + True + False + 4 + 2 + + + True + False + Username + + + + + True + False + Password + + + 1 + 2 + + + + + True + False + Internet connection: + + + 2 + 3 + + + + + True + True + + False + False + True + True + + + 1 + 2 + + + + + True + True + False + + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + model4 + 0 + + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + Automatically log me in + True + True + False + False + True + + + 1 + 2 + 3 + 4 + + + + + + + + + + + + True + False + Login information + True + + + + + True + True + 10 + 1 + + + + + True + False + + + gtk-connect + True + True + True + False + True + + + + False + False + 0 + + + + + True + True + 2 + + + + + + + + + True + False + <b>Welcome !</b> + True + + + + + True + True + 1 + + + + + True + True + 1 + + + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + True + 0 + + + + + True + True + True + False + none + + + + False + True + 5 + 1 + + + + + False + False + 2 + + + + + @@ -434,1151 +1842,4 @@ - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - - - True - _Options - True - - - - True - - - gtk-preferences - True - True - True - - - - - - gtk-disconnect - True - True - - - - - - True - - - - - True - Always start video - True - - - - - - True - Enable self-view - True - True - - - - - - True - - - - - gtk-quit - True - True - - - - - - - - - - True - _Help - True - - - True - - - gtk-about - True - True - True - - - - - - Show debug window - True - image1 - False - - - - - - _Homepage - True - True - image4 - False - - - - - - Check _Updates - True - image5 - False - - - - - - Account assistant - image12 - False - - - - - - - - - - False - 0 - - - - - True - - - True - - - True - - - True - True - True - - - - False - False - 0 - - - - - True - True - Initiate a new call - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - none - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 5 - 5 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - True - Enter username, phone number, or full sip address - - - - - 0 - - - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - SIP address or phone number: - True - - - - - 2 - - - - - True - True - True - - - - False - False - 3 - - - - - False - 8 - 0 - - - - - True - True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Lookup: - - - 12 - 0 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - True - - - - 4 - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - in - - - 8 - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - model1 - 0 - - - - - 0 - - - - - 4 - 3 - - - - - False - 0 - - - - - True - True - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - 0 - - - - - - - - - 1 - - - - - 0 - none - - - - - True - True - - True - - - - - - - 0 - - - - - True - True - True - none - - - - True - - - True - gtk-find - - - 0 - - - - - True - Search - - - 1 - - - - - - - False - 1 - - - - - - - True - <b>Add contacts from directory</b> - True - - - - - False - False - 5 - 2 - - - - - True - - - Add contact - True - True - image10 - - - - False - False - 0 - - - - - False - False - 3 - - - - - 0 - - - - - - - True - - - True - gtk-directory - 1 - - - 0 - - - - - True - Contacts - - - 1 - - - - - False - - - - - True - - - True - 2 - - - True - True - never - - - True - True - False - - - - - - - 1 - - - - - True - end - - - gtk-clear - True - True - True - True - - - - False - False - 0 - - - - - - - - - - - False - end - 0 - - - - - 0 - - - - - 1 - - - - - True - - - True - gtk-refresh - 1 - - - 0 - - - - - True - 0.49000000953674316 - Recent calls - - - 1 - - - - - 1 - False - - - - - True - 0.5 - none - - - True - 0 - 0 - - - True - 0 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 4 - 4 - 4 - True - - - D - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - 4 - 3 - 4 - - - - - # - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - 3 - 3 - 4 - - - - - 0 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - 3 - 4 - - - - - * - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - 4 - - - - - C - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - 4 - 2 - 3 - - - - - 9 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - 3 - 2 - 3 - - - - - 8 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - 2 - 3 - - - - - 7 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - 3 - - - - - B - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - 4 - 1 - 2 - - - - - 6 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - 3 - 1 - 2 - - - - - 5 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - 1 - 2 - - - - - 4 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - - - - - A - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - 4 - - - - - 3 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - 3 - - - - - 2 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - - - - - 1 - 40 - 40 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - - - - - - - - - - 2 - - - - - True - - - True - gtk-missing-image - 1 - - - 0 - - - - - True - Keypad - - - 1 - - - - - 2 - False - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - none - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - model3 - 0 - - - - - 0 - - - - - - - True - 5 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - My current identity: - True - - - 0 - - - - - True - True - none - - - - True - gtk-refresh - - - - - 1 - - - - - - - False - False - 2 - - - - - 0 - - - - - 0 - etched-out - - - True - 12 - - - True - - - True - gtk-missing-image - - - 0 - - - - - True - 0 - none - - - True - 12 - 12 - - - True - 4 - 2 - - - True - Username - - - - - True - Password - - - 1 - 2 - - - - - True - Internet connection: - - - 2 - 3 - - - - - True - True - - - - 1 - 2 - - - - - True - True - False - - - - 1 - 2 - 1 - 2 - - - - - True - model4 - 0 - - - - - 0 - - - - - 1 - 2 - 2 - 3 - - - - - Automatically log me in - True - True - False - True - - - 1 - 2 - 3 - 4 - - - - - - - - - - - - True - Login information - True - - - - - 10 - 1 - - - - - True - - - gtk-connect - True - True - True - True - - - - False - False - 0 - - - - - 2 - - - - - - - - - True - <b>Welcome !</b> - True - - - - - 1 - - - - - 1 - - - - - True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - - - 0 - - - - - True - True - True - none - - - - False - 5 - 1 - - - - - False - False - 2 - - - - -