diff options
Diffstat (limited to 'capplets/font/main.c')
-rw-r--r-- | capplets/font/main.c | 916 |
1 files changed, 0 insertions, 916 deletions
diff --git a/capplets/font/main.c b/capplets/font/main.c deleted file mode 100644 index 5998db18a..000000000 --- a/capplets/font/main.c +++ /dev/null @@ -1,916 +0,0 @@ -/* This program was written with lots of love under the GPL by Jonathan - * Blandford <jrb@gnome.org> - */ - -#include <config.h> - -#include <string.h> -#include <gtk/gtk.h> -#include <gconf/gconf-client.h> -#include <glade/glade.h> -#include <stdarg.h> -#include <math.h> - -#ifdef HAVE_XFT2 -#include <gdk/gdkx.h> -#include <X11/Xft/Xft.h> -#endif /* HAVE_XFT2 */ - -#include "capplet-util.h" -#include "activate-settings-daemon.h" -#include "gconf-property-editor.h" - -#ifdef HAVE_XFT2 -static void cb_show_details (GtkWidget *button, - GtkWindow *parent); -#endif /* HAVE_XFT2 */ - -#define GTK_FONT_KEY "/desktop/gnome/interface/font_name" -#define DESKTOP_FONT_KEY "/apps/nautilus/preferences/desktop_font" - -#define METACITY_DIR "/apps/metacity/general" -#define WINDOW_TITLE_FONT_KEY METACITY_DIR "/titlebar_font" -#define WINDOW_TITLE_USES_SYSTEM_KEY METACITY_DIR "/titlebar_uses_system_font" -#define MONOSPACE_FONT_KEY "/desktop/gnome/interface/monospace_font_name" - -#ifdef HAVE_XFT2 -#define FONT_RENDER_DIR "/desktop/gnome/font_rendering" -#define FONT_ANTIALIASING_KEY FONT_RENDER_DIR "/antialiasing" -#define FONT_HINTING_KEY FONT_RENDER_DIR "/hinting" -#define FONT_RGBA_ORDER_KEY FONT_RENDER_DIR "/rgba_order" -#define FONT_DPI_KEY FONT_RENDER_DIR "/dpi" - -#endif /* HAVE_XFT2 */ -static gboolean in_change = FALSE; -static gchar *old_font = NULL; - -#define MAX_FONT_POINT_WITHOUT_WARNING 32 -#define MAX_FONT_SIZE_WITHOUT_WARNING MAX_FONT_POINT_WITHOUT_WARNING*1024 -#define PICKER_DIALOG_DATA_STRING "picker-dialog-data-string" -static GladeXML * -create_dialog (void) -{ - GladeXML *dialog; - - dialog = glade_xml_new (GLADEDIR "/font-properties.glade", "font_dialog", NULL); - - return dialog; -} - -static void -cb_dialog_response (GtkDialog *dialog, gint response_id) -{ - if (response_id == GTK_RESPONSE_HELP) - capplet_help (GTK_WINDOW (dialog), - "wgoscustdesk.xml", - "goscustdesk-38"); - else - gtk_main_quit (); -} - -#ifdef HAVE_XFT2 - -/* - * Code for displaying previews of font rendering with various Xft options - */ - -static void -sample_size_request (GtkWidget *darea, - GtkRequisition *requisition) -{ - GdkPixbuf *pixbuf = g_object_get_data (G_OBJECT (darea), "sample-pixbuf"); - - requisition->width = gdk_pixbuf_get_width (pixbuf) + 2; - requisition->height = gdk_pixbuf_get_height (pixbuf) + 2; -} - -static void -sample_expose (GtkWidget *darea, - GdkEventExpose expose) -{ - GdkPixbuf *pixbuf = g_object_get_data (G_OBJECT (darea), "sample-pixbuf"); - int width = gdk_pixbuf_get_width (pixbuf); - int height = gdk_pixbuf_get_height (pixbuf); - - int x = (darea->allocation.width - width) / 2; - int y = (darea->allocation.height - height) / 2; - - gdk_draw_rectangle (darea->window, darea->style->white_gc, TRUE, - 0, 0, - darea->allocation.width, darea->allocation.height); - gdk_draw_rectangle (darea->window, darea->style->black_gc, FALSE, - 0, 0, - darea->allocation.width - 1, darea->allocation.height - 1); - - gdk_pixbuf_render_to_drawable (pixbuf, darea->window, NULL, - 0, 0, x, y, width, height, - GDK_RGB_DITHER_NORMAL, 0, 0); -} - -typedef enum { - ANTIALIAS_NONE, - ANTIALIAS_GRAYSCALE, - ANTIALIAS_RGBA -} Antialiasing; - -static GConfEnumStringPair antialias_enums[] = { - { ANTIALIAS_NONE, "none" }, - { ANTIALIAS_GRAYSCALE, "grayscale" }, - { ANTIALIAS_RGBA, "rgba" }, - { -1, NULL } -}; - -typedef enum { - HINT_NONE, - HINT_SLIGHT, - HINT_MEDIUM, - HINT_FULL -} Hinting; - -static GConfEnumStringPair hint_enums[] = { - { HINT_NONE, "none" }, - { HINT_SLIGHT, "slight" }, - { HINT_MEDIUM, "medium" }, - { HINT_FULL, "full" }, - { -1, NULL } -}; - -typedef enum { - RGBA_RGB, - RGBA_BGR, - RGBA_VRGB, - RGBA_VBGR -} RgbaOrder; - -static GConfEnumStringPair rgba_order_enums[] = { - { RGBA_RGB, "rgb" }, - { RGBA_BGR, "bgr" }, - { RGBA_VRGB, "vrgb" }, - { RGBA_VBGR, "vbgr" }, - { -1, NULL } -}; - -static XftFont * -open_pattern (FcPattern *pattern, - Antialiasing antialiasing, - Hinting hinting) -{ -#ifdef FC_HINT_STYLE - static const int hintstyles[] = { FC_HINT_NONE, FC_HINT_SLIGHT, FC_HINT_MEDIUM, FC_HINT_FULL }; -#endif /* FC_HINT_STYLE */ - - FcPattern *res_pattern; - FcResult result; - XftFont *font; - - Display *xdisplay = gdk_x11_get_default_xdisplay (); - int screen = gdk_x11_get_default_screen (); - - res_pattern = XftFontMatch (xdisplay, screen, pattern, &result); - if (res_pattern == NULL) - return NULL; - - FcPatternDel (res_pattern, FC_HINTING); - FcPatternAddBool (res_pattern, FC_HINTING, hinting != HINT_NONE); - -#ifdef FC_HINT_STYLE - FcPatternDel (res_pattern, FC_HINT_STYLE); - FcPatternAddInteger (res_pattern, FC_HINT_STYLE, hintstyles[hinting]); -#endif /* FC_HINT_STYLE */ - - FcPatternDel (res_pattern, FC_ANTIALIAS); - FcPatternAddBool (res_pattern, FC_ANTIALIAS, antialiasing != ANTIALIAS_NONE); - - FcPatternDel (res_pattern, FC_RGBA); - FcPatternAddInteger (res_pattern, FC_RGBA, - antialiasing == ANTIALIAS_RGBA ? FC_RGBA_RGB : FC_RGBA_NONE); - - FcPatternDel (res_pattern, FC_DPI); - FcPatternAddInteger (res_pattern, FC_DPI, 96); - - font = XftFontOpenPattern (xdisplay, res_pattern); - if (!font) - FcPatternDestroy (res_pattern); - - return font; -} - -static void -setup_font_sample (GtkWidget *darea, - Antialiasing antialiasing, - Hinting hinting) -{ - const char *string1 = "abcfgop AO "; - const char *string2 = "abcfgop"; - - XftColor black, white; - XRenderColor rendcolor; - - Display *xdisplay = gdk_x11_get_default_xdisplay (); - - GdkColormap *colormap = gdk_rgb_get_colormap (); - Colormap xcolormap = GDK_COLORMAP_XCOLORMAP (colormap); - - GdkVisual *visual = gdk_colormap_get_visual (colormap); - Visual *xvisual = GDK_VISUAL_XVISUAL (visual); - - FcPattern *pattern; - XftFont *font1, *font2; - XGlyphInfo extents1 = { 0 }; - XGlyphInfo extents2 = { 0 }; - GdkPixmap *pixmap; - XftDraw *draw; - GdkPixbuf *tmp_pixbuf, *pixbuf; - - int width, height; - int ascent, descent; - - pattern = FcPatternBuild (NULL, - FC_FAMILY, FcTypeString, "Serif", - FC_SLANT, FcTypeInteger, FC_SLANT_ROMAN, - FC_SIZE, FcTypeDouble, 18., - NULL); - font1 = open_pattern (pattern, antialiasing, hinting); - FcPatternDestroy (pattern); - - pattern = FcPatternBuild (NULL, - FC_FAMILY, FcTypeString, "Serif", - FC_SLANT, FcTypeInteger, FC_SLANT_ITALIC, - FC_SIZE, FcTypeDouble, 20., - NULL); - font2 = open_pattern (pattern, antialiasing, hinting); - FcPatternDestroy (pattern); - - if (font1) - XftTextExtentsUtf8 (xdisplay, font1, (char *)string1, strlen (string1), &extents1); - if (font2) - XftTextExtentsUtf8 (xdisplay, font2, (char *)string2, strlen (string2), &extents2); - - ascent = 0; - if (font1) - ascent = MAX (ascent, font1->ascent); - if (font2) - ascent = MAX (ascent, font2->ascent); - - descent = 0; - if (font1) - descent = MAX (descent, font1->descent); - if (font2) - descent = MAX (descent, font2->descent); - - width = extents1.xOff + extents2.xOff + 4; - - height = ascent + descent + 2; - - pixmap = gdk_pixmap_new (NULL, width, height, visual->depth); - - draw = XftDrawCreate (xdisplay, GDK_DRAWABLE_XID (pixmap), xvisual, xcolormap); - - rendcolor.red = 0; - rendcolor.green = 0; - rendcolor.blue = 0; - rendcolor.alpha = 0xffff; - XftColorAllocValue (xdisplay, xvisual, xcolormap, &rendcolor, &black); - - rendcolor.red = 0xffff; - rendcolor.green = 0xffff; - rendcolor.blue = 0xffff; - rendcolor.alpha = 0xffff; - XftColorAllocValue (xdisplay, xvisual, xcolormap, &rendcolor, &white); - XftDrawRect (draw, &white, 0, 0, width, height); - if (font1) - XftDrawStringUtf8 (draw, &black, font1, - 2, 2 + ascent, - (char *)string1, strlen (string1)); - if (font2) - XftDrawStringUtf8 (draw, &black, font2, - 2 + extents1.xOff, 2 + ascent, - (char *)string2, strlen (string2)); - - XftDrawDestroy (draw); - - if (font1) - XftFontClose (xdisplay, font1); - if (font2) - XftFontClose (xdisplay, font2); - - tmp_pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, colormap, 0, 0, 0, 0, width, height); - pixbuf = gdk_pixbuf_scale_simple (tmp_pixbuf, 1 * width, 1 * height, GDK_INTERP_TILES); - - g_object_unref (pixmap); - g_object_unref (tmp_pixbuf); - - g_object_set_data_full (G_OBJECT (darea), "sample-pixbuf", - pixbuf, (GDestroyNotify)g_object_unref); - - g_signal_connect (darea, "size_request", G_CALLBACK (sample_size_request), NULL); - g_signal_connect (darea, "expose_event", G_CALLBACK (sample_expose), NULL); -} - -/* - * Code implementing a group of radio buttons with different Xft option combinations. - * If one of the buttons is matched by the GConf key, we pick it. Otherwise we - * show the group as inconsistent. - */ -static void -font_render_get_gconf (Antialiasing *antialiasing, - Hinting *hinting) -{ - GConfClient *client = gconf_client_get_default (); - char *antialias_str = gconf_client_get_string (client, FONT_ANTIALIASING_KEY, NULL); - char *hint_str = gconf_client_get_string (client, FONT_HINTING_KEY, NULL); - int val; - - val = ANTIALIAS_GRAYSCALE; - if (antialias_str) { - gconf_string_to_enum (antialias_enums, antialias_str, &val); - g_free (antialias_str); - } - *antialiasing = val; - - val = HINT_FULL; - if (hint_str) { - gconf_string_to_enum (hint_enums, hint_str, &val); - g_free (hint_str); - } - *hinting = val; - - g_object_unref (client); -} - -typedef struct { - Antialiasing antialiasing; - Hinting hinting; - GtkWidget *radio; -} FontPair; - -static GSList *font_pairs = NULL; - -static void -font_render_load (void) -{ - Antialiasing antialiasing; - Hinting hinting; - gboolean inconsistent = TRUE; - GSList *tmp_list; - - font_render_get_gconf (&antialiasing, &hinting); - - in_change = TRUE; - - for (tmp_list = font_pairs; tmp_list; tmp_list = tmp_list->next) { - FontPair *pair = tmp_list->data; - - if (antialiasing == pair->antialiasing && hinting == pair->hinting) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pair->radio), TRUE); - inconsistent = FALSE; - } - } - - for (tmp_list = font_pairs; tmp_list; tmp_list = tmp_list->next) { - FontPair *pair = tmp_list->data; - - gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (pair->radio), inconsistent); - } - - in_change = FALSE; -} - -static void -font_render_changed (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - font_render_load (); -} - -static void -font_radio_toggled (GtkToggleButton *toggle_button, - FontPair *pair) -{ - if (!in_change) { - GConfClient *client = gconf_client_get_default (); - - gconf_client_set_string (client, FONT_ANTIALIASING_KEY, - gconf_enum_to_string (antialias_enums, pair->antialiasing), - NULL); - gconf_client_set_string (client, FONT_HINTING_KEY, - gconf_enum_to_string (hint_enums, pair->hinting), - NULL); - - g_object_unref (client); - } - - /* Restore back to the previous state until we get notification - */ - font_render_load (); -} - -static void -setup_font_pair (GtkWidget *radio, - GtkWidget *darea, - Antialiasing antialiasing, - Hinting hinting) -{ - FontPair *pair = g_new (FontPair, 1); - - pair->antialiasing = antialiasing; - pair->hinting = hinting; - pair->radio = radio; - - setup_font_sample (darea, antialiasing, hinting); - font_pairs = g_slist_prepend (font_pairs, pair); - - g_signal_connect (radio, "toggled", - G_CALLBACK (font_radio_toggled), pair); -} -#endif /* HAVE_XFT2 */ - -static void -metacity_titlebar_load_sensitivity (GConfClient *client, - GladeXML *dialog) -{ - gtk_widget_set_sensitive (WID ("window_title_font"), - !gconf_client_get_bool (client, - WINDOW_TITLE_USES_SYSTEM_KEY, - NULL)); -} - -static void -metacity_changed (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - if (strcmp (entry->key, WINDOW_TITLE_USES_SYSTEM_KEY) == 0) - metacity_titlebar_load_sensitivity (client, user_data); -} - - - -/* returns 0 if the font is safe, otherwise returns the size in points. */ -static gint -new_font_dangerous (const char *new_font) -{ - PangoFontDescription *pfd; - gboolean retval = 0; - - pfd = pango_font_description_from_string (new_font); - if (pfd == NULL) - /* an invalid font was passed in. This isn't our problem. */ - return 0; - - if (pango_font_description_get_set_fields (pfd) & PANGO_FONT_MASK_SIZE) { - if (pango_font_description_get_size (pfd) >= MAX_FONT_SIZE_WITHOUT_WARNING) { - retval = pango_font_description_get_size (pfd)/1024; - } - } - pango_font_description_free (pfd); - - return retval; -} - -static GConfValue * -application_font_to_gconf (GConfPropertyEditor *peditor, - GConfValue *value) -{ - GConfValue *new_value; - const char *new_font; - GtkWidget *font_picker; - GladeXML *dialog; - gint danger_level; - - font_picker = (GtkWidget *) gconf_property_editor_get_ui_control (peditor); - g_assert (font_picker); - - dialog = glade_xml_new (GLADEDIR "/font-properties.glade", "font_size_warning_dialog", NULL); - - new_value = gconf_value_new (GCONF_VALUE_STRING); - new_font = gconf_value_get_string (value); - if (new_font_dangerous (old_font)) { - /* If we're already too large, we don't warn again. */ - gconf_value_set_string (new_value, new_font); - return new_value; - } - - danger_level = new_font_dangerous (new_font); - if (danger_level) { - GtkWidget *font_size_warning_dialog; - gchar *warning_label; - gchar *warning_label2; - - font_size_warning_dialog = WID ("font_size_warning_dialog"); - if (danger_level > MAX_FONT_POINT_WITHOUT_WARNING) { - warning_label = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s", - _("Font may be too large"), - _("The font selected is %d points large, and may make it difficult to effectively use the computer. It is recommended that you select a size smaller than %d.")); - warning_label2 = g_strdup_printf (warning_label, danger_level, MAX_FONT_POINT_WITHOUT_WARNING); - } else { - warning_label = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s", - _("Font may be too large"), - _("The font selected is %d points large, and may make it difficult to effectively use the computer. It is recommended that you select a smaller sized font.")); - warning_label2 = g_strdup_printf (warning_label, danger_level); - } - gtk_label_set_markup (GTK_LABEL (WID ("font_size_warning_label")), warning_label2); - if (gtk_dialog_run (GTK_DIALOG (font_size_warning_dialog)) == 1) { - gconf_value_set_string (new_value, new_font); - } else { - gconf_value_set_string (new_value, old_font); - gnome_font_picker_set_font_name (GNOME_FONT_PICKER (font_picker), old_font); - } - gtk_widget_destroy (font_size_warning_dialog); - } else { - gconf_value_set_string (new_value, new_font); - } - - return new_value; -} - -static void -application_font_changed (GtkWidget *font_picker) -{ - const gchar *font; - - font = gnome_font_picker_get_font_name (GNOME_FONT_PICKER (font_picker)); - g_free (old_font); - old_font = g_strdup (font); -} - -static void -setup_dialog (GladeXML *dialog) -{ - GConfClient *client; - GtkWidget *widget; - GObject *peditor; - - client = gconf_client_get_default (); - - gconf_client_add_dir (client, "/desktop/gnome/interface", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_add_dir (client, "/apps/nautilus/preferences", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_add_dir (client, METACITY_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); -#ifdef HAVE_XFT2 - gconf_client_add_dir (client, FONT_RENDER_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); -#endif /* HAVE_XFT2 */ - - g_object_set_data (G_OBJECT (WID ("application_font")), PICKER_DIALOG_DATA_STRING, dialog); - peditor = gconf_peditor_new_font (NULL, GTK_FONT_KEY, - WID ("application_font"), - PEDITOR_FONT_COMBINED, - "conv-from-widget-cb", application_font_to_gconf, - NULL); - g_signal_connect_swapped (G_OBJECT (peditor), "value-changed", (GCallback) application_font_changed, WID ("application_font")); - application_font_changed (WID ("application_font")); - peditor = gconf_peditor_new_font (NULL, DESKTOP_FONT_KEY, - WID ("desktop_font"), - PEDITOR_FONT_COMBINED, NULL); - - peditor = gconf_peditor_new_font (NULL, WINDOW_TITLE_FONT_KEY, - WID ("window_title_font"), - PEDITOR_FONT_COMBINED, NULL); - - peditor = gconf_peditor_new_font (NULL, MONOSPACE_FONT_KEY, - WID ("monospace_font"), - PEDITOR_FONT_COMBINED, NULL); - - gconf_client_notify_add (client, METACITY_DIR, - metacity_changed, - dialog, NULL, NULL); - - metacity_titlebar_load_sensitivity (client, dialog); - - widget = WID ("font_dialog"); - capplet_set_icon (widget, "font-capplet.png"); - -#ifdef HAVE_XFT2 - setup_font_pair (WID ("monochrome_radio"), WID ("monochrome_sample"), ANTIALIAS_NONE, HINT_FULL); - setup_font_pair (WID ("best_shapes_radio"), WID ("best_shapes_sample"), ANTIALIAS_GRAYSCALE, HINT_MEDIUM); - setup_font_pair (WID ("best_contrast_radio"), WID ("best_contrast_sample"), ANTIALIAS_GRAYSCALE, HINT_FULL); - setup_font_pair (WID ("subpixel_radio"), WID ("subpixel_sample"), ANTIALIAS_RGBA, HINT_FULL); - - font_render_load (); - - gconf_client_notify_add (client, FONT_RENDER_DIR, - font_render_changed, - NULL, NULL, NULL); - - g_signal_connect (WID ("details_button"), - "clicked", - G_CALLBACK (cb_show_details), widget); -#else /* !HAVE_XFT2 */ - gtk_widget_hide (WID ("font_render_frame")); -#endif /* HAVE_XFT2 */ - - g_signal_connect (G_OBJECT (widget), - "response", - G_CALLBACK (cb_dialog_response), NULL); - - gtk_widget_show (widget); - - g_object_unref (client); -} - -#ifdef HAVE_XFT2 -/* - * EnumGroup - a group of radio buttons tied to a string enumeration - * value. We add this here because the gconf peditor - * equivalent of this is both painful to use (you have - * to supply functions to convert from enums to indices) - * and conceptually broken (the order of radio buttons - * in a group when using Glade is not predictable. - */ -typedef struct -{ - GConfClient *client; - GSList *items; - const gchar *gconf_key; - GConfEnumStringPair *enums; - int default_value; -} EnumGroup; - -typedef struct -{ - EnumGroup *group; - GtkWidget *widget; - int value; -} EnumItem; - -static void -enum_group_load (EnumGroup *group) -{ - char *str = gconf_client_get_string (group->client, group->gconf_key, NULL); - int val = group->default_value; - GSList *tmp_list; - - if (str) - gconf_string_to_enum (group->enums, str, &val); - - g_free (str); - - in_change = TRUE; - - for (tmp_list = group->items; tmp_list; tmp_list = tmp_list->next) { - EnumItem *item = tmp_list->data; - - if (val == item->value) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->widget), TRUE); - } - - - - in_change = FALSE; -} - -static void -enum_group_changed (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - enum_group_load (user_data); -} - -static void -enum_item_toggled (GtkToggleButton *toggle_button, - EnumItem *item) -{ - EnumGroup *group = item->group; - - if (!in_change) { - gconf_client_set_string (group->client, group->gconf_key, - gconf_enum_to_string (group->enums, item->value), - NULL); - } - - /* Restore back to the previous state until we get notification - */ - enum_group_load (group); -} - -static EnumGroup * -enum_group_create (const gchar *gconf_key, - GConfEnumStringPair *enums, - int default_value, - GtkWidget *first_widget, - ...) -{ - EnumGroup *group; - GtkWidget *widget; - va_list args; - - group = g_new (EnumGroup, 1); - - group->client = gconf_client_get_default (); - group->gconf_key = g_strdup (gconf_key); - group->enums = enums; - group->default_value = default_value; - group->items = NULL; - - va_start (args, first_widget); - - widget = first_widget; - while (widget) - { - EnumItem *item; - - item = g_new (EnumItem, 1); - item->group = group; - item->widget = widget; - item->value = va_arg (args, int); - - g_signal_connect (item->widget, "toggled", - G_CALLBACK (enum_item_toggled), item); - - group->items = g_slist_prepend (group->items, item); - - widget = va_arg (args, GtkWidget *); - } - - va_end (args); - - enum_group_load (group); - - gconf_client_notify_add (group->client, gconf_key, - enum_group_changed, - group, NULL, NULL); - - return group; -} - -/* - * The font rendering details dialog - */ -static void -dpi_load (GConfClient *client, - GtkSpinButton *spinner) -{ - gdouble dpi = gconf_client_get_float (client, FONT_DPI_KEY, NULL); - - if (dpi < 50.) - dpi = 50.; - - in_change = TRUE; - gtk_spin_button_set_value (spinner, dpi); - in_change = FALSE; -} - -static void -dpi_changed (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - dpi_load (client, user_data); -} - -static void -dpi_value_changed (GtkSpinButton *spinner, - GConfClient *client) -{ - /* Like any time when using a spin button with GConf, there is - * a race condition here. When we change, we send the new - * value to GCOnf, then restore to the old value until - * we get a response to emulate the proper model/view behavior. - * - * If the user changes the value faster than responses are - * received from GConf, this may cause mild strange effects. - */ - gdouble new_dpi = gtk_spin_button_get_value (spinner); - - gconf_client_set_float (client, FONT_DPI_KEY, new_dpi, NULL); - - dpi_load (client, spinner); -} - -static void -cb_details_response (GtkDialog *dialog, gint response_id) -{ - if (response_id == GTK_RESPONSE_HELP) - capplet_help (GTK_WINDOW (dialog), - "wgoscustdesk.xml", - "goscustdesk-38"); - else if (response_id == 1) { - /* "Go to font folder" was clicked */ - g_spawn_command_line_async ("nautilus --no-desktop fonts:///", NULL); - } else - gtk_widget_hide (GTK_WIDGET (dialog)); -} - -static void -cb_show_details (GtkWidget *button, - GtkWindow *parent) -{ - static GtkWidget *details_dialog = NULL; - - if (!details_dialog) { - GConfClient *client = gconf_client_get_default (); - GladeXML *dialog = glade_xml_new (GLADEDIR "/font-properties.glade", "render_details", NULL); - GtkWidget *dpi_spinner; - GnomeVFSURI *uri; - int dpi; - GtkAdjustment *adjustment; - - details_dialog = WID ("render_details"); - uri = gnome_vfs_uri_new ("fonts:///"); - if (uri == NULL) { - gtk_widget_hide (WID ("go_to_font_button")); - } else { - gnome_vfs_uri_unref (uri); - gtk_widget_show (WID ("go_to_font_button")); - } - - gtk_window_set_transient_for (GTK_WINDOW (details_dialog), parent); - - dpi_spinner = WID ("dpi_spinner"); - - /* pick a sensible maximum dpi */ - dpi = floor ((gdk_screen_width () / gdk_screen_width_mm () + - gdk_screen_height () / gdk_screen_height_mm ()) * 25.4 / 2. + .5); - if (dpi < 50) - dpi = 50; /* be extra careful */ - adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (dpi_spinner)); - adjustment->upper = dpi * 3; - - dpi_load (client, GTK_SPIN_BUTTON (dpi_spinner)); - g_signal_connect (dpi_spinner, "value_changed", - G_CALLBACK (dpi_value_changed), client); - - gconf_client_notify_add (client, FONT_DPI_KEY, - dpi_changed, - dpi_spinner, NULL, NULL); - - setup_font_sample (WID ("antialias_none_sample"), ANTIALIAS_NONE, HINT_FULL); - setup_font_sample (WID ("antialias_grayscale_sample"), ANTIALIAS_GRAYSCALE, HINT_FULL); - setup_font_sample (WID ("antialias_subpixel_sample"), ANTIALIAS_RGBA, HINT_FULL); - - enum_group_create (FONT_ANTIALIASING_KEY, antialias_enums, ANTIALIAS_GRAYSCALE, - WID ("antialias_none_radio"), ANTIALIAS_NONE, - WID ("antialias_grayscale_radio"), ANTIALIAS_GRAYSCALE, - WID ("antialias_subpixel_radio"), ANTIALIAS_RGBA, - NULL); - - setup_font_sample (WID ("hint_none_sample"), ANTIALIAS_GRAYSCALE, HINT_NONE); - setup_font_sample (WID ("hint_slight_sample"), ANTIALIAS_GRAYSCALE, HINT_SLIGHT); - setup_font_sample (WID ("hint_medium_sample"), ANTIALIAS_GRAYSCALE, HINT_MEDIUM); - setup_font_sample (WID ("hint_full_sample"), ANTIALIAS_GRAYSCALE, HINT_FULL); - - enum_group_create (FONT_HINTING_KEY, hint_enums, HINT_FULL, - WID ("hint_none_radio"), HINT_NONE, - WID ("hint_slight_radio"), HINT_SLIGHT, - WID ("hint_medium_radio"), HINT_MEDIUM, - WID ("hint_full_radio"), HINT_FULL, - NULL); - - gtk_image_set_from_file (GTK_IMAGE (WID ("subpixel_rgb_image")), - PIXMAPDIR "/subpixel-rgb.png"); - gtk_image_set_from_file (GTK_IMAGE (WID ("subpixel_bgr_image")), - PIXMAPDIR "/subpixel-bgr.png"); - gtk_image_set_from_file (GTK_IMAGE (WID ("subpixel_vrgb_image")), - PIXMAPDIR "/subpixel-vrgb.png"); - gtk_image_set_from_file (GTK_IMAGE (WID ("subpixel_vbgr_image")), - PIXMAPDIR "/subpixel-vbgr.png"); - - enum_group_create (FONT_RGBA_ORDER_KEY, rgba_order_enums, RGBA_RGB, - WID ("subpixel_rgb_radio"), RGBA_RGB, - WID ("subpixel_bgr_radio"), RGBA_BGR, - WID ("subpixel_vrgb_radio"), RGBA_VRGB, - WID ("subpixel_vbgr_radio"), RGBA_VBGR, - NULL); - - g_signal_connect (G_OBJECT (details_dialog), - "response", - G_CALLBACK (cb_details_response), NULL); - g_signal_connect (G_OBJECT (details_dialog), - "delete_event", - G_CALLBACK (gtk_true), NULL); - - g_object_unref (client); - } - - gtk_window_present (GTK_WINDOW (details_dialog)); -} -#endif /* HAVE_XFT2 */ - -int -main (int argc, char *argv[]) -{ - GladeXML *dialog; - - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - gnome_program_init ("gnome-font-properties", VERSION, - LIBGNOMEUI_MODULE, argc, argv, - GNOME_PARAM_APP_DATADIR, GNOMECC_DATA_DIR, - NULL); - - activate_settings_daemon (); - - dialog = create_dialog (); - setup_dialog (dialog); - - gtk_main (); - - return 0; -} |