[gtk+] [win32] Properly draw the menu separator for Windows Vista/7. Also adds the bits for transparency.
- From: Fridrich Strba <strba src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] [win32] Properly draw the menu separator for Windows Vista/7. Also adds the bits for transparency.
- Date: Mon, 30 Aug 2010 19:06:45 +0000 (UTC)
commit e14560cf1ebf345feed03356813d73fbe392ded0
Author: Martin Schlemmer <11285613 nwu ac za>
Date: Mon Aug 30 20:03:04 2010 +0200
[win32] Properly draw the menu separator for Windows Vista/7.
Also adds the bits for transparency.
modules/engines/ms-windows/msw_style.c | 15 ++++++-
modules/engines/ms-windows/xp_theme.c | 69 +++++++++++++++++++++++++++-
modules/engines/ms-windows/xp_theme.h | 3 +
modules/engines/ms-windows/xp_theme_defs.h | 6 ++
4 files changed, 91 insertions(+), 2 deletions(-)
---
diff --git a/modules/engines/ms-windows/msw_style.c b/modules/engines/ms-windows/msw_style.c
index e76519b..d08e1cd 100755
--- a/modules/engines/ms-windows/msw_style.c
+++ b/modules/engines/ms-windows/msw_style.c
@@ -2903,8 +2903,21 @@ draw_hline (GtkStyle *style,
{
if (xp_theme_is_active () && detail && !strcmp (detail, "menuitem"))
{
+ gint cx, cy;
+ gint new_y, new_height;
+ gint y_offset;
+
+ xp_theme_get_element_dimensions (XP_THEME_ELEMENT_MENU_SEPARATOR,
+ state_type,
+ &cx, &cy);
+
+ /* Center the separator */
+ y_offset = (area->height / 2) - (cy / 2);
+ new_y = y_offset >= 0 ? area->y + y_offset : area->y;
+ new_height = cy;
+
if (xp_theme_draw
- (window, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, y, x2, 1,
+ (window, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, new_y, x2, new_height,
state_type, area))
{
return;
diff --git a/modules/engines/ms-windows/xp_theme.c b/modules/engines/ms-windows/xp_theme.c
index f864515..79698ac 100755
--- a/modules/engines/ms-windows/xp_theme.c
+++ b/modules/engines/ms-windows/xp_theme.c
@@ -86,6 +86,7 @@
#define MBI_DISABLEDHOT 5
#define MBI_DISABLEDPUSHED 6
+#define MENU_POPUPGUTTER 13
#define MENU_POPUPITEM 14
#define MENU_POPUPSEPARATOR 15
@@ -188,6 +189,13 @@ typedef BOOL (FAR PASCAL *IsThemeBackgroundPartiallyTransparentFunc) (HTHEME hTh
typedef HRESULT (FAR PASCAL *DrawThemeParentBackgroundFunc) (HWND hwnd,
HDC hdc,
RECT *prc);
+typedef HRESULT (FAR PASCAL *GetThemePartSizeFunc) (HTHEME hTheme,
+ HDC hdc,
+ int iPartId,
+ int iStateId,
+ RECT *prc,
+ int eSize,
+ SIZE *psz);
static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
static GetThemeSysColorFunc get_theme_sys_color_func = NULL;
@@ -200,6 +208,7 @@ static IsThemeActiveFunc is_theme_active_func = NULL;
static IsAppThemedFunc is_app_themed_func = NULL;
static IsThemeBackgroundPartiallyTransparentFunc is_theme_partially_transparent_func = NULL;
static DrawThemeParentBackgroundFunc draw_theme_parent_background_func = NULL;
+static GetThemePartSizeFunc get_theme_part_size_func = NULL;
static void
xp_theme_close_open_handles (void)
@@ -242,6 +251,7 @@ xp_theme_init (void)
get_theme_sys_metric_func = (GetThemeSysSizeFunc) GetProcAddress (uxtheme_dll, "GetThemeSysSize");
is_theme_partially_transparent_func = (IsThemeBackgroundPartiallyTransparentFunc) GetProcAddress (uxtheme_dll, "IsThemeBackgroundPartiallyTransparent");
draw_theme_parent_background_func = (DrawThemeParentBackgroundFunc) GetProcAddress (uxtheme_dll, "DrawThemeParentBackground");
+ get_theme_part_size_func = (GetThemePartSizeFunc) GetProcAddress (uxtheme_dll, "GetThemePartSize");
}
if (is_app_themed_func && is_theme_active_func)
@@ -292,6 +302,7 @@ xp_theme_exit (void)
get_theme_sys_metric_func = NULL;
is_theme_partially_transparent_func = NULL;
draw_theme_parent_background_func = NULL;
+ get_theme_part_size_func = NULL;
}
static HTHEME
@@ -782,8 +793,11 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
ret = 1;
break;
- case XP_THEME_ELEMENT_MENU_ITEM:
case XP_THEME_ELEMENT_MENU_SEPARATOR:
+ ret = TS_NORMAL;
+ break;
+
+ case XP_THEME_ELEMENT_MENU_ITEM:
switch (state)
{
case GTK_STATE_SELECTED:
@@ -934,6 +948,10 @@ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
part_state = xp_theme_map_gtk_state (element, state_type);
+ /* Support transparency */
+ if (is_theme_partially_transparent_func (theme, element_part_map[element], part_state))
+ draw_theme_parent_background_func (GDK_WINDOW_HWND (win), dc, pClip);
+
draw_theme_background_func (theme, dc, element_part_map[element],
part_state, &rect, pClip);
@@ -958,6 +976,55 @@ xp_theme_is_drawable (XpThemeElement element)
}
gboolean
+xp_theme_get_element_dimensions (XpThemeElement element,
+ GtkStateType state_type,
+ gint *cx, gint *cy)
+{
+ HTHEME theme;
+ SIZE part_size;
+ int part_state;
+
+ if (!xp_theme_is_active ())
+ return FALSE;
+
+ theme = xp_theme_get_handle_by_element (element);
+ if (!theme)
+ return FALSE;
+
+ part_state = xp_theme_map_gtk_state (element, state_type);
+
+ get_theme_part_size_func (theme,
+ NULL,
+ element_part_map[element],
+ part_state,
+ NULL,
+ TS_MIN,
+ &part_size);
+
+ *cx = part_size.cx;
+ *cy = part_size.cy;
+
+ if (element == XP_THEME_ELEMENT_MENU_ITEM ||
+ element == XP_THEME_ELEMENT_MENU_SEPARATOR)
+ {
+ SIZE gutter_size;
+
+ get_theme_part_size_func (theme,
+ NULL,
+ MENU_POPUPGUTTER,
+ 0,
+ NULL,
+ TS_MIN,
+ &gutter_size);
+
+ *cx += gutter_size.cx * 2;
+ *cy += gutter_size.cy * 2;
+ }
+
+ return TRUE;
+}
+
+gboolean
xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId,
OUT LOGFONTW *lf)
{
diff --git a/modules/engines/ms-windows/xp_theme.h b/modules/engines/ms-windows/xp_theme.h
index 2d172f3..dfacb43 100755
--- a/modules/engines/ms-windows/xp_theme.h
+++ b/modules/engines/ms-windows/xp_theme.h
@@ -141,6 +141,9 @@ gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,
int height, GtkStateType state_type,
GdkRectangle *area);
gboolean xp_theme_is_drawable (XpThemeElement element);
+gboolean xp_theme_get_element_dimensions (XpThemeElement element,
+ GtkStateType state_type,
+ gint *cx, gint *cy);
gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, OUT LOGFONTW *lf);
gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, OUT DWORD *pColor);
gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int *pVal);
diff --git a/modules/engines/ms-windows/xp_theme_defs.h b/modules/engines/ms-windows/xp_theme_defs.h
index 49f5179..aaae6d9 100644
--- a/modules/engines/ms-windows/xp_theme_defs.h
+++ b/modules/engines/ms-windows/xp_theme_defs.h
@@ -756,4 +756,10 @@ enum {
VTS_DISABLED = 4
};
+enum {
+ TS_MIN,
+ TS_TRUE,
+ TS_DRAW
+};
+
#endif /* XP_THEME_DFNS_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]