📄 pixbuf-rc-style.c
字号:
/* GTK+ Pixbuf Engine * Copyright (C) 1998-2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Written by Owen Taylor <otaylor@redhat.com>, based on code by * Carsten Haitzler <raster@rasterman.com> */#include "pixbuf.h"#include "pixbuf-style.h"#include "pixbuf-rc-style.h"static void pixbuf_rc_style_init (PixbufRcStyle *style);static void pixbuf_rc_style_class_init (PixbufRcStyleClass *klass);static void pixbuf_rc_style_finalize (GObject *object);static guint pixbuf_rc_style_parse (GtkRcStyle *rc_style, GtkSettings *settings, GScanner *scanner);static void pixbuf_rc_style_merge (GtkRcStyle *dest, GtkRcStyle *src);static GtkStyle *pixbuf_rc_style_create_style (GtkRcStyle *rc_style);static void theme_image_unref (ThemeImage *data);static const struct { gchar *name; guint token; }theme_symbols[] ={ { "image", TOKEN_IMAGE }, { "function", TOKEN_FUNCTION }, { "file", TOKEN_FILE }, { "stretch", TOKEN_STRETCH }, { "recolorable", TOKEN_RECOLORABLE }, { "border", TOKEN_BORDER }, { "detail", TOKEN_DETAIL }, { "state", TOKEN_STATE }, { "shadow", TOKEN_SHADOW }, { "gap_side", TOKEN_GAP_SIDE }, { "gap_file", TOKEN_GAP_FILE }, { "gap_border", TOKEN_GAP_BORDER }, { "gap_start_file", TOKEN_GAP_START_FILE }, { "gap_start_border", TOKEN_GAP_START_BORDER }, { "gap_end_file", TOKEN_GAP_END_FILE }, { "gap_end_border", TOKEN_GAP_END_BORDER }, { "overlay_file", TOKEN_OVERLAY_FILE }, { "overlay_border", TOKEN_OVERLAY_BORDER }, { "overlay_stretch", TOKEN_OVERLAY_STRETCH }, { "arrow_direction", TOKEN_ARROW_DIRECTION }, { "orientation", TOKEN_ORIENTATION }, { "expander_style", TOKEN_EXPANDER_STYLE }, { "window_edge", TOKEN_WINDOW_EDGE }, { "HLINE", TOKEN_D_HLINE }, { "VLINE", TOKEN_D_VLINE }, { "SHADOW", TOKEN_D_SHADOW }, { "POLYGON", TOKEN_D_POLYGON }, { "ARROW", TOKEN_D_ARROW }, { "DIAMOND", TOKEN_D_DIAMOND }, { "OVAL", TOKEN_D_OVAL }, { "STRING", TOKEN_D_STRING }, { "BOX", TOKEN_D_BOX }, { "FLAT_BOX", TOKEN_D_FLAT_BOX }, { "CHECK", TOKEN_D_CHECK }, { "OPTION", TOKEN_D_OPTION }, { "CROSS", TOKEN_D_CROSS }, { "RAMP", TOKEN_D_RAMP }, { "TAB", TOKEN_D_TAB }, { "SHADOW_GAP", TOKEN_D_SHADOW_GAP }, { "BOX_GAP", TOKEN_D_BOX_GAP }, { "EXTENSION", TOKEN_D_EXTENSION }, { "FOCUS", TOKEN_D_FOCUS }, { "SLIDER", TOKEN_D_SLIDER }, { "ENTRY", TOKEN_D_ENTRY }, { "HANDLE", TOKEN_D_HANDLE }, { "STEPPER", TOKEN_D_STEPPER }, { "EXPANDER", TOKEN_D_EXPANDER }, { "RESIZE_GRIP", TOKEN_D_RESIZE_GRIP }, { "TRUE", TOKEN_TRUE }, { "FALSE", TOKEN_FALSE }, { "TOP", TOKEN_TOP }, { "UP", TOKEN_UP }, { "BOTTOM", TOKEN_BOTTOM }, { "DOWN", TOKEN_DOWN }, { "LEFT", TOKEN_LEFT }, { "RIGHT", TOKEN_RIGHT }, { "NORMAL", TOKEN_NORMAL }, { "ACTIVE", TOKEN_ACTIVE }, { "PRELIGHT", TOKEN_PRELIGHT }, { "SELECTED", TOKEN_SELECTED }, { "INSENSITIVE", TOKEN_INSENSITIVE }, { "NONE", TOKEN_NONE }, { "IN", TOKEN_IN }, { "OUT", TOKEN_OUT }, { "ETCHED_IN", TOKEN_ETCHED_IN }, { "ETCHED_OUT", TOKEN_ETCHED_OUT }, { "HORIZONTAL", TOKEN_HORIZONTAL }, { "VERTICAL", TOKEN_VERTICAL }, { "COLLAPSED", TOKEN_COLLAPSED }, { "SEMI_COLLAPSED", TOKEN_SEMI_COLLAPSED }, { "SEMI_EXPANDED", TOKEN_SEMI_EXPANDED }, { "EXPANDED", TOKEN_EXPANDED }, { "NORTH_WEST", TOKEN_NORTH_WEST }, { "NORTH", TOKEN_NORTH }, { "NORTH_EAST", TOKEN_NORTH_EAST }, { "WEST", TOKEN_WEST }, { "EAST", TOKEN_EAST }, { "SOUTH_WEST", TOKEN_SOUTH_WEST }, { "SOUTH", TOKEN_SOUTH }, { "SOUTH_EAST", TOKEN_SOUTH_EAST }};static GtkRcStyleClass *parent_class;GType pixbuf_type_rc_style = 0;voidpixbuf_rc_style_register_type (GTypeModule *module){ static const GTypeInfo object_info = { sizeof (PixbufRcStyleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) pixbuf_rc_style_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (PixbufRcStyle), 0, /* n_preallocs */ (GInstanceInitFunc) pixbuf_rc_style_init, }; pixbuf_type_rc_style = g_type_module_register_type (module, GTK_TYPE_RC_STYLE, "PixbufRcStyle", &object_info, 0);}static voidpixbuf_rc_style_init (PixbufRcStyle *style){}static voidpixbuf_rc_style_class_init (PixbufRcStyleClass *klass){ GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); rc_style_class->parse = pixbuf_rc_style_parse; rc_style_class->merge = pixbuf_rc_style_merge; rc_style_class->create_style = pixbuf_rc_style_create_style; object_class->finalize = pixbuf_rc_style_finalize;}static voidpixbuf_rc_style_finalize (GObject *object){ PixbufRcStyle *rc_style = PIXBUF_RC_STYLE (object); g_list_foreach (rc_style->img_list, (GFunc) theme_image_unref, NULL); g_list_free (rc_style->img_list); G_OBJECT_CLASS (parent_class)->finalize (object);}static guinttheme_parse_file(GtkSettings *settings, GScanner *scanner, ThemePixbuf **theme_pb){ guint token; gchar *pixmap; /* Skip 'blah_file' */ token = g_scanner_get_next_token(scanner); token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; if (!*theme_pb) *theme_pb = theme_pixbuf_new (); pixmap = gtk_rc_find_pixmap_in_path(settings, scanner, scanner->value.v_string); if (pixmap) { theme_pixbuf_set_filename (*theme_pb, pixmap); g_free (pixmap); } return G_TOKEN_NONE;}static guinttheme_parse_border (GScanner *scanner, ThemePixbuf **theme_pb){ guint token; gint left, right, top, bottom; /* Skip 'blah_border' */ token = g_scanner_get_next_token(scanner); token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_LEFT_CURLY) return G_TOKEN_LEFT_CURLY; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_INT) return G_TOKEN_INT; left = scanner->value.v_int; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_COMMA) return G_TOKEN_COMMA; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_INT) return G_TOKEN_INT; right = scanner->value.v_int; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_COMMA) return G_TOKEN_COMMA; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_INT) return G_TOKEN_INT; top = scanner->value.v_int; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_COMMA) return G_TOKEN_COMMA; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_INT) return G_TOKEN_INT; bottom = scanner->value.v_int; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_RIGHT_CURLY) return G_TOKEN_RIGHT_CURLY; if (!*theme_pb) *theme_pb = theme_pixbuf_new (); theme_pixbuf_set_border (*theme_pb, left, right, top, bottom); return G_TOKEN_NONE;}static guinttheme_parse_stretch(GScanner *scanner, ThemePixbuf **theme_pb){ guint token; gboolean stretch; /* Skip 'blah_stretch' */ token = g_scanner_get_next_token(scanner); token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token == TOKEN_TRUE) stretch = TRUE; else if (token == TOKEN_FALSE) stretch = FALSE; else return TOKEN_TRUE; if (!*theme_pb) *theme_pb = theme_pixbuf_new (); theme_pixbuf_set_stretch (*theme_pb, stretch); return G_TOKEN_NONE;}static guinttheme_parse_recolorable(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_RECOLORABLE) return TOKEN_RECOLORABLE; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token == TOKEN_TRUE) data->recolorable = 1; else if (token == TOKEN_FALSE) data->recolorable = 0; else return TOKEN_TRUE; return G_TOKEN_NONE;}static guinttheme_parse_function(GScanner * scanner, ThemeImage *data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_FUNCTION) return TOKEN_FUNCTION; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if ((token >= TOKEN_D_HLINE) && (token <= TOKEN_D_RESIZE_GRIP)) data->match_data.function = token; return G_TOKEN_NONE;}static guinttheme_parse_detail(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_DETAIL) return TOKEN_DETAIL; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; g_free (data->match_data.detail); data->match_data.detail = g_strdup(scanner->value.v_string); return G_TOKEN_NONE;}static guinttheme_parse_state(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_STATE) return TOKEN_STATE; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token == TOKEN_NORMAL) data->match_data.state = GTK_STATE_NORMAL; else if (token == TOKEN_ACTIVE) data->match_data.state = GTK_STATE_ACTIVE; else if (token == TOKEN_PRELIGHT) data->match_data.state = GTK_STATE_PRELIGHT; else if (token == TOKEN_SELECTED) data->match_data.state = GTK_STATE_SELECTED; else if (token == TOKEN_INSENSITIVE) data->match_data.state = GTK_STATE_INSENSITIVE; else return TOKEN_NORMAL; data->match_data.flags |= THEME_MATCH_STATE; return G_TOKEN_NONE;}static guinttheme_parse_shadow(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_SHADOW) return TOKEN_SHADOW; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_EQUAL_SIGN) return G_TOKEN_EQUAL_SIGN; token = g_scanner_get_next_token(scanner); if (token == TOKEN_NONE) data->match_data.shadow = GTK_SHADOW_NONE; else if (token == TOKEN_IN) data->match_data.shadow = GTK_SHADOW_IN; else if (token == TOKEN_OUT) data->match_data.shadow = GTK_SHADOW_OUT; else if (token == TOKEN_ETCHED_IN) data->match_data.shadow = GTK_SHADOW_ETCHED_IN; else if (token == TOKEN_ETCHED_OUT) data->match_data.shadow = GTK_SHADOW_ETCHED_OUT; else return TOKEN_NONE; data->match_data.flags |= THEME_MATCH_SHADOW; return G_TOKEN_NONE;}static guinttheme_parse_arrow_direction(GScanner * scanner, ThemeImage * data){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -