--- a/pidgin/pidginlog.c Mon May 20 05:25:18 2019 -0400
+++ b/pidgin/pidginlog.c Fri May 24 03:21:48 2019 -0400
@@ -21,6 +21,8 @@
@@ -39,13 +41,17 @@
#define PIDGIN_TYPE_LOG_VIEWER pidgin_log_viewer_get_type()
- * @logs: The list of logs viewed in this viewer
- * @treestore: The treestore containing said logs
- * @treeview: The treeview representing said treestore
- * @log_view: The webkit web view to display said logs
- * @entry: The search entry, in which search terms are entered
- * @search: The string currently being searched for
- * @label: The label at the top of the log viewer
+ * @logs: The list of logs viewed in this viewer + * @browse_button: The button for opening a log folder externally + * @treestore: The treestore containing said logs + * @treeview: The treeview representing said treestore + * @log_view: The talkatu view to display said logs + * @log_buffer: The talkatu buffer to hold said logs + * @title_box: The box containing the title (and optional icon) + * @label: The label at the top of the log viewer + * @size_label: The label to show the size of the logs + * @entry: The search entry, in which search terms are entered + * @search: The string currently being searched for * A Pidgin Log Viewer. You can look at logs with it.
@@ -56,13 +62,20 @@
+ GtkWidget *browse_button;
+ TalkatuHtmlBuffer *log_buffer;
G_DEFINE_TYPE(PidginLogViewer, pidgin_log_viewer, GTK_TYPE_DIALOG)
@@ -149,26 +162,31 @@
-static void search_cb(GtkWidget *button, PidginLogViewer *lv)
+entry_stop_search_cb(GtkWidget *entry, PidginLogViewer *lv) + gtk_tree_store_clear(lv->treestore); + g_clear_pointer(&lv->search, g_free); + webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(lv->log_view)); +entry_search_changed_cb(GtkWidget *button, PidginLogViewer *lv) const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry));
- gtk_tree_store_clear(lv->treestore);
- webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(lv->log_view));
if (lv->search != NULL && purple_strequal(lv->search, search_term))
/* Searching for the same term acts as "Find Next" */
webkit_web_view_search_text(WEBKIT_WEB_VIEW(lv->log_view), lv->search, FALSE, TRUE, TRUE);
@@ -178,7 +196,7 @@
lv->search = g_strdup(search_term);
gtk_tree_store_clear(lv->treestore);
- webkit_web_view_open(WEBKIT_WEB_VIEW(lv->log_view), "about:blank"); /* clear the view */
+ talkatu_buffer_clear(TALKATU_BUFFER(lv->log_buffer)); for (logs = lv->logs; logs != NULL; logs = logs->next) {
char *read = purple_log_read((PurpleLog*)logs->data, NULL);
@@ -444,6 +462,7 @@
+#if 0 /* FIXME: Add support in Talkatu for highlighting search terms. */ static gboolean search_find_cb(gpointer data)
PidginLogViewer *viewer = data;
@@ -452,6 +471,7 @@
webkit_web_view_search_text(WEBKIT_WEB_VIEW(viewer->log_view), viewer->search, FALSE, TRUE, TRUE);
static void log_select_cb(GtkTreeSelection *sel, PidginLogViewer *viewer) {
@@ -476,13 +496,14 @@
if (log->type != PURPLE_LOG_SYSTEM) {
gchar *log_date = log_get_date(log);
- if (log->type == PURPLE_LOG_CHAT)
- title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"),
- title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation with %s on %s</span>"),
+ if (log->type == PURPLE_LOG_CHAT) { + title = g_strdup_printf(_("Conversation in %s on %s"), + title = g_strdup_printf(_("Conversation with %s on %s"), gtk_label_set_markup(viewer->label, title);
@@ -491,7 +512,7 @@
read = purple_log_read(log, &flags);
- webkit_web_view_open(WEBKIT_WEB_VIEW(viewer->log_view), "about:blank");
+ talkatu_buffer_clear(TALKATU_BUFFER(viewer->log_buffer)); purple_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log);
@@ -503,12 +524,14 @@
- webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(viewer->log_view), read, "");
+ talkatu_markup_set_html(TALKATU_BUFFER(viewer->log_buffer), read, -1); if (viewer->search != NULL) {
+#if 0 /* FIXME: Add support in Talkatu for highlighting search terms. */ webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(viewer->log_view));
g_idle_add(search_find_cb, viewer);
pidgin_clear_cursor(GTK_WIDGET(viewer));
@@ -564,17 +587,6 @@
const char *title, GtkWidget *icon, int log_size)
- GtkTreeViewColumn *col;
- GtkWidget *find_button;
@@ -606,115 +618,45 @@
lv = g_object_new(PIDGIN_TYPE_LOG_VIEWER, NULL);
gtk_window_set_title(GTK_WINDOW(lv), title);
- gtk_dialog_add_buttons(GTK_DIALOG(lv), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
g_hash_table_insert(log_viewers, ht, lv);
- /* Steal the "HELP" response and use it to trigger browsing to the logs folder */
- gtk_dialog_add_button(GTK_DIALOG(lv), _("_Browse logs folder"), GTK_RESPONSE_HELP);
+ gtk_widget_hide(lv->browse_button); - gtk_container_set_border_width(GTK_CONTAINER(lv), PIDGIN_HIG_BOX_SPACE);
- gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(lv))), 0);
- g_signal_connect(G_OBJECT(lv), "response",
- G_CALLBACK(destroy_cb), ht);
- gtk_window_set_role(GTK_WINDOW(lv), "log_viewer");
+ g_signal_connect(G_OBJECT(lv), "response", G_CALLBACK(destroy_cb), ht); - title_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PIDGIN_HIG_BOX_SPACE);
- gtk_container_set_border_width(GTK_CONTAINER(title_box), PIDGIN_HIG_BOX_SPACE);
- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(lv))),
- title_box, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(title_box), icon, FALSE, FALSE, 0);
- title_box = gtk_dialog_get_content_area(GTK_DIALOG(lv));
+ gtk_box_pack_start(GTK_BOX(lv->title_box), icon, FALSE, FALSE, - lv->label = GTK_LABEL(gtk_label_new(NULL));
- text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title);
- gtk_label_set_markup(lv->label, text);
- gtk_label_set_xalign(GTK_LABEL(lv->label), 0);
- gtk_label_set_yalign(GTK_LABEL(lv->label), 0);
- gtk_box_pack_start(GTK_BOX(title_box), GTK_WIDGET(lv->label), FALSE, FALSE, 0);
- pane = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_container_set_border_width(GTK_CONTAINER(pane), PIDGIN_HIG_BOX_SPACE);
- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(lv))),
+ gtk_label_set_markup(lv->label, title); - lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
- lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore));
- g_object_unref(G_OBJECT(lv->treestore));
- rend = gtk_cell_renderer_text_new();
- col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE);
- gtk_paned_add1(GTK_PANED(pane),
- pidgin_make_scrollable(lv->treeview, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1));
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview));
- g_signal_connect (G_OBJECT (sel), "changed",
- G_CALLBACK (log_select_cb),
- g_signal_connect (G_OBJECT(lv->treeview), "row-activated",
- G_CALLBACK(log_row_activated_cb),
- pidgin_set_accessible_label(lv->treeview, lv->label);
- g_signal_connect(lv->treeview, "button-press-event", G_CALLBACK(log_button_press_cb), lv);
- g_signal_connect(lv->treeview, "popup-menu", G_CALLBACK(log_popup_menu_cb), lv);
/* Log size ************/
char *sz_txt = purple_str_size_to_units(log_size);
- text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt);
- size_label = gtk_label_new(NULL);
- gtk_label_set_markup(GTK_LABEL(size_label), text);
- /* gtk_paned_add1(GTK_PANED(pane), size_label); */
- gtk_label_set_xalign(GTK_LABEL(size_label), 0);
- gtk_label_set_yalign(GTK_LABEL(size_label), 0);
- gtk_box_pack_end(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(lv))),
- size_label, FALSE, FALSE, 0);
+ char *text = g_strdup_printf("<span weight='bold'>%s</span> %s", + _("Total log size:"), sz_txt); + gtk_label_set_markup(GTK_LABEL(lv->size_label), text); + gtk_widget_hide(lv->size_label); - /* A fancy little box ************/
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_BOX_SPACE);
- gtk_paned_add2(GTK_PANED(pane), vbox);
- /* Viewer ************/
- frame = pidgin_create_webview(FALSE, &lv->log_view, NULL);
- gtk_widget_set_name(lv->log_view, "pidgin_log_log_view");
- gtk_widget_set_size_request(lv->log_view, 320, 200);
- gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
- /* Search box **********/
- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PIDGIN_HIG_BOX_SPACE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- lv->entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0);
- find_button = gtk_button_new_from_stock(GTK_STOCK_FIND);
- gtk_box_pack_start(GTK_BOX(hbox), find_button, FALSE, FALSE, 0);
- g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv);
- g_signal_connect(GTK_BUTTON(find_button), "clicked", G_CALLBACK(search_cb), lv);
- gtk_widget_show_all(GTK_WIDGET(lv));
+ gtk_widget_show(GTK_WIDGET(lv)); @@ -725,11 +667,51 @@
pidgin_log_viewer_class_init(PidginLogViewerClass *klass)
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + gtk_widget_class_set_template_from_resource( + widget_class, "/im/pidgin/Pidgin/Log/log-viewer.ui"); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, browse_button); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, title_box); + gtk_widget_class_bind_template_child_internal(widget_class, + PidginLogViewer, label); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, treeview); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, treestore); + gtk_widget_class_bind_template_callback(widget_class, log_select_cb); + gtk_widget_class_bind_template_callback(widget_class, + gtk_widget_class_bind_template_callback(widget_class, + gtk_widget_class_bind_template_callback(widget_class, + gtk_widget_class_bind_template_child_internal(widget_class, + PidginLogViewer, entry); + gtk_widget_class_bind_template_callback(widget_class, + entry_search_changed_cb); + gtk_widget_class_bind_template_callback(widget_class, + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, log_view); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, log_buffer); + gtk_widget_class_bind_template_child_internal( + widget_class, PidginLogViewer, size_label); pidgin_log_viewer_init(PidginLogViewer *self)
+ gtk_widget_init_template(GTK_WIDGET(self)); /****************************************************************************
--- a/pidgin/resources/pidgin.gresource.xml Mon May 20 05:25:18 2019 -0400
+++ b/pidgin/resources/pidgin.gresource.xml Fri May 24 03:21:48 2019 -0400
@@ -9,6 +9,7 @@
<file compressed="true">Debug/debug.ui</file>
<file compressed="true">Debug/filter-popover.ui</file>
<file compressed="true">Debug/plugininfo.ui</file>
+ <file compressed="true">Log/log-viewer.ui</file> <file compressed="true">Prefs/prefs.ui</file>