From: Simon Morlat Date: Wed, 19 Sep 2012 15:14:49 +0000 (+0200) Subject: add call statistics window to gtk X-Git-Url: http://sjero.net/git/?p=linphone;a=commitdiff_plain;h=0b475524e734ae0b17326ee4398f96d7dd7da119 add call statistics window to gtk --- diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 9243be08..a714ad7f 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 acf81f1d..9a5792a7 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 7e8eb683..90c080be 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 9a458dbc..a57b7996 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -1,49 +1,60 @@ - + + False True + False 0 none True + False 12 True + False True - - - True - True - - - False - False - 1 - - + False True + False <b>Callee name</b> True right end + True + True end 0 + + + True + True + False + + + False + False + 1 + + + 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,173 +386,150 @@ 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 - - - - - - - - All users - - - Online users - - - - - - - - - - - ADSL - - - Fiber Channel - - - - - - - - - - - Default - - - - - - - - - - - ADSL - - - Fiber Channel - - - + 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 - + @@ -511,54 +539,67 @@ 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 - + @@ -568,24 +609,29 @@ False + True 0 True + False True + False True + False True True True - + False + False @@ -598,7 +644,8 @@ True True Initiate a new call - + False + False @@ -609,18 +656,21 @@ 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 @@ -628,10 +678,16 @@ True True Enter username, phone number, or full sip address - - + ● + False + False + True + True + + True + True 0 @@ -642,6 +698,7 @@ 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 @@ -649,6 +706,8 @@ + True + True 2 @@ -657,7 +716,8 @@ True True True - + False + False @@ -668,6 +728,7 @@ False + True 8 0 @@ -679,21 +740,27 @@ 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 @@ -703,11 +770,17 @@ 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 @@ -715,10 +788,13 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK in + True + True 8 2 @@ -726,10 +802,11 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model1 0 - + @@ -738,6 +815,8 @@ + True + True 4 3 @@ -745,6 +824,7 @@ False + True 0 @@ -759,35 +839,45 @@ 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 @@ -796,26 +886,34 @@ True True True + False none - + True + False True + False gtk-find + True + True 0 True + False Search + True + True 1 @@ -824,6 +922,7 @@ False + True 1 @@ -832,6 +931,7 @@ True + False <b>Add contacts from directory</b> True @@ -847,13 +947,15 @@ True + False Add contact True True + False image10 - + False @@ -870,6 +972,8 @@ + True + True 0 @@ -878,22 +982,29 @@ True + False True + False gtk-directory 1 + True + True 0 True + False Contacts + True + True 1 @@ -905,32 +1016,16 @@ True + False True + False 2 - - - True - True - never - - - True - True - False - - - - - - - 1 - - True + False end @@ -938,8 +1033,9 @@ True True True + False True - + False @@ -956,12 +1052,36 @@ False + True end 0 + + + True + True + never + + + True + True + False + + + + + + + True + True + 1 + + + True + True 0 @@ -973,23 +1093,30 @@ True + False True + False gtk-refresh 1 + True + True 0 True + False 0.49000000953674316 Recent calls + True + True 1 @@ -1002,20 +1129,24 @@ 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 @@ -1028,6 +1159,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 3 @@ -1043,6 +1175,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 2 @@ -1058,6 +1191,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 1 @@ -1073,6 +1207,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 3 @@ -1086,6 +1221,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 3 @@ -1101,6 +1237,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 2 @@ -1116,6 +1253,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 1 @@ -1131,6 +1269,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 2 @@ -1144,6 +1283,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 3 @@ -1159,6 +1299,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 2 @@ -1174,6 +1315,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 1 @@ -1189,6 +1331,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 1 @@ -1202,6 +1345,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 3 @@ -1215,6 +1359,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 2 @@ -1228,6 +1373,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False 1 @@ -1243,6 +1389,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False @@ -1262,22 +1409,29 @@ True + False True + False gtk-missing-image 1 + True + True 0 True + False Keypad + True + True 1 @@ -1289,22 +1443,26 @@ + 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 - + @@ -1316,15 +1474,19 @@ 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 @@ -1332,16 +1494,20 @@ True True + False none - + True + False gtk-refresh + True + True 1 @@ -1356,53 +1522,66 @@ + 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 @@ -1413,6 +1592,7 @@ True + False Internet connection: @@ -1424,7 +1604,11 @@ True True - + ● + False + False + True + True 1 @@ -1436,7 +1620,11 @@ True True False - + ● + False + False + True + True 1 @@ -1448,9 +1636,10 @@ True + False model4 0 - + @@ -1471,6 +1660,7 @@ True True False + False True @@ -1490,12 +1680,15 @@ True + False Login information True + True + True 10 1 @@ -1503,14 +1696,16 @@ True + False gtk-connect True True True + False True - + False @@ -1520,6 +1715,8 @@ + True + True 2 @@ -1530,30 +1727,39 @@ 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 @@ -1562,11 +1768,13 @@ True True True + False none - + False + True 5 1 @@ -1581,4 +1789,57 @@ + + + + + + + + All users + + + Online users + + + + + + + + + + + ADSL + + + Fiber Channel + + + + + + + + + + + Default + + + + + + + + + + + ADSL + + + Fiber Channel + + +