⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msw_style.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
     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){  /* TODO: Owen says:  	 "If your setup_system_styles() function called gtk_rc_parse_string(), then you are just piling a new set of strings on top each time the theme changes .. the old ones won't be removed" */  char buf[1024], font_buf[256], *font_ptr;  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"	     "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);  /* Enable coloring for menu bars. */  g_snprintf(buf, sizeof (buf),	     "style \"msw-menu-bar\" = \"msw-menu\"\n"	     "{\n"	     "bg[NORMAL] = { %d, %d, %d }\n"	     "GtkMenuBar::shadow-type = out\n"	     "}widget_class \"*MenuBar*\" style \"msw-menu-bar\"\n",	     btn_face.red,	     btn_face.green,	     btn_face.blue);  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 = { 1, 1, 1, 1 }\n"	     "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n"	     "GtkButton::child-displacement-x = 1\n"	     "GtkButton::child-displacement-y = 1\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	     );  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"	     "}widget_class \"*VScrollbar*\" style \"msw-vscrollbar\"\n",	     GetSystemMetrics(SM_CYVTHUMB),	     get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL));  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"	     "}widget_class \"*HScrollbar*\" style \"msw-hscrollbar\"\n",	     GetSystemMetrics(SM_CXHTHUMB),	     get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL));  gtk_rc_parse_string(buf);  /* 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);}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]);  sys_color_to_gtk_color(XP_THEME_CLASS_TEXT,    COLOR_HIGHLIGHT, &style->bg[GTK_STATE_SELECTED]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNFACE,   &style->bg[GTK_STATE_INSENSITIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNFACE,   &style->bg[GTK_STATE_ACTIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNFACE,   &style->bg[GTK_STATE_PRELIGHT]);  /* Default base */  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW,  COLOR_WINDOW,    &style->base[GTK_STATE_NORMAL]);  sys_color_to_gtk_color(XP_THEME_CLASS_TEXT,    COLOR_HIGHLIGHT, &style->base[GTK_STATE_SELECTED]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNFACE,   &style->base[GTK_STATE_INSENSITIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNFACE,   &style->base[GTK_STATE_ACTIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW,  COLOR_WINDOW,    &style->base[GTK_STATE_PRELIGHT]);  /* Default text */  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW,  COLOR_WINDOWTEXT,    &style->text[GTK_STATE_NORMAL]);  sys_color_to_gtk_color(XP_THEME_CLASS_TEXT,    COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_SELECTED]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_GRAYTEXT,      &style->text[GTK_STATE_INSENSITIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNTEXT,       &style->text[GTK_STATE_ACTIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW,  COLOR_WINDOWTEXT,    &style->text[GTK_STATE_PRELIGHT]);  /* Default forgeground */  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNTEXT,       &style->fg[GTK_STATE_NORMAL]);  sys_color_to_gtk_color(XP_THEME_CLASS_TEXT,    COLOR_HIGHLIGHTTEXT, &style->fg[GTK_STATE_SELECTED]);  sys_color_to_gtk_color(XP_THEME_CLASS_TEXT,    COLOR_GRAYTEXT,      &style->fg[GTK_STATE_INSENSITIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON,  COLOR_BTNTEXT,       &style->fg[GTK_STATE_ACTIVE]);  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW,  COLOR_WINDOWTEXT,    &style->fg[GTK_STATE_PRELIGHT]);  for (i = 0; i < 5; i++)    {      sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DSHADOW, &style->dark[i]);      sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DHILIGHT, &style->light[i]);      style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;      style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;      style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;      style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2;      style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2;      style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2;    }}static gbooleansanitize_size (GdkWindow *window,	       gint      *width,	       gint      *height){  gboolean set_bg = FALSE;  if ((*width == -1) && (*height == -1))    {      set_bg = GDK_IS_WINDOW (window);      gdk_drawable_get_size (window, width, height);    }  else if (*width == -1)    gdk_drawable_get_size (window, width, NULL);  else if (*height == -1)    gdk_drawable_get_size (window, NULL, height);  return set_bg;}static XpThemeElementmap_gtk_progress_bar_to_xp(GtkProgressBar *progress_bar, gboolean trough){  XpThemeElement ret;  switch (progress_bar->orientation)    {    case GTK_PROGRESS_LEFT_TO_RIGHT:    case GTK_PROGRESS_RIGHT_TO_LEFT:      ret = trough        ? XP_THEME_ELEMENT_PROGRESS_TROUGH_H        : XP_THEME_ELEMENT_PROGRESS_BAR_H;      break;    default:      ret = trough        ? XP_THEME_ELEMENT_PROGRESS_TROUGH_V        : XP_THEME_ELEMENT_PROGRESS_BAR_V;      break;    }  return ret;}static voiddraw_part (GdkDrawable  *drawable,	   GdkGC        *gc,	   GdkRectangle *area,	   gint          x,	   gint          y,	   Part          part){  if (area)    gdk_gc_set_clip_rectangle (gc, area);  if (!parts[part].bmap)      parts[part].bmap = gdk_bitmap_create_from_data (drawable,						      parts[part].bits,						      PART_SIZE, PART_SIZE);  gdk_gc_set_ts_origin (gc, x, y);  gdk_gc_set_stipple (gc, parts[part].bmap);  gdk_gc_set_fill (gc, GDK_STIPPLED);  gdk_draw_rectangle (drawable, gc, TRUE, x, y, PART_SIZE, PART_SIZE);  gdk_gc_set_fill (gc, GDK_SOLID);  if (area)    gdk_gc_set_clip_rectangle (gc, NULL);}static voiddraw_check(GtkStyle      *style,	   GdkWindow     *window,	   GtkStateType   state,	   GtkShadowType  shadow,	   GdkRectangle  *area,	   GtkWidget     *widget,	   const gchar   *detail,	   gint           x,	   gint           y,	   gint           width,	   gint           height){  x -= (1 + PART_SIZE - width) / 2;  y -= (1 + PART_SIZE - height) / 2;  if (detail && strcmp (detail, "check") == 0)	/* Menu item */    {      if (shadow == GTK_SHADOW_IN)	{	  draw_part (window, style->black_gc, area, x, y, CHECK_TEXT);	  draw_part (window, style->dark_gc[state], area, x, y, CHECK_AA);	}    }  else    {      if (!xp_theme_draw(window, shadow == GTK_SHADOW_IN			 ? XP_THEME_ELEMENT_PRESSED_CHECKBOX			 : XP_THEME_ELEMENT_CHECKBOX,			 style, x, y, width, height, state, area))        {          draw_part (window, style->black_gc, area, x, y, CHECK_BLACK);          draw_part (window, style->dark_gc[state], area, x, y, CHECK_DARK);          draw_part (window, style->mid_gc[state], area, x, y, CHECK_MID);          draw_part (window, style->light_gc[state], area, x, y, CHECK_LIGHT);          draw_part (window, style->base_gc[state], area, x, y, CHECK_BASE);          if (shadow == GTK_SHADOW_IN)            {              draw_part (window, style->text_gc[state], area, x, y, CHECK_TEXT);              draw_part (window, style->text_aa_gc[state], area, x, y, CHECK_AA);            }        }    }}static voiddraw_expander(GtkStyle      *style,	      GdkWindow     *window,	      GtkStateType   state,	      GdkRectangle  *area,	      GtkWidget     *widget,	      const gchar   *detail,	      gint           x,	      gint           y,	      GtkExpanderStyle expander_style){  gint expander_size;  gint expander_semi_size;  GdkColor color;  GdkGCValues values;  gboolean success;  XpThemeElement xp_expander;  gtk_widget_style_get (widget, "expander_size", &expander_size, NULL);  switch (expander_style)    {    case GTK_EXPANDER_COLLAPSED:    case GTK_EXPANDER_SEMI_COLLAPSED:      xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED;      break;    default:      xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED;      break;    }  if ((expander_size % 2) == 0)    expander_size--;  if (expander_size > 2)    expander_size -= 2;  if (area)    gdk_gc_set_clip_rectangle (style->fg_gc[state], area);  expander_semi_size = expander_size / 2;  x -= expander_semi_size;  y -= expander_semi_size;  gdk_gc_get_values (style->fg_gc[state], &values);  if (! xp_theme_draw(window, xp_expander, style,                      x, y,                      expander_size, expander_size, state, area))    {      /* RGB values to emulate Windows Classic style */      color.red = color.green = color.blue = 128 << 8;      success = gdk_colormap_alloc_color        (gtk_widget_get_default_colormap (), &color, FALSE, TRUE);      if (success)        gdk_gc_set_foreground (style->fg_gc[state], &color);      gdk_draw_rectangle        (window, style->fg_gc[state], FALSE, x, y,         expander_size - 1, expander_size - 1);      gdk_draw_line        (window, style->fg_gc[state], x + 2, y + expander_semi_size,         x + expander_size - 2, y + expander_semi_size);      switch (expander_style)        {        case GTK_EXPANDER_COLLAPSED:        case GTK_EXPANDER_SEMI_COLLAPSED:          gdk_draw_line            (window, style->fg_gc[state], x + expander_semi_size, y + 2,             x + expander_semi_size, y + expander_size - 2);          break;	default:	  break;        }      if (success)        gdk_gc_set_foreground (style->fg_gc[state], &values.foreground);    }  if (area)    gdk_gc_set_clip_rectangle (style->fg_gc[state], NULL);}static voiddraw_option(GtkStyle      *style,	    GdkWindow     *window,	    GtkStateType   state,	    GtkShadowType  shadow,	    GdkRectangle  *area,	    GtkWidget     *widget,	    const gchar   *detail,	    gint           x,	    gint           y,	    gint           width,	    gint           height){  x -= (1 + PART_SIZE - width) / 2;  y -= (1 + PART_SIZE - height) / 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -