From b9ffc926ef44f24c8141086ab0348c1a98b6751c Mon Sep 17 00:00:00 2001 From: smorlat Date: Tue, 4 Aug 2009 14:35:44 +0000 Subject: [PATCH] - new in-call view - set name of remote people as title of the video window. git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@562 3f6dc0c8-ddfe-455d-9043-3cd528dc4637 --- linphone/NEWS | 8 +- linphone/coreapi/linphonecore.c | 13 +- linphone/coreapi/linphonecore.h | 4 +- linphone/gtk-glade/Makefile.am | 1 + linphone/gtk-glade/incall_view.c | 111 ++ linphone/gtk-glade/linphone.h | 11 + linphone/gtk-glade/main.c | 98 +- linphone/gtk-glade/main.glade | 1299 ++++++++++++++---------- linphone/gtk-glade/support.c | 36 + linphone/gtk-glade/utils.c | 17 + linphone/mediastreamer2/src/videoout.c | 6 +- 11 files changed, 1056 insertions(+), 548 deletions(-) create mode 100644 linphone/gtk-glade/incall_view.c diff --git a/linphone/NEWS b/linphone/NEWS index 68202bbd7..ec9c071b5 100644 --- a/linphone/NEWS +++ b/linphone/NEWS @@ -1,4 +1,10 @@ -linphone-3.1.2 -- +linphone-3.2.0 -- + * new in-call layout + * new idle view with two buttons + * ability to dial the number from dialpad + + +linphone-3.1.2 -- May 5, 2009 * make it work with lastest ffmpeg swscale * improve theora packer * update theora default settings to match performance of 1.0 release. diff --git a/linphone/coreapi/linphonecore.c b/linphone/coreapi/linphonecore.c index 8a8c7eee0..7a161a03f 100644 --- a/linphone/coreapi/linphonecore.c +++ b/linphone/coreapi/linphonecore.c @@ -79,6 +79,7 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){ static void linphone_call_init_common(LinphoneCall *call, char *from, char *to){ call->state=LCStateInit; call->start_time=time(NULL); + call->media_start_time=0; call->log=linphone_call_log_new(call, from, to); linphone_core_notify_all_friends(call->core,LINPHONE_STATUS_ONTHEPHONE); if (linphone_core_get_firewall_policy(call->core)==LINPHONE_POLICY_USE_STUN) @@ -251,7 +252,14 @@ void linphone_call_log_destroy(LinphoneCallLog *cl){ int linphone_core_get_current_call_duration(const LinphoneCore *lc){ LinphoneCall *call=lc->call; if (call==NULL) return 0; - return time(NULL)-call->start_time; + if (call->media_start_time==0) return 0; + return time(NULL)-call->media_start_time; +} + +const char *linphone_core_get_remote_uri(LinphoneCore *lc){ + LinphoneCall *call=lc->call; + if (call==NULL) return 0; + return call->dir==LinphoneCallIncoming ? call->log->from : call->log->to; } void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){ @@ -1541,6 +1549,9 @@ void linphone_core_start_media_streams(LinphoneCore *lc, LinphoneCall *call){ const char *tool="linphone-" LINPHONE_VERSION; /* adjust rtp jitter compensation. It must be at least the latency of the sound card */ int jitt_comp=MAX(lc->sound_conf.latency,lc->rtp_conf.audio_jitt_comp); + + if (call->media_start_time==0) call->media_start_time=time(NULL); + char *cname=ortp_strdup_printf("%s@%s",me->url->username,me->url->host); { StreamParams *audio_params=&call->audio_params; diff --git a/linphone/coreapi/linphonecore.h b/linphone/coreapi/linphonecore.h index 71e3bda5c..ee7ac5c39 100644 --- a/linphone/coreapi/linphonecore.h +++ b/linphone/coreapi/linphonecore.h @@ -186,7 +186,8 @@ typedef struct _LinphoneCall int did; /*dialog id */ int tid; /*last transaction id*/ struct _sdp_context *sdpctx; - time_t start_time; + time_t start_time; /*time at which the call was initiated*/ + time_t media_start_time; /*time at which it was accepted, media streams established*/ LCState state; bool_t auth_pending; } LinphoneCall; @@ -771,6 +772,7 @@ void linphone_core_set_record_file(LinphoneCore *lc, const char *file); gstate_t linphone_core_get_state(const LinphoneCore *lc, gstate_group_t group); int linphone_core_get_current_call_duration(const LinphoneCore *lc); +const char *linphone_core_get_remote_uri(LinphoneCore *lc); int linphone_core_get_mtu(const LinphoneCore *lc); void linphone_core_set_mtu(LinphoneCore *lc, int mtu); diff --git a/linphone/gtk-glade/Makefile.am b/linphone/gtk-glade/Makefile.am index 884d9ecfb..4f8f67f80 100644 --- a/linphone/gtk-glade/Makefile.am +++ b/linphone/gtk-glade/Makefile.am @@ -35,6 +35,7 @@ linphone_3_SOURCES= main.c \ buddylookup.c \ utils.c \ setupwizard.c\ + incall_view.c \ linphone.h linphone_3_LDADD=$(top_builddir)/oRTP/src/libortp.la \ diff --git a/linphone/gtk-glade/incall_view.c b/linphone/gtk-glade/incall_view.c new file mode 100644 index 000000000..5ec94eba6 --- /dev/null +++ b/linphone/gtk-glade/incall_view.c @@ -0,0 +1,111 @@ +/* +* C Implementation: incall_frame +* +* Description: +* +* +* Author: Simon Morlat , (C) 2009 +* +* Copyright: See COPYING file that comes with this distribution +* +*/ + +#include "linphone.h" + +void linphone_gtk_show_in_call_view(void){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *idle_frame=linphone_gtk_get_widget(main_window,"idle_frame"); + GtkWidget *in_call_frame=linphone_gtk_get_widget(main_window,"in_call_frame"); + gtk_widget_hide(idle_frame); + gtk_widget_show(in_call_frame); +} + +void linphone_gtk_show_idle_view(void){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *idle_frame=linphone_gtk_get_widget(main_window,"idle_frame"); + GtkWidget *in_call_frame=linphone_gtk_get_widget(main_window,"in_call_frame"); + gtk_widget_show(idle_frame); + gtk_widget_hide(in_call_frame); +} + +void linphone_gtk_in_call_view_set_calling(const char *uri){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *status=linphone_gtk_get_widget(main_window,"in_call_status"); + GtkWidget *callee=linphone_gtk_get_widget(main_window,"in_call_uri"); + GtkWidget *duration=linphone_gtk_get_widget(main_window,"in_call_duration"); + GtkWidget *animation=linphone_gtk_get_widget(main_window,"in_call_animation"); + GdkPixbufAnimation *pbuf=create_pixbuf_animation("calling_anim.gif"); + GtkWidget *terminate_button=linphone_gtk_get_widget(main_window,"in_call_terminate"); + char *uri_label; + + gtk_widget_set_sensitive(terminate_button,TRUE); + gtk_label_set_markup(GTK_LABEL(status),_("Calling...")); + uri_label=g_markup_printf_escaped("%s", uri); + gtk_label_set_markup(GTK_LABEL(callee),uri_label); + g_free(uri_label); + gtk_label_set_text(GTK_LABEL(duration),"00:00:00"); + if (pbuf!=NULL){ + gtk_image_set_from_animation(GTK_IMAGE(animation),pbuf); + g_object_unref(G_OBJECT(pbuf)); + }else gtk_image_set_from_stock(GTK_IMAGE(animation),GTK_STOCK_INFO,GTK_ICON_SIZE_DIALOG); +} + +void linphone_gtk_in_call_view_set_in_call(const char *uri){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *status=linphone_gtk_get_widget(main_window,"in_call_status"); + GtkWidget *callee=linphone_gtk_get_widget(main_window,"in_call_uri"); + GtkWidget *duration=linphone_gtk_get_widget(main_window,"in_call_duration"); + char *uri_label; + GtkWidget *animation=linphone_gtk_get_widget(main_window,"in_call_animation"); + GdkPixbufAnimation *pbuf=create_pixbuf_animation("incall_anim.gif"); + GtkWidget *terminate_button=linphone_gtk_get_widget(main_window,"in_call_terminate"); + + gtk_widget_set_sensitive(terminate_button,TRUE); + gtk_label_set_markup(GTK_LABEL(status),_("In call with")); + uri_label=g_markup_printf_escaped("%s", uri); + gtk_label_set_markup(GTK_LABEL(callee),uri_label); + g_free(uri_label); + gtk_label_set_text(GTK_LABEL(duration),_("00::00::00")); + if (pbuf!=NULL){ + gtk_image_set_from_animation(GTK_IMAGE(animation),pbuf); + g_object_unref(G_OBJECT(pbuf)); + }else gtk_image_set_from_stock(GTK_IMAGE(animation),GTK_STOCK_INFO,GTK_ICON_SIZE_DIALOG); +} + +void linphone_gtk_in_call_view_update_duration(int duration){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *duration_label=linphone_gtk_get_widget(main_window,"in_call_duration"); + char tmp[256]={0}; + int seconds=duration%60; + int minutes=(duration/60)%60; + int hours=duration/3600; + snprintf(tmp,sizeof(tmp)-1,_("%02i::%02i::%02i"),hours,minutes,seconds); + gtk_label_set_text(GTK_LABEL(duration_label),tmp); +} + +static gboolean in_call_view_terminated(){ + linphone_gtk_show_idle_view(); + return FALSE; +} + +void linphone_gtk_in_call_view_terminate(const char *error_msg){ + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *status=linphone_gtk_get_widget(main_window,"in_call_status"); + GtkWidget *animation=linphone_gtk_get_widget(main_window,"in_call_animation"); + GtkWidget *terminate_button=linphone_gtk_get_widget(main_window,"in_call_terminate"); + GdkPixbuf *pbuf=create_pixbuf(linphone_gtk_get_ui_config("stop_call_icon","red.png")); + + gtk_widget_set_sensitive(terminate_button,FALSE); + if (error_msg==NULL) + gtk_label_set_markup(GTK_LABEL(status),_("Call ended.")); + else{ + char *msg=g_markup_printf_escaped("%s",error_msg); + gtk_label_set_markup(GTK_LABEL(status),msg); + g_free(msg); + } + if (pbuf!=NULL){ + gtk_image_set_from_pixbuf(GTK_IMAGE(animation),pbuf); + g_object_unref(G_OBJECT(pbuf)); + } + g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,NULL); +} diff --git a/linphone/gtk-glade/linphone.h b/linphone/gtk-glade/linphone.h index 11d2eb6f4..a10f77dac 100644 --- a/linphone/gtk-glade/linphone.h +++ b/linphone/gtk-glade/linphone.h @@ -34,6 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif GdkPixbuf * create_pixbuf(const gchar *filename); +GdkPixbufAnimation *create_pixbuf_animation(const gchar *filename); void add_pixmap_directory(const gchar *directory); GtkWidget *linphone_gtk_create_window(const char *window_name); GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name); @@ -41,6 +42,7 @@ LinphoneCore *linphone_gtk_get_core(void); GtkWidget *linphone_gtk_get_main_window(); void linphone_gtk_display_something(GtkMessageType type,const gchar *message); void linphone_gtk_start_call(GtkWidget *button); +void linphone_gtk_call_terminated(); void linphone_gtk_show_friends(void); void linphone_gtk_show_contact(LinphoneFriend *lf); void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss); @@ -63,3 +65,12 @@ void linphone_gtk_set_lang(const char *code); SipSetupContext* linphone_gtk_get_default_sip_setup_context(void); void linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx); void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress); +gchar *linphone_gtk_get_display_name(const char *sip_uri); + +/*functions controlling the in-call view*/ +void linphone_gtk_show_in_call_view(void); +void linphone_gtk_show_idle_view(void); +void linphone_gtk_in_call_view_set_calling(const char *uri); +void linphone_gtk_in_call_view_set_in_call(const char *uri); +void linphone_gtk_in_call_view_update_duration(int duration); +void linphone_gtk_in_call_view_terminate(const char *error_msg); diff --git a/linphone/gtk-glade/main.c b/linphone/gtk-glade/main.c index 9e490d41c..5198eca49 100644 --- a/linphone/gtk-glade/main.c +++ b/linphone/gtk-glade/main.c @@ -304,8 +304,17 @@ static void set_video_window_decorations(GdkWindow *w){ const char *icon_path=linphone_gtk_get_ui_config("icon","linphone2.png"); char video_title[256]; GdkPixbuf *pbuf=create_pixbuf(icon_path); - snprintf(video_title,sizeof(video_title),"%s video",title); + if (!linphone_core_in_call(linphone_gtk_get_core())){ + snprintf(video_title,sizeof(video_title),"%s video",title); + }else{ + const char *uri=linphone_core_get_remote_uri(linphone_gtk_get_core()); + gchar *display_name=linphone_gtk_get_display_name(uri); + snprintf(video_title,sizeof(video_title),"Call with %s",display_name); + g_free(display_name); + } gdk_window_set_title(w,video_title); + /*gdk_window_set_urgency_hint(w,TRUE);*/ + gdk_window_raise(w); if (pbuf){ GList *l=NULL; l=g_list_append(l,pbuf); @@ -315,6 +324,11 @@ static void set_video_window_decorations(GdkWindow *w){ } } +static gboolean video_needs_update=FALSE; + +static void update_video_title(){ + video_needs_update=TRUE; +} static gboolean linphone_gtk_iterate(LinphoneCore *lc){ unsigned long id; @@ -326,11 +340,11 @@ static gboolean linphone_gtk_iterate(LinphoneCore *lc){ in_iterate=TRUE; linphone_core_iterate(lc); id=linphone_core_get_native_video_window_id(lc); - if (id!=previd){ - ms_message("Updating window decorations"); + if (id!=previd || video_needs_update){ GdkWindow *w; previd=id; if (id!=0){ + ms_message("Updating window decorations"); #ifndef WIN32 w=gdk_window_foreign_new(id); #else @@ -341,6 +355,7 @@ static gboolean linphone_gtk_iterate(LinphoneCore *lc){ g_object_unref(G_OBJECT(w)); } else ms_error("gdk_window_foreign_new() failed"); + if (video_needs_update) video_needs_update=FALSE; } } in_iterate=FALSE; @@ -419,37 +434,56 @@ static void completion_add_text(GtkEntry *entry, const char *text){ save_uri_history(); } -static void linphone_gtk_call_terminated(GtkWidget *mw){ +void linphone_gtk_call_terminated(const char *error){ + GtkWidget *mw=linphone_gtk_get_main_window(); gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"terminate_call"),FALSE); gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"start_call"),TRUE); + gtk_widget_hide(linphone_gtk_get_widget(mw,"go_to_call_view")); + linphone_gtk_in_call_view_terminate(error); + update_video_title(); g_object_set_data(G_OBJECT(mw),"incoming_call",NULL); + } -gboolean check_call_active(){ - if (!linphone_core_in_call(linphone_gtk_get_core())){ - linphone_gtk_call_terminated(linphone_gtk_get_main_window()); - return FALSE; +static gboolean in_call_timer(){ + if (linphone_core_in_call(linphone_gtk_get_core())){ + linphone_gtk_in_call_view_update_duration( + linphone_core_get_current_call_duration(linphone_gtk_get_core())); + return TRUE; } - return TRUE; + return FALSE; } static void linphone_gtk_call_started(GtkWidget *mw){ gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"start_call"),FALSE); gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"terminate_call"),TRUE); - g_timeout_add(250,(GSourceFunc)check_call_active,NULL); + gtk_widget_show(linphone_gtk_get_widget(mw,"go_to_call_view")); + update_video_title(); + g_timeout_add(250,(GSourceFunc)in_call_timer,NULL); +} + +static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){ + const char *entered=gtk_entry_get_text(GTK_ENTRY(uri_bar)); + if (linphone_core_invite(linphone_gtk_get_core(),entered)==0) { + completion_add_text(GTK_ENTRY(uri_bar),entered); + }else{ + } + return FALSE; } void linphone_gtk_start_call(GtkWidget *w){ LinphoneCore *lc=linphone_gtk_get_core(); - if (linphone_core_inc_invite_pending(lc)){ + if (linphone_core_inc_invite_pending(lc) || linphone_core_in_call(lc)) { /*already in call */ }else{ - GtkWidget *uri_bar=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"uribar"); + /*change into in-call mode, then do the work later as it might block a bit */ + GtkWidget *mw=gtk_widget_get_toplevel(w); + GtkWidget *uri_bar=linphone_gtk_get_widget(mw,"uribar"); const char *entered=gtk_entry_get_text(GTK_ENTRY(uri_bar)); - if (linphone_core_invite(lc,entered)==0) { - linphone_gtk_call_started(linphone_gtk_get_main_window()); - completion_add_text(GTK_ENTRY(uri_bar),entered); - } + linphone_gtk_call_started(mw); + linphone_gtk_in_call_view_set_calling(entered); + linphone_gtk_show_in_call_view(); + g_timeout_add(100,(GSourceFunc)linphone_gtk_start_call_do,uri_bar); } } @@ -460,20 +494,21 @@ void linphone_gtk_uri_bar_activate(GtkWidget *w){ void linphone_gtk_terminate_call(GtkWidget *button){ linphone_core_terminate_call(linphone_gtk_get_core(),NULL); - linphone_gtk_call_terminated(gtk_widget_get_toplevel(button)); } void linphone_gtk_decline_call(GtkWidget *button){ linphone_core_terminate_call(linphone_gtk_get_core(),NULL); - linphone_gtk_call_terminated(linphone_gtk_get_main_window()); gtk_widget_destroy(gtk_widget_get_toplevel(button)); } void linphone_gtk_accept_call(GtkWidget *button){ - linphone_core_accept_call(linphone_gtk_get_core(),NULL); + LinphoneCore *lc=linphone_gtk_get_core(); + linphone_core_accept_call(lc,NULL); g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"incoming_call",NULL); gtk_widget_destroy(gtk_widget_get_toplevel(button)); linphone_gtk_call_started(linphone_gtk_get_main_window()); + linphone_gtk_in_call_view_set_in_call(linphone_core_get_remote_uri(lc)); + linphone_gtk_show_in_call_view(); } void linphone_gtk_set_audio_video(){ @@ -535,7 +570,6 @@ static void linphone_gtk_bye_recv(LinphoneCore *lc, const char *from){ if (icw!=NULL){ gtk_widget_destroy(icw); } - linphone_gtk_call_terminated(linphone_gtk_get_main_window()); } static void linphone_gtk_notify_recv(LinphoneCore *lc, LinphoneFriend * fid, const char *url, const char *status, const char *img){ @@ -667,6 +701,20 @@ static void linphone_gtk_call_log_updated(LinphoneCore *lc, LinphoneCallLog *cl) } static void linphone_gtk_general_state(LinphoneCore *lc, LinphoneGeneralState *gstate){ + switch(gstate->new_state){ + case GSTATE_CALL_OUT_CONNECTED: + case GSTATE_CALL_IN_CONNECTED: + linphone_gtk_in_call_view_set_in_call(linphone_core_get_remote_uri(lc)); + break; + case GSTATE_CALL_ERROR: + linphone_gtk_call_terminated(gstate->message); + break; + case GSTATE_CALL_END: + linphone_gtk_call_terminated(NULL); + break; + default: + break; + } } static void icon_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data){ @@ -769,7 +817,13 @@ void linphone_gtk_load_identities(void){ static void linphone_gtk_dtmf_clicked(GtkButton *button){ const char *label=gtk_button_get_label(button); - linphone_core_send_dtmf(linphone_gtk_get_core(),label[0]); + if (linphone_core_in_call(linphone_gtk_get_core())){ + linphone_core_send_dtmf(linphone_gtk_get_core(),label[0]); + }else{ + GtkWidget *uri_bar=linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"uribar"); + int pos=-1; + gtk_editable_insert_text(GTK_EDITABLE(uri_bar),label,1,&pos); + } } static void linphone_gtk_connect_digits(void){ @@ -863,7 +917,7 @@ void linphone_gtk_close(){ /*shutdown call if any*/ if (linphone_core_in_call(lc)){ linphone_core_terminate_call(lc,NULL); - linphone_gtk_call_terminated(the_ui); + linphone_gtk_call_terminated(NULL); } linphone_core_enable_video_preview(lc,FALSE); } diff --git a/linphone/gtk-glade/main.glade b/linphone/gtk-glade/main.glade index 24ba9eeb6..23382c05a 100644 --- a/linphone/gtk-glade/main.glade +++ b/linphone/gtk-glade/main.glade @@ -194,240 +194,41 @@ - + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - True - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Start call - half - - - - True - - - True - gtk-apply - - - 0 - - - - - Start call - - - 1 - - - - - - - False - False - 10 - 0 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - - - 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 - 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 - - - label_item - - - - - 1 - - - - - True - False - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Terminate call - half - - - - 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 - gtk-close - - - 0 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Terminate call - - - 1 - - - - - - - False - False - 10 - 2 - - - - - False - 8 - 0 - - - - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical - + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - + True + True + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 12 + True + Start call + half + - + 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 - - - - 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 - 0 - All users -Online users - - - - 4 - 3 - - + gtk-apply - False 0 - - True - True - automatic - automatic - - - 120 - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - - + + Start call 1 @@ -436,299 +237,36 @@ Online users - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - <b>Contact list</b> - True - - label_item + False + False + 10 + 0 - - - 8 - 0 - - - - - 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 0 - + 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 - 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 + Enter username, phone number, or full sip address + + - 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 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - + 0 @@ -736,10 +274,10 @@ Online users - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Digits + SIP address or phone number: True @@ -747,74 +285,793 @@ Online users + + 1 + + + + + True + False + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + Terminate call + half + + + + 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 + gtk-close + + + 0 + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Terminate call + + + 1 + + + + + False False - 0 + 10 + 2 False - False - 1 + 8 + 0 - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 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 - 12 + 0 - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - Default - + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical + + + 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 + + + + + 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 + 0 + All users +Online users + + + + 4 + 3 + + + + + False + 0 + + + + + True + True + automatic + automatic + + + 120 + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + + + + + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Contact list</b> + True + + + label_item + + + + + 8 + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + + + 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 + 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 + 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 + Digits + True + + + label_item + + + + + False + False + 0 + + + + + False + False + 1 + + + + + 1 + + + + + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + + + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + Default + + + + + + 0 + + + + + True + True + True + + + + False + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + My current identity: + True + + + label_item + + 0 - + True - True - True - + vertical - + + True + True + + + + True + + + True + gtk-jump-to + 1 + + + 0 + + + + + True + Show current call + + + 1 + + + + + + + False + False + 8 + end + 0 + False + False + 8 + end 1 + + 2 + + + + + 0 + + + + + 0.5 + + + True + 12 + + + True + vertical + + + True + gtk-info + 5 + + + 0 + + + + + True + 0 + + + True + label + + + + + True + True + + + label_item + + + + + 1 + + + + + True + 0 + + + True + Duration + center + + + + + True + Duration: + True + + + label_item + + + + + False + 2 + + + + + True + + + True + center + + + True + True + True + + + + True + + + True + gtk-close + 3 + + + 0 + + + + + True + <b>Terminate call</b> + True + + + 1 + + + + + + + False + False + 0 + + + + + 8 + 0 + + + + + True + True + True + + + + True + + + True + gtk-undo + 1 + + + 0 + + + + + True + Main view + + + 1 + + + + + + + False + False + end + 1 + + + + + False + 8 + 3 + + + + + - + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - My current identity: + In call True + center label_item @@ -822,9 +1079,7 @@ Online users - False - False - 2 + 1 diff --git a/linphone/gtk-glade/support.c b/linphone/gtk-glade/support.c index 6ed94c822..dc3a8c0c3 100644 --- a/linphone/gtk-glade/support.c +++ b/linphone/gtk-glade/support.c @@ -86,6 +86,36 @@ create_pixbuf (const gchar *filename) return pixbuf; } +/* This is an internally used function to create animations */ +GdkPixbufAnimation * +create_pixbuf_animation(const gchar *filename) +{ + gchar *pathname = NULL; + GdkPixbufAnimation *pixbuf; + GError *error = NULL; + + if (!filename || !filename[0]) + return NULL; + + pathname = find_pixmap_file (filename); + + if (!pathname){ + g_warning (_("Couldn't find pixmap file: %s"), filename); + return NULL; + } + + pixbuf = gdk_pixbuf_animation_new_from_file (pathname, &error); + if (!pixbuf){ + fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", + pathname, error->message); + g_error_free (error); + } + g_free (pathname); + return pixbuf; +} + + + /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, @@ -126,6 +156,12 @@ const char *linphone_gtk_get_lang(const char *config_file){ void linphone_gtk_set_lang(const char *code){ LpConfig *cfg=linphone_core_get_config(linphone_gtk_get_core()); + const char *curlang; + curlang=getenv("LANG"); + if (curlang!=NULL && strncmp(curlang,code,2)==0) { + /* do not loose the _territory@encoding part*/ + return; + } lp_config_set_string(cfg,"GtkUi","lang",code); #ifdef WIN32 char tmp[128]; diff --git a/linphone/gtk-glade/utils.c b/linphone/gtk-glade/utils.c index 72d000105..97f263a8d 100644 --- a/linphone/gtk-glade/utils.c +++ b/linphone/gtk-glade/utils.c @@ -75,3 +75,20 @@ void *linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, co } return NULL; } + +gchar *linphone_gtk_get_display_name(const char *sip_uri){ + osip_from_t *from; + gchar *ret=NULL; + if (strchr(sip_uri,'@')){ + osip_from_init(&from); + if (osip_from_parse(from,sip_uri)==0){ + if (from->displayname!=NULL && strlen(from->displayname)>0){ + ret=g_strdup(from->displayname); + } + } + osip_from_free(from); + } + if (ret==NULL) ret=g_strdup(sip_uri); + return ret; +} + diff --git a/linphone/mediastreamer2/src/videoout.c b/linphone/mediastreamer2/src/videoout.c index 8d1c572d8..d557497c4 100644 --- a/linphone/mediastreamer2/src/videoout.c +++ b/linphone/mediastreamer2/src/videoout.c @@ -100,6 +100,7 @@ static long sdl_get_native_window_id(){ static void sdl_display_uninit(MSDisplay *obj); static SDL_Overlay * sdl_create_window(int w, int h){ + static bool_t once=TRUE; SDL_Overlay *lay; sdl_screen = SDL_SetVideoMode(w,h, 0,SDL_SWSURFACE|SDL_RESIZABLE); if (sdl_screen == NULL ) { @@ -108,7 +109,10 @@ static SDL_Overlay * sdl_create_window(int w, int h){ return NULL; } if (sdl_screen->flags & SDL_HWSURFACE) ms_message("SDL surface created in hardware"); - SDL_WM_SetCaption("Video window", NULL); + if (once) { + SDL_WM_SetCaption("Video window", NULL); + once=FALSE; + } ms_message("Using yuv overlay."); lay=SDL_CreateYUVOverlay(w , h ,SDL_YV12_OVERLAY,sdl_screen); if (lay==NULL){