📄 msw_style.c
字号:
if (lf.lfItalic) style = "Italic"; else style = ""; hwnd = GetDesktopWindow (); hDC = GetDC (hwnd); if (hDC) { pt_size = -MulDiv (lf.lfHeight, 72, GetDeviceCaps (hDC, LOGPIXELSY)); } else pt_size = 10; font = get_family_name (&lf, hDC); if (hDC) ReleaseDC (hwnd, hDC); if(!(font && *font)) return NULL; g_snprintf (buf, bufsiz, "%s %s %s %d", font, style, weight, pt_size); g_free (font); return buf; } return NULL;}/* missing from ms's header files */#ifndef SPI_GETMENUSHOWDELAY#define SPI_GETMENUSHOWDELAY 106#endif/* I don't know the proper XP theme class for things like HIGHLIGHTTEXT, so we'll just define it to be "BUTTON" for now */#define XP_THEME_CLASS_TEXT XP_THEME_CLASS_BUTTONstatic voidsetup_menu_settings (GtkSettings * settings){ int menu_delay; gboolean win95 = FALSE; OSVERSIONINFOEX osvi; GObjectClass *klazz = G_OBJECT_GET_CLASS (G_OBJECT (settings)); ZeroMemory (&osvi, sizeof (OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); if (!GetVersionEx ((OSVERSIONINFO *) & osvi)) win95 = TRUE; /* assume the worst */ if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) win95 = TRUE; if (!win95) { if (SystemParametersInfo (SPI_GETMENUSHOWDELAY, 0, &menu_delay, 0)) { if (klazz) { if (g_object_class_find_property (klazz, "gtk-menu-bar-popup-delay")) { g_object_set (settings, "gtk-menu-bar-popup-delay", 0, NULL); } if (g_object_class_find_property (klazz, "gtk-menu-popup-delay")) { g_object_set (settings, "gtk-menu-popup-delay", menu_delay, NULL); } if (g_object_class_find_property (klazz, "gtk-menu-popdown-delay")) { g_object_set (settings, "gtk-menu-popdown-delay", menu_delay, NULL); } } } }}voidmsw_style_setup_system_settings (void){ GtkSettings *settings; int cursor_blink_time; settings = gtk_settings_get_default (); if (!settings) return; cursor_blink_time = GetCaretBlinkTime (); g_object_set (settings, "gtk-cursor-blink", cursor_blink_time > 0, NULL); if (cursor_blink_time > 0) g_object_set (settings, "gtk-cursor-blink-time", 2 * cursor_blink_time, NULL); g_object_set (settings, "gtk-double-click-distance", GetSystemMetrics (SM_CXDOUBLECLK), NULL); g_object_set (settings, "gtk-double-click-time", GetDoubleClickTime (), NULL); g_object_set (settings, "gtk-dnd-drag-threshold", GetSystemMetrics (SM_CXDRAG), NULL); setup_menu_settings (settings); /* http://developer.gnome.org/doc/API/2.0/gtk/GtkSettings.html http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/systemparametersinfo.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp */}static voidsetup_system_font (GtkStyle * style){ char buf[256], *font; /* It's okay, lfFaceName is smaller than 32 chars */ if ((font = sys_font_to_pango_font (XP_THEME_CLASS_TEXT, XP_THEME_FONT_MESSAGE, buf, sizeof (buf))) != NULL) { if (style->font_desc) pango_font_description_free (style->font_desc); style->font_desc = pango_font_description_from_string (font); }}static voidsys_color_to_gtk_color (XpThemeClass klazz, int id, GdkColor * pcolor){ DWORD color; if (!xp_theme_get_system_color (klazz, id, &color)) color = GetSysColor (id); pcolor->pixel = color; pcolor->red = (GetRValue (color) << 8) | GetRValue (color); pcolor->green = (GetGValue (color) << 8) | GetGValue (color); pcolor->blue = (GetBValue (color) << 8) | GetBValue (color);}static intget_system_metric (XpThemeClass klazz, int id){ int rval; if (!xp_theme_get_system_metric (klazz, id, &rval)) rval = GetSystemMetrics (id); return rval;}static voidsetup_msw_rc_style (void){ char buf[1024], font_buf[256], *font_ptr; char menu_bar_prelight_str[128]; GdkColor menu_color; GdkColor menu_text_color; GdkColor tooltip_back; GdkColor tooltip_fore; GdkColor btn_fore; GdkColor btn_face; GdkColor progress_back; GdkColor fg_prelight; GdkColor bg_prelight; GdkColor base_prelight; GdkColor text_prelight; /* Prelight */ sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT, &fg_prelight); sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT, &bg_prelight); sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT, &base_prelight); sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT, &text_prelight); sys_color_to_gtk_color (XP_THEME_CLASS_MENU, COLOR_MENUTEXT, &menu_text_color); sys_color_to_gtk_color (XP_THEME_CLASS_MENU, COLOR_MENU, &menu_color); /* tooltips */ sys_color_to_gtk_color (XP_THEME_CLASS_TOOLTIP, COLOR_INFOTEXT, &tooltip_fore); sys_color_to_gtk_color (XP_THEME_CLASS_TOOLTIP, COLOR_INFOBK, &tooltip_back); /* text on push buttons. TODO: button shadows, backgrounds, and highlights */ sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT, &btn_fore); sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE, &btn_face); /* progress bar background color */ sys_color_to_gtk_color (XP_THEME_CLASS_PROGRESS, COLOR_HIGHLIGHT, &progress_back); /* Enable coloring for menus. */ font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_MENU, XP_THEME_FONT_MENU, font_buf, sizeof (font_buf)); g_snprintf (buf, sizeof (buf), "style \"msw-menu\" = \"msw-default\"\n" "{\n" "GtkMenuItem::toggle-spacing = 8\n" "fg[PRELIGHT] = { %d, %d, %d }\n" "bg[PRELIGHT] = { %d, %d, %d }\n" "text[PRELIGHT] = { %d, %d, %d }\n" "base[PRELIGHT] = { %d, %d, %d }\n" "fg[NORMAL] = { %d, %d, %d }\n" "bg[NORMAL] = { %d, %d, %d }\n" "%s = \"%s\"\n" "}widget_class \"*MenuItem*\" style \"msw-menu\"\n" "widget_class \"*GtkMenu\" style \"msw-menu\"\n" "widget_class \"*GtkMenuShell*\" style \"msw-menu\"\n", fg_prelight.red, fg_prelight.green, fg_prelight.blue, bg_prelight.red, bg_prelight.green, bg_prelight.blue, text_prelight.red, text_prelight.green, text_prelight.blue, base_prelight.red, base_prelight.green, base_prelight.blue, menu_text_color.red, menu_text_color.green, menu_text_color.blue, menu_color.red, menu_color.green, menu_color.blue, (font_ptr ? "font_name" : "#"), (font_ptr ? font_ptr : " font name should go here")); gtk_rc_parse_string (buf); if( xp_theme_is_active() ) { *menu_bar_prelight_str = '\0'; } else { g_snprintf(menu_bar_prelight_str, sizeof(menu_bar_prelight_str), "fg[PRELIGHT] = { %d, %d, %d }\n", menu_text_color.red, menu_text_color.green, menu_text_color.blue); } /* Enable coloring for menu bars. */ g_snprintf (buf, sizeof (buf), "style \"msw-menu-bar\" = \"msw-menu\"\n" "{\n" "bg[NORMAL] = { %d, %d, %d }\n" "%s" "GtkMenuBar::shadow-type = %d\n" /* FIXME: This should be enabled once gtk+ support GtkMenuBar::prelight-item style property. */ /* "GtkMenuBar::prelight-item = 1\n" */ "}widget_class \"*MenuBar*\" style \"msw-menu-bar\"\n", btn_face.red, btn_face.green, btn_face.blue, menu_bar_prelight_str, xp_theme_is_active() ? 0 : 2 ); gtk_rc_parse_string (buf); g_snprintf (buf, sizeof (buf), "style \"msw-toolbar\" = \"msw-default\"\n" "{\n" "GtkHandleBox::shadow-type = %s\n" "GtkToolbar::shadow-type = %s\n" "}widget_class \"*HandleBox*\" style \"msw-toolbar\"\n", "etched-in", "etched-in"); gtk_rc_parse_string (buf); /* enable tooltip fonts */ font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS, font_buf, sizeof (font_buf)); g_snprintf (buf, sizeof (buf), "style \"msw-tooltips-caption\" = \"msw-default\"\n" "{fg[NORMAL] = { %d, %d, %d }\n" "%s = \"%s\"\n" "}widget \"gtk-tooltips.GtkLabel\" style \"msw-tooltips-caption\"\n", tooltip_fore.red, tooltip_fore.green, tooltip_fore.blue, (font_ptr ? "font_name" : "#"), (font_ptr ? font_ptr : " font name should go here")); gtk_rc_parse_string (buf); g_snprintf (buf, sizeof (buf), "style \"msw-tooltips\" = \"msw-default\"\n" "{bg[NORMAL] = { %d, %d, %d }\n" "}widget \"gtk-tooltips*\" style \"msw-tooltips\"\n", tooltip_back.red, tooltip_back.green, tooltip_back.blue); gtk_rc_parse_string (buf); /* enable font theming for status bars */ font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS, font_buf, sizeof (font_buf)); g_snprintf (buf, sizeof (buf), "style \"msw-status\" = \"msw-default\"\n" "{%s = \"%s\"\n" "bg[NORMAL] = { %d, %d, %d }\n" "}widget_class \"*Status*\" style \"msw-status\"\n", (font_ptr ? "font_name" : "#"), (font_ptr ? font_ptr : " font name should go here"), btn_face.red, btn_face.green, btn_face.blue); gtk_rc_parse_string (buf); /* enable coloring for text on buttons TODO: use GetThemeMetric for the border and outside border */ g_snprintf (buf, sizeof (buf), "style \"msw-button\" = \"msw-default\"\n" "{\n" "bg[NORMAL] = { %d, %d, %d }\n" "bg[PRELIGHT] = { %d, %d, %d }\n" "bg[INSENSITIVE] = { %d, %d, %d }\n" "fg[PRELIGHT] = { %d, %d, %d }\n" "GtkButton::default-border = { 0, 0, 0, 0 }\n" "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n" "GtkButton::child-displacement-x = 1\n" "GtkButton::child-displacement-y = 1\n" "GtkButton::focus-padding = %d\n" "}widget_class \"*Button*\" style \"msw-button\"\n", btn_face.red, btn_face.green, btn_face.blue, btn_face.red, btn_face.green, btn_face.blue, btn_face.red, btn_face.green, btn_face.blue, btn_fore.red, btn_fore.green, btn_fore.blue, xp_theme_is_active() ? 1 : 2 ); gtk_rc_parse_string (buf); /* enable coloring for progress bars */ g_snprintf (buf, sizeof (buf), "style \"msw-progress\" = \"msw-default\"\n" "{bg[PRELIGHT] = { %d, %d, %d }\n" "bg[NORMAL] = { %d, %d, %d }\n" "}widget_class \"*Progress*\" style \"msw-progress\"\n", progress_back.red, progress_back.green, progress_back.blue, btn_face.red, btn_face.green, btn_face.blue); gtk_rc_parse_string (buf); /* scrollbar thumb width and height */ g_snprintf (buf, sizeof (buf), "style \"msw-vscrollbar\" = \"msw-default\"\n" "{GtkRange::slider-width = %d\n" "GtkRange::stepper-size = %d\n" "GtkRange::stepper-spacing = 0\n" "GtkRange::trough_border = 0\n" "GtkScale::slider-length = %d\n" "GtkScrollbar::min-slider-length = 8\n" "}widget_class \"*VScrollbar*\" style \"msw-vscrollbar\"\n" "widget_class \"*VScale*\" style \"msw-vscrollbar\"\n", GetSystemMetrics (SM_CYVTHUMB), get_system_metric (XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL), 11); gtk_rc_parse_string (buf); g_snprintf (buf, sizeof (buf), "style \"msw-hscrollbar\" = \"msw-default\"\n" "{GtkRange::slider-width = %d\n" "GtkRange::stepper-size = %d\n" "GtkRange::stepper-spacing = 0\n" "GtkRange::trough_border = 0\n" "GtkScale::slider-length = %d\n" "GtkScrollbar::min-slider-length = 8\n" "}widget_class \"*HScrollbar*\" style \"msw-hscrollbar\"\n" "widget_class \"*HScale*\" style \"msw-hscrollbar\"\n", GetSystemMetrics (SM_CXHTHUMB), get_system_metric (XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL), 11); gtk_rc_parse_string (buf); gtk_rc_parse_string ( "style \"msw-scrolled-window\" = \"msw-default\"\n" "{GtkScrolledWindow::scrollbars-within-bevel = 1}\n" "class \"GtkScrolledWindow\" style \"msw-scrolled-window\"\n"); /* radio/check button sizes */ g_snprintf (buf, sizeof (buf), "style \"msw-checkbutton\" = \"msw-button\"\n" "{GtkCheckButton::indicator-size = 13\n" "}widget_class \"*CheckButton*\" style \"msw-checkbutton\"\n" "widget_class \"*RadioButton*\" style \"msw-checkbutton\"\n"); gtk_rc_parse_string (buf); /* size of combo box toggle button */ g_snprintf (buf, sizeof(buf), "style \"msw-combobox-button\" = \"msw-default\"\n" "{\n" "xthickness = 0\n" "ythickness = 0\n" "GtkButton::default-border = { 0, 0, 0, 0 }\n" "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n" "GtkButton::child-displacement-x = 0\n" "GtkButton::child-displacement-y = 0\n" "GtkWidget::focus-padding = 0\n" "GtkWidget::focus-line-width = 0\n" "}\n" "widget_class \"*ComboBox*ToggleButton*\" style \"msw-combobox-button\"\n"); gtk_rc_parse_string (buf); g_snprintf (buf, sizeof(buf), "style \"msw-combobox\" = \"msw-default\"\n" "{\n" "GtkComboBox::shadow-type = in\n" "xthickness = %d\n" "ythickness = %d\n" "}\n" "class \"GtkComboBox\" style \"msw-combobox\"\n", GetSystemMetrics (SM_CXEDGE), GetSystemMetrics (SM_CYEDGE)); gtk_rc_parse_string (buf); /* size of tree view header */ g_snprintf (buf, sizeof(buf), "style \"msw-header-button\" = \"msw-default\"\n" "{\n" "xthickness = 4\n" "ythickness = %d\n" "GtkButton::default-border = { 0, 0, 0, 0 }\n" "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n" "GtkButton::child-displacement-x = 1\n" "GtkButton::child-displacement-y = 1\n" "GtkWidget::focus-padding = 0\n" "GtkWidget::focus-line-width = 0\n" "}\n" "widget_class \"*TreeView*Button*\" style \"msw-header-button\"\n", xp_theme_is_active() ? 2 : 0 ); gtk_rc_parse_string (buf); /* FIXME: This should be enabled once gtk+ support GtkNotebok::prelight-tab */ /* enable prelight tab of GtkNotebook */ /* g_snprintf (buf, sizeof (buf), "style \"msw-notebook\" = \"msw-default\"\n" "{GtkNotebook::prelight-tab=1\n" "}widget_class \"*Notebook*\" style \"msw-notebook\"\n"); gtk_rc_parse_string (buf); */ /* FIXME: This should be enabled once gtk+ support GtkTreeView::full-row-focus */ /* g_snprintf (buf, sizeof (buf), "style \"msw-treeview\" = \"msw-default\"\n" "{GtkTreeView::full-row-focus=0\n" "}widget_class \"*TreeView*\" style \"msw-treeview\"\n"); gtk_rc_parse_string (buf); */}static voidsetup_system_styles (GtkStyle * style){ int i; /* Default background */ sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE, &style->bg[GTK_STATE_NORMAL]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -