From ed1f88b24e5cdb249de00b341742743470bd89a0 Mon Sep 17 00:00:00 2001 From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Date: Mon, 16 Aug 2010 15:56:43 -0400 Subject: [PATCH] [#960] Display messages in the webkit windows --- sflphone-client-gnome/src/dbus/dbus.c | 1 + sflphone-client-gnome/src/imwindow.c | 3 +- sflphone-client-gnome/src/uimanager.c | 2 +- sflphone-client-gnome/src/widget/imwidget.c | 67 +++++++++++++++------ sflphone-client-gnome/webkit/im/im.css | 6 +- sflphone-client-gnome/webkit/im/im.html | 3 +- sflphone-client-gnome/webkit/im/im.js | 6 +- 7 files changed, 62 insertions(+), 26 deletions(-) diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 1722fba991..a634703552 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 fbbeb50a59..69bae4df72 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 ebc44c113d..1d5a959fee 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 856497321f..494806d537 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 f738ae5800..28cf9a6516 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 369ce676da..0e17ee5cbf 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 30e5d6790a..db963f2578 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; } + -- GitLab