[GnomeMeeting-devel-list] [PATCH] private text-chat (revisited)
- From: PUYDT Julien <julien puydt laposte net>
- To: GnomeMeeting Devel Liste <gnomemeeting-devel-list gnome org>
- Subject: [GnomeMeeting-devel-list] [PATCH] private text-chat (revisited)
- Date: Mon, 08 Mar 2004 16:25:58 +0100
Hi,
new version of the patch ; this one gets rid of the explicit call to a
destroy function.
Now the memory is freed this way:
* when the main window is destroyed,
* it destroys the text-chat window, that
* gets rid of the rest of the text-chat;
Snark
diff -ur gnomemeeting-cvs-20040308.CVS/src/chat_window.cpp gnomemeeting-cvs-20040308.CVS.patched/src/chat_window.cpp
--- gnomemeeting-cvs-20040308.CVS/src/chat_window.cpp 2004-03-04 20:04:13.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/chat_window.cpp 2004-03-08 16:14:11.000000000 +0100
@@ -56,6 +56,15 @@
extern GtkWidget *gm;
+struct _GmTextChatPrivate
+{
+ GtkWidget *window;
+ GtkWidget *text_view;
+ GtkTextBuffer *text_buffer;
+ gboolean something_typed;
+ gchar *begin_msg;
+};
+
#ifndef DISABLE_GNOME
/* DESCRIPTION : Called when an URL is clicked.
@@ -138,6 +147,7 @@
gpointer data)
{
GMH323EndPoint *endpoint = GnomeMeeting::Process ()->Endpoint ();
+ GmTextChat *chat = (GmTextChat *)data;
PString s;
if (endpoint) {
@@ -169,7 +179,7 @@
utf8_local = gnomemeeting_from_iso88591_to_utf8 (local);
if (utf8_local)
- gnomemeeting_text_chat_insert (utf8_local, s, 0);
+ gnomemeeting_text_chat_insert (chat, utf8_local, s, 0);
g_free (utf8_local);
gtk_entry_set_text (GTK_ENTRY (w), "");
@@ -180,30 +190,27 @@
}
}
-void gnomemeeting_text_chat_clear (GtkWidget *w,
- GmTextChat *chat)
+void gnomemeeting_text_chat_clear (GmTextChat *chat)
{
GmWindow *gw = NULL;
GtkTextIter start_iter, end_iter;
gw = GnomeMeeting::Process ()->GetMainWindow ();
- gtk_text_buffer_get_start_iter (chat->text_buffer, &start_iter);
- gtk_text_buffer_get_end_iter (chat->text_buffer, &end_iter);
+ gtk_text_buffer_get_start_iter (chat->internal->text_buffer, &start_iter);
+ gtk_text_buffer_get_end_iter (chat->internal->text_buffer, &end_iter);
- gtk_text_buffer_delete (chat->text_buffer, &start_iter, &end_iter);
+ gtk_text_buffer_delete (chat->internal->text_buffer, &start_iter, &end_iter);
gtk_menu_set_sensitive (gw->main_menu, "clear_text_chat", FALSE);
}
void
-gnomemeeting_text_chat_call_start_notification (void)
+gnomemeeting_text_chat_call_start_notification (GmTextChat *chat)
{
- GmTextChat *chat = NULL;
GmWindow *gw = NULL;
gw = GnomeMeeting::Process ()->GetMainWindow ();
- chat = GnomeMeeting::Process ()->GetTextChat ();
// find the time at which the event occured
time_t *timeptr;
@@ -216,21 +223,22 @@
strftime(time_str, 20, "%H:%M:%S", localtime (timeptr));
// prepare the message
- if (chat->begin_msg) g_free (chat->begin_msg); // shouldn't happen...
- chat->begin_msg = g_strdup_printf ("---- Call begins at %s\n", time_str);
+ if (chat->internal->begin_msg)
+ g_free (chat->internal->begin_msg); // shouldn't happen...
+ chat->internal->begin_msg = g_strdup_printf ("---- Call begins at %s\n",
+ time_str);
// we are ready to trigger the message display
- chat->something_typed = FALSE;
+ chat->internal->something_typed = FALSE;
// free what we should
g_free (time_str);
}
void
-gnomemeeting_text_chat_call_stop_notification (void)
+gnomemeeting_text_chat_call_stop_notification (GmTextChat *chat)
{
GtkTextIter iter;
- GmTextChat *chat = NULL;
GmWindow *gw = NULL;
gchar *text = NULL;
@@ -249,11 +257,10 @@
// displays the message
gw = GnomeMeeting::Process ()->GetMainWindow ();
- chat = GnomeMeeting::Process ()->GetTextChat ();
- gtk_text_buffer_get_end_iter (chat->text_buffer, &iter);
+ gtk_text_buffer_get_end_iter (chat->internal->text_buffer, &iter);
- if (chat->something_typed == TRUE)
- gtk_text_buffer_insert(chat->text_buffer, &iter, text, -1);
+ if (chat->internal->something_typed == TRUE)
+ gtk_text_buffer_insert(chat->internal->text_buffer, &iter, text, -1);
// freeing what we need to
free (time_str);
@@ -261,7 +268,8 @@
}
void
-gnomemeeting_text_chat_insert (PString local,
+gnomemeeting_text_chat_insert (GmTextChat *chat,
+ PString local,
PString str,
int user)
{
@@ -269,51 +277,67 @@
GtkTextIter iter;
GtkTextMark *mark;
- GmTextChat *chat = NULL;
GmWindow *gw = NULL;
gw = GnomeMeeting::Process ()->GetMainWindow ();
- chat = GnomeMeeting::Process ()->GetTextChat ();
- gtk_text_buffer_get_end_iter (chat->text_buffer, &iter);
+ gtk_text_buffer_get_end_iter (chat->internal->text_buffer, &iter);
// delayed call begin notification first!
- if (chat->something_typed == FALSE) {
- chat->something_typed = TRUE;
- if (chat->begin_msg) { // should always be true
- gtk_text_buffer_insert(chat->text_buffer, &iter, chat->begin_msg, -1);
- g_free (chat->begin_msg);
- chat->begin_msg = NULL;
+ if (chat->internal->something_typed == FALSE) {
+ chat->internal->something_typed = TRUE;
+ if (chat->internal->begin_msg) { // should always be true
+ gtk_text_buffer_insert(chat->internal->text_buffer,
+ &iter, chat->internal->begin_msg, -1);
+ g_free (chat->internal->begin_msg);
+ chat->internal->begin_msg = NULL;
}
}
msg = g_strdup_printf ("%s: ", (const char *) local);
if (user == 1)
- gtk_text_buffer_insert_with_tags_by_name (chat->text_buffer, &iter, msg,
- -1, "primary-user", NULL);
+ gtk_text_buffer_insert_with_tags_by_name (chat->internal->text_buffer,
+ &iter, msg, -1,
+ "primary-user", NULL);
else
- gtk_text_buffer_insert_with_tags_by_name (chat->text_buffer, &iter, msg,
- -1, "secondary-user", NULL);
+ gtk_text_buffer_insert_with_tags_by_name (chat->internal->text_buffer,
+ &iter, msg, -1,
+ "secondary-user", NULL);
g_free (msg);
- gtk_text_buffer_insert_with_regex (chat->text_buffer, &iter,
+ gtk_text_buffer_insert_with_regex (chat->internal->text_buffer, &iter,
(const char *) str);
- gtk_text_buffer_insert (chat->text_buffer, &iter, "\n", -1);
+ gtk_text_buffer_insert (chat->internal->text_buffer, &iter, "\n", -1);
- mark = gtk_text_buffer_get_mark (chat->text_buffer, "current-position");
+ mark = gtk_text_buffer_get_mark (chat->internal->text_buffer,
+ "current-position");
- gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (chat->text_view), mark,
- 0.0, FALSE, 0,0);
+ gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (chat->internal->text_view),
+ mark, 0.0, FALSE, 0,0);
gtk_menu_set_sensitive (gw->main_menu, "clear_text_chat", TRUE);
}
+void
+text_chat_destroy (gpointer data)
+{
+ GmTextChat *chat = (GmTextChat *)data;
+ /* gtk_widget_destroy (chat->internal->window)
+ unneeded: its destruction is what make this function called!
+ */
+ if (chat->internal->begin_msg) {
+ g_free (chat->internal->begin_msg);
+ chat->internal->begin_msg = NULL;
+ }
+ delete (chat->internal);
+ delete (chat);
+}
-GtkWidget *
-gnomemeeting_text_chat_new (GmTextChat *chat)
+GmTextChat*
+gnomemeeting_text_chat_new ()
{
GtkWidget *entry = NULL;
GtkWidget *scr = NULL;
@@ -321,55 +345,63 @@
GtkWidget *table = NULL;
GtkWidget *frame = NULL;
GtkWidget *hbox = NULL;
- GtkWidget *chat_window = NULL;
+ GmTextChat *chat = NULL;
GtkTextIter iter;
GtkTextMark *mark = NULL;
GtkTextTag *regex_tag = NULL;
+ /* create the basic data */
+ chat = new GmTextChat ();
+ chat->internal = new GmTextChatPrivate ();
/* Get the structs from the application */
- chat_window = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (chat_window), GTK_SHADOW_NONE);
+ chat->internal->window = gtk_frame_new (NULL);
+ g_object_set_data_full (G_OBJECT (chat->internal->window), "private",
+ (gpointer)chat, text_chat_destroy);
+ gtk_frame_set_shadow_type (GTK_FRAME (chat->internal->window),
+ GTK_SHADOW_NONE);
table = gtk_table_new (1, 3, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 0);
- gtk_container_add (GTK_CONTAINER (chat_window), table);
+ gtk_container_add (GTK_CONTAINER (chat->internal->window), table);
scr = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_ALWAYS);
- chat->begin_msg = NULL;
- chat->something_typed = FALSE;
+ chat->internal->begin_msg = NULL;
+ chat->internal->something_typed = FALSE;
- chat->text_view = gtk_text_view_new_with_regex ();
- gtk_text_view_set_editable (GTK_TEXT_VIEW (chat->text_view), FALSE);
- gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (chat->text_view),
+ chat->internal->text_view = gtk_text_view_new_with_regex ();
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (chat->internal->text_view),
+ FALSE);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (chat->internal->text_view),
GTK_WRAP_WORD);
- chat->text_buffer =
- gtk_text_view_get_buffer (GTK_TEXT_VIEW (chat->text_view));
+ chat->internal->text_buffer =
+ gtk_text_view_get_buffer (GTK_TEXT_VIEW (chat->internal->text_view));
- gtk_text_buffer_get_end_iter (chat->text_buffer, &iter);
- gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (chat->text_view), false);
+ gtk_text_buffer_get_end_iter (chat->internal->text_buffer, &iter);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (chat->internal->text_view),
+ false);
- mark = gtk_text_buffer_create_mark (chat->text_buffer,
+ mark = gtk_text_buffer_create_mark (chat->internal->text_buffer,
"current-position", &iter, FALSE);
- gtk_text_buffer_create_tag (chat->text_buffer, "primary-user",
+ gtk_text_buffer_create_tag (chat->internal->text_buffer, "primary-user",
"foreground", "red",
"weight", 900, NULL);
- gtk_text_buffer_create_tag (chat->text_buffer,
+ gtk_text_buffer_create_tag (chat->internal->text_buffer,
"secondary-user",
"foreground", "darkblue",
"weight", 900, NULL);
/* Create the various tags for the different urls types */
- regex_tag = gtk_text_buffer_create_tag (chat->text_buffer,
+ regex_tag = gtk_text_buffer_create_tag (chat->internal->text_buffer,
"uri-http",
"foreground", "blue",
NULL);
@@ -386,7 +418,8 @@
}
- regex_tag = gtk_text_buffer_create_tag (chat->text_buffer, "uri-h323",
+ regex_tag = gtk_text_buffer_create_tag (chat->internal->text_buffer,
+ "uri-h323",
"foreground", "pink",
NULL);
if (gtk_text_tag_set_regex (regex_tag,
@@ -401,14 +434,14 @@
NULL);
}
- regex_tag = gtk_text_buffer_create_tag (chat->text_buffer, "smileys",
- "foreground", "grey",
+ regex_tag = gtk_text_buffer_create_tag (chat->internal->text_buffer,
+ "smileys", "foreground", "grey",
NULL);
if (gtk_text_tag_set_regex (regex_tag,
"(:[-]?(\\)|\\(|o|O|p|P|D|\\||/)|\\}:(\\(|\\))|\\|[-]?(\\(|\\))|:'\\(|:\\[|:-(\\.|\\*|x)|;[-]?\\)|(8|B)[-]?\\)|X(\\(|\\||\\))|\\((\\.|\\|)\\)|x\\*O)"))
gtk_text_tag_set_regex_display (regex_tag, gtk_text_buffer_insert_smiley);
- regex_tag = gtk_text_buffer_create_tag (chat->text_buffer, "latex",
+ regex_tag = gtk_text_buffer_create_tag (chat->internal->text_buffer, "latex",
"foreground", "grey",
NULL);
if (gtk_text_tag_set_regex (regex_tag,
@@ -420,7 +453,7 @@
/* */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (scr), chat->text_view);
+ gtk_container_add (GTK_CONTAINER (scr), chat->internal->text_view);
gtk_container_add (GTK_CONTAINER (frame), scr);
gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (frame),
@@ -451,7 +484,13 @@
0, 0);
g_signal_connect (GTK_OBJECT (entry), "activate",
- G_CALLBACK (chat_entry_activate), chat->text_view);
+ G_CALLBACK (chat_entry_activate), chat);
- return chat_window;
+ return chat;
+}
+
+GtkWidget*
+gnomemeeting_text_chat_window (GmTextChat *chat)
+{
+ return chat->internal->window;
}
diff -ur gnomemeeting-cvs-20040308.CVS/src/chat_window.h gnomemeeting-cvs-20040308.CVS.patched/src/chat_window.h
--- gnomemeeting-cvs-20040308.CVS/src/chat_window.h 2004-01-20 12:00:38.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/chat_window.h 2004-03-08 16:12:36.000000000 +0100
@@ -43,17 +43,29 @@
#include "common.h"
-
G_BEGIN_DECLS
+typedef struct _GmTextChat GmTextChat;
+typedef struct _GmTextChatPrivate GmTextChatPrivate;
+
+struct _GmTextChat
+{
+ GmTextChatPrivate *internal;
+};
/* DESCRIPTION : /
- * BEHAVIOR : Initializes the text chat view.
+ * BEHAVIOR : Initializes/destroys the text chat.
* PRE : /
*/
-GtkWidget *
-gnomemeeting_text_chat_new (GmTextChat *);
+GmTextChat *
+gnomemeeting_text_chat_new ();
+/* DESCRIPTION : /
+ * BEHAVIOR : Initializes/destroys the text chat.
+ * PRE : /
+ */
+GtkWidget*
+gnomemeeting_text_chat_window (GmTextChat *);
/* DESCRIPTION : /
* BEHAVIOR : Clears the text chat view.
@@ -61,17 +73,16 @@
* can be used in a callback.
*/
void
-gnomemeeting_text_chat_clear (GtkWidget *,
- GmTextChat *);
+gnomemeeting_text_chat_clear (GmTextChat *);
/* DESCRIPTION: /
* BEHAVIOR : Signals the text chat that a connection begins or ends
*/
void
-gnomemeeting_text_chat_call_start_notification (void);
+gnomemeeting_text_chat_call_start_notification (GmTextChat *);
void
-gnomemeeting_text_chat_call_stop_notification (void);
+gnomemeeting_text_chat_call_stop_notification (GmTextChat *);
/* DESCRIPTION : /
* BEHAVIOR : Displays the colored text chat message,
@@ -81,7 +92,8 @@
* 0 for local user string, 1 for remote user received string.
*/
void
-gnomemeeting_text_chat_insert (PString,
+gnomemeeting_text_chat_insert (GmTextChat *,
+ PString,
PString,
int);
diff -ur gnomemeeting-cvs-20040308.CVS/src/common.h gnomemeeting-cvs-20040308.CVS.patched/src/common.h
--- gnomemeeting-cvs-20040308.CVS/src/common.h 2004-02-01 22:53:25.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/common.h 2004-03-08 16:12:36.000000000 +0100
@@ -120,7 +120,6 @@
typedef struct _GmPrefWindow GmPrefWindow;
typedef struct _GmLdapWindow GmLdapWindow;
typedef struct _GmLdapWindowPage GmLdapWindowPage;
-typedef struct _GmTextChat GmTextChat;
typedef struct _GmDruidWindow GmDruidWindow;
typedef struct _GmCallsHistoryWindow GmCallsHistoryWindow;
typedef struct _GmRtpData GmRtpData;
@@ -156,15 +155,6 @@
} ControlPanelSection;
-struct _GmTextChat
-{
- GtkWidget *text_view;
- GtkTextBuffer *text_buffer;
- gboolean something_typed;
- gchar *begin_msg;
-};
-
-
struct _GmRtpData
{
int tr_audio_bytes;
diff -ur gnomemeeting-cvs-20040308.CVS/src/connection.cpp gnomemeeting-cvs-20040308.CVS.patched/src/connection.cpp
--- gnomemeeting-cvs-20040308.CVS/src/connection.cpp 2004-02-10 23:01:14.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/connection.cpp 2004-03-08 16:12:36.000000000 +0100
@@ -270,7 +270,8 @@
gnomemeeting_threads_enter ();
if (utf8_remote && strcmp (utf8_remote, ""))
- gnomemeeting_text_chat_insert (utf8_remote, val, 1);
+ gnomemeeting_text_chat_insert (GnomeMeeting::Process ()->GetTextChat (),
+ utf8_remote, val, 1);
if (!GTK_WIDGET_VISIBLE (gw->chat_window))
gconf_set_bool (USER_INTERFACE_KEY "main_window/show_chat_window", true);
diff -ur gnomemeeting-cvs-20040308.CVS/src/endpoint.cpp gnomemeeting-cvs-20040308.CVS.patched/src/endpoint.cpp
--- gnomemeeting-cvs-20040308.CVS/src/endpoint.cpp 2004-03-04 20:04:13.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/endpoint.cpp 2004-03-08 16:12:36.000000000 +0100
@@ -978,7 +978,7 @@
gnomemeeting_statusbar_push (gw->statusbar, _("Connected"));
gnomemeeting_log_insert (_("Connected with %s using %s"),
utf8_name, utf8_app);
- gnomemeeting_text_chat_call_start_notification ();
+ gnomemeeting_text_chat_call_start_notification (chat);
gtk_label_set_text (GTK_LABEL (gw->remote_name), (const char *) utf8_name);
gtk_window_set_title (GTK_WINDOW (gw->remote_video_window),
@@ -1270,7 +1270,7 @@
gnomemeeting_log_insert (msg_reason);
- gnomemeeting_text_chat_call_stop_notification ();
+ gnomemeeting_text_chat_call_stop_notification (chat);
gnomemeeting_statusbar_flash (gw->statusbar, msg_reason);
gnomemeeting_threads_leave ();
@@ -1337,7 +1337,7 @@
/* We empty the text chat buffer */
if (auto_clear_text_chat)
- gnomemeeting_text_chat_clear (NULL, chat);
+ gnomemeeting_text_chat_clear (chat);
/* set-on-top to False */
diff -ur gnomemeeting-cvs-20040308.CVS/src/endpoint.h gnomemeeting-cvs-20040308.CVS.patched/src/endpoint.h
--- gnomemeeting-cvs-20040308.CVS/src/endpoint.h 2004-02-16 20:03:30.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/endpoint.h 2004-03-08 16:12:36.000000000 +0100
@@ -43,6 +43,7 @@
#include "../config.h"
#include "common.h"
+#include "chat_window.h"
#ifdef HAS_IXJ
#include <ixjlid.h>
diff -ur gnomemeeting-cvs-20040308.CVS/src/gnomemeeting.cpp gnomemeeting-cvs-20040308.CVS.patched/src/gnomemeeting.cpp
--- gnomemeeting-cvs-20040308.CVS/src/gnomemeeting.cpp 2004-02-24 23:04:16.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/gnomemeeting.cpp 2004-03-08 16:12:36.000000000 +0100
@@ -107,7 +107,7 @@
pw = new GmPrefWindow ();
lw = new GmLdapWindow ();
dw = new GmDruidWindow ();
- chat = new GmTextChat ();
+ chat = gnomemeeting_text_chat_new ();
chw = new GmCallsHistoryWindow ();
rtp = new GmRtpData ();
@@ -162,7 +162,6 @@
delete (pw);
delete (lw);
delete (dw);
- delete (chat);
delete (chw);
delete (rtp);
}
diff -ur gnomemeeting-cvs-20040308.CVS/src/main_window.cpp gnomemeeting-cvs-20040308.CVS.patched/src/main_window.cpp
--- gnomemeeting-cvs-20040308.CVS/src/main_window.cpp 2004-02-24 23:04:17.000000000 +0100
+++ gnomemeeting-cvs-20040308.CVS.patched/src/main_window.cpp 2004-03-08 16:12:36.000000000 +0100
@@ -1161,7 +1161,7 @@
/* The Chat Window */
- gw->chat_window = gnomemeeting_text_chat_new (chat);
+ gw->chat_window = gnomemeeting_text_chat_window (chat);
gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (gw->chat_window),
2, 4, 0, 3,
(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]