#include <gtk/gtk.h>
+#include <epan/proto.h>
#include <epan/prefs.h>
-#include "../color.h"
-#include "../print.h"
-
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
+#include <color.h>
+
+#include <ui/recent.h>
+#include <ui/simple_dialog.h>
+
+#include "color_utils.h"
+#include "follow_tcp.h"
+#include "font_utils.h"
+#include "gui_utils.h"
+#include "keys.h"
+#include "old-gtk-compat.h"
+#include "packet_panes.h"
+#include "prefs_font_color.h"
+
+
+/* Hack to use GtkColorSelection [GdkColor) or GtkColorChooser [GdkRGBA] */
+/* (The code to use GtkColorSelection or GtkColorChooser is almost 1 for 1) */
+#if GTK_CHECK_VERSION(3,4,0)
+ typedef GdkRGBA GdkXxx;
+ #define color_t_to_gdkxxx color_t_to_gdkRGBAcolor
+ #define gdkxxx_to_color_t gdkRGBAcolor_to_color_t
+ #define TAG_PROP_FG_COLOR "foreground-rgba"
+ #define TAG_PROP_BG_COLOR "background-rgba"
+ #define GTK_COLOR_XXX GTK_COLOR_CHOOSER
+ #define gtk_color_xxx_new gtk_color_chooser_widget_new
+ #define gtk_color_xxx_get_yyy gtk_color_chooser_get_rgba
+ #define gtk_color_xxx_set_yyy gtk_color_chooser_set_rgba
+ #define COLOR_CHANGED_SIGNAL "notify::rgba"
+#else
+ typedef GdkColor GdkXxx;
+ #define color_t_to_gdkxxx color_t_to_gdkcolor
+ #define gdkxxx_to_color_t gdkcolor_to_color_t
+ #define TAG_PROP_FG_COLOR "foreground-gdk"
+ #define TAG_PROP_BG_COLOR "background-gdk"
+ #define gtk_color_xxx_new gtk_color_selection_new
+ #define gtk_color_xxx_get_yyy gtk_color_selection_get_current_color
+ #define gtk_color_xxx_set_yyy gtk_color_selection_set_current_color
+ #define GTK_COLOR_XXX GTK_COLOR_SELECTION
+ #define COLOR_CHANGED_SIGNAL "notify::current-color"
+#endif
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/follow_tcp.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/prefs_font_color.h"
#define SAMPLE_MARKED_TEXT "Sample marked packet text\n"
#define SAMPLE_IGNORED_TEXT "Sample ignored packet text\n"
#define SAMPLE_CLIENT_TEXT "Sample stream client text\n"
#define SAMPLE_SERVER_TEXT "Sample stream server text\n"
+
#define MFG_IDX 0
#define MBG_IDX 1
#define IFG_IDX 2
#define CBG_IDX 5
#define SFG_IDX 6
#define SBG_IDX 7
-#define MAX_IDX 8 /* set this to the number of IDX values */
+#define MAX_IDX 8 /* set this to the number of IDX values */
+
#define COLOR_SAMPLE_KEY "text_color_sample"
-#define FONT_SAMPLE_KEY "font_sample"
-#define STREAM_CS_KEY "stream_colorselection"
-#define CS_RED 0
-#define CS_GREEN 1
-#define CS_BLUE 2
-#define CS_OPACITY 3
+#define FONT_SAMPLE_KEY "font_sample"
+#define STREAM_CS_KEY "stream_colorselection"
static void select_font(GtkWidget *, gpointer);
static void update_font(PangoFontDescription *, GtkWidget *, GtkWidget *);
-static void update_text_color(GtkWidget *, gpointer);
+static void update_text_color(GObject *obj, GParamSpec *pspec, gpointer data);
static void update_current_color(GtkWidget *, gpointer);
-static GdkColor tcolors_orig[MAX_IDX];
-static GdkColor tcolors[MAX_IDX], *curcolor = NULL;
+static GdkXxx tcolors[MAX_IDX], *curcolor = NULL;
+
+#if ! GTK_CHECK_VERSION(3,4,0)
+static GdkXxx tcolors_orig[MAX_IDX];
+#endif
/* Set to FALSE initially; set to TRUE if the user ever hits "OK" on
the "Font..." dialog, so that we know that they (probably) changed
};
#define NUM_FONT_PANGRAMS (sizeof font_pangrams / sizeof font_pangrams[0])
+
GtkWidget *
font_color_prefs_show(void)
{
int i;
#define GRID_FONT_ROW 0
-#define GRID_COLOR_ROW 3
-#define GRID_COLOR_SEL_ROW 8
+#define GRID_COLOR_ROW 1
+#define GRID_COLOR_SEL_ROW 3
/* The font hasn't been changed yet. */
font_changed = FALSE;
- color_t_to_gdkcolor(&tcolors[MFG_IDX], &prefs.gui_marked_fg);
- color_t_to_gdkcolor(&tcolors[MBG_IDX], &prefs.gui_marked_bg);
- color_t_to_gdkcolor(&tcolors[IFG_IDX], &prefs.gui_ignored_fg);
- color_t_to_gdkcolor(&tcolors[IBG_IDX], &prefs.gui_ignored_bg);
- color_t_to_gdkcolor(&tcolors[CFG_IDX], &prefs.st_client_fg);
- color_t_to_gdkcolor(&tcolors[CBG_IDX], &prefs.st_client_bg);
- color_t_to_gdkcolor(&tcolors[SFG_IDX], &prefs.st_server_fg);
- color_t_to_gdkcolor(&tcolors[SBG_IDX], &prefs.st_server_bg);
+ color_t_to_gdkxxx(&tcolors[MFG_IDX], &prefs.gui_marked_fg);
+ color_t_to_gdkxxx(&tcolors[MBG_IDX], &prefs.gui_marked_bg);
+ color_t_to_gdkxxx(&tcolors[IFG_IDX], &prefs.gui_ignored_fg);
+ color_t_to_gdkxxx(&tcolors[IBG_IDX], &prefs.gui_ignored_bg);
+ color_t_to_gdkxxx(&tcolors[CFG_IDX], &prefs.st_client_fg);
+ color_t_to_gdkxxx(&tcolors[CBG_IDX], &prefs.st_client_bg);
+ color_t_to_gdkxxx(&tcolors[SFG_IDX], &prefs.st_server_fg);
+ color_t_to_gdkxxx(&tcolors[SBG_IDX], &prefs.st_server_bg);
+#if ! GTK_CHECK_VERSION(3,4,0)
for (i=0; i<MAX_IDX; i++) {
tcolors_orig[i] = tcolors[i];
}
+#endif
curcolor = &tcolors[CFG_IDX];
main_grid = ws_gtk_grid_new();
gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
+ ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 40);
ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
gtk_widget_show(main_grid);
gtk_widget_show(label);
/* We have to create this now, and configure it below. */
- colorsel = gtk_color_selection_new();
+
+#if GTK_CHECK_VERSION(3,4,0)
+ /* XXX: There appears to be a bug in the GTK3 GtkColorChooserWidget such that
+ * when in the GtkColorChooserWidget "customize" mode (aka "color-edit" mode)
+ * selecting a color doesn't trigger a "motify::rgba" callback.
+ * The effect is that the sample text FG/BG colors don't update for the GTK3
+ * GtkColorChooserWidget in "custon color edit node").
+ * I expect use of the "customize mode" will be minimal and that the bug will
+ * not be very noticeable.
+ * (A GTK3 bug report has beem submitted.
+ */
+#endif
+ colorsel = gtk_color_xxx_new();
combo_box = gtk_combo_box_text_new();
for (i = 0; i < mcount; i++){
gtk_text_buffer_get_start_iter(buf, &iter);
gtk_text_buffer_create_tag(buf, "marked",
- "foreground-gdk", &tcolors[MFG_IDX],
- "background-gdk", &tcolors[MBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[MFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[MBG_IDX],
NULL);
gtk_text_buffer_create_tag(buf, "ignored",
- "foreground-gdk", &tcolors[IFG_IDX],
- "background-gdk", &tcolors[IBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[IFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[IBG_IDX],
NULL);
gtk_text_buffer_create_tag(buf, "client",
- "foreground-gdk", &tcolors[CFG_IDX],
- "background-gdk", &tcolors[CBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[CFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[CBG_IDX],
NULL);
gtk_text_buffer_create_tag(buf, "server",
- "foreground-gdk", &tcolors[SFG_IDX],
- "background-gdk", &tcolors[SBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[SFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[SBG_IDX],
NULL);
gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_MARKED_TEXT, -1,
"client", NULL);
gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_SERVER_TEXT, -1,
"server", NULL);
+
ws_gtk_grid_attach_extended(GTK_GRID(main_grid), color_sample,
2, GRID_COLOR_ROW, 1, 2,
- GTK_EXPAND|GTK_FILL, 0, 0,0);
+ GTK_EXPAND|GTK_FILL, 0, 0, 0);
gtk_widget_show(color_sample);
- gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), curcolor);
+ gtk_color_xxx_set_yyy(GTK_COLOR_XXX(colorsel), curcolor);
ws_gtk_grid_attach_extended(GTK_GRID(main_grid), colorsel,
1, GRID_COLOR_SEL_ROW, 2, 1,
GTK_FILL|GTK_EXPAND, 0, 0, 0);
g_object_set_data(G_OBJECT(combo_box), COLOR_SAMPLE_KEY, color_sample);
g_object_set_data(G_OBJECT(colorsel), COLOR_SAMPLE_KEY, color_sample);
- g_signal_connect(colorsel, "color-changed", G_CALLBACK(update_text_color), NULL);
+ g_signal_connect(colorsel, COLOR_CHANGED_SIGNAL, G_CALLBACK(update_text_color), NULL);
gtk_widget_show(colorsel);
g_rand_free(rand_state);
return main_vb;
}
+
static void
update_font(PangoFontDescription *font, GtkWidget *font_sample _U_, GtkWidget *color_sample _U_) {
}
+
static gboolean
font_fetch(void)
{
return TRUE;
}
+
static void
select_font(GtkWidget *w, gpointer data _U_)
{
}
}
+
static void
-update_text_color(GtkWidget *w, gpointer data _U_) {
- GtkTextView *sample = g_object_get_data(G_OBJECT(w), COLOR_SAMPLE_KEY);
+update_text_color(GObject *obj, GParamSpec *pspec _U_, gpointer data _U_) {
+ GtkTextView *sample = g_object_get_data(G_OBJECT(obj), COLOR_SAMPLE_KEY);
GtkTextBuffer *buf;
GtkTextTag *tag;
- gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(w), curcolor); /* update tcolors[xx] */
+ gtk_color_xxx_get_yyy(GTK_COLOR_XXX(obj), curcolor); /* updates tcolors[xx] */
buf = gtk_text_view_get_buffer(sample);
tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "marked");
g_object_set(tag,
- "foreground-gdk", &tcolors[MFG_IDX],
- "background-gdk", &tcolors[MBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[MFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[MBG_IDX],
NULL);
tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "ignored");
g_object_set(tag,
- "foreground-gdk", &tcolors[IFG_IDX],
- "background-gdk", &tcolors[IBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[IFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[IBG_IDX],
NULL);
tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "client");
g_object_set(tag,
- "foreground-gdk", &tcolors[CFG_IDX],
- "background-gdk", &tcolors[CBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[CFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[CBG_IDX],
NULL);
tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "server");
g_object_set(tag,
- "foreground-gdk", &tcolors[SFG_IDX],
- "background-gdk", &tcolors[SBG_IDX],
+ TAG_PROP_FG_COLOR, &tcolors[SFG_IDX],
+ TAG_PROP_BG_COLOR, &tcolors[SBG_IDX],
NULL);
}
+
/* ComboBox selection changed (marked/ignored/... forground/background) */
static void
update_current_color(GtkWidget *combo_box, gpointer data)
{
- GtkColorSelection *colorsel = (GtkColorSelection *)data;
+ GtkWidget *colorsel = (GtkWidget *)data;
GtkTextView *color_sample = (GtkTextView *)g_object_get_data(G_OBJECT(combo_box), COLOR_SAMPLE_KEY);
int i;
GtkTextIter iter;
i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
curcolor = &tcolors[i];
- gtk_color_selection_set_previous_color(colorsel, &tcolors_orig[i]);
- gtk_color_selection_set_current_color(colorsel, curcolor); /* triggers "color-changed" callback */
+#if ! GTK_CHECK_VERSION(3,4,0)
+ gtk_color_selection_set_previous_color(GTK_COLOR_SELECTION(colorsel), &tcolors_orig[i]);
+#endif
+ gtk_color_xxx_set_yyy(GTK_COLOR_XXX(colorsel), curcolor); /* triggers update_text_color() callback */
gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(color_sample), &iter);
gtk_text_iter_set_line(&iter, i/2);
gtk_text_view_scroll_to_iter(color_sample, &iter, 0.0, FALSE, 0, 0);
}
+
void
font_color_prefs_fetch(GtkWidget *w _U_)
{
- gdkcolor_to_color_t(&prefs.gui_marked_fg, &tcolors[MFG_IDX]);
- gdkcolor_to_color_t(&prefs.gui_marked_bg, &tcolors[MBG_IDX]);
- gdkcolor_to_color_t(&prefs.gui_ignored_fg, &tcolors[IFG_IDX]);
- gdkcolor_to_color_t(&prefs.gui_ignored_bg, &tcolors[IBG_IDX]);
- gdkcolor_to_color_t(&prefs.st_client_fg, &tcolors[CFG_IDX]);
- gdkcolor_to_color_t(&prefs.st_client_bg, &tcolors[CBG_IDX]);
- gdkcolor_to_color_t(&prefs.st_server_fg, &tcolors[SFG_IDX]);
- gdkcolor_to_color_t(&prefs.st_server_bg, &tcolors[SBG_IDX]);
+ gdkxxx_to_color_t(&prefs.gui_marked_fg, &tcolors[MFG_IDX]);
+ gdkxxx_to_color_t(&prefs.gui_marked_bg, &tcolors[MBG_IDX]);
+ gdkxxx_to_color_t(&prefs.gui_ignored_fg, &tcolors[IFG_IDX]);
+ gdkxxx_to_color_t(&prefs.gui_ignored_bg, &tcolors[IBG_IDX]);
+ gdkxxx_to_color_t(&prefs.st_client_fg, &tcolors[CFG_IDX]);
+ gdkxxx_to_color_t(&prefs.st_client_bg, &tcolors[CBG_IDX]);
+ gdkxxx_to_color_t(&prefs.st_server_fg, &tcolors[SFG_IDX]);
+ gdkxxx_to_color_t(&prefs.st_server_bg, &tcolors[SBG_IDX]);
/*
* XXX - we need to have a way to fetch the preferences into
}
}
+
void
font_color_prefs_apply(GtkWidget *w _U_, gboolean redissect)
{
follow_tcp_redraw_all();
}
+
void
font_color_prefs_destroy(GtkWidget *w _U_)
{