From 46622ba4f8d9c95ccf0f9eb3d2404b00db92bc5b Mon Sep 17 00:00:00 2001 From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Date: Fri, 20 Aug 2010 17:01:11 -0400 Subject: [PATCH] [#3621] Display multiple chat windows in tabs --- sflphone-client-gnome/src/callable_obj.c | 11 ++ sflphone-client-gnome/src/callable_obj.h | 2 + sflphone-client-gnome/src/dbus/dbus.c | 6 ++ sflphone-client-gnome/src/imwindow.c | 76 ++++++++++--- sflphone-client-gnome/src/imwindow.h | 7 +- sflphone-client-gnome/src/uimanager.c | 18 +--- sflphone-client-gnome/src/widget/imwidget.c | 100 ++++++++++++------ sflphone-client-gnome/src/widget/imwidget.h | 7 ++ sflphone-client-gnome/webkit/Makefile.am | 3 +- sflphone-client-gnome/webkit/im/chat_info.png | Bin 0 -> 7284 bytes sflphone-client-gnome/webkit/im/im.css | 12 ++- sflphone-client-gnome/webkit/im/im.html | 9 +- sflphone-client-gnome/webkit/im/im.js | 10 +- 13 files changed, 196 insertions(+), 65 deletions(-) create mode 100644 sflphone-client-gnome/webkit/im/chat_info.png diff --git a/sflphone-client-gnome/src/callable_obj.c b/sflphone-client-gnome/src/callable_obj.c index e165857433..66b0503b48 100644 --- a/sflphone-client-gnome/src/callable_obj.c +++ b/sflphone-client-gnome/src/callable_obj.c @@ -423,3 +423,14 @@ time_t convert_gchar_to_timestamp (gchar *timestamp) { return (time_t) atoi (timestamp); } + + gchar* +get_peer_information (callable_obj_t *c) { + + gchar *res; + + if (g_strcasecmp (c->_peer_name,"") == 0) + return g_strdup (c->_peer_number); + else + return g_strdup (c->_peer_name); +} diff --git a/sflphone-client-gnome/src/callable_obj.h b/sflphone-client-gnome/src/callable_obj.h index a3d4f252ee..acab0ed3ea 100644 --- a/sflphone-client-gnome/src/callable_obj.h +++ b/sflphone-client-gnome/src/callable_obj.h @@ -224,4 +224,6 @@ time_t convert_gchar_to_timestamp (gchar*); gchar* call_get_audio_codec (callable_obj_t *obj); +gchar* get_peer_information (callable_obj_t *c); + #endif diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 2fbeb378d1..5acd8c35f5 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -127,7 +127,13 @@ incoming_message_cb(DBusGProxy *proxy UNUSED, const gchar* callID UNUSED, // Get the call information. Does this call exist? callable_obj_t * c = calllist_get (current_calls, callID); + + /* Make the instant messaging main window pops */ + im_widget_display (&c); + + /* Display le message */ im_widget_add_message (c, msg); + if (c) { notify_incoming_message (callID, msg); } else { diff --git a/sflphone-client-gnome/src/imwindow.c b/sflphone-client-gnome/src/imwindow.c index eb20ca626b..b805b5751c 100644 --- a/sflphone-client-gnome/src/imwindow.c +++ b/sflphone-client-gnome/src/imwindow.c @@ -39,7 +39,7 @@ /** Local variables */ GtkWidget *im_window = NULL; -GtkWidget *im_vbox = NULL; +GtkWidget *im_notebook = NULL; static gboolean window_configure_cb (GtkWidget *win, GdkEventConfigure *event) { int pos_x, pos_y; @@ -57,15 +57,15 @@ static gboolean window_configure_cb (GtkWidget *win, GdkEventConfigure *event) { /** * Minimize the main window. */ -static gboolean + static gboolean on_delete(GtkWidget * widget UNUSED, gpointer data UNUSED) { - gtk_widget_hide(GTK_WIDGET(im_window_get())); - // gtk_widget_destroy (GTK_WIDGET(im_window_get())); + /* Only hide the main window that contains all the instant messaging instances */ + gtk_widget_hide (GTK_WIDGET(im_window_get())); return TRUE; } -static void + static void im_window_init() { const char *window_title = "SFLphone VoIP Client - Instant Messaging Module"; @@ -94,14 +94,18 @@ im_window_init() gtk_widget_set_name(im_window, "imwindow"); g_signal_connect (G_OBJECT (im_window), "delete-event", - G_CALLBACK (on_delete), NULL); + G_CALLBACK (on_delete), NULL); g_signal_connect_object (G_OBJECT (im_window), "configure-event", - G_CALLBACK (window_configure_cb), NULL, 0); + G_CALLBACK (window_configure_cb), NULL, 0); + + GtkWidget *im_vbox = gtk_vbox_new (FALSE /*homogeneous*/, 0 /*spacing*/); + im_notebook = gtk_notebook_new (); - im_vbox = gtk_vbox_new (FALSE /*homogeneous*/, 0 /*spacing*/); gtk_container_add (GTK_CONTAINER (im_window), im_vbox); + gtk_box_pack_start (GTK_BOX (im_vbox), im_notebook, TRUE, TRUE, 0); + gtk_widget_show (im_notebook); /* make sure that everything is visible */ gtk_widget_show_all (im_window); @@ -110,7 +114,7 @@ im_window_init() gtk_window_move (GTK_WINDOW (im_window), position_x, position_y); } -GtkWidget * + GtkWidget * im_window_get() { if (im_window == NULL) @@ -119,16 +123,62 @@ im_window_get() } void -im_window_add (GtkWidget *widget) +im_window_show (){ + gtk_widget_show (im_window_get ()); +} + + void +im_window_add (GtkWidget *widget, gchar *label) { if (im_window_get()) { - gtk_box_pack_start (GTK_BOX (im_vbox), widget, TRUE /*expand*/, - TRUE /*fill*/, 0 /*padding*/); + /* Add the new tab to the notebook */ + im_window_add_tab (widget, label); + + /* Switch to the newly opened tab */ + guint index = gtk_notebook_page_num (GTK_NOTEBOOK (im_notebook), widget); + gtk_notebook_set_current_page (GTK_NOTEBOOK (im_notebook), 2); + g_print ("index %i - current %i\n", index, gtk_notebook_get_current_page (GTK_NOTEBOOK (im_notebook))); + + /* Show it all */ gtk_widget_show_all (im_window); } + else + error ("Could not create the main instant messaging window"); } -void + static void +close_tab_cb (GtkButton *button, gpointer userdata) +{ + + /* We want here to close the current tab */ + guint index = gtk_notebook_page_num (GTK_NOTEBOOK (im_notebook), GTK_WIDGET (userdata)); + g_print ("removing index %i\n", index); + gtk_notebook_remove_page (GTK_NOTEBOOK (im_notebook), index); + +} + + void +im_window_add_tab (GtkWidget *widget, gchar *label) +{ + /* A container to include the tab label and the close button */ + GtkWidget *tab_Container = gtk_hbox_new (FALSE, 3); + GtkWidget *tab_Label = gtk_label_new (label); + GtkWidget *tab_CloseButton = gtk_button_new (); + + gtk_button_set_relief (GTK_BUTTON(tab_CloseButton), GTK_RELIEF_NONE); + gtk_box_pack_start (GTK_BOX (tab_Container), tab_Label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (tab_Container), tab_CloseButton, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER (tab_CloseButton), gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU)); + g_signal_connect (tab_CloseButton, "clicked", G_CALLBACK (close_tab_cb), widget); + + gtk_widget_show_all (tab_Container); + gtk_notebook_append_page (GTK_NOTEBOOK (im_notebook), widget, tab_Container); + +} + + + + void im_window_remove(GtkWidget *widget) { // TODO(jonas) remove widget from the window diff --git a/sflphone-client-gnome/src/imwindow.h b/sflphone-client-gnome/src/imwindow.h index 61128a415f..22d24e5007 100644 --- a/sflphone-client-gnome/src/imwindow.h +++ b/sflphone-client-gnome/src/imwindow.h @@ -49,11 +49,16 @@ GtkWidget *im_window_get(); /** * Add IM widget to the IM window */ -void im_window_add(GtkWidget *widget); +void im_window_add(GtkWidget *widget, gchar *label); /** * Remove IM widget from the IM window */ void im_window_remove(GtkWidget *widget); +void im_window_show (); + +void im_window_add_tab (GtkWidget *widget, gchar *label); + + #endif diff --git a/sflphone-client-gnome/src/uimanager.c b/sflphone-client-gnome/src/uimanager.c index 602f25a333..faa3dda240 100644 --- a/sflphone-client-gnome/src/uimanager.c +++ b/sflphone-client-gnome/src/uimanager.c @@ -509,20 +509,12 @@ call_hold(void* foo UNUSED) call_im (void* foo UNUSED) { callable_obj_t * selectedCall = calltab_get_selected_call(current_calls); - static IMWidget *im = NULL; - if (selectedCall) - { - if (selectedCall->_im_widget == NULL) { - printf("Call IM with call %s\n", selectedCall->_callID); - im = im_widget_new(); - im_window_add (im); - im->call = selectedCall; - selectedCall->_im_widget = im; - - /* Update the informations about the call in the chat window */ - im_widget_add_call_header (selectedCall); - } + if (selectedCall) { + im_widget_display (&selectedCall); + } + else { + warn ("Sorry. Instant messaging is not allowed outside a call\n"); } } diff --git a/sflphone-client-gnome/src/widget/imwidget.c b/sflphone-client-gnome/src/widget/imwidget.c index 0396a1ce91..b3d994d5aa 100644 --- a/sflphone-client-gnome/src/widget/imwidget.c +++ b/sflphone-client-gnome/src/widget/imwidget.c @@ -33,46 +33,57 @@ #define WEBKIT_DIR "file://" DATA_DIR "/webkit/" -static IMWidget *_this; - void im_widget_add_message (callable_obj_t *call, const gchar *message) { /* use the widget for this specific call, if exists */ - IMWidget *im = IM_WIDGET (call->_im_widget); // IM_WIDGET(widget); + if (!call){ + error ("The call passed as a parameter does not seem to be valid"); + } + else { - if (im) { + IMWidget *im = IM_WIDGET (call->_im_widget); - /* Prepare and execute the Javascript code */ - gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, call->_peer_name, call->_peer_number, call->_peer_info); - webkit_web_view_execute_script (WEBKIT_WEB_VIEW(_this->web_view), script); + if (im) { - /* Cleanup */ - g_free(script); - } + /* Update the informations about the call in the chat window */ + im_widget_add_call_header (call); - else { + /* Prepare and execute the Javascript code */ + gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, call->_peer_name, call->_peer_number, call->_peer_info); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script); - im = im_widget_new (); - im_window_add (im); - im->call = call; - call->_im_widget = im; - - /* Prepare and execute the Javascript code */ - gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, call->_peer_name, call->_peer_number, call->_peer_info); - webkit_web_view_execute_script (WEBKIT_WEB_VIEW(_this->web_view), script); + /* Cleanup */ + g_free(script); - /* Cleanup */ - g_free(script); + } + else { + + /* If the chat window is not opened when we receive an incoming message, create the im widget first, + then call the javascript to display the message */ + + im = im_widget_new (); + im_window_add (im); + im->call = call; + call->_im_widget = im; + + /* Prepare and execute the Javascript code */ + gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, call->_peer_name, call->_peer_number, call->_peer_info); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script); + + /* Cleanup */ + g_free(script); + } } } void im_widget_add_call_header (callable_obj_t *call) { + IMWidget *im = IM_WIDGET (call->_im_widget); gchar *script = g_strdup_printf("add_call_info_header('%s', '%s', '%s');", call->_peer_name, call->_peer_number, call->_peer_info); - webkit_web_view_execute_script (WEBKIT_WEB_VIEW(_this->web_view), script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script); /* Cleanup */ g_free(script); @@ -105,8 +116,9 @@ on_Textview_changed (GtkWidget *widget, GdkEventKey *event, gpointer user_data) GtkTextIter start, end; /* Get all the text in the buffer */ - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (_this->textarea)); - + IMWidget *im = user_data; + GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (im->textarea)); + if (event->type == GDK_KEY_PRESS){ switch (event->keyval) @@ -119,10 +131,10 @@ on_Textview_changed (GtkWidget *widget, GdkEventKey *event, gpointer user_data) gchar *message = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); /* Display our own message in the chat window */ - im_widget_add_message (_this->call, message); + im_widget_add_message (im->call, message); /* Send the message to the peer */ - dbus_send_text_message (_this->call->_callID, message); + dbus_send_text_message (im->call->_callID, message); /* Empty the buffer */ gtk_text_buffer_delete (GTK_TEXT_BUFFER (buffer), &start, &end); @@ -165,17 +177,13 @@ im_widget_init (IMWidget *im) gtk_box_pack_start (GTK_BOX(im), webscrollwin, TRUE, TRUE, 5); gtk_box_pack_end (GTK_BOX(im), hbox, FALSE, FALSE, 2); g_signal_connect (im->web_view, "navigation-policy-decision-requested", G_CALLBACK (web_view_nav_requested_cb), NULL); - g_signal_connect(im->textarea, "key-press-event", G_CALLBACK (on_Textview_changed), NULL); + g_signal_connect(im->textarea, "key-press-event", G_CALLBACK (on_Textview_changed), im); g_signal_connect (G_OBJECT (webscrollwin), "destroy", G_CALLBACK (gtk_main_quit), NULL); im->web_frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(im->web_view)); im->js_context = webkit_web_frame_get_global_context(im->web_frame); im->js_global = JSContextGetGlobalObject(im->js_context); webkit_web_view_load_uri (WEBKIT_WEB_VIEW(im->web_view), "file://" DATA_DIR "/webkit/im/im.html"); - - - - _this = im; } GtkWidget * @@ -211,4 +219,34 @@ im_widget_get_type(void) } return im_widget_type; +} + + void +im_widget_display (callable_obj_t **call) +{ + + /* Work with a copy of the object */ + callable_obj_t *tmp = *call; + + /* Use the widget for this specific call, if exists */ + IMWidget *im = IM_WIDGET (tmp->_im_widget); + + if (!im) { + g_print ("creating the im widget for this call\n"); + /* Create the im object */ + im = im_widget_new (); + tmp->_im_widget = im; + /* Update the call */ + *call = tmp; + im->call = *call; + + /* Add it to the main instant messaging window */ + gchar *label = get_peer_information (tmp); + im_window_add (im, label); + } + else { + g_print ("im widget exists for this call\n"); + im_window_show (); + } + } diff --git a/sflphone-client-gnome/src/widget/imwidget.h b/sflphone-client-gnome/src/widget/imwidget.h index 7a250b43f8..b5e80b27df 100644 --- a/sflphone-client-gnome/src/widget/imwidget.h +++ b/sflphone-client-gnome/src/widget/imwidget.h @@ -63,6 +63,13 @@ struct _IMWidgetClass { GtkContainerClass parent_class; }; + +/* + * Display the instant messaging interface for this call. + * If it has not been created yet, create it and attached it to the imWindow + */ +void im_widget_display (callable_obj_t**); + GType im_widget_get_type(void) G_GNUC_CONST; GtkWidget *im_widget_new(void); void im_widget_add_message (callable_obj_t *c, const gchar *message); diff --git a/sflphone-client-gnome/webkit/Makefile.am b/sflphone-client-gnome/webkit/Makefile.am index 7d546f4840..6ef49f61b1 100644 --- a/sflphone-client-gnome/webkit/Makefile.am +++ b/sflphone-client-gnome/webkit/Makefile.am @@ -8,4 +8,5 @@ imdir = $(webkitdir)/im im_DATA = im/im.js \ im/im.html \ im/im.css \ - im/sflphone.png + im/sflphone.png \ + im/chat_info.png diff --git a/sflphone-client-gnome/webkit/im/chat_info.png b/sflphone-client-gnome/webkit/im/chat_info.png new file mode 100644 index 0000000000000000000000000000000000000000..07d3ac7940b2817de5f0497975c883a6c416dd55 GIT binary patch literal 7284 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 Jmvv4FO#uD!i-Q0F literal 0 HcmV?d00001 diff --git a/sflphone-client-gnome/webkit/im/im.css b/sflphone-client-gnome/webkit/im/im.css index 5058075b0e..a234d411e9 100644 --- a/sflphone-client-gnome/webkit/im/im.css +++ b/sflphone-client-gnome/webkit/im/im.css @@ -7,6 +7,7 @@ margin: 20px; overflow: auto; font-size: 0.95em; +clear: both; } * { @@ -22,7 +23,16 @@ body { background: #fbfdfe url(sflphone.png) no-repeat fixed bottom right; } -.peername { +.author { color: #3578B1; font-weight: bold; } + +#call-info { + margin: 40px; +height: 96px; + background: url(chat_info.png) no-repeat center left; + padding: 20px 20px 20px 100px; + border: 2px solid #dedede; + -webkit-border-radius: 25px; +} diff --git a/sflphone-client-gnome/webkit/im/im.html b/sflphone-client-gnome/webkit/im/im.html index cb7e025185..ee3a5d5584 100644 --- a/sflphone-client-gnome/webkit/im/im.html +++ b/sflphone-client-gnome/webkit/im/im.html @@ -5,8 +5,13 @@ </head> <body> <div class='page'> - <div id="call-info"></div> - <div id="messages"></div> + <div id="call-info"> + <h2> Calling <span id='peer-number'></span></h2> + <p>Nom: <span id='peer-name'></span></p> + <p>Plus: <span id='peer-info'></span></p> + </div> + <div id="messages"> + </div> </div> </body> </html> diff --git a/sflphone-client-gnome/webkit/im/im.js b/sflphone-client-gnome/webkit/im/im.js index be53a4b082..45642b0ce3 100644 --- a/sflphone-client-gnome/webkit/im/im.js +++ b/sflphone-client-gnome/webkit/im/im.js @@ -23,12 +23,16 @@ function add_message (message, peer_name, peer_number, peer_info) } var msgBody = document.getElementById ('messages'); - msgBody.innerHTML = msgBody.innerHTML + '<div class="message">' + '<span class="peername">' + display_name + ': </span>' + '<span class="text">' + linkify (message) + '</span></div>' ; + msgBody.innerHTML = msgBody.innerHTML + '<div class="message">' + '<span class="author">' + display_name + ': </span>' + '<p class="text">' + linkify (message) + '</p></div>' ; } function add_call_info_header (peer_name, peer_number, peer_info) { - var infoBody = document.getElementById ('call-info'); - infoBody.innerHTML = '<h2>Calling ' + peer_number + '</h2><p>' + peer_info + '</p></h4>'; + var peerNumber = document.getElementById ('peer-number'); + var peerName = document.getElementById ('peer-name'); + var peerInfo = document.getElementById ('peer-info'); + peerNumber.innerHTML = peer_number; + peerName.innerHTML = peer_name; + peerInfo.innerHTML = peer_info; } -- GitLab