claws-mail/src/prefs_logging.c
Olaf Hering ed7e8e3ea5 Fix truncated input widgets in preferences window
With larger UI fontsize some input fields are truncated, the numbers can
not be read properly. Remove the hardcoded width values, let GTK pick a
value.
2017-11-26 20:53:20 +01:00

428 lines
17 KiB
C

/*
* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
* Copyright (C) 1999-2012 Tristan Chabredier <wwp@claws-mail.org> and
* the Claws Mail team
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#include "claws-features.h"
#endif
#include "defs.h"
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include "prefs_common.h"
#include "prefs_gtk.h"
#include "gtk/gtkutils.h"
#include "gtk/prefswindow.h"
#include "gtk/menu.h"
#include "manage_window.h"
#include "log.h"
#include "combobox.h"
typedef struct _LoggingPage
{
PrefsPage page;
GtkWidget *window;
GtkWidget *checkbtn_clip_network_log;
GtkWidget *spinbtn_network_log_length;
GtkWidget *checkbtn_log_standard;
GtkWidget *checkbtn_log_warning;
GtkWidget *checkbtn_log_error;
GtkWidget *checkbtn_log_status;
GtkWidget *checkbtn_clip_filtering_log;
GtkWidget *spinbtn_filtering_log_length;
GtkWidget *checkbtn_filtering_log;
GtkWidget *checkbtn_filtering_log_inc;
GtkWidget *checkbtn_filtering_log_manual;
GtkWidget *checkbtn_filtering_log_folder_proc;
GtkWidget *checkbtn_filtering_log_pre_proc;
GtkWidget *checkbtn_filtering_log_post_proc;
GtkWidget *optmenu_filtering_log_level;
} LoggingPage;
static GtkWidget *prefs_logging_create_check_buttons(GtkWidget **checkbtn1,
gchar *label1, GtkWidget **checkbtn2, gchar *label2)
{
GtkWidget *hbox_checkbtn;
hbox_checkbtn = gtk_hbox_new(FALSE, VBOX_BORDER);
gtk_widget_show(hbox_checkbtn);
PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn1, label1);
gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn1)))), TRUE);
PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn2, label2);
gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn2)))), TRUE);
return hbox_checkbtn;
}
static void prefs_logging_create_widget(PrefsPage *_page, GtkWindow *window,
gpointer data)
{
LoggingPage *prefs_logging = (LoggingPage *) _page;
GtkWidget *vbox1;
GtkWidget *frame_logging;
GtkWidget *vbox_network_log;
GtkWidget *hbox_clip_network_log;
GtkWidget *checkbtn_clip_network_log;
GtkWidget *spinbtn_network_log_length;
GtkAdjustment *spinbtn_network_log_length_adj;
GtkWidget *hbox_checkbtn;
GtkWidget *vbox1_filtering_log;
GtkWidget *hbox_clip_filtering_log;
GtkWidget *checkbtn_clip_filtering_log;
GtkWidget *spinbtn_filtering_log_length;
GtkAdjustment *spinbtn_filtering_log_length_adj;
GtkWidget *hbox_filtering_log;
GtkWidget *checkbtn_filtering_log;
GtkWidget *frame_filtering_log;
GtkWidget *vbox2_filtering_log;
GtkWidget *checkbtn_filtering_log_inc;
GtkWidget *checkbtn_filtering_log_manual;
GtkWidget *checkbtn_filtering_log_folder_proc;
GtkWidget *checkbtn_filtering_log_pre_proc;
GtkWidget *checkbtn_filtering_log_post_proc;
GtkWidget *hbox_filtering_log_level;
GtkWidget *label_filtering_log_level;
GtkWidget *optmenu_filtering_log_level;
GtkSizeGroup *filter_size_group;
GtkListStore *menu;
GtkTreeIter iter;
GtkWidget *frame_disk_log;
GtkWidget *vbox_disk_log;
GtkWidget *label;
GtkWidget *hbox;
GtkWidget *checkbtn_log_standard;
GtkWidget *checkbtn_log_warning;
GtkWidget *checkbtn_log_error;
GtkWidget *checkbtn_log_status;
GtkSizeGroup *log_size_group;
vbox1 = gtk_vbox_new (FALSE, VSPACING);
gtk_widget_show (vbox1);
gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
/* Protocol log */
vbox_network_log = gtkut_get_options_frame(vbox1, &frame_logging, _("Network log"));
hbox_clip_network_log = gtk_hbox_new (FALSE, 8);
gtk_container_add (GTK_CONTAINER (vbox_network_log), hbox_clip_network_log);
gtk_widget_show (hbox_clip_network_log);
PACK_CHECK_BUTTON (hbox_clip_network_log, checkbtn_clip_network_log,
_("Restrict the log window to"));
spinbtn_network_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
spinbtn_network_log_length = gtk_spin_button_new
(GTK_ADJUSTMENT (spinbtn_network_log_length_adj), 1, 0);
gtk_widget_show (spinbtn_network_log_length);
gtk_box_pack_start (GTK_BOX (hbox_clip_network_log), spinbtn_network_log_length,
FALSE, FALSE, 0);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_network_log_length), TRUE);
CLAWS_SET_TIP(spinbtn_network_log_length,
_("0 to stop logging in the log window"));
label = gtk_label_new(_("lines"));
gtk_widget_show (label);
gtk_box_pack_start(GTK_BOX(hbox_clip_network_log), label, FALSE, FALSE, 0);
SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, spinbtn_network_log_length);
SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, label);
/* Filtering/processing debug log */
vbox1_filtering_log = gtkut_get_options_frame(vbox1,
&frame_logging, _("Filtering/processing log"));
PACK_CHECK_BUTTON (vbox1_filtering_log, checkbtn_filtering_log,
_("Enable logging of filtering/processing rules"));
hbox_filtering_log = gtk_hbox_new (FALSE, 8);
gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_filtering_log);
gtk_widget_show (hbox_filtering_log);
CLAWS_SET_TIP(checkbtn_filtering_log,
_("If checked, turns on logging of filtering and processing rules.\n"
"The log is accessible from 'Tools/Filtering log'.\n"
"Caution: enabling this option will slow down the filtering/processing, "
"this might be critical when applying many rules upon thousands of "
"messages."));
vbox2_filtering_log = gtkut_get_options_frame(vbox1_filtering_log, &frame_filtering_log,
_("Log filtering/processing when..."));
hbox_checkbtn = prefs_logging_create_check_buttons(
&checkbtn_filtering_log_inc,
_("filtering at incorporation"),
&checkbtn_filtering_log_pre_proc,
_("pre-processing folders"));
gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
hbox_checkbtn = prefs_logging_create_check_buttons(
&checkbtn_filtering_log_manual,
_("manually filtering"),
&checkbtn_filtering_log_post_proc,
_("post-processing folders"));
gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
hbox_checkbtn = gtk_hbox_new(TRUE, VBOX_BORDER);
gtk_widget_show(hbox_checkbtn);
gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
PACK_CHECK_BUTTON (hbox_checkbtn, checkbtn_filtering_log_folder_proc,
_("processing folders"));
gtk_box_pack_start(GTK_BOX(hbox_checkbtn), gtk_label_new(""),
FALSE, TRUE, 0);
filter_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_inc);
gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_manual);
gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_folder_proc);
g_object_unref(G_OBJECT(filter_size_group));
SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, frame_filtering_log);
hbox_filtering_log_level = gtk_hbox_new (FALSE, 8);
gtk_widget_show (hbox_filtering_log_level);
gtk_box_pack_start(GTK_BOX (vbox1_filtering_log), hbox_filtering_log_level, FALSE, FALSE, 0);
label_filtering_log_level = gtk_label_new (_("Log level"));
gtk_widget_show (label_filtering_log_level);
gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), label_filtering_log_level, FALSE, FALSE, 0);
optmenu_filtering_log_level = gtkut_sc_combobox_create(NULL, FALSE);
gtk_widget_show (optmenu_filtering_log_level);
menu = GTK_LIST_STORE(gtk_combo_box_get_model(
GTK_COMBO_BOX(optmenu_filtering_log_level)));
COMBOBOX_ADD (menu, _("Low"), 0);
COMBOBOX_ADD (menu, _("Medium"), 1);
COMBOBOX_ADD (menu, _("High"), 2);
gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), optmenu_filtering_log_level, FALSE, FALSE, 0);
CLAWS_SET_TIP(optmenu_filtering_log_level,
_("Select the level of detail of the logging.\n"
"Choose Low to see when rules are applied, which "
"conditions match or don't match and what actions are "
"performed.\n"
"Choose Medium to see more details about the message "
"that is being processed, and why rules are skipped.\n"
"Choose High to explicitly show the reason why all "
"rules are processed or skipped, and why all conditions "
"are matched or not matched.\n"
"Caution: the higher the level, the greater the "
"impact on performance."));
hbox_clip_filtering_log = gtk_hbox_new (FALSE, 8);
gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_clip_filtering_log);
gtk_widget_show (hbox_clip_filtering_log);
PACK_CHECK_BUTTON (hbox_clip_filtering_log, checkbtn_clip_filtering_log,
_("Restrict the log window to"));
spinbtn_filtering_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
spinbtn_filtering_log_length = gtk_spin_button_new
(GTK_ADJUSTMENT (spinbtn_filtering_log_length_adj), 1, 0);
gtk_widget_show (spinbtn_filtering_log_length);
gtk_box_pack_start (GTK_BOX (hbox_clip_filtering_log), spinbtn_filtering_log_length,
FALSE, FALSE, 0);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_filtering_log_length), TRUE);
CLAWS_SET_TIP(spinbtn_filtering_log_length,
_("0 to stop logging in the log window"));
label = gtk_label_new(_("lines"));
gtk_widget_show (label);
gtk_box_pack_start(GTK_BOX(hbox_clip_filtering_log), label, FALSE, FALSE, 0);
SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, spinbtn_filtering_log_length);
SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, label);
SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, hbox_clip_filtering_log);
SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, optmenu_filtering_log_level);
SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, checkbtn_clip_filtering_log);
SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, label_filtering_log_level);
/* disk log */
vbox_disk_log = gtkut_get_options_frame(vbox1, &frame_disk_log, _("Disk log"));
label = gtk_label_new(_("Write the following information to disk..."));
gtk_widget_show(label);
hbox = gtk_hbox_new (FALSE, 8);
gtk_container_add (GTK_CONTAINER (vbox_disk_log), hbox);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show (hbox);
hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_warning,
_("Warning messages"), &checkbtn_log_standard,
_("Network protocol messages"));
gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_error,
_("Error messages"), &checkbtn_log_status,
_("Status messages for filtering/processing log"));
gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
log_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
gtk_size_group_add_widget(log_size_group, checkbtn_log_warning);
gtk_size_group_add_widget(log_size_group, checkbtn_log_error);
g_object_unref(G_OBJECT(log_size_group));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_network_log),
prefs_common.cliplog);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_filtering_log),
prefs_common.filtering_debug_cliplog);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_standard),
prefs_common.enable_log_standard);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_warning),
prefs_common.enable_log_warning);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_error),
prefs_common.enable_log_error);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_status),
prefs_common.enable_log_status);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log),
prefs_common.enable_filtering_debug);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_inc),
prefs_common.enable_filtering_debug_inc);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_manual),
prefs_common.enable_filtering_debug_manual);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_folder_proc),
prefs_common.enable_filtering_debug_folder_proc);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_pre_proc),
prefs_common.enable_filtering_debug_pre_proc);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_post_proc),
prefs_common.enable_filtering_debug_post_proc);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_network_log_length),
prefs_common.loglength);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_filtering_log_length),
prefs_common.filtering_debug_loglength);
combobox_select_by_data(GTK_COMBO_BOX(optmenu_filtering_log_level),
prefs_common.filtering_debug_level);
prefs_logging->checkbtn_clip_network_log = checkbtn_clip_network_log;
prefs_logging->spinbtn_network_log_length = spinbtn_network_log_length;
prefs_logging->checkbtn_log_standard = checkbtn_log_standard;
prefs_logging->checkbtn_log_warning = checkbtn_log_warning;
prefs_logging->checkbtn_log_error = checkbtn_log_error;
prefs_logging->checkbtn_log_status = checkbtn_log_status;
prefs_logging->checkbtn_clip_filtering_log = checkbtn_clip_filtering_log;
prefs_logging->spinbtn_filtering_log_length = spinbtn_filtering_log_length;
prefs_logging->checkbtn_filtering_log = checkbtn_filtering_log;
prefs_logging->checkbtn_filtering_log_inc = checkbtn_filtering_log_inc;
prefs_logging->checkbtn_filtering_log_manual = checkbtn_filtering_log_manual;
prefs_logging->checkbtn_filtering_log_folder_proc = checkbtn_filtering_log_folder_proc;
prefs_logging->checkbtn_filtering_log_pre_proc = checkbtn_filtering_log_pre_proc;
prefs_logging->checkbtn_filtering_log_post_proc = checkbtn_filtering_log_post_proc;
prefs_logging->optmenu_filtering_log_level = optmenu_filtering_log_level;
prefs_logging->page.widget = vbox1;
}
static void prefs_logging_save(PrefsPage *_page)
{
LoggingPage *page = (LoggingPage *) _page;
MainWindow *mainwindow;
gboolean filtering_debug_enabled;
prefs_common.filtering_debug_level =
combobox_get_active_data(GTK_COMBO_BOX(page->optmenu_filtering_log_level));
prefs_common.cliplog = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_clip_network_log));
prefs_common.loglength = gtk_spin_button_get_value_as_int(
GTK_SPIN_BUTTON(page->spinbtn_network_log_length));
prefs_common.enable_log_standard = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_log_standard));
prefs_common.enable_log_warning = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_log_warning));
prefs_common.enable_log_error = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_log_error));
prefs_common.enable_log_status = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_log_status));
prefs_common.filtering_debug_cliplog = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_clip_filtering_log));
prefs_common.filtering_debug_loglength = gtk_spin_button_get_value_as_int(
GTK_SPIN_BUTTON(page->spinbtn_filtering_log_length));
filtering_debug_enabled = prefs_common.enable_filtering_debug;
prefs_common.enable_filtering_debug = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log));
if (filtering_debug_enabled != prefs_common.enable_filtering_debug) {
if (prefs_common.enable_filtering_debug)
log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
else
log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
}
prefs_common.enable_filtering_debug_inc = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_inc));
prefs_common.enable_filtering_debug_manual = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_manual));
prefs_common.enable_filtering_debug_folder_proc = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_folder_proc));
prefs_common.enable_filtering_debug_pre_proc = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_pre_proc));
prefs_common.enable_filtering_debug_post_proc = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_post_proc));
mainwindow = mainwindow_get_mainwindow();
log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
prefs_common.loglength);
log_window_set_clipping(mainwindow->filtering_debugwin, prefs_common.filtering_debug_cliplog,
prefs_common.filtering_debug_loglength);
}
static void prefs_logging_destroy_widget(PrefsPage *_page)
{
}
LoggingPage *prefs_logging;
void prefs_logging_init(void)
{
LoggingPage *page;
static gchar *path[3];
path[0] = _("Other");
path[1] = _("Logging");
path[2] = NULL;
page = g_new0(LoggingPage, 1);
page->page.path = path;
page->page.create_widget = prefs_logging_create_widget;
page->page.destroy_widget = prefs_logging_destroy_widget;
page->page.save_page = prefs_logging_save;
page->page.weight = 5.0;
prefs_gtk_register_page((PrefsPage *) page);
prefs_logging = page;
}
void prefs_logging_done(void)
{
prefs_gtk_unregister_page((PrefsPage *) prefs_logging);
g_free(prefs_logging);
}