diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-08-05 18:06:53 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-08-05 18:06:53 +0800 |
commit | d4397c1120f65ce0f4051156c255857d08b1b4ae (patch) | |
tree | 5aa19f107ddd1be34fcaebe33c067610b1cd3b7c | |
parent | 493056ec895710376ee79e403e6c17ea93029e4a (diff) | |
parent | 6d744e08f1cc7169b79fedade4681d5c67fadcd4 (diff) | |
download | gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar.gz gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar.bz2 gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar.lz gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar.xz gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.tar.zst gsoc2013-empathy-d4397c1120f65ce0f4051156c255857d08b1b4ae.zip |
Merge branch 'av-candidate-624344'
-rw-r--r-- | libempathy/empathy-call-handler.c | 178 | ||||
-rw-r--r-- | libempathy/empathy-call-handler.h | 12 | ||||
-rw-r--r-- | src/empathy-call-window.c | 120 | ||||
-rw-r--r-- | src/empathy-call-window.ui | 321 |
4 files changed, 623 insertions, 8 deletions
diff --git a/libempathy/empathy-call-handler.c b/libempathy/empathy-call-handler.c index 07620ad4b..b8e893486 100644 --- a/libempathy/empathy-call-handler.c +++ b/libempathy/empathy-call-handler.c @@ -44,6 +44,7 @@ enum { REQUEST_RESOURCE, CLOSED, STREAM_CLOSED, + CANDIDATES_CHANGED, LAST_SIGNAL }; @@ -59,6 +60,10 @@ enum { PROP_SEND_VIDEO_CODEC, PROP_RECV_AUDIO_CODECS, PROP_RECV_VIDEO_CODECS, + PROP_AUDIO_REMOTE_CANDIDATE, + PROP_VIDEO_REMOTE_CANDIDATE, + PROP_AUDIO_LOCAL_CANDIDATE, + PROP_VIDEO_LOCAL_CANDIDATE, }; /* private structure */ @@ -75,6 +80,10 @@ typedef struct { FsCodec *send_video_codec; GList *recv_audio_codecs; GList *recv_video_codecs; + FsCandidate *audio_remote_candidate; + FsCandidate *video_remote_candidate; + FsCandidate *audio_local_candidate; + FsCandidate *video_local_candidate; } EmpathyCallHandlerPriv; #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCallHandler) @@ -121,6 +130,10 @@ empathy_call_handler_finalize (GObject *object) fs_codec_destroy (priv->send_video_codec); fs_codec_list_destroy (priv->recv_audio_codecs); fs_codec_list_destroy (priv->recv_video_codecs); + fs_candidate_destroy (priv->audio_remote_candidate); + fs_candidate_destroy (priv->video_remote_candidate); + fs_candidate_destroy (priv->audio_local_candidate); + fs_candidate_destroy (priv->video_local_candidate); if (G_OBJECT_CLASS (empathy_call_handler_parent_class)->finalize) G_OBJECT_CLASS (empathy_call_handler_parent_class)->finalize (object); @@ -203,6 +216,18 @@ empathy_call_handler_get_property (GObject *object, case PROP_RECV_VIDEO_CODECS: g_value_set_boxed (value, priv->recv_video_codecs); break; + case PROP_AUDIO_REMOTE_CANDIDATE: + g_value_set_boxed (value, priv->audio_remote_candidate); + break; + case PROP_VIDEO_REMOTE_CANDIDATE: + g_value_set_boxed (value, priv->video_remote_candidate); + break; + case PROP_AUDIO_LOCAL_CANDIDATE: + g_value_set_boxed (value, priv->audio_local_candidate); + break; + case PROP_VIDEO_LOCAL_CANDIDATE: + g_value_set_boxed (value, priv->video_local_candidate); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -277,6 +302,38 @@ empathy_call_handler_class_init (EmpathyCallHandlerClass *klass) g_object_class_install_property (object_class, PROP_RECV_VIDEO_CODECS, param_spec); + param_spec = g_param_spec_boxed ("audio-remote-candidate", + "audio remote candidate", + "Remote candidate used for the audio stream", + FS_TYPE_CANDIDATE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, + PROP_AUDIO_REMOTE_CANDIDATE, param_spec); + + param_spec = g_param_spec_boxed ("video-remote-candidate", + "video remote candidate", + "Remote candidate used for the video stream", + FS_TYPE_CANDIDATE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, + PROP_VIDEO_REMOTE_CANDIDATE, param_spec); + + param_spec = g_param_spec_boxed ("audio-local-candidate", + "audio local candidate", + "Local candidate used for the audio stream", + FS_TYPE_CANDIDATE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, + PROP_AUDIO_REMOTE_CANDIDATE, param_spec); + + param_spec = g_param_spec_boxed ("video-local-candidate", + "video local candidate", + "Local candidate used for the video stream", + FS_TYPE_CANDIDATE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, + PROP_VIDEO_REMOTE_CANDIDATE, param_spec); + signals[CONFERENCE_ADDED] = g_signal_new ("conference-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, @@ -317,6 +374,12 @@ empathy_call_handler_class_init (EmpathyCallHandlerClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TF_TYPE_STREAM); + + signals[CANDIDATES_CHANGED] = + g_signal_new ("candidates-changed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); } /** @@ -400,6 +463,67 @@ update_receiving_codec (EmpathyCallHandler *self, g_object_unref (session); } +static void +update_candidates (EmpathyCallHandler *self, + FsCandidate *remote_candidate, + FsCandidate *local_candidate, + FsStream *stream) +{ + EmpathyCallHandlerPriv *priv = GET_PRIV (self); + FsSession *session; + FsMediaType type; + + if (stream == NULL) + return; + + g_object_get (stream, "session", &session, NULL); + if (session == NULL) + return; + + g_object_get (session, "media-type", &type, NULL); + + if (type == FS_MEDIA_TYPE_AUDIO) + { + if (remote_candidate != NULL) + { + fs_candidate_destroy (priv->audio_remote_candidate); + priv->audio_remote_candidate = fs_candidate_copy (remote_candidate); + g_object_notify (G_OBJECT (self), "audio-remote-candidate"); + } + + if (local_candidate != NULL) + { + fs_candidate_destroy (priv->audio_local_candidate); + priv->audio_local_candidate = fs_candidate_copy (local_candidate); + g_object_notify (G_OBJECT (self), "audio-local-candidate"); + } + + g_signal_emit (G_OBJECT (self), signals[CANDIDATES_CHANGED], 0, + FS_MEDIA_TYPE_AUDIO); + } + else if (type == FS_MEDIA_TYPE_VIDEO) + { + if (remote_candidate != NULL) + { + fs_candidate_destroy (priv->video_remote_candidate); + priv->video_remote_candidate = fs_candidate_copy (remote_candidate); + g_object_notify (G_OBJECT (self), "video-remote-candidate"); + } + + if (local_candidate != NULL) + { + fs_candidate_destroy (priv->video_local_candidate); + priv->video_local_candidate = fs_candidate_copy (local_candidate); + g_object_notify (G_OBJECT (self), "video-local-candidate"); + } + + g_signal_emit (G_OBJECT (self), signals[CANDIDATES_CHANGED], 0, + FS_MEDIA_TYPE_VIDEO); + } + + g_object_unref (session); +} + void empathy_call_handler_bus_message (EmpathyCallHandler *handler, GstBus *bus, GstMessage *message) @@ -440,6 +564,24 @@ empathy_call_handler_bus_message (EmpathyCallHandler *handler, update_receiving_codec (handler, codecs, stream); } + else if (s != NULL && + gst_structure_has_name (s, "farsight-new-active-candidate-pair")) + { + const GValue *val; + FsCandidate *remote_candidate, *local_candidate; + FsStream *stream; + + val = gst_structure_get_value (s, "remote-candidate"); + remote_candidate = g_value_get_boxed (val); + + val = gst_structure_get_value (s, "local-candidate"); + local_candidate = g_value_get_boxed (val); + + val = gst_structure_get_value (s, "stream"); + stream = g_value_get_object (val); + + update_candidates (handler, remote_candidate, local_candidate, stream); + } tf_channel_bus_message (priv->tfchannel, message); } @@ -723,3 +865,39 @@ empathy_call_handler_get_recv_video_codecs (EmpathyCallHandler *self) return priv->recv_video_codecs; } + +FsCandidate * +empathy_call_handler_get_audio_remote_candidate ( + EmpathyCallHandler *self) +{ + EmpathyCallHandlerPriv *priv = GET_PRIV (self); + + return priv->audio_remote_candidate; +} + +FsCandidate * +empathy_call_handler_get_audio_local_candidate ( + EmpathyCallHandler *self) +{ + EmpathyCallHandlerPriv *priv = GET_PRIV (self); + + return priv->audio_local_candidate; +} + +FsCandidate * +empathy_call_handler_get_video_remote_candidate ( + EmpathyCallHandler *self) +{ + EmpathyCallHandlerPriv *priv = GET_PRIV (self); + + return priv->video_remote_candidate; +} + +FsCandidate * +empathy_call_handler_get_video_local_candidate ( + EmpathyCallHandler *self) +{ + EmpathyCallHandlerPriv *priv = GET_PRIV (self); + + return priv->video_local_candidate; +} diff --git a/libempathy/empathy-call-handler.h b/libempathy/empathy-call-handler.h index 234bc800e..9f6fd9e3b 100644 --- a/libempathy/empathy-call-handler.h +++ b/libempathy/empathy-call-handler.h @@ -89,6 +89,18 @@ GList * empathy_call_handler_get_recv_audio_codecs ( GList * empathy_call_handler_get_recv_video_codecs ( EmpathyCallHandler *self); +FsCandidate * empathy_call_handler_get_audio_remote_candidate ( + EmpathyCallHandler *self); + +FsCandidate * empathy_call_handler_get_audio_local_candidate ( + EmpathyCallHandler *self); + +FsCandidate * empathy_call_handler_get_video_remote_candidate ( + EmpathyCallHandler *self); + +FsCandidate * empathy_call_handler_get_video_local_candidate ( + EmpathyCallHandler *self); + G_END_DECLS #endif /* #ifndef __EMPATHY_CALL_HANDLER_H__*/ diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index ffdcb5c71..d64d59302 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -174,6 +174,15 @@ struct _EmpathyCallWindowPriv GtkWidget *vcodec_decoding_label; GtkWidget *acodec_decoding_label; + GtkWidget *audio_remote_candidate_label; + GtkWidget *audio_local_candidate_label; + GtkWidget *video_remote_candidate_label; + GtkWidget *video_local_candidate_label; + GtkWidget *video_remote_candidate_info_img; + GtkWidget *video_local_candidate_info_img; + GtkWidget *audio_remote_candidate_info_img; + GtkWidget *audio_local_candidate_info_img; + GstElement *video_input; GstElement *audio_input; GstElement *audio_output; @@ -1051,6 +1060,14 @@ empathy_call_window_init (EmpathyCallWindow *self) "acodec_encoding_label", &priv->acodec_encoding_label, "acodec_decoding_label", &priv->acodec_decoding_label, "vcodec_decoding_label", &priv->vcodec_decoding_label, + "audio_remote_candidate_label", &priv->audio_remote_candidate_label, + "audio_local_candidate_label", &priv->audio_local_candidate_label, + "video_remote_candidate_label", &priv->video_remote_candidate_label, + "video_local_candidate_label", &priv->video_local_candidate_label, + "video_remote_candidate_info_img", &priv->video_remote_candidate_info_img, + "video_local_candidate_info_img", &priv->video_local_candidate_info_img, + "audio_remote_candidate_info_img", &priv->audio_remote_candidate_info_img, + "audio_local_candidate_info_img", &priv->audio_local_candidate_info_img, NULL); g_free (filename); @@ -1450,6 +1467,106 @@ recv_video_codecs_notify_cb (GObject *object, update_recv_codec (self, FALSE); } +static const gchar * +candidate_type_to_str (FsCandidate *candidate) +{ + switch (candidate->type) + { + case FS_CANDIDATE_TYPE_HOST: + return "host"; + case FS_CANDIDATE_TYPE_SRFLX: + return "server reflexive"; + case FS_CANDIDATE_TYPE_PRFLX: + return "peer reflexive"; + case FS_CANDIDATE_TYPE_RELAY: + return "relay"; + case FS_CANDIDATE_TYPE_MULTICAST: + return "multicast"; + } + + return NULL; +} + +static const gchar * +candidate_type_to_desc (FsCandidate *candidate) +{ + switch (candidate->type) + { + case FS_CANDIDATE_TYPE_HOST: + return _("The IP address as seen by the machine"); + case FS_CANDIDATE_TYPE_SRFLX: + return _("The IP address as seen by a server on the Internet"); + case FS_CANDIDATE_TYPE_PRFLX: + return _("The IP address of the peer as seen by the other side"); + case FS_CANDIDATE_TYPE_RELAY: + return _("The IP address of a relay server"); + case FS_CANDIDATE_TYPE_MULTICAST: + return _("The IP address of the multicast group"); + } + + return NULL; +} + +static void +update_candidat_widget (EmpathyCallWindow *self, + GtkWidget *label, + GtkWidget *img, + FsCandidate *candidate) +{ + gchar *str; + + g_assert (candidate != NULL); + str = g_strdup_printf ("%s %u (%s)", candidate->ip, + candidate->port, candidate_type_to_str (candidate)); + + gtk_label_set_text (GTK_LABEL (label), str); + gtk_widget_set_tooltip_text (img, candidate_type_to_desc (candidate)); + + g_free (str); +} + +static void +candidates_changed_cb (GObject *object, + FsMediaType type, + EmpathyCallWindow *self) +{ + EmpathyCallWindowPriv *priv = GET_PRIV (self); + FsCandidate *candidate = NULL; + + if (type == FS_MEDIA_TYPE_VIDEO) + { + /* Update remote candidate */ + candidate = empathy_call_handler_get_video_remote_candidate ( + priv->handler); + + update_candidat_widget (self, priv->video_remote_candidate_label, + priv->video_remote_candidate_info_img, candidate); + + /* Update local candidate */ + candidate = empathy_call_handler_get_video_local_candidate ( + priv->handler); + + update_candidat_widget (self, priv->video_local_candidate_label, + priv->video_local_candidate_info_img, candidate); + } + else + { + /* Update remote candidate */ + candidate = empathy_call_handler_get_audio_remote_candidate ( + priv->handler); + + update_candidat_widget (self, priv->audio_remote_candidate_label, + priv->audio_remote_candidate_info_img, candidate); + + /* Update local candidate */ + candidate = empathy_call_handler_get_audio_local_candidate ( + priv->handler); + + update_candidat_widget (self, priv->audio_local_candidate_label, + priv->audio_local_candidate_info_img, candidate); + } +} + static void empathy_call_window_constructed (GObject *object) { @@ -1488,6 +1605,9 @@ empathy_call_window_constructed (GObject *object) G_CALLBACK (recv_audio_codecs_notify_cb), self, 0); tp_g_signal_connect_object (priv->handler, "notify::recv-video-codecs", G_CALLBACK (recv_video_codecs_notify_cb), self, 0); + + tp_g_signal_connect_object (priv->handler, "candidates-changed", + G_CALLBACK (candidates_changed_cb), self, 0); } static void empathy_call_window_dispose (GObject *object); diff --git a/src/empathy-call-window.ui b/src/empathy-call-window.ui index 781de76d9..5ad7399b9 100644 --- a/src/empathy-call-window.ui +++ b/src/empathy-call-window.ui @@ -348,7 +348,7 @@ <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_END</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode">False</property> <property name="angle">0</property> @@ -358,7 +358,7 @@ <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options">expand|shrink|fill</property> + <property name="x_options">fill</property> <property name="y_options"/> </packing> </child> @@ -409,7 +409,7 @@ <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_END</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode">False</property> <property name="angle">0</property> @@ -419,11 +419,164 @@ <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options">expand|shrink|fill</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="vrc_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Remote Candidate:</property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + <attributes> + <attribute name="style" value="PANGO_STYLE_ITALIC"/> + </attributes> + </object> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="video_remote_candidate_label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Unknown</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </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> + <property name="x_options">fill</property> <property name="y_options"/> </packing> </child> + <child> + <object class="GtkImage" id="video_remote_candidate_info_img"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + + <child> + <object class="GtkLabel" id="vlc_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Local Candidate:</property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + <attributes> + <attribute name="style" value="PANGO_STYLE_ITALIC"/> + </attributes> + </object> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="video_local_candidate_label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Unknown</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </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="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkImage" id="video_local_candidate_info_img"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + </object> </child> </object> @@ -542,7 +695,7 @@ <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_END</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode">False</property> <property name="angle">0</property> @@ -552,7 +705,7 @@ <property name="right_attach">2</property> <property name="top_attach">0</property> <property name="bottom_attach">1</property> - <property name="x_options">expand|shrink|fill</property> + <property name="x_options">fill</property> <property name="y_options"/> </packing> </child> @@ -602,7 +755,7 @@ <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_END</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode">False</property> <property name="angle">0</property> @@ -612,11 +765,163 @@ <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options">expand|shrink|fill</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="arc_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Remote Candidate:</property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + <attributes> + <attribute name="style" value="PANGO_STYLE_ITALIC"/> + </attributes> + </object> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="audio_remote_candidate_label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Unknown</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">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="x_options">fill</property> <property name="y_options"/> </packing> </child> + <child> + <object class="GtkImage" id="audio_remote_candidate_info_img"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="alc_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Local Candidate:</property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + <attributes> + <attribute name="style" value="PANGO_STYLE_ITALIC"/> + </attributes> + </object> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkLabel" id="audio_local_candidate_label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Unknown</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </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> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + + <child> + <object class="GtkImage" id="audio_local_candidate_info_img"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"/> + </packing> + </child> + </object> </child> </object> |