diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 1722fba991f650a49183f965fb4bb337d5e8189c..a634703552cc98d1331cca03ef330e7e2301fc72 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -127,6 +127,7 @@ 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); + im_widget_add_message (NULL, 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 fbbeb50a5905b56a844130e5b714799593a46ff1..69bae4df72b4284155249f4d75b038f34f4f5bb3 100644 --- a/sflphone-client-gnome/src/imwindow.c +++ b/sflphone-client-gnome/src/imwindow.c @@ -61,13 +61,14 @@ 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())); return TRUE; } static void im_window_init() { - const char *window_title = "SFLphone VoIP Client"; + const char *window_title = "SFLphone VoIP Client - Instant Messaging Module"; gchar *path; GError *error = NULL; gboolean ret; diff --git a/sflphone-client-gnome/src/uimanager.c b/sflphone-client-gnome/src/uimanager.c index ebc44c113d915994756ab1f07127a8ff8e1866ac..1d5a959fee36348184177bbde28e9efc378d8a7f 100644 --- a/sflphone-client-gnome/src/uimanager.c +++ b/sflphone-client-gnome/src/uimanager.c @@ -506,7 +506,7 @@ call_hold(void* foo UNUSED) } static void -call_im(void* foo UNUSED) +call_im (void* foo UNUSED) { callable_obj_t * selectedCall = calltab_get_selected_call(current_calls); diff --git a/sflphone-client-gnome/src/widget/imwidget.c b/sflphone-client-gnome/src/widget/imwidget.c index 856497321fea67d76ff93b50f004ad0ac39f6b92..494806d5370abc7b70d1ad48eb38f968a9961372 100644 --- a/sflphone-client-gnome/src/widget/imwidget.c +++ b/sflphone-client-gnome/src/widget/imwidget.c @@ -32,13 +32,19 @@ #define WEBKIT_DIR "file://" DATA_DIR "/webkit/" +static IMWidget *_this; + void -im_widget_add_message(GtkWidget *widget, const gchar *message) +im_widget_add_message (GtkWidget *widget, const gchar *message) { IMWidget *im = IM_WIDGET(widget); + + /* Prepare and execute the Javascript code */ gchar *script = g_strdup_printf("add_message('%s');", message); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (_this->web_view), script); + // webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script); - webkit_web_view_execute_script(WEBKIT_WEB_VIEW(im->web_view), script); + /* Cleanup */ g_free(script); } @@ -63,6 +69,25 @@ web_view_nav_requested_cb( return TRUE; } +static void +on_SendMessage_click (void) { + + /* Get the text in the buffer */ + GtkTextIter start, end; + GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (_this->textarea)); + gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (buffer), &start, &end); + gchar *message = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + + if (g_strcasecmp (message, "") != 0 ) + { + im_widget_add_message (GTK_WIDGET (_this), message); + + /* Empty the buffer */ + gtk_text_buffer_delete (GTK_TEXT_BUFFER (buffer), &start, &end); + } +} + + static void im_widget_class_init(IMWidgetClass *klass) { @@ -71,35 +96,41 @@ im_widget_class_init(IMWidgetClass *klass) static void im_widget_init(IMWidget *im) { - im->textarea = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(im->textarea), TRUE); - GtkWidget *textscrollwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(textscrollwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(textscrollwin), im->textarea); + im->textarea = gtk_text_view_new (); im->web_view = webkit_web_view_new(); - GtkWidget *webscrollwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(webscrollwin), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(webscrollwin), im->web_view); - - g_signal_connect(im->web_view, "navigation-policy-decision-requested", - G_CALLBACK (web_view_nav_requested_cb), NULL); + GtkWidget *textscrollwin = gtk_scrolled_window_new(NULL, NULL); + GtkWidget *webscrollwin = gtk_scrolled_window_new (NULL, NULL); + /* A bar with the entry text and the button to send the message */ + GtkWidget *hbox = gtk_hbox_new (FALSE, 10); + GtkWidget *button_SendMessage = gtk_button_new_with_label("Send"); + gtk_text_view_set_editable(GTK_TEXT_VIEW(im->textarea), TRUE); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(textscrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(webscrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (textscrollwin), im->textarea); + gtk_container_add (GTK_CONTAINER (webscrollwin), im->web_view); + gtk_container_add (GTK_CONTAINER (hbox), textscrollwin); + gtk_container_add (GTK_CONTAINER (hbox), button_SendMessage); gtk_box_pack_start(GTK_BOX(im), webscrollwin, TRUE, TRUE, 5); - gtk_box_pack_end(GTK_BOX(im), textscrollwin, TRUE, TRUE, 5); + gtk_box_pack_end(GTK_BOX(im), hbox, FALSE, FALSE, 1); + // gtk_box_pack_end(GTK_BOX(im), textscrollwin, TRUE, TRUE, 5); + g_signal_connect (im->web_view, "navigation-policy-decision-requested", G_CALLBACK (web_view_nav_requested_cb), NULL); + g_signal_connect(button_SendMessage, "clicked", G_CALLBACK(on_SendMessage_click), NULL); + 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_open(WEBKIT_WEB_VIEW(im->web_view), "file://" DATA_DIR "/webkit/im/im.html"); + webkit_web_view_load_uri (WEBKIT_WEB_VIEW(im->web_view), "file://" DATA_DIR "/webkit/im/im.html"); + + _this = im; } GtkWidget * im_widget_new() { - return GTK_WIDGET(g_object_new(IM_WIDGET_TYPE, NULL)); + return GTK_WIDGET (g_object_new (IM_WIDGET_TYPE, NULL)); } GType diff --git a/sflphone-client-gnome/webkit/im/im.css b/sflphone-client-gnome/webkit/im/im.css index f738ae58004b7c5f1f4b598b26ae7c71e0a74188..28cf9a6516f81425e50506fae04e4773ec702f01 100644 --- a/sflphone-client-gnome/webkit/im/im.css +++ b/sflphone-client-gnome/webkit/im/im.css @@ -1,6 +1,8 @@ .message { -webkit-border-radius: 5px; - background: green; - color: white; + background: #f2f2f2; + color: #777; padding: 1em; + -webkit-box-shadow: 2px 2px 5px #000; + margin: 20px; } diff --git a/sflphone-client-gnome/webkit/im/im.html b/sflphone-client-gnome/webkit/im/im.html index 369ce676da776aa62a85d99f3f4b23643a6247e7..0e17ee5cbf5ea8ab2874dfb18c37a37b98864926 100644 --- a/sflphone-client-gnome/webkit/im/im.html +++ b/sflphone-client-gnome/webkit/im/im.html @@ -1,11 +1,10 @@ <html> <head> <script src="im.js"></script> + <script src="jquery-1.4.2.min.js"></script> <link rel="stylesheet" type="text/css" href="im.css" /> </head> <body> <div id="messages"></div> - <div class="message">Hello something</div> - <a href="http://www.savoirfairelinux.com/">www.savoirfairelinux.com</a> </body> </html> diff --git a/sflphone-client-gnome/webkit/im/im.js b/sflphone-client-gnome/webkit/im/im.js index 30e5d6790ab75688c79b6dbdae040baba765af3a..db963f2578585fdf92f5ef66ce6b23135974863b 100644 --- a/sflphone-client-gnome/webkit/im/im.js +++ b/sflphone-client-gnome/webkit/im/im.js @@ -1,4 +1,6 @@ -function add_message(message) +function add_message (message) { - alert("Message: " + message); + var msgBody = document.getElementById ('messages'); + msgBody.innerHTML = '<div class="message">' + message + '</div>' + msgBody.innerHTML; } +