diff options
Diffstat (limited to 'logview/logview-window.c')
-rw-r--r-- | logview/logview-window.c | 1548 |
1 files changed, 0 insertions, 1548 deletions
diff --git a/logview/logview-window.c b/logview/logview-window.c deleted file mode 100644 index d0728f92..00000000 --- a/logview/logview-window.c +++ /dev/null @@ -1,1548 +0,0 @@ -/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ -/* logview-window.c - main window of logview - * - * Copyright (C) 1998 Cesar Miquel <[email protected]> - * Copyright (C) 2008 Cosimo Cecchi <[email protected]> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <gtk/gtk.h> -#include <gdk/gdkkeysyms.h> -#include <glib/gi18n.h> - -#include "logview-window.h" - -#include "logview-loglist.h" -#include "logview-findbar.h" -#include "logview-about.h" -#include "logview-prefs.h" -#include "logview-manager.h" -#include "logview-filter-manager.h" - -#define APP_NAME _("System Log Viewer") -#define SEARCH_START_MARK "lw-search-start-mark" -#define SEARCH_END_MARK "lw-search-end-mark" - -struct _LogviewWindowPrivate { - GtkUIManager *ui_manager; - GtkActionGroup *action_group; - GtkActionGroup *filter_action_group; - - GtkWidget *find_bar; - GtkWidget *loglist; - GtkWidget *sidebar; - GtkWidget *version_bar; - GtkWidget *version_selector; - GtkWidget *hpaned; - GtkWidget *text_view; - GtkWidget *statusbar; - - GtkWidget *message_area; - GtkWidget *message_primary; - GtkWidget *message_secondary; - - GtkTextTagTable *tag_table; - - int original_fontsize, fontsize; - - LogviewPrefs *prefs; - LogviewManager *manager; - - gulong monitor_id; - guint search_timeout_id; - - GCancellable *read_cancellable; - - guint filter_merge_id; - GList *active_filters; - gboolean matches_only; -}; - -#define GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_WINDOW, LogviewWindowPrivate)) - -G_DEFINE_TYPE (LogviewWindow, logview_window, GTK_TYPE_WINDOW); - -static void findbar_close_cb (LogviewFindbar *findbar, - gpointer user_data); -static void read_new_lines_cb (LogviewLog *log, - const char **lines, - GSList *new_days, - GError *error, - gpointer user_data); - -/* private functions */ - -static void -logview_version_selector_changed (GtkComboBox *version_selector, gpointer user_data) -{ - -} -#if 0 - LogviewWindow *logview = user_data; - Log *log = logview->curlog; - int selected; - - g_assert (LOGVIEW_IS_WINDOW (logview)); - - selected = gtk_combo_box_get_active (version_selector); - - if (selected == log->current_version) - return; - - /* select a new version */ - if (selected == 0) { - logview_select_log (logview, log->parent_log); - } else { - Log *new; - if (log->parent_log) { - new = log->parent_log->older_logs[selected]; - } else { - new = log->older_logs[selected]; - } - - logview_select_log (logview, new); - } -} - -#endif - -/* private helpers */ - -static void -populate_tag_table (GtkTextTagTable *tag_table) -{ - GtkTextTag *tag; - - tag = gtk_text_tag_new ("bold"); - g_object_set (tag, "weight", PANGO_WEIGHT_BOLD, - "weight-set", TRUE, NULL); - - gtk_text_tag_table_add (tag_table, tag); - - tag = gtk_text_tag_new ("invisible"); - g_object_set (tag, "invisible", TRUE, "invisible-set", TRUE, NULL); - gtk_text_tag_table_add (tag_table, tag); - - tag = gtk_text_tag_new ("invisible-filter"); - g_object_set (tag, "invisible", TRUE, "invisible-set", TRUE, NULL); - gtk_text_tag_table_add (tag_table, tag); -} - - -static void -populate_style_tag_table (GtkStyle *style, - GtkTextTagTable *tag_table) -{ - GtkTextTag *tag; - GdkColor color; - - tag = gtk_text_tag_table_lookup (tag_table, "gray"); - - if (tag) { - /* FIXME: do we need a way to update the buffer/view? */ - gtk_text_tag_table_remove (tag_table, tag); - } - - tag = gtk_text_tag_new ("gray"); - color = style->text[GTK_STATE_INSENSITIVE]; - g_object_set (tag, "foreground-gdk", &color, "foreground-set", TRUE, NULL); - - gtk_text_tag_table_add (tag_table, tag); -} - -static void -_gtk_text_buffer_apply_tag_to_rectangle (GtkTextBuffer *buffer, int line_start, int line_end, - int offset_start, int offset_end, char *tag_name) -{ - GtkTextIter start, end; - int line_cur; - - gtk_text_buffer_get_iter_at_line (buffer, &start, line_start); - gtk_text_buffer_get_iter_at_line (buffer, &end, line_start); - - for (line_cur = line_start; line_cur < line_end + 1; line_cur++) { - - if (offset_start > 0) { - gtk_text_iter_forward_chars (&start, offset_start); - } - - gtk_text_iter_forward_chars (&end, offset_end); - - gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end); - - gtk_text_iter_forward_line (&start); - gtk_text_iter_forward_line (&end); - } -} - -static void -logview_update_statusbar (LogviewWindow *logview, LogviewLog *active) -{ - char *statusbar_text; - char *size, *modified, *timestring_utf8; - time_t timestamp; - char timestring[255]; - - if (active == NULL) { - gtk_statusbar_pop (GTK_STATUSBAR (logview->priv->statusbar), 0); - return; - } - - timestamp = logview_log_get_timestamp (active); - strftime (timestring, sizeof (timestring), "%a %b %e %T %Y", localtime (×tamp)); - timestring_utf8 = g_locale_to_utf8 (timestring, -1, NULL, NULL, NULL); - - modified = g_strdup_printf (_("last update: %s"), timestring_utf8); - - size = g_format_size (logview_log_get_file_size (active)); - - statusbar_text = g_strdup_printf (_("%d lines (%s) - %s"), - logview_log_get_cached_lines_number (active), - size, modified); - - gtk_statusbar_pop (GTK_STATUSBAR (logview->priv->statusbar), 0); - gtk_statusbar_push (GTK_STATUSBAR (logview->priv->statusbar), 0, statusbar_text); - - g_free (size); - g_free (timestring_utf8); - g_free (modified); - g_free (statusbar_text); -} - -#define DEFAULT_LOGVIEW_FONT "Monospace 10" - -static void -logview_set_font (LogviewWindow *logview, - const char *fontname) -{ - PangoFontDescription *font_desc; - - if (fontname == NULL) - fontname = DEFAULT_LOGVIEW_FONT; - - font_desc = pango_font_description_from_string (fontname); - if (font_desc) { - gtk_widget_modify_font (logview->priv->text_view, font_desc); - pango_font_description_free (font_desc); - } -} - -static void -logview_set_fontsize (LogviewWindow *logview, gboolean store) -{ - PangoFontDescription *fontdesc; - PangoContext *context; - LogviewWindowPrivate *priv = logview->priv; - - context = gtk_widget_get_pango_context (priv->text_view); - fontdesc = pango_context_get_font_description (context); - pango_font_description_set_size (fontdesc, (priv->fontsize) * PANGO_SCALE); - gtk_widget_modify_font (priv->text_view, fontdesc); - - if (store) { - logview_prefs_store_fontsize (logview->priv->prefs, priv->fontsize); - } -} - -static void -logview_set_window_title (LogviewWindow *logview, const char * log_name) -{ - char *window_title; - - if (log_name) { - window_title = g_strdup_printf ("%s - %s", log_name, APP_NAME); - } else { - window_title = g_strdup_printf (APP_NAME); - } - - gtk_window_set_title (GTK_WINDOW (logview), window_title); - - g_free (window_title); -} - -/* actions callbacks */ - -static void -open_file_selected_cb (GtkWidget *chooser, gint response, LogviewWindow *logview) -{ - GFile *f; - char *file_uri; - LogviewLog *log; - - gtk_widget_hide (GTK_WIDGET (chooser)); - if (response != GTK_RESPONSE_OK) { - return; - } - - f = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (chooser)); - file_uri = g_file_get_uri (f); - - log = logview_manager_get_if_loaded (logview->priv->manager, file_uri); - - g_free (file_uri); - - if (log) { - logview_manager_set_active_log (logview->priv->manager, log); - g_object_unref (log); - goto out; - } - - logview_manager_add_log_from_gfile (logview->priv->manager, f, TRUE); - -out: - g_object_unref (f); -} - -static void -logview_open_log (GtkAction *action, LogviewWindow *logview) -{ - static GtkWidget *chooser = NULL; - char *active; - - if (chooser == NULL) { - chooser = gtk_file_chooser_dialog_new (_("Open Log"), - GTK_WINDOW (logview), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_OK); - gtk_window_set_modal (GTK_WINDOW (chooser), TRUE); - g_signal_connect (chooser, "response", - G_CALLBACK (open_file_selected_cb), logview); - g_signal_connect (chooser, "destroy", - G_CALLBACK (gtk_widget_destroyed), &chooser); - active = logview_prefs_get_active_logfile (logview->priv->prefs); - if (active != NULL) { - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), active); - g_free (active); - } - } - - gtk_window_present (GTK_WINDOW (chooser)); -} - -static void -logview_close_log (GtkAction *action, LogviewWindow *logview) -{ - findbar_close_cb (LOGVIEW_FINDBAR (logview->priv->find_bar), logview); - logview_manager_close_active_log (logview->priv->manager); -} - -static void -logview_help (GtkAction *action, GtkWidget *parent_window) -{ - GError *error = NULL; - - gtk_show_uri (gtk_widget_get_screen (parent_window), - "help:mate-system-log", gtk_get_current_event_time (), - &error); - - if (error) { - g_warning (_("There was an error displaying help: %s"), error->message); - g_error_free (error); - } -} - -static void -logview_bigger_text (GtkAction *action, LogviewWindow *logview) -{ - logview->priv->fontsize = MIN (logview->priv->fontsize + 1, 24); - logview_set_fontsize (logview, TRUE); -} - -static void -logview_smaller_text (GtkAction *action, LogviewWindow *logview) -{ - logview->priv->fontsize = MAX (logview->priv->fontsize-1, 6); - logview_set_fontsize (logview, TRUE); -} - -static void -logview_normal_text (GtkAction *action, LogviewWindow *logview) -{ - logview->priv->fontsize = logview->priv->original_fontsize; - logview_set_fontsize (logview, TRUE); -} - -static void -logview_select_all (GtkAction *action, LogviewWindow *logview) -{ - GtkTextIter start, end; - GtkTextBuffer *buffer; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - - gtk_text_buffer_get_bounds (buffer, &start, &end); - gtk_text_buffer_select_range (buffer, &start, &end); - - gtk_widget_grab_focus (GTK_WIDGET (logview->priv->text_view)); -} - -static void -logview_copy (GtkAction *action, LogviewWindow *logview) -{ - GtkTextBuffer *buffer; - GtkClipboard *clipboard; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - - gtk_text_buffer_copy_clipboard (buffer, clipboard); - - gtk_widget_grab_focus (GTK_WIDGET (logview->priv->text_view)); -} - -static void -findbar_close_cb (LogviewFindbar *findbar, - gpointer user_data) -{ - gtk_widget_hide (GTK_WIDGET (findbar)); - logview_findbar_set_message (findbar, NULL); -} - -static void -logview_search_text (LogviewWindow *logview, gboolean forward) -{ - GtkTextBuffer *buffer; - GtkTextMark *search_start, *search_end; - GtkTextIter search, start_m, end_m; - const char *text; - gboolean res, wrapped; - - wrapped = FALSE; - - text = logview_findbar_get_text (LOGVIEW_FINDBAR (logview->priv->find_bar)); - - if (!text || g_strcmp0 (text, "") == 0) { - return; - } - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - search_start = gtk_text_buffer_get_mark (buffer, SEARCH_START_MARK); - search_end = gtk_text_buffer_get_mark (buffer, SEARCH_END_MARK); - - if (!search_start) { - /* this is our first search on the buffer, create a new search mark */ - gtk_text_buffer_get_start_iter (buffer, &search); - search_start = gtk_text_buffer_create_mark (buffer, SEARCH_START_MARK, - &search, TRUE); - search_end = gtk_text_buffer_create_mark (buffer, SEARCH_END_MARK, - &search, TRUE); - } else { - if (forward) { - gtk_text_buffer_get_iter_at_mark (buffer, &search, search_end); - } else { - gtk_text_buffer_get_iter_at_mark (buffer, &search, search_start); - } - } - -wrap: - - if (forward) { - res = gtk_text_iter_forward_search (&search, text, GTK_TEXT_SEARCH_VISIBLE_ONLY, &start_m, &end_m, NULL); - } else { - res = gtk_text_iter_backward_search (&search, text, GTK_TEXT_SEARCH_VISIBLE_ONLY, &start_m, &end_m, NULL); - } - - if (res) { - gtk_text_buffer_select_range (buffer, &start_m, &end_m); - gtk_text_buffer_move_mark (buffer, search_start, &start_m); - gtk_text_buffer_move_mark (buffer, search_end, &end_m); - - gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (logview->priv->text_view), search_end); - - if (wrapped) { - logview_findbar_set_message (LOGVIEW_FINDBAR (logview->priv->find_bar), _("Wrapped")); - } - } else { - if (wrapped) { - - GtkTextMark *mark; - GtkTextIter iter; - - if (gtk_text_buffer_get_has_selection (buffer)) { - /* unselect */ - mark = gtk_text_buffer_get_mark (buffer, "insert"); - gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); - gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &iter); - } - - logview_findbar_set_message (LOGVIEW_FINDBAR (logview->priv->find_bar), _("Not found")); - } else { - if (forward) { - gtk_text_buffer_get_start_iter (buffer, &search); - } else { - gtk_text_buffer_get_end_iter (buffer, &search); - } - - wrapped = TRUE; - goto wrap; - } - } -} - -static void -findbar_previous_cb (LogviewFindbar *findbar, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - - logview_search_text (logview, FALSE); -} - -static void -findbar_next_cb (LogviewFindbar *findbar, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - - logview_search_text (logview, TRUE); -} - -static gboolean -text_changed_timeout_cb (gpointer user_data) -{ - LogviewWindow *logview = user_data; - GtkTextMark *search_start, *search_end; - GtkTextIter start; - GtkTextBuffer *buffer; - - logview->priv->search_timeout_id = 0; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - search_start = gtk_text_buffer_get_mark (buffer, SEARCH_START_MARK); - search_end = gtk_text_buffer_get_mark (buffer, SEARCH_END_MARK); - - if (search_start) { - /* reset the search mark to the start */ - gtk_text_buffer_get_start_iter (buffer, &start); - gtk_text_buffer_move_mark (buffer, search_start, &start); - gtk_text_buffer_move_mark (buffer, search_end, &start); - } - - logview_findbar_set_message (LOGVIEW_FINDBAR (logview->priv->find_bar), NULL); - - logview_search_text (logview, TRUE); - - return FALSE; -} - -static void -findbar_text_changed_cb (LogviewFindbar *findbar, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - - if (logview->priv->search_timeout_id != 0) { - g_source_remove (logview->priv->search_timeout_id); - } - - logview->priv->search_timeout_id = g_timeout_add (300, text_changed_timeout_cb, logview); -} - -static void -logview_search (GtkAction *action, LogviewWindow *logview) -{ - logview_findbar_open (LOGVIEW_FINDBAR (logview->priv->find_bar)); -} - -static void -filter_buffer (LogviewWindow *logview, gint start_line) -{ - GtkTextBuffer *buffer; - GtkTextIter start, *end; - gchar* text; - GList* cur_filter; - gboolean matched; - int lines, i; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - lines = gtk_text_buffer_get_line_count (buffer); - - for (i = start_line; i < lines; i++) { - matched = FALSE; - - gtk_text_buffer_get_iter_at_line (buffer, &start, i); - end = gtk_text_iter_copy (&start); - gtk_text_iter_forward_line (end); - - text = gtk_text_buffer_get_text (buffer, &start, end, TRUE); - - for (cur_filter = logview->priv->active_filters; cur_filter != NULL; - cur_filter = g_list_next (cur_filter)) - { - if (logview_filter_filter (LOGVIEW_FILTER (cur_filter->data), text)) { - gtk_text_buffer_apply_tag (buffer, - logview_filter_get_tag (LOGVIEW_FILTER (cur_filter->data)), - &start, end); - matched = TRUE; - } - } - - g_free (text); - - if (!matched && logview->priv->matches_only) { - gtk_text_buffer_apply_tag_by_name (buffer, - "invisible-filter", - &start, end); - } else { - gtk_text_buffer_remove_tag_by_name (buffer, - "invisible-filter", - &start, end); - } - - gtk_text_iter_free (end); - } -} - -static void -filter_remove (LogviewWindow *logview, LogviewFilter *filter) -{ - GtkTextIter start, end; - GtkTextBuffer *buffer; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - gtk_text_buffer_get_bounds (buffer, &start, &end); - - gtk_text_buffer_remove_tag (buffer, logview_filter_get_tag (filter), - &start, &end); -} - -static void -on_filter_toggled (GtkToggleAction *action, LogviewWindow *logview) -{ - LogviewWindowPrivate *priv = GET_PRIVATE (logview); - const gchar* name; - LogviewFilter *filter; - - name = gtk_action_get_name (GTK_ACTION (action)); - - if (gtk_toggle_action_get_active (action)) { - priv->active_filters = g_list_append (priv->active_filters, - logview_prefs_get_filter (priv->prefs, - name)); - filter_buffer(logview, 0); - } else { - filter = logview_prefs_get_filter (priv->prefs, name); - priv->active_filters = g_list_remove (priv->active_filters, - filter); - - filter_remove (logview, filter); - } -} - -#define FILTER_PLACEHOLDER "/LogviewMenu/FilterMenu/PlaceholderFilters" -static void -update_filter_menu (LogviewWindow *window) -{ - LogviewWindowPrivate *priv; - GtkUIManager* ui; - GList *actions, *l; - guint id; - GList *filters; - GtkTextBuffer *buffer; - GtkTextTagTable *table; - GtkTextTag *tag; - GtkToggleAction *action; - gchar* name; - - priv = GET_PRIVATE (window); - ui = priv->ui_manager; - - g_return_if_fail (priv->filter_action_group != NULL); - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->text_view)); - table = priv->tag_table; - - if (priv->filter_merge_id != 0) { - gtk_ui_manager_remove_ui (ui, - priv->filter_merge_id); - } - - actions = gtk_action_group_list_actions (priv->filter_action_group); - - for (l = actions; l != NULL; l = g_list_next (l)) { - tag = gtk_text_tag_table_lookup (table, gtk_action_get_name (GTK_ACTION (l->data))); - gtk_text_tag_table_remove (table, tag); - - g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), - G_CALLBACK (on_filter_toggled), - window); - gtk_action_group_remove_action (priv->filter_action_group, - GTK_ACTION (l->data)); - } - - g_list_free (actions); - - filters = logview_prefs_get_filters (logview_prefs_get ()); - - id = (g_list_length (filters) > 0) ? gtk_ui_manager_new_merge_id (ui) : 0; - - for (l = filters; l != NULL; l = g_list_next (l)) { - g_object_get (l->data, "name", &name, NULL); - - action = gtk_toggle_action_new (name, name, NULL, NULL); - gtk_action_group_add_action (priv->filter_action_group, - GTK_ACTION (action)); - - g_signal_connect (action, - "toggled", - G_CALLBACK (on_filter_toggled), - window); - - gtk_ui_manager_add_ui (ui, id, FILTER_PLACEHOLDER, - name, name, GTK_UI_MANAGER_MENUITEM, FALSE); - gtk_text_tag_table_add (table, - logview_filter_get_tag (LOGVIEW_FILTER (l->data))); - - g_object_unref (action); - g_free(name); - } - - g_list_free (filters); - - priv->filter_merge_id = id; -} - -static void -on_logview_filter_manager_response (GtkDialog *dialog, - gint response, - LogviewWindow *logview) -{ - update_filter_menu (logview); - - g_list_free (logview->priv->active_filters); - logview->priv->active_filters = NULL; -} - -static void -logview_manage_filters (GtkAction *action, LogviewWindow *logview) -{ - GtkWidget *manager; - - manager = logview_filter_manager_new (); - - g_signal_connect (manager, "response", - G_CALLBACK (on_logview_filter_manager_response), - logview); - - gtk_window_set_transient_for (GTK_WINDOW (manager), - GTK_WINDOW (logview)); - gtk_widget_show (GTK_WIDGET (manager)); -} - -static void -logview_about (GtkWidget *widget, GtkWidget *window) -{ - g_return_if_fail (GTK_IS_WINDOW (window)); - - char *license_trans = g_strjoin ("\n\n", _(logview_about_license[0]), - _(logview_about_license[1]), - _(logview_about_license[2]), NULL); - - gtk_show_about_dialog (GTK_WINDOW (window), - "name", _("System Log Viewer"), - "version", VERSION, - "copyright", "Copyright \xc2\xa9 1998-2008 Free Software Foundation, Inc.", - "license", license_trans, - "wrap-license", TRUE, - "comments", _("A system log viewer for MATE."), - "authors", logview_about_authors, - "documenters", logview_about_documenters, - "translator_credits", strcmp (logview_about_translator_credits, - "translator-credits") != 0 ? - logview_about_translator_credits : NULL, - "logo_icon_name", "mate-system-log", - NULL); - g_free (license_trans); - - return; -} - -static void -logview_toggle_statusbar (GtkAction *action, LogviewWindow *logview) -{ - if (gtk_widget_get_visible (logview->priv->statusbar)) - gtk_widget_hide (logview->priv->statusbar); - else - gtk_widget_show (logview->priv->statusbar); -} - -static void -logview_toggle_sidebar (GtkAction *action, LogviewWindow *logview) -{ - if (gtk_widget_get_visible (logview->priv->sidebar)) - gtk_widget_hide (logview->priv->sidebar); - else - gtk_widget_show (logview->priv->sidebar); -} - -static void -logview_toggle_match_filters (GtkToggleAction *action, LogviewWindow *logview) -{ - logview->priv->matches_only = gtk_toggle_action_get_active (action); - filter_buffer (logview, 0); -} - -/* GObject functions */ - -/* Menus */ - -static GtkActionEntry entries[] = { - { "FileMenu", NULL, N_("_File"), NULL, NULL, NULL }, - { "EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL }, - { "ViewMenu", NULL, N_("_View"), NULL, NULL, NULL }, - { "FilterMenu", NULL, N_("_Filters"), NULL, NULL, NULL }, - { "HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL }, - - { "OpenLog", GTK_STOCK_OPEN, N_("_Open..."), "<control>O", N_("Open a log from file"), - G_CALLBACK (logview_open_log) }, - { "CloseLog", GTK_STOCK_CLOSE, N_("_Close"), "<control>W", N_("Close this log"), - G_CALLBACK (logview_close_log) }, - { "Quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", N_("Quit the log viewer"), - G_CALLBACK (gtk_main_quit) }, - - { "Copy", GTK_STOCK_COPY, N_("_Copy"), "<control>C", N_("Copy the selection"), - G_CALLBACK (logview_copy) }, - { "SelectAll", NULL, N_("Select _All"), "<Control>A", N_("Select the entire log"), - G_CALLBACK (logview_select_all) }, - { "Search", GTK_STOCK_FIND, N_("_Find..."), "<control>F", N_("Find a word or phrase in the log"), - G_CALLBACK (logview_search) }, - - { "ViewZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus", N_("Bigger text size"), - G_CALLBACK (logview_bigger_text)}, - { "ViewZoomOut", GTK_STOCK_ZOOM_OUT, NULL, "<control>minus", N_("Smaller text size"), - G_CALLBACK (logview_smaller_text)}, - { "ViewZoom100", GTK_STOCK_ZOOM_100, NULL, "<control>0", N_("Normal text size"), - G_CALLBACK (logview_normal_text)}, - - { "FilterManage", NULL, N_("Manage Filters"), NULL, N_("Manage filters"), - G_CALLBACK (logview_manage_filters)}, - - { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", N_("Open the help contents for the log viewer"), - G_CALLBACK (logview_help) }, - { "AboutAction", GTK_STOCK_ABOUT, N_("_About"), NULL, N_("Show the about dialog for the log viewer"), - G_CALLBACK (logview_about) }, -}; - -static GtkToggleActionEntry toggle_entries[] = { - { "ShowStatusBar", NULL, N_("_Statusbar"), NULL, N_("Show Status Bar"), - G_CALLBACK (logview_toggle_statusbar), TRUE }, - { "ShowSidebar", NULL, N_("Side _Pane"), "F9", N_("Show Side Pane"), - G_CALLBACK (logview_toggle_sidebar), TRUE }, - { "FilterMatchOnly", NULL, N_("Show matches only"), NULL, N_("Only show lines that match one of the given filters"), - G_CALLBACK (logview_toggle_match_filters), FALSE} -}; - -static gboolean -window_size_changed_cb (GtkWidget *widget, GdkEventConfigure *event, - gpointer data) -{ - LogviewWindow *window = data; - - logview_prefs_store_window_size (window->priv->prefs, - event->width, event->height); - - return FALSE; -} - -static void -real_select_day (LogviewWindow *logview, - GDate *date, int first_line, int last_line) -{ - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter, start_vis, end_vis; - GdkRectangle visible_rect; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - - gtk_text_buffer_get_bounds (buffer, &start_iter, &end_iter); - gtk_text_buffer_get_iter_at_line (buffer, &start_vis, first_line); - gtk_text_buffer_get_iter_at_line (buffer, &end_vis, last_line + 1); - - /* clear all previous invisible tags */ - gtk_text_buffer_remove_tag_by_name (buffer, "invisible", - &start_iter, &end_iter); - - gtk_text_buffer_apply_tag_by_name (buffer, "invisible", - &start_iter, &start_vis); - gtk_text_buffer_apply_tag_by_name (buffer, "invisible", - &end_vis, &end_iter); - - /* FIXME: why is this needed to update the view when selecting a day back? */ - gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (logview->priv->text_view), - &visible_rect); - gdk_window_invalidate_rect (gtk_widget_get_window (logview->priv->text_view), - &visible_rect, TRUE); -} - -static void -loglist_day_selected_cb (LogviewLoglist *loglist, - Day *day, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - - real_select_day (logview, day->date, day->first_line, day->last_line); -} - -static void -loglist_day_cleared_cb (LogviewLoglist *loglist, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - GtkTextBuffer *buffer; - GtkTextIter start, end; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view)); - gtk_text_buffer_get_bounds (buffer, &start, &end); - - /* clear all previous invisible tags */ - gtk_text_buffer_remove_tag_by_name (buffer, "invisible", - &start, &end); -} - -static void -logview_window_schedule_log_read (LogviewWindow *window, - LogviewLog *log) -{ - if (window->priv->read_cancellable != NULL) { - g_cancellable_cancel (window->priv->read_cancellable); - g_clear_object (&window->priv->read_cancellable); - } - - window->priv->read_cancellable = g_cancellable_new (); - logview_log_read_new_lines (log, - window->priv->read_cancellable, - (LogviewNewLinesCallback) read_new_lines_cb, - window); -} - -static void -log_monitor_changed_cb (LogviewLog *log, - gpointer user_data) -{ - LogviewWindow *window = user_data; - - /* reschedule a read */ - logview_window_schedule_log_read (window, log); -} - -static void -paint_timestamps (GtkTextBuffer *buffer, int old_line_count, - GSList *days) -{ - GSList *l; - - for (l = days; l; l = l->next) { - Day *day = l->data; - - _gtk_text_buffer_apply_tag_to_rectangle (buffer, - old_line_count + day->first_line - 1, - old_line_count + day->last_line, - 0, day->timestamp_len, "gray"); - } -} - -static void -read_new_lines_cb (LogviewLog *log, - const char **lines, - GSList *new_days, - GError *error, - gpointer user_data) -{ - LogviewWindow *window = user_data; - GtkTextBuffer *buffer; - gboolean boldify = FALSE; - int i, old_line_count, filter_start_line; - GtkTextIter iter, start; - GtkTextMark *mark; - char *converted, *primary; - gsize len; - - if (error != NULL) { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - primary = g_strdup_printf (_("Can't read from \"%s\""), - logview_log_get_display_name (log)); - logview_window_add_error (window, primary, error->message); - g_free (primary); - } - - return; - } - - if (lines == NULL) { - /* there's no error, but no lines have been read */ - return; - } - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (window->priv->text_view)); - old_line_count = gtk_text_buffer_get_line_count (buffer); - filter_start_line = old_line_count > 0 ? (old_line_count - 1) : 0; - - if (gtk_text_buffer_get_char_count (buffer) != 0) { - boldify = TRUE; - } - - gtk_text_buffer_get_end_iter (buffer, &iter); - - if (boldify) { - mark = gtk_text_buffer_create_mark (buffer, NULL, &iter, TRUE); - } - - for (i = 0; lines[i]; i++) { - len = strlen (lines[i]); - - if (!g_utf8_validate (lines[i], len, NULL)) { - converted = g_locale_to_utf8 (lines[i], (gssize) len, NULL, &len, NULL); - gtk_text_buffer_insert (buffer, &iter, converted, len); - g_free (converted); - } else { - gtk_text_buffer_insert (buffer, &iter, lines[i], strlen (lines[i])); - } - - gtk_text_iter_forward_to_end (&iter); - gtk_text_buffer_insert (buffer, &iter, "\n", 1); - gtk_text_iter_forward_char (&iter); - } - - if (boldify) { - gtk_text_buffer_get_iter_at_mark (buffer, &start, mark); - gtk_text_buffer_apply_tag_by_name (buffer, "bold", &start, &iter); - gtk_text_buffer_delete_mark (buffer, mark); - } - filter_buffer (window, filter_start_line); - - gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (window->priv->text_view), - &iter, 0.0, FALSE, 0.0, 0.0); - - paint_timestamps (buffer, old_line_count, new_days); - - if (window->priv->monitor_id == 0) { - window->priv->monitor_id = g_signal_connect (log, "log-changed", - G_CALLBACK (log_monitor_changed_cb), window); - } - - logview_update_statusbar (window, log); - logview_loglist_update_lines (LOGVIEW_LOGLIST (window->priv->loglist), log); -} - -static void -active_log_changed_cb (LogviewManager *manager, - LogviewLog *log, - LogviewLog *old_log, - gpointer data) -{ - LogviewWindow *window = data; - const char **lines; - GtkTextBuffer *buffer; - - findbar_close_cb (LOGVIEW_FINDBAR (window->priv->find_bar), - window); - - logview_set_window_title (window, logview_log_get_display_name (log)); - - if (window->priv->monitor_id) { - g_signal_handler_disconnect (old_log, window->priv->monitor_id); - window->priv->monitor_id = 0; - } - - lines = logview_log_get_cached_lines (log); - buffer = gtk_text_buffer_new (window->priv->tag_table); - - if (lines != NULL) { - int i; - GtkTextIter iter; - - /* update the text view to show the current lines */ - gtk_text_buffer_get_end_iter (buffer, &iter); - - for (i = 0; lines[i]; i++) { - gtk_text_buffer_insert (buffer, &iter, lines[i], strlen (lines[i])); - gtk_text_iter_forward_to_end (&iter); - gtk_text_buffer_insert (buffer, &iter, "\n", 1); - gtk_text_iter_forward_char (&iter); - } - - paint_timestamps (buffer, 1, logview_log_get_days_for_cached_lines (log)); - } - - if (lines == NULL || logview_log_has_new_lines (log)) { - /* read the new lines */ - logview_window_schedule_log_read (window, log); - } else { - /* start now monitoring the log for changes */ - window->priv->monitor_id = g_signal_connect (log, "log-changed", - G_CALLBACK (log_monitor_changed_cb), window); - } - - /* we set the buffer to the view anyway; - * if there are no lines it will be empty for the duration of the thread - * and will help us to distinguish the two cases of the following if - * cause in the callback. - */ - gtk_text_view_set_buffer (GTK_TEXT_VIEW (window->priv->text_view), buffer); - g_object_unref (buffer); -} - -static void -font_changed_cb (LogviewPrefs *prefs, - const char *font_name, - gpointer user_data) -{ - LogviewWindow *window = user_data; - - logview_set_font (window, font_name); -} - -static void -tearoff_changed_cb (LogviewPrefs *prefs, - gboolean have_tearoffs, - gpointer user_data) -{ - LogviewWindow *window = user_data; - - gtk_ui_manager_set_add_tearoffs (window->priv->ui_manager, have_tearoffs); -} - -static void -style_set_cb (GtkWidget *widget, - GtkStyle *prev, - gpointer user_data) -{ - LogviewWindow *logview = user_data; - GtkStyle *style = gtk_widget_get_style (widget); - - populate_style_tag_table (style, logview->priv->tag_table); -} - -static const struct { - guint keyval; - GdkModifierType modifier; - const gchar *action; -} extra_keybindings [] = { - { GDK_KEY_KP_Add, GDK_CONTROL_MASK, "ViewZoomIn" }, - { GDK_KEY_KP_Subtract, GDK_CONTROL_MASK, "ViewZoomOut" }, - { GDK_KEY_KP_0, GDK_CONTROL_MASK, "ViewZoom100" } -}; - -static gboolean -key_press_event_cb (GtkWidget *widget, - GdkEventKey *event, - gpointer user_data) -{ - LogviewWindow *window = user_data; - guint modifier = event->state & gtk_accelerator_get_default_mod_mask (); - GtkAction *action; - int i; - - /* handle accelerators that we want bound, but aren't associated with - * an action */ - for (i = 0; i < G_N_ELEMENTS (extra_keybindings); i++) { - if (event->keyval == extra_keybindings[i].keyval && - modifier == extra_keybindings[i].modifier) { - - action = gtk_action_group_get_action (window->priv->action_group, - extra_keybindings[i].action); - gtk_action_activate (action); - return TRUE; - } - } - - return FALSE; -} - -/* adapted from GEdit */ - -static void -message_area_create_error_box (LogviewWindow *window, - GtkWidget *message_area) -{ - GtkWidget *hbox_content; - GtkWidget *image; - GtkWidget *vbox; - GtkWidget *primary_label; - GtkWidget *secondary_label; - - hbox_content = gtk_hbox_new (FALSE, 8); - gtk_widget_show (hbox_content); - - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, - GTK_ICON_SIZE_DIALOG); - gtk_widget_show (image); - gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0); - - vbox = gtk_vbox_new (FALSE, 6); - gtk_widget_show (vbox); - gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0); - - primary_label = gtk_label_new (NULL); - gtk_widget_show (primary_label); - gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0); - gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5); - gtk_widget_set_can_focus (primary_label, TRUE); - gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE); - - window->priv->message_primary = primary_label; - - secondary_label = gtk_label_new (NULL); - gtk_widget_show (secondary_label); - gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0); - gtk_widget_set_can_focus (secondary_label, TRUE); - gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE); - gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5); - - window->priv->message_secondary = secondary_label; - - gtk_container_add - (GTK_CONTAINER (gtk_info_bar_get_content_area - (GTK_INFO_BAR (message_area))), - hbox_content); -} - -static void -message_area_set_labels (LogviewWindow *window, - const char *primary, - const char *secondary) -{ - char *primary_markup, *secondary_markup; - - primary_markup = g_markup_printf_escaped ("<b>%s</b>", primary); - secondary_markup = g_markup_printf_escaped ("<small>%s</small>", - secondary); - - gtk_label_set_markup (GTK_LABEL (window->priv->message_primary), - primary_markup); - gtk_label_set_markup (GTK_LABEL (window->priv->message_secondary), - secondary_markup); - - g_free (primary_markup); - g_free (secondary_markup); -} - -static void -message_area_response_cb (GtkInfoBar *message_area, - int response_id, gpointer user_data) -{ - gtk_widget_hide (GTK_WIDGET (message_area)); - - g_signal_handlers_disconnect_by_func (message_area, - message_area_response_cb, - user_data); -} - -static void -logview_window_finalize (GObject *object) -{ - LogviewWindow *logview = LOGVIEW_WINDOW (object); - - if (logview->priv->read_cancellable != NULL) { - g_cancellable_cancel (logview->priv->read_cancellable); - g_clear_object (&logview->priv->read_cancellable); - } - - g_object_unref (logview->priv->ui_manager); - G_OBJECT_CLASS (logview_window_parent_class)->finalize (object); -} - -static void -logview_window_init (LogviewWindow *logview) -{ - GtkActionGroup *action_group; - GtkAccelGroup *accel_group; - GError *error = NULL; - GtkWidget *hpaned, *main_view, *vbox, *w; - PangoContext *context; - PangoFontDescription *fontdesc; - gchar *monospace_font_name; - LogviewWindowPrivate *priv; - int width, height; - gboolean res; - - priv = logview->priv = GET_PRIVATE (logview); - priv->prefs = logview_prefs_get (); - priv->manager = logview_manager_get (); - priv->monitor_id = 0; - - logview_prefs_get_stored_window_size (priv->prefs, &width, &height); - gtk_window_set_default_size (GTK_WINDOW (logview), width, height); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (logview), vbox); - - /* create menus */ - action_group = gtk_action_group_new ("LogviewMenuActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), logview); - gtk_action_group_add_toggle_actions (action_group, toggle_entries, G_N_ELEMENTS (toggle_entries), logview); - priv->action_group = action_group; - - priv->ui_manager = gtk_ui_manager_new (); - - gtk_ui_manager_insert_action_group (priv->ui_manager, action_group, 0); - accel_group = gtk_ui_manager_get_accel_group (priv->ui_manager); - gtk_window_add_accel_group (GTK_WINDOW (logview), accel_group); - - res = gtk_ui_manager_add_ui_from_file (priv->ui_manager, - LOGVIEW_DATADIR "/logview-toolbar.xml", - &error); - - if (res == FALSE) { - priv->ui_manager = NULL; - g_critical ("Can't load the UI description: %s", error->message); - g_error_free (error); - return; - } - - gtk_ui_manager_set_add_tearoffs (priv->ui_manager, - logview_prefs_get_have_tearoff (priv->prefs)); - - w = gtk_ui_manager_get_widget (priv->ui_manager, "/LogviewMenu"); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); - gtk_widget_show (w); - - /* panes */ -#if GTK_CHECK_VERSION (3, 0, 0) - hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); -#else - hpaned = gtk_hpaned_new (); -#endif - gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); - priv->hpaned = hpaned; - gtk_widget_show (hpaned); - - /* first pane : sidebar (list of logs) */ - priv->sidebar = gtk_vbox_new (FALSE, 0); - gtk_widget_show (priv->sidebar); - - /* first pane: log list */ - w = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), - GTK_SHADOW_ETCHED_IN); - - priv->loglist = logview_loglist_new (); - gtk_container_add (GTK_CONTAINER (w), priv->loglist); - gtk_box_pack_start (GTK_BOX (priv->sidebar), w, TRUE, TRUE, 0); - gtk_paned_pack1 (GTK_PANED (hpaned), priv->sidebar, FALSE, FALSE); - gtk_widget_show (w); - gtk_widget_show (priv->loglist); - - g_signal_connect (priv->loglist, "day_selected", - G_CALLBACK (loglist_day_selected_cb), logview); - g_signal_connect (priv->loglist, "day_cleared", - G_CALLBACK (loglist_day_cleared_cb), logview); - - /* second pane: log */ - main_view = gtk_vbox_new (FALSE, 0); - gtk_paned_pack2 (GTK_PANED (hpaned), main_view, TRUE, TRUE); - - /* second pane: error message area */ - priv->message_area = gtk_info_bar_new (); - message_area_create_error_box (logview, priv->message_area); - gtk_info_bar_add_button (GTK_INFO_BAR (priv->message_area), - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); - gtk_box_pack_start (GTK_BOX (main_view), priv->message_area, FALSE, FALSE, 0); - - /* second pane: text view */ - w = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (main_view), w, TRUE, TRUE, 0); - gtk_widget_show (w); - - priv->tag_table = gtk_text_tag_table_new (); - populate_tag_table (priv->tag_table); - priv->text_view = gtk_text_view_new (); - g_object_set (priv->text_view, "editable", FALSE, NULL); - - gtk_container_add (GTK_CONTAINER (w), priv->text_view); - gtk_widget_show (priv->text_view); - - /* use the desktop monospace font */ - monospace_font_name = logview_prefs_get_monospace_font_name (priv->prefs); - logview_set_font (logview, monospace_font_name); - g_free (monospace_font_name); - - /* remember the original font size */ - context = gtk_widget_get_pango_context (priv->text_view); - fontdesc = pango_context_get_font_description (context); - priv->original_fontsize = pango_font_description_get_size (fontdesc) / PANGO_SCALE; - - /* restore saved zoom */ - priv->fontsize = logview_prefs_get_stored_fontsize (priv->prefs); - - if (priv->fontsize <= 0) { - /* restore the default */ - logview_normal_text (NULL, logview); - } else { - logview_set_fontsize (logview, FALSE); - } - - /* version selector */ - priv->version_bar = gtk_hbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (priv->version_bar), 3); - priv->version_selector = gtk_combo_box_text_new (); - g_signal_connect (priv->version_selector, "changed", - G_CALLBACK (logview_version_selector_changed), logview); - w = gtk_label_new (_("Version: ")); - - gtk_box_pack_end (GTK_BOX (priv->version_bar), priv->version_selector, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (priv->version_bar), w, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (main_view), priv->version_bar, FALSE, FALSE, 0); - - priv->find_bar = logview_findbar_new (); - gtk_box_pack_end (GTK_BOX (main_view), priv->find_bar, FALSE, FALSE, 0); - - g_signal_connect (priv->find_bar, "previous", - G_CALLBACK (findbar_previous_cb), logview); - g_signal_connect (priv->find_bar, "next", - G_CALLBACK (findbar_next_cb), logview); - g_signal_connect (priv->find_bar, "text_changed", - G_CALLBACK (findbar_text_changed_cb), logview); - g_signal_connect (priv->find_bar, "close", - G_CALLBACK (findbar_close_cb), logview); - - /* signal handlers - * - first is used to remember/restore the window size on quit. - */ - g_signal_connect (logview, "configure_event", - G_CALLBACK (window_size_changed_cb), logview); - g_signal_connect (priv->prefs, "system-font-changed", - G_CALLBACK (font_changed_cb), logview); - g_signal_connect (priv->prefs, "have-tearoff-changed", - G_CALLBACK (tearoff_changed_cb), logview); - g_signal_connect (priv->manager, "active-changed", - G_CALLBACK (active_log_changed_cb), logview); - g_signal_connect (logview, "style-set", - G_CALLBACK (style_set_cb), logview); - g_signal_connect (logview, "key-press-event", - G_CALLBACK (key_press_event_cb), logview); - - /* status area at bottom */ - priv->statusbar = gtk_statusbar_new (); -#if GTK_CHECK_VERSION (3, 0, 0) - gtk_widget_set_margin_top (GTK_WIDGET (logview->priv->statusbar), 0); - gtk_widget_set_margin_bottom (GTK_WIDGET (logview->priv->statusbar), 0); -#endif - gtk_box_pack_start (GTK_BOX (vbox), priv->statusbar, FALSE, FALSE, 0); - gtk_widget_show (priv->statusbar); - - /* Filter menu */ - priv->filter_action_group = gtk_action_group_new ("ActionGroupFilter"); - gtk_ui_manager_insert_action_group (priv->ui_manager, priv->filter_action_group, - 1); - priv->active_filters = NULL; - update_filter_menu (logview); - - gtk_widget_show (vbox); - gtk_widget_show (main_view); -} - -static void -logview_window_class_init (LogviewWindowClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - - object_class->finalize = logview_window_finalize; - - g_type_class_add_private (klass, sizeof (LogviewWindowPrivate)); -} - -/* public methods */ - -GtkWidget * -logview_window_new () -{ - LogviewWindow *logview; - - logview = g_object_new (LOGVIEW_TYPE_WINDOW, NULL); - - if (logview->priv->ui_manager == NULL) { - return NULL; - } - - return GTK_WIDGET (logview); -} - -void -logview_window_add_error (LogviewWindow *window, - const char *primary, - const char *secondary) -{ - LogviewWindowPrivate *priv; - - g_assert (LOGVIEW_IS_WINDOW (window)); - priv = window->priv; - - message_area_set_labels (window, - primary, secondary); - - gtk_widget_show (priv->message_area); - - g_signal_connect (priv->message_area, "response", - G_CALLBACK (message_area_response_cb), window); -} - -void -logview_window_add_errors (LogviewWindow *window, - GPtrArray *errors) -{ - char *primary, *secondary; - GString *str; - char **err; - int i; - - g_assert (LOGVIEW_IS_WINDOW (window)); - g_assert (errors->len > 1); - - primary = g_strdup (_("Could not open the following files:")); - str = g_string_new (NULL); - - for (i = 0; i < errors->len; i++) { - err = (char **) g_ptr_array_index (errors, i); - g_string_append (str, err[0]); - g_string_append (str, ": "); - g_string_append (str, err[1]); - g_string_append (str, "\n"); - } - - secondary = g_string_free (str, FALSE); - - message_area_set_labels (window, primary, secondary); - - gtk_widget_show (window->priv->message_area); - - g_signal_connect (window->priv->message_area, "response", - G_CALLBACK (message_area_response_cb), window); - - g_free (primary); - g_free (secondary); -} - - |