aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2004-01-20 18:47:25 +0000
committerUlf Lamping <ulf.lamping@web.de>2004-01-20 18:47:25 +0000
commitef57df088f4c62d2b49b7a06ccceb7c0df10dff9 (patch)
tree73d347c23e8b498132f3e90674cd798bb6f4c638 /gtk
parent3172f21ea58c044aeffe90501dbcecf9b9f9fc21 (diff)
a.) saving GTK1 and GTK2 fontnames in different preference setting, to prevent problems when switching between GTK1 and GTK2 ethereal versions
b.) added new feature "Edit->Go To First Packet" "Edit->Go To Last Packet" with corresponding menu and toolbar items c.) added new feature "View->Zoom In" / "View->Zoom Out" / View->Normal Size" with corresponding menu and toolbar items This feature will act as a "size offset" to the current fontsize, so that the packet list/tree view/... will have a larger/smaller font size. The value is stored inside the recent file. d.) Win32 only: Try to get the win32 system font and fontsize at program startup and show the menus/dialogs and such with the same font and fontsize like other win32 windows. This makes the program make a *lot* more feel like a normal win32 program. svn path=/trunk/; revision=9753
Diffstat (limited to 'gtk')
-rw-r--r--gtk/compat_macros.h20
-rw-r--r--gtk/gui_prefs.c68
-rw-r--r--gtk/main.c428
-rw-r--r--gtk/main.h10
-rw-r--r--gtk/menu.c13
-rw-r--r--gtk/recent.c15
-rw-r--r--gtk/recent.h4
-rw-r--r--gtk/toolbar.c34
8 files changed, 507 insertions, 85 deletions
diff --git a/gtk/compat_macros.h b/gtk/compat_macros.h
index 106b2ae0e3..8a3e5c64bf 100644
--- a/gtk/compat_macros.h
+++ b/gtk/compat_macros.h
@@ -1,7 +1,7 @@
/* compat_macros.h
* GTK-related Global defines, etc.
*
- * $Id: compat_macros.h,v 1.9 2004/01/20 02:35:31 guy Exp $
+ * $Id: compat_macros.h,v 1.10 2004/01/20 18:47:23 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -89,9 +89,12 @@ gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), name)
#define GTK_STOCK_COPY "Copy"
#define GTK_STOCK_DELETE "Delete"
#define GTK_STOCK_FIND "Find"
+#define GTK_STOCK_GO_BACK "Back"
#define GTK_STOCK_GO_DOWN "Down"
#define GTK_STOCK_GO_FORWARD "Next"
#define GTK_STOCK_GO_UP "Up"
+#define GTK_STOCK_GOTO_BOTTOM "Bottom"
+#define GTK_STOCK_GOTO_TOP "Top"
#define GTK_STOCK_HELP "Help"
#define GTK_STOCK_JUMP_TO "GoTo"
#define GTK_STOCK_NEW "New"
@@ -106,15 +109,18 @@ gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), name)
#define GTK_STOCK_SELECT_COLOR "Color"
#define GTK_STOCK_SELECT_FONT "Font"
#define GTK_STOCK_STOP "Stop"
+#define GTK_STOCK_ZOOM_IN "Zoom In"
+#define GTK_STOCK_ZOOM_OUT "Zoom Out"
+#define GTK_STOCK_ZOOM_100 "Zoom 100%"
#ifdef HAVE_LIBPCAP
-#define ETHEREAL_STOCK_CAPTURE_START ETHEREAL_STOCK_LABEL_CAPTURE_START
-#define ETHEREAL_STOCK_CAPTURE_FILTER ETHEREAL_STOCK_LABEL_CAPTURE_FILTER
-#define ETHEREAL_STOCK_CAPTURE_FILTER_ENTRY ETHEREAL_STOCK_LABEL_CAPTURE_FILTER_ENTRY
+#define ETHEREAL_STOCK_CAPTURE_START "New"
+#define ETHEREAL_STOCK_CAPTURE_FILTER "CFilter"
+#define ETHEREAL_STOCK_CAPTURE_FILTER_ENTRY "CFilter:"
#endif
-#define ETHEREAL_STOCK_DISPLAY_FILTER ETHEREAL_STOCK_LABEL_DISPLAY_FILTER
-#define ETHEREAL_STOCK_DISPLAY_FILTER_ENTRY ETHEREAL_STOCK_LABEL_DISPLAY_FILTER_ENTRY
-#define ETHEREAL_STOCK_PREFS ETHEREAL_STOCK_LABEL_PREFS
+#define ETHEREAL_STOCK_DISPLAY_FILTER "DFilter"
+#define ETHEREAL_STOCK_DISPLAY_FILTER_ENTRY "DFilter:"
+#define ETHEREAL_STOCK_PREFS "Prefs"
#define BUTTON_NEW_FROM_STOCK(stock_id) \
gtk_button_new_with_label(stock_id);
diff --git a/gtk/gui_prefs.c b/gtk/gui_prefs.c
index 6285b0f311..56b05a053c 100644
--- a/gtk/gui_prefs.c
+++ b/gtk/gui_prefs.c
@@ -1,7 +1,7 @@
/* gui_prefs.c
* Dialog box for GUI preferences
*
- * $Id: gui_prefs.c,v 1.54 2004/01/17 03:09:24 guy Exp $
+ * $Id: gui_prefs.c,v 1.55 2004/01/20 18:47:23 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -33,7 +33,6 @@
#include "globals.h"
#include "gui_prefs.h"
#include "gtkglobals.h"
-#include "follow_dlg.h"
#include "help_dlg.h"
#include "supported_protos_dlg.h"
#include "prefs.h"
@@ -321,7 +320,7 @@ gui_font_prefs_show(void)
a fix; hopefully, it'll show up in 1.2.9 if, as, and when
they put out a 1.2.9 release. */
gtk_font_selection_set_font_name(
- GTK_FONT_SELECTION(font_browse_w), prefs.gui_font_name);
+ GTK_FONT_SELECTION(font_browse_w), prefs.PREFS_GUI_FONT_NAME);
gtk_widget_show(font_browse_w);
@@ -353,7 +352,7 @@ font_fetch(void)
#if GTK_MAJOR_VERSION < 2
/* Get the name that the boldface version of that font would have. */
- bold_font_name = boldify(font_name);
+ bold_font_name = font_boldify(font_name);
/* Now load those fonts, just to make sure we can. */
new_r_font = gdk_font_load(font_name);
@@ -453,52 +452,26 @@ gui_prefs_fetch(GtkWidget *w)
* places where there *can* be a bad preference value.
*/
if (font_fetch()) {
- if (strcmp(new_font_name, prefs.gui_font_name) != 0) {
+ if (strcmp(new_font_name, prefs.PREFS_GUI_FONT_NAME) != 0) {
font_changed = TRUE;
- if (prefs.gui_font_name != NULL)
- g_free(prefs.gui_font_name);
- prefs.gui_font_name = g_strdup(new_font_name);
+ if (prefs.PREFS_GUI_FONT_NAME != NULL)
+ g_free(prefs.PREFS_GUI_FONT_NAME);
+ prefs.PREFS_GUI_FONT_NAME = g_strdup(new_font_name);
}
}
}
+
+
void
gui_prefs_apply(GtkWidget *w _U_)
{
-#if GTK_MAJOR_VERSION < 2
- GdkFont *new_r_font, *new_b_font;
- char *bold_font_name;
- GdkFont *old_r_font = NULL, *old_b_font = NULL;
-#else
- PangoFontDescription *new_r_font, *new_b_font;
- PangoFontDescription *old_r_font = NULL, *old_b_font = NULL;
-#endif
- if (font_changed) {
- /* XXX - what if the world changed out from under
- us, so that one or both of these fonts cannot
- be loaded? */
-#if GTK_MAJOR_VERSION < 2
- new_r_font = gdk_font_load(prefs.gui_font_name);
- bold_font_name = boldify(prefs.gui_font_name);
- new_b_font = gdk_font_load(bold_font_name);
-#else
- new_r_font = pango_font_description_from_string(prefs.gui_font_name);
- new_b_font = pango_font_description_copy(new_r_font);
- pango_font_description_set_weight(new_b_font,
- PANGO_WEIGHT_BOLD);
-#endif
- set_plist_font(new_r_font);
- set_ptree_font_all(new_r_font);
- old_r_font = m_r_font;
- old_b_font = m_b_font;
- set_fonts(new_r_font, new_b_font);
-#if GTK_MAJOR_VERSION < 2
- g_free(bold_font_name);
-#endif
+ if (font_changed) {
+ font_apply();
}
- /* Redraw the hex dump windows, in case either the font or the
+ /* Redraw the hex dump windows, in case the
highlight style changed. */
redraw_hex_dump_all();
@@ -506,10 +479,6 @@ gui_prefs_apply(GtkWidget *w _U_)
supported_redraw();
help_redraw();
- /* Redraw the "Follow TCP Stream" windows, if the font changed. */
- if (font_changed)
- follow_redraw_all();
-
/* XXX: redraw the toolbar only, if style changed */
toolbar_redraw_all();
@@ -517,19 +486,6 @@ gui_prefs_apply(GtkWidget *w _U_)
set_plist_sel_browse(prefs.gui_plist_sel_browse);
set_ptree_sel_browse_all(prefs.gui_ptree_sel_browse);
set_tree_styles_all();
-
- /* We're no longer using the old fonts; unreference them. */
-#if GTK_MAJOR_VERSION < 2
- if (old_r_font != NULL)
- gdk_font_unref(old_r_font);
- if (old_b_font != NULL)
- gdk_font_unref(old_b_font);
-#else
- if (old_r_font != NULL)
- pango_font_description_free(old_r_font);
- if (old_b_font != NULL)
- pango_font_description_free(old_b_font);
-#endif
}
void
diff --git a/gtk/main.c b/gtk/main.c
index aa8125b48f..d904925f69 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * $Id: main.c,v 1.362 2004/01/20 02:26:00 ulfl Exp $
+ * $Id: main.c,v 1.363 2004/01/20 18:47:23 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -124,6 +124,7 @@
#include "find_dlg.h"
#include "packet_list.h"
#include "recent.h"
+#include "follow_dlg.h"
#ifdef WIN32
#include "capture-wpcap.h"
@@ -177,6 +178,7 @@ static gboolean list_link_layer_types;
#endif
static void create_main_window(gint, gint, gint, e_prefs*);
+static void try_to_get_windows_font_gtk2 (void);
#define E_DFILTER_CM_KEY "display_filter_combo"
#define E_DFILTER_FL_KEY "display_filter_list"
@@ -296,6 +298,44 @@ goto_framenum_cb(GtkWidget *w _U_, gpointer data _U_)
}
}
+void
+goto_top_frame_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+ goto_top_frame(&cfile);
+}
+
+void
+goto_bottom_frame_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+ goto_bottom_frame(&cfile);
+}
+
+
+void
+view_zoom_in_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+
+ recent.gui_zoom_level++;
+ font_apply();
+}
+
+void
+view_zoom_out_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+
+ recent.gui_zoom_level--;
+ font_apply();
+}
+
+void
+view_zoom_100_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+
+ recent.gui_zoom_level = 0;
+ font_apply();
+}
+
+
/* Match selected byte pattern */
static void
match_selected_cb_do(gpointer data, int action, gchar *text)
@@ -1726,9 +1766,9 @@ main(int argc, char *argv[])
#endif
break;
case 'm': /* Fixed-width font for the display */
- if (prefs->gui_font_name != NULL)
- g_free(prefs->gui_font_name);
- prefs->gui_font_name = g_strdup(optarg);
+ if (prefs->PREFS_GUI_FONT_NAME != NULL)
+ g_free(prefs->PREFS_GUI_FONT_NAME);
+ prefs->PREFS_GUI_FONT_NAME = g_strdup(optarg);
break;
case 'n': /* No name resolution */
g_resolv_flags = RESOLV_NONE;
@@ -2127,16 +2167,24 @@ main(int argc, char *argv[])
#endif
#endif
+#ifdef WIN32
+#if GTK_MAJOR_VERSION >= 2
+ try_to_get_windows_font_gtk2();
+#endif
+#endif
+
+ /* read in rc file from global and personal configuration paths. */
+ gtk_rc_parse(RC_FILE);
rc_file = get_persconffile_path(RC_FILE, FALSE);
gtk_rc_parse(rc_file);
/* Try to load the regular and boldface fixed-width fonts */
#if GTK_MAJOR_VERSION < 2
- bold_font_name = boldify(prefs->gui_font_name);
- m_r_font = gdk_font_load(prefs->gui_font_name);
+ bold_font_name = font_boldify(prefs->PREFS_GUI_FONT_NAME);
+ m_r_font = gdk_font_load(prefs->PREFS_GUI_FONT_NAME);
m_b_font = gdk_font_load(bold_font_name);
#else
- m_r_font = pango_font_description_from_string(prefs->gui_font_name);
+ m_r_font = pango_font_description_from_string(prefs->PREFS_GUI_FONT_NAME);
m_b_font = pango_font_description_copy(m_r_font);
pango_font_description_set_weight(m_b_font, PANGO_WEIGHT_BOLD);
#endif
@@ -2151,7 +2199,7 @@ main(int argc, char *argv[])
#else
fprintf(stderr, "ethereal: Warning: font %s not found - defaulting to Monospace 9\n",
#endif
- prefs->gui_font_name);
+ prefs->PREFS_GUI_FONT_NAME);
} else {
#if GTK_MAJOR_VERSION < 2
gdk_font_unref(m_r_font);
@@ -2168,7 +2216,7 @@ main(int argc, char *argv[])
bold_font_name);
#else
fprintf(stderr, "ethereal: Warning: bold font %s not found - defaulting"
- " to Monospace 9\n", prefs->gui_font_name);
+ " to Monospace 9\n", prefs->PREFS_GUI_FONT_NAME);
#endif
} else {
#if GTK_MAJOR_VERSION < 2
@@ -2197,12 +2245,12 @@ main(int argc, char *argv[])
#endif
exit(1);
}
- g_free(prefs->gui_font_name);
+ g_free(prefs->PREFS_GUI_FONT_NAME);
#if GTK_MAJOR_VERSION < 2
- prefs->gui_font_name = g_strdup("6x13");
+ prefs->PREFS_GUI_FONT_NAME = g_strdup("6x13");
#else
pango_font_description_set_weight(m_b_font, PANGO_WEIGHT_BOLD);
- prefs->gui_font_name = g_strdup("Monospace 9");
+ prefs->PREFS_GUI_FONT_NAME = g_strdup("Monospace 9");
#endif
}
@@ -2644,7 +2692,7 @@ static const struct {
#define N_WEIGHTS (sizeof weight_map / sizeof weight_map[0])
char *
-boldify(const char *font_name)
+font_boldify(const char *font_name)
{
char *bold_font_name;
gchar **xlfd_tokens;
@@ -2692,6 +2740,353 @@ not_xlfd:
#endif
+char *font_zoom(char *gui_font_name)
+{
+ char new_font_name[200];
+ char *font_name_dup;
+ char *font_name_p;
+ long font_point_size_l;
+#if GTK_MAJOR_VERSION < 2
+ int minus_chars;
+ char *font_foundry;
+ char *font_family;
+ char *font_weight;
+ char *font_slant;
+ char *font_set_width;
+ char *font_add_style;
+ char *font_pixel_size;
+ char *font_point_size;
+ char *font_res_x;
+ char *font_res_y;
+ char *font_spacing;
+ char *font_aver_width;
+ char *font_charset_reg;
+ char *font_charset_encoding;
+#endif
+
+#if GTK_MAJOR_VERSION >= 2
+ font_name_dup = strdup(gui_font_name);
+ font_name_p = font_name_dup;
+
+ /* find the start of the font_size string */
+ font_name_p = strrchr(font_name_dup, ' ');
+ *font_name_p = 0;
+ font_name_p++;
+
+ /* calculate the new font size */
+ font_point_size_l = strtoul(font_name_p, NULL, 10);
+ font_point_size_l += recent.gui_zoom_level;
+
+ /* build a new font name */
+ sprintf(new_font_name, "%s %u", font_name_dup, font_point_size_l);
+ g_free(font_name_dup);
+
+ return strdup(new_font_name);
+#else
+ font_name_dup = strdup(gui_font_name);
+ font_name_p = font_name_dup;
+
+ minus_chars = 0;
+ /* replace all '-' chars by 0 and count them */
+ while (font_name_p = strchr(font_name_p, '-')) {
+ *font_name_p = 0;
+ font_name_p++;
+ minus_chars++;
+ }
+
+ if (minus_chars != 14) {
+ return NULL;
+ }
+
+ /* first element empty */
+ font_name_p = font_name_dup;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ /* get pointers to all font name elements */
+ font_foundry = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_family = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_weight = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_slant = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_set_width = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_add_style = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_pixel_size = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_point_size = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_res_x = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_res_y = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_spacing = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_aver_width = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_charset_reg = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ font_charset_encoding = font_name_p;
+ font_name_p += strlen(font_name_p);
+ font_name_p++;
+
+ /* calculate the new font size */
+ font_point_size_l = strtoul(font_point_size, NULL, 10);
+ font_point_size_l += recent.gui_zoom_level*10;
+ if (font_point_size_l < 0)
+ font_point_size_l = 0;
+
+ /* build a new font name */
+ sprintf(new_font_name, "-%s-%s-%s-%s-%s--%s-%u-%s-%s-%s-%s-%s-%s",
+ font_foundry, font_family, font_weight, font_slant, font_set_width,
+ font_pixel_size, font_point_size_l, font_res_x, font_res_y,
+ font_spacing, font_aver_width, font_charset_reg, font_charset_encoding);
+ g_free(font_name_dup);
+
+ return strdup(new_font_name);
+#endif
+}
+
+
+void
+font_apply(void) {
+ char *gui_font_name;
+#if GTK_MAJOR_VERSION < 2
+ GdkFont *new_r_font, *new_b_font;
+ char *bold_font_name;
+ GdkFont *old_r_font = NULL, *old_b_font = NULL;
+#else
+ PangoFontDescription *new_r_font, *new_b_font;
+ PangoFontDescription *old_r_font = NULL, *old_b_font = NULL;
+#endif
+
+
+ /* convert font name to reflect the zoom level */
+ gui_font_name = font_zoom(prefs.PREFS_GUI_FONT_NAME);
+ if (gui_font_name == NULL) {
+ simple_dialog(ESD_TYPE_WARN, NULL,
+ "Font name: \"%s\" invalid, please update font setting in Edit->Preferences",
+ gui_font_name);
+ return;
+ }
+
+ /* XXX - what if the world changed out from under
+ us, so that one or both of these fonts cannot
+ be loaded? */
+#if GTK_MAJOR_VERSION < 2
+ new_r_font = gdk_font_load(gui_font_name);
+ bold_font_name = font_boldify(gui_font_name);
+ new_b_font = gdk_font_load(bold_font_name);
+#else
+ new_r_font = pango_font_description_from_string(gui_font_name);
+ new_b_font = pango_font_description_copy(new_r_font);
+ pango_font_description_set_weight(new_b_font,
+ PANGO_WEIGHT_BOLD);
+#endif
+ set_plist_font(new_r_font);
+ set_ptree_font_all(new_r_font);
+ old_r_font = m_r_font;
+ old_b_font = m_b_font;
+ set_fonts(new_r_font, new_b_font);
+#if GTK_MAJOR_VERSION < 2
+ g_free(bold_font_name);
+#endif
+
+ /* Redraw the hex dump windows. */
+ redraw_hex_dump_all();
+
+ /* Redraw the "Follow TCP Stream" windows. */
+ follow_redraw_all();
+
+ /* We're no longer using the old fonts; unreference them. */
+#if GTK_MAJOR_VERSION < 2
+ if (old_r_font != NULL)
+ gdk_font_unref(old_r_font);
+ if (old_b_font != NULL)
+ gdk_font_unref(old_b_font);
+#else
+ if (old_r_font != NULL)
+ pango_font_description_free(old_r_font);
+ if (old_b_font != NULL)
+ pango_font_description_free(old_b_font);
+#endif
+ g_free(gui_font_name);
+}
+
+
+
+
+#ifdef WIN32
+
+#define NAME_BUFFER_LEN 32
+
+#if GTK_MAJOR_VERSION < 2
+
+
+/* coming from: Allin Cottrell, http://www.ecn.wfu.edu/~cottrell/gtk_win32 */
+int get_windows_font_gtk1(char *fontspec)
+{
+ HDC h_dc;
+ HGDIOBJ h_font;
+ TEXTMETRIC tm;
+ char name[NAME_BUFFER_LEN];
+ int len, pix_height;
+
+ h_dc = CreateDC("DISPLAY", NULL, NULL, NULL);
+ if (h_dc == NULL) return 1;
+ h_font = GetStockObject(DEFAULT_GUI_FONT);
+ if (h_font == NULL || !SelectObject(h_dc, h_font)) {
+ DeleteDC(h_dc);
+ return 1;
+ }
+ len = GetTextFace(h_dc, NAME_BUFFER_LEN, name);
+ if (len <= 0) {
+ DeleteDC(h_dc);
+ return 1;
+ }
+ if (!GetTextMetrics(h_dc, &tm)) {
+ DeleteDC(h_dc);
+ return 1;
+ }
+ pix_height = tm.tmHeight;
+ DeleteDC(h_dc);
+ sprintf(fontspec, "-*-%s-*-*-*-*-%i-*-*-*-p-*-iso8859-1", name,
+ pix_height);
+ return 0;
+}
+
+void set_app_font_gtk1(GtkWidget *top_level_w)
+{
+ GtkStyle *style;
+ char winfont[80];
+
+ style = gtk_widget_get_style(top_level);
+ if (get_windows_font_gtk1(winfont) == 0)
+ style->font = gdk_font_load(winfont);
+ if (style->font) gtk_widget_set_style(top_level, style);
+}
+
+#else /* GTK_MAJOR_VERSION */
+static char appfontname[128] = "tahoma 8";
+
+void set_app_font_gtk2(const char *fontname)
+{
+ GtkSettings *settings;
+
+ if (fontname != NULL && *fontname == 0) return;
+
+ settings = gtk_settings_get_default();
+
+ if (fontname == NULL) {
+ g_object_set(G_OBJECT(settings), "gtk-font-name", appfontname, NULL);
+ } else {
+ GtkWidget *w;
+ PangoFontDescription *pfd;
+ PangoContext *pc;
+ PangoFont *pfont;
+
+ w = gtk_label_new(NULL);
+ pfd = pango_font_description_from_string(fontname);
+ pc = gtk_widget_get_pango_context(w);
+ pfont = pango_context_load_font(pc, pfd);
+
+ if (pfont != NULL) {
+ strcpy(appfontname, fontname);
+ g_object_set(G_OBJECT(settings), "gtk-font-name", appfontname, NULL);
+ }
+
+ gtk_widget_destroy(w);
+ pango_font_description_free(pfd);
+ }
+}
+
+char *default_windows_menu_fontspec_gtk2(void)
+{
+ gchar *fontspec = NULL;
+ NONCLIENTMETRICS ncm;
+
+ memset(&ncm, 0, sizeof ncm);
+ ncm.cbSize = sizeof ncm;
+
+ if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0)) {
+ HDC screen = GetDC(0);
+ double y_scale = 72.0 / GetDeviceCaps(screen, LOGPIXELSY);
+ int point_size = (int) (ncm.lfMenuFont.lfHeight * y_scale);
+
+ if (point_size < 0) point_size = -point_size;
+ fontspec = g_strdup_printf("%s %d", ncm.lfMenuFont.lfFaceName,
+ point_size);
+ ReleaseDC(0, screen);
+ }
+
+ return fontspec;
+}
+
+static void try_to_get_windows_font_gtk2(void)
+{
+ gchar *fontspec;
+
+ fontspec = default_windows_menu_fontspec_gtk2();
+
+ if (fontspec != NULL) {
+ int match = 0;
+ PangoFontDescription *pfd;
+ PangoFont *pfont;
+ PangoContext *pc;
+ GtkWidget *w;
+
+ pfd = pango_font_description_from_string(fontspec);
+
+ w = gtk_label_new(NULL);
+ pc = gtk_widget_get_pango_context(w);
+ pfont = pango_context_load_font(pc, pfd);
+ match = (pfont != NULL);
+
+ pango_font_description_free(pfd);
+ g_object_unref(G_OBJECT(pc));
+ gtk_widget_destroy(w);
+
+ if (match) set_app_font_gtk2(fontspec);
+ g_free(fontspec);
+ }
+}
+#endif /* GTK_MAJOR_VERSION */
+
+#endif /* WIN32 */
+
+
+
+
/*
* Helper for main_widgets_rearrange()
*/
@@ -2802,6 +3197,13 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs)
/* Main window */
top_level = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+#ifdef WIN32
+#if GTK_MAJOR_VERSION < 2
+ set_app_font_gtk1(top_level);
+#endif
+#endif
+
gtk_widget_set_name(top_level, "main window");
SIGNAL_CONNECT(top_level, "delete_event", main_window_delete_event_cb,
NULL);
diff --git a/gtk/main.h b/gtk/main.h
index c33716ece1..63bfecdcbe 100644
--- a/gtk/main.h
+++ b/gtk/main.h
@@ -1,7 +1,7 @@
/* main.h
* Global defines, etc.
*
- * $Id: main.h,v 1.36 2004/01/19 00:42:09 ulfl Exp $
+ * $Id: main.h,v 1.37 2004/01/20 18:47:24 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -64,6 +64,11 @@ extern GtkStyle *item_style;
void about_ethereal( GtkWidget *, gpointer);
void goto_framenum_cb(GtkWidget *, gpointer);
+void goto_top_frame_cb(GtkWidget *w _U_, gpointer d _U_);
+void goto_bottom_frame_cb(GtkWidget *w _U_, gpointer d _U_);
+void view_zoom_in_cb(GtkWidget *w _U_, gpointer d _U_);
+void view_zoom_out_cb(GtkWidget *w _U_, gpointer d _U_);
+void view_zoom_100_cb(GtkWidget *w _U_, gpointer d _U_);
void match_selected_cb_replace_ptree( GtkWidget *, gpointer);
void match_selected_cb_and_ptree( GtkWidget *, gpointer);
void match_selected_cb_or_ptree( GtkWidget *, gpointer);
@@ -101,8 +106,9 @@ extern void dfilter_recent_combo_write_all(FILE *rf);
extern void main_widgets_rearrange(void);
-char *boldify(const char *);
+extern void font_apply(void);
#if GTK_MAJOR_VERSION < 2
+char *font_boldify(const char *);
void set_fonts(GdkFont *regular, GdkFont *bold);
#else
void set_fonts(PangoFontDescription *regular, PangoFontDescription *bold);
diff --git a/gtk/menu.c b/gtk/menu.c
index 204d36d54b..ce8f5b68b0 100644
--- a/gtk/menu.c
+++ b/gtk/menu.c
@@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
- * $Id: menu.c,v 1.139 2004/01/19 23:03:20 guy Exp $
+ * $Id: menu.c,v 1.140 2004/01/20 18:47:24 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -159,6 +159,10 @@ static GtkItemFactoryEntry menu_items[] =
ITEM_FACTORY_STOCK_ENTRY("/Edit/Find Pre_vious", "<control>B",
find_previous_cb, 0, GTK_STOCK_GO_BACK),
ITEM_FACTORY_ENTRY("/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL),
+ ITEM_FACTORY_STOCK_ENTRY("/Edit/_Go To First Packet...", NULL,
+ goto_top_frame_cb, 0, GTK_STOCK_GOTO_TOP),
+ ITEM_FACTORY_STOCK_ENTRY("/Edit/_Go To Last Packet...", NULL,
+ goto_bottom_frame_cb, 0, GTK_STOCK_GOTO_BOTTOM),
ITEM_FACTORY_STOCK_ENTRY("/Edit/_Go To Packet...", "<control>G",
goto_frame_cb, 0, GTK_STOCK_JUMP_TO),
ITEM_FACTORY_ENTRY("/Edit/Go To _Corresponding Packet", NULL, goto_framenum_cb,
@@ -209,6 +213,13 @@ static GtkItemFactoryEntry menu_items[] =
0, NULL, NULL),
#endif
ITEM_FACTORY_ENTRY("/View/<separator>", NULL, NULL, 0, "<Separator>", NULL),
+ ITEM_FACTORY_STOCK_ENTRY("/View/Zoom In", "<control>plus", view_zoom_in_cb,
+ 0, GTK_STOCK_ZOOM_IN),
+ ITEM_FACTORY_STOCK_ENTRY("/View/Zoom Out", "<control>minus", view_zoom_out_cb,
+ 0, GTK_STOCK_ZOOM_OUT),
+ ITEM_FACTORY_STOCK_ENTRY("/View/Normal Size", "<control>equal", view_zoom_100_cb,
+ 0, GTK_STOCK_ZOOM_100),
+ ITEM_FACTORY_ENTRY("/View/<separator>", NULL, NULL, 0, "<Separator>", NULL),
ITEM_FACTORY_ENTRY("/View/Collapse _All", NULL, collapse_all_cb,
0, NULL, NULL),
ITEM_FACTORY_ENTRY("/View/_Expand All", NULL, expand_all_cb,
diff --git a/gtk/recent.c b/gtk/recent.c
index 871aed1ed8..57bc1e6633 100644
--- a/gtk/recent.c
+++ b/gtk/recent.c
@@ -2,7 +2,7 @@
* Recent "preference" handling routines
* Copyright 2004, Ulf Lamping <ulf.lamping@web.de>
*
- * $Id: recent.c,v 1.4 2004/01/19 23:03:20 guy Exp $
+ * $Id: recent.c,v 1.5 2004/01/20 18:47:25 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -141,6 +141,11 @@ write_recent(char **rf_path_return)
fprintf(rf, RECENT_GUI_TIME_FORMAT ": %s\n",
ts_type_text[recent.gui_time_format]);
+ fprintf(rf, "\n# Zoom level.\n");
+ fprintf(rf, "# A decimal number.\n");
+ fprintf(rf, RECENT_GUI_ZOOM_LEVEL ": %d\n",
+ recent.gui_zoom_level);
+
fclose(rf);
/* XXX - catch I/O errors (e.g. "ran out of disk space") and return
@@ -203,8 +208,10 @@ read_set_recent_pair(gchar *key, gchar *value)
recent.statusbar_show = FALSE;
}
} else if (strcmp(key, RECENT_GUI_TIME_FORMAT) == 0) {
- recent.gui_time_format =
- find_index_from_string_array(value, ts_type_text, TS_RELATIVE);
+ recent.gui_time_format =
+ find_index_from_string_array(value, ts_type_text, TS_RELATIVE);
+ } else if (strcmp(key, RECENT_GUI_ZOOM_LEVEL) == 0) {
+ recent.gui_zoom_level = strtol(value, NULL, 0);
}
return PREFS_SET_OK;
@@ -227,6 +234,7 @@ read_recent(char **rf_path_return, int *rf_errno_return)
recent.byte_view_show = TRUE;
recent.statusbar_show = TRUE;
recent.gui_time_format = TS_RELATIVE;
+ recent.gui_zoom_level = 0;
/* Construct the pathname of the user's recent file. */
rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE);
@@ -252,6 +260,7 @@ read_recent(char **rf_path_return, int *rf_errno_return)
}
menu_recent_read_finished();
+ font_apply();
}
diff --git a/gtk/recent.h b/gtk/recent.h
index 1e603f98bf..3f2527cf6c 100644
--- a/gtk/recent.h
+++ b/gtk/recent.h
@@ -2,7 +2,7 @@
* Definitions for recent "preference" handling routines
* Copyright 2004, Ulf Lamping <ulf.lamping@web.de>
*
- * $Id: recent.h,v 1.2 2004/01/19 03:46:43 ulfl Exp $
+ * $Id: recent.h,v 1.3 2004/01/20 18:47:25 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -38,6 +38,7 @@
#define RECENT_KEY_BYTE_VIEW_SHOW "gui.byte_view_show"
#define RECENT_KEY_STATUSBAR_SHOW "gui.statusbar_show"
#define RECENT_GUI_TIME_FORMAT "gui.time_format"
+#define RECENT_GUI_ZOOM_LEVEL "gui.zoom_level"
typedef struct recent_settings_tag {
gboolean main_toolbar_show;
@@ -49,6 +50,7 @@ typedef struct recent_settings_tag {
gboolean byte_view_show;
gboolean statusbar_show;
gint gui_time_format;
+ gint gui_zoom_level;
} recent_settings_t;
extern recent_settings_t recent;
diff --git a/gtk/toolbar.c b/gtk/toolbar.c
index f0be38d82e..c377bd64bb 100644
--- a/gtk/toolbar.c
+++ b/gtk/toolbar.c
@@ -2,7 +2,7 @@
* The main toolbar
* Copyright 2003, Ulf Lamping <ulf.lamping@web.de>
*
- * $Id: toolbar.c,v 1.22 2004/01/20 02:36:04 guy Exp $
+ * $Id: toolbar.c,v 1.23 2004/01/20 18:47:25 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -78,8 +78,14 @@
#include "../image/toolbar/stock_refresh_24.xpm"
#include "../image/toolbar/stock_print_24.xpm"
#include "../image/toolbar/stock_search_24.xpm"
+#include "../image/toolbar/stock_left_arrow_24.xpm"
#include "../image/toolbar/stock_right_arrow_24.xpm"
#include "../image/toolbar/stock_jump_to_24.xpm"
+#include "../image/toolbar/stock_top_24.xpm"
+#include "../image/toolbar/stock_bottom_24.xpm"
+#include "../image/toolbar/stock_zoom_in_24.xpm"
+#include "../image/toolbar/stock_zoom_out_24.xpm"
+#include "../image/toolbar/stock_zoom_1_24.xpm"
#include "../image/toolbar/stock_colorselector_24.xpm"
#include "../image/toolbar/stock_help_24.xpm"
#endif /* GTK_MAJOR_VERSION */
@@ -104,8 +110,10 @@ static GtkWidget *new_button, *stop_button;
static GtkWidget *capture_filter_button;
#endif /* HAVE_LIBPCAP */
static GtkWidget *open_button, *save_button, *save_as_button, *close_button, *reload_button;
-static GtkWidget *print_button, *find_button, *find_next_button, *go_to_button;
+static GtkWidget *print_button, *find_button, *find_next_button, *find_prev_button;
+static GtkWidget *go_to_button, *go_to_top_button, *go_to_bottom_button;
static GtkWidget *display_filter_button;
+static GtkWidget *zoom_in_button, *zoom_out_button, *zoom_100_button;
static GtkWidget *color_display_button, *prefs_button, *help_button;
#if GTK_MAJOR_VERSION >= 2
@@ -256,7 +264,13 @@ void set_toolbar_for_captured_packets(gboolean have_captured_packets) {
gtk_widget_set_sensitive(print_button, have_captured_packets);
gtk_widget_set_sensitive(find_button, have_captured_packets);
gtk_widget_set_sensitive(find_next_button, have_captured_packets);
+ gtk_widget_set_sensitive(find_prev_button, have_captured_packets);
gtk_widget_set_sensitive(go_to_button, have_captured_packets);
+ gtk_widget_set_sensitive(go_to_top_button, have_captured_packets);
+ gtk_widget_set_sensitive(go_to_bottom_button, have_captured_packets);
+ gtk_widget_set_sensitive(zoom_in_button, have_captured_packets);
+ gtk_widget_set_sensitive(zoom_out_button, have_captured_packets);
+ gtk_widget_set_sensitive(zoom_100_button, have_captured_packets);
/* XXX - I don't see a reason why this should be done (as it is in the
* menus) */
/* gtk_widget_set_sensitive(color_display_button, have_captured_packets);*/
@@ -367,10 +381,26 @@ toolbar_new(void)
toolbar_item(find_button, window, main_tb,
GTK_STOCK_FIND, "Find a packet...", stock_search_24_xpm, find_frame_cb);
+ toolbar_item(find_prev_button, window, main_tb,
+ GTK_STOCK_GO_BACK, "Find the previous matching packet", stock_left_arrow_24_xpm, find_previous_cb);
toolbar_item(find_next_button, window, main_tb,
GTK_STOCK_GO_FORWARD, "Find the next matching packet", stock_right_arrow_24_xpm, find_next_cb);
+ toolbar_append_separator(main_tb);
+
toolbar_item(go_to_button, window, main_tb,
GTK_STOCK_JUMP_TO, "Go to the packet with number...", stock_jump_to_24_xpm, goto_frame_cb);
+ toolbar_item(go_to_top_button, window, main_tb,
+ GTK_STOCK_GOTO_TOP, "Go to the first packet", stock_top_24_xpm, goto_top_frame_cb);
+ toolbar_item(go_to_bottom_button, window, main_tb,
+ GTK_STOCK_GOTO_BOTTOM, "Go to the last packet", stock_bottom_24_xpm, goto_bottom_frame_cb);
+ toolbar_append_separator(main_tb);
+
+ toolbar_item(zoom_in_button, window, main_tb,
+ GTK_STOCK_ZOOM_IN, "Zoom in", stock_zoom_in_24_xpm, view_zoom_in_cb);
+ toolbar_item(zoom_out_button, window, main_tb,
+ GTK_STOCK_ZOOM_OUT, "Zoom out", stock_zoom_out_24_xpm, view_zoom_out_cb);
+ toolbar_item(zoom_100_button, window, main_tb,
+ GTK_STOCK_ZOOM_100, "Zoom 100%", stock_zoom_1_24_xpm, view_zoom_100_cb);
toolbar_append_separator(main_tb);
#ifdef HAVE_LIBPCAP