For GTK 3.4 and newer: use GtkColorChooserWidget;
authorBill Meier <wmeier@newsguy.com>
Mon, 4 Mar 2013 04:53:44 +0000 (04:53 -0000)
committerBill Meier <wmeier@newsguy.com>
Mon, 4 Mar 2013 04:53:44 +0000 (04:53 -0000)
(Implemented using a bit of a hack).

svn path=/trunk/; revision=48044

ui/gtk/prefs_font_color.c

index 14652ee6335a4ff24fa3a6c49818756c4a992919..b1be9bc178e4f6cadfa262a570783ff71da21464 100644 (file)
 
 #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
@@ -90,6 +119,7 @@ static const char *font_pangrams[] = {
 };
 #define NUM_FONT_PANGRAMS (sizeof font_pangrams / sizeof font_pangrams[0])
 
+
 GtkWidget *
 font_color_prefs_show(void)
 {
@@ -113,24 +143,26 @@ 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];
 
@@ -140,7 +172,7 @@ font_color_prefs_show(void)
 
   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);
 
@@ -183,7 +215,19 @@ font_color_prefs_show(void)
   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++){
@@ -203,20 +247,20 @@ font_color_prefs_show(void)
   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,
@@ -227,19 +271,20 @@ font_color_prefs_show(void)
                                            "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);
@@ -247,6 +292,7 @@ font_color_prefs_show(void)
   return main_vb;
 }
 
+
 static void
 update_font(PangoFontDescription *font, GtkWidget *font_sample _U_, GtkWidget *color_sample _U_) {
 
@@ -263,6 +309,7 @@ update_font(PangoFontDescription *font, GtkWidget *font_sample _U_, GtkWidget *c
 
 }
 
+
 static gboolean
 font_fetch(void)
 {
@@ -293,6 +340,7 @@ font_fetch(void)
   return TRUE;
 }
 
+
 static void
 select_font(GtkWidget *w, gpointer data _U_)
 {
@@ -310,46 +358,48 @@ 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;
@@ -357,25 +407,28 @@ update_current_color(GtkWidget *combo_box, gpointer data)
   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
@@ -392,6 +445,7 @@ font_color_prefs_fetch(GtkWidget *w _U_)
   }
 }
 
+
 void
 font_color_prefs_apply(GtkWidget *w _U_, gboolean redissect)
 {
@@ -427,6 +481,7 @@ font_color_prefs_apply(GtkWidget *w _U_, gboolean redissect)
   follow_tcp_redraw_all();
 }
 
+
 void
 font_color_prefs_destroy(GtkWidget *w _U_)
 {