/** * gcc -Wall -g `pkg-config --cflags --libs gtk+-2.0` gtkinfo.c -o gtkinfo */ #include #include #include #include void print_gtk_settings (void) { GtkSettings *settings; gchar *gtk_font_name = 0; gchar *gtk_icon_sizes = 0; gchar *gtk_icon_theme_name = 0; gchar *gtk_key_theme_name = 0; gchar *gtk_theme_name = 0; gint gtk_xft_antialias; gint gtk_xft_dpi; fprintf (stdout, "General settings:\n"); fprintf (stdout, " Language is %s.\n", pango_language_to_string (gtk_get_default_language ())); settings = gtk_settings_get_default (); g_object_get (settings, "gtk-font-name", >k_font_name, "gtk-icon-sizes", >k_icon_sizes, "gtk-key-theme-name", >k_key_theme_name, "gtk-theme-name", >k_theme_name, "gtk-xft-antialias", >k_xft_antialias, "gtk-xft-dpi", >k_xft_dpi, NULL); if (gtk_theme_name) fprintf (stdout, " Theme is %s.\n", gtk_theme_name); if (gtk_font_name) fprintf (stdout, " Default font is %s.\n", gtk_font_name); if (g_object_class_find_property (G_OBJECT_GET_CLASS (settings), "gtk-icon-theme-name")) { g_object_get (settings, "gtk-icon-theme-name", >k_icon_theme_name, NULL); if (gtk_icon_theme_name) { fprintf (stdout, " Icon theme is %s.\n", gtk_icon_theme_name); g_free (gtk_icon_theme_name); } } if (gtk_key_theme_name) fprintf (stdout, " Key theme is %s.\n", gtk_key_theme_name); fprintf (stdout, " Xft antialiasing is turned %s.\n", gtk_xft_antialias ? "on" : "off"); if (gtk_xft_dpi > -1 ) fprintf (stdout, " Xft is set to %.2f DPI.\n", ((double) gtk_xft_dpi) / 1024.0); fprintf (stdout, "\n"); if (gtk_font_name) g_free (gtk_font_name); if (gtk_icon_sizes) g_free (gtk_icon_sizes); if (gtk_key_theme_name) g_free (gtk_key_theme_name); if (gtk_theme_name) g_free (gtk_theme_name); } void print_gdk_screen_info (void) { const gchar *displayname = NULL; GdkDisplay *display; gint nscreens = 0; gint i; display = gdk_display_get_default (); nscreens = gdk_display_get_n_screens (display); displayname = gdk_display_get_name (display); fprintf (stdout, "Display name is %s and has %d screens.\n", displayname, nscreens); for (i = 0; i < nscreens; i++) { GdkScreen *screen = gdk_display_get_screen (display, i); gint nmonitors = gdk_screen_get_n_monitors (screen); int j; fprintf (stdout, " Screen %d: %dx%d on %d monitors.\n", i, gdk_screen_get_width (screen), gdk_screen_get_height (screen), nmonitors); fprintf (stderr, " Window manager is %s.\n", gdk_x11_screen_get_window_manager_name (screen)); for (j = 0; j < nmonitors; j++) { GdkRectangle geom; gdk_screen_get_monitor_geometry (screen, j, &geom); fprintf (stdout, " Monitor %d: %d,%d %dx%d\n", j, geom.x, geom.y, geom.width, geom.height); } } fprintf (stdout, "\n"); } void print_gtk_paths (void) { const gchar *module_path_env; const gchar *exe_prefix; const gchar *im_module_file; const gchar *data_prefix; const gchar *rc_files; module_path_env = g_getenv ("GTK_PATH"); exe_prefix = g_getenv ("GTK_EXE_PREFIX"); im_module_file = g_getenv ("GTK_IM_MODULE_FILE"); data_prefix = g_getenv ("GTK_DATA_PREFIX"); rc_files = g_getenv ("GTK2_RC_FILES"); fprintf (stdout, "Environment variables:\n"); if (module_path_env) { fprintf (stdout, " GTK_PATH is set to %s.\n", module_path_env); } else { fprintf (stdout, " GTK_PATH is not set.\n"); } if (exe_prefix) { fprintf (stdout, " GTK_EXE_PREFIX is set to %s.\n", exe_prefix); fprintf (stdout, " GTK+ will search: %s/lib/gtk-2.0/...\n", exe_prefix); } else { fprintf (stdout, " GTK_EXE_PREFIX is not set.\n"); fprintf (stdout, " GTK+ will search: $libdir/lib/gtk-2.0/...\n"); } if (data_prefix) { fprintf (stdout, " GTK_DATA_PREFIX is set to %s.\n", data_prefix); fprintf (stdout, " GTK+ will search: %s/share/themes\n", data_prefix); } else { fprintf (stdout, " GTK_DATA_PREFIX is not set.\n"); fprintf (stdout, " GTK+ will search: $prefix/share/themes\n"); } if (rc_files) { fprintf (stdout, " GTK2_RC_FILES is set to %s.\n", rc_files); fprintf (stdout, " These files will override " "$sysconfdir/gtk-2.0/gtkrc and ~/.gtkrc-2.0\n"); } else { fprintf (stdout, " GTK2_RC_FILES is not set.\n"); fprintf (stdout, " GTK+ will read: " "$sysconfdir/gtk-2.0/gtkrc and ~/.gtkrc-2.0\n"); } fprintf (stdout, "\n"); } void print_pango_information (GtkWidget *widget) { PangoFontFamily **families; int nfam, i; int totalfaces = 0; fprintf (stdout, "Global font information:\n"); pango_context_list_families (gtk_widget_get_pango_context (widget), &families, &nfam); fprintf (stdout, " There are %d font families.\n", nfam); for (i = 0; i < nfam; i++) { PangoFontFace **faces; int nfaces; pango_font_family_list_faces (families[i], &faces, &nfaces); totalfaces += nfaces; g_free (faces); } fprintf (stdout, " There are a total of %d faces in all families.\n", totalfaces); g_free (families); } int main (int argc, char **argv) { GtkWidget *window; GtkWidget *vbox; GtkWidget *button; GtkWidget *area; GtkWidget *label; PangoContext *context; PangoLanguage *lang; PangoFontMetrics *metrics; PangoFontDescription *font; gint focus_width, focus_pad; GtkBorder *default_border; GtkBorder *default_outside_border; GtkStyle *style; gtk_init (&argc, &argv); fprintf (stdout, "Version information:\n"); fprintf (stdout, " Compiled on GTK+ version %d.%d.%d.\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); fprintf (stdout, " Running on GTK+ version %d.%d.%d.\n\n", gtk_major_version, gtk_minor_version, gtk_micro_version); print_gtk_paths (); print_gtk_settings (); print_gdk_screen_info (); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); vbox = gtk_vbox_new (FALSE, 0); area = gtk_drawing_area_new (); gtk_widget_set_size_request (area, 100, 100); gtk_container_add (GTK_CONTAINER (vbox), area); button = gtk_button_new_with_label ("Hello"); gtk_container_add (GTK_CONTAINER (vbox), button); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_realize (button); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_style_get (GTK_WIDGET (button), "focus-line-width", &focus_width, "focus-padding", &focus_pad, "default-border", &default_border, "default-outside-border", &default_outside_border, NULL); fprintf (stdout, "Style information from a button:\n"); fprintf (stdout, " Focus width %d, focus pad %d.\n", focus_width, focus_pad); if (default_border) { fprintf (stdout, " Default border (%d,%d,%d,%d)\n", default_border->left, default_border->right, default_border->top, default_border->bottom); } if (default_outside_border) { fprintf (stdout, " Outside border (%d,%d,%d,%d)\n", default_outside_border->left, default_outside_border->right, default_outside_border->top, default_outside_border->bottom); } style = gtk_widget_get_style (GTK_WIDGET (button)); fprintf (stdout, " Normal foreground (%d,%d,%d), background (%d,%d,%d).\n\n", style->fg[ GTK_STATE_NORMAL ].red, style->fg[ GTK_STATE_NORMAL ].green, style->fg[ GTK_STATE_NORMAL ].blue, style->bg[ GTK_STATE_NORMAL ].red, style->bg[ GTK_STATE_NORMAL ].green, style->bg[ GTK_STATE_NORMAL ].blue); label = gtk_label_new ("hi there"); context = gtk_widget_get_pango_context (label); lang = pango_context_get_language (context); font = pango_font_description_copy (gtk_widget_get_style (window)->font_desc); metrics = pango_context_get_metrics (context, font, lang); fprintf (stdout, "Font information from a default label:\n"); fprintf (stdout, " Font: %s\n", pango_font_description_get_family (font)); fprintf (stdout, " Size: %d (%d pixels)\n", pango_font_description_get_size (font), PANGO_PIXELS (pango_font_description_get_size (font))); fprintf (stdout, " Approximate char width: %d (%d pixels)\n", pango_font_metrics_get_approximate_char_width (metrics), PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (metrics))); fprintf (stdout, " Approximate digit width: %d (%d pixels)\n", pango_font_metrics_get_approximate_digit_width (metrics), PANGO_PIXELS (pango_font_metrics_get_approximate_digit_width (metrics))); fprintf (stdout, "\n"); print_pango_information (label); return 0; }