forked from AuroraMiddleware/gtk
tooltips, handle boxes, menus, toolbars
This commit is contained in:
parent
b1b4498b0e
commit
ccdf6b9bc9
@ -1,3 +1,7 @@
|
|||||||
|
2003-08-26 Dom Lachowicz <cinamod@hotmail.com>
|
||||||
|
|
||||||
|
* src/*.c: Tooltips should do XP-style theming. Handle Boxes/Panes do XP style REBAR theming (TODO: non-XP version of the above for handleboxes). Toolbars should draw the REBAR part properly. Preparation for using the Toolbar class. Menubars and Toolbars now are etched-in to mimic Windows' behavior. HandleBoxes' shadow types should also be correct now, compared to OfficeXP applications.
|
||||||
|
|
||||||
2003-08-26 Raymond Penners <raymond@dotsphinx.com>
|
2003-08-26 Raymond Penners <raymond@dotsphinx.com>
|
||||||
|
|
||||||
* === Released 0.3.0 ===
|
* === Released 0.3.0 ===
|
||||||
|
@ -3,6 +3,9 @@ style "wimp-default"
|
|||||||
GtkWidget::interior_focus = 1
|
GtkWidget::interior_focus = 1
|
||||||
GtkOptionMenu::indicator_size = { 9, 5 }
|
GtkOptionMenu::indicator_size = { 9, 5 }
|
||||||
GtkOptionMenu::indicator_spacing = { 7, 5, 2, 2 }
|
GtkOptionMenu::indicator_spacing = { 7, 5, 2, 2 }
|
||||||
|
GtkMenuBar::shadow-type = etched-in
|
||||||
|
GtkToolBar::shadow-type = etched-in
|
||||||
|
GtkHandleBox::shadow-type = none
|
||||||
GtkSpinButton::shadow-type = in
|
GtkSpinButton::shadow-type = in
|
||||||
|
|
||||||
GtkTreeView::allow-rules = 0
|
GtkTreeView::allow-rules = 0
|
||||||
|
@ -120,41 +120,16 @@ static gboolean
|
|||||||
get_system_font(LOGFONT *lf)
|
get_system_font(LOGFONT *lf)
|
||||||
{
|
{
|
||||||
gboolean ok;
|
gboolean ok;
|
||||||
/*
|
|
||||||
if (NULL)//uxtheme_dll)
|
NONCLIENTMETRICS ncm;
|
||||||
|
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||||||
|
ok = SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
|
||||||
|
sizeof(NONCLIENTMETRICS), &ncm, 0);
|
||||||
|
if (ok)
|
||||||
{
|
{
|
||||||
LOGFONTW lfw;
|
*lf = ncm.lfMessageFont;
|
||||||
ok = get_system_font_xp(&lfw);
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
memcpy(lf, &lfw, sizeof(*lf));
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, lfw.lfFaceName, -1,
|
|
||||||
lf->lfFaceName, sizeof(lf->lfFaceName),
|
|
||||||
NULL, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
NONCLIENTMETRICS ncm;
|
|
||||||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
|
||||||
ok = SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
|
|
||||||
sizeof(NONCLIENTMETRICS), &ncm, 0);
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
*lf = ncm.lfMessageFont;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
HGDIOBJ font = GetStockObject(SYSTEM_FONT);
|
|
||||||
if (font)
|
|
||||||
{
|
|
||||||
if (GetObject( font, sizeof( LOGFONT ), lf ))
|
|
||||||
{
|
|
||||||
ok = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -947,6 +922,18 @@ draw_box (GtkStyle *style,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (detail && !strcmp (detail, "handlebox_bin")) {
|
||||||
|
if (xp_theme_draw (window, XP_THEME_ELEMENT_REBAR, style, x, y, width, height, state_type))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp (gtk_widget_get_name (widget), "gtk-tooltips")) {
|
||||||
|
if (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width, height, state_type))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (detail && strcmp (detail, "menuitem") == 0)
|
if (detail && strcmp (detail, "menuitem") == 0)
|
||||||
shadow_type = GTK_SHADOW_NONE;
|
shadow_type = GTK_SHADOW_NONE;
|
||||||
@ -1095,6 +1082,10 @@ draw_tab (GtkStyle *style,
|
|||||||
x, y, indicator_size.width, arrow_height);
|
x, y, indicator_size.width, arrow_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this is an undefined magic value that, according to the mozilla folks,
|
||||||
|
worked for all the various themes that they tried */
|
||||||
|
#define XP_EDGE_SIZE 2
|
||||||
|
|
||||||
static void
|
static void
|
||||||
draw_extension(GtkStyle *style,
|
draw_extension(GtkStyle *style,
|
||||||
GdkWindow *window,
|
GdkWindow *window,
|
||||||
@ -1112,17 +1103,26 @@ draw_extension(GtkStyle *style,
|
|||||||
if (detail && !strcmp(detail, "tab"))
|
if (detail && !strcmp(detail, "tab"))
|
||||||
{
|
{
|
||||||
GtkNotebook *notebook = GTK_NOTEBOOK(widget);
|
GtkNotebook *notebook = GTK_NOTEBOOK(widget);
|
||||||
|
GtkPositionType pos_type = gtk_notebook_get_tab_pos(notebook);
|
||||||
|
|
||||||
/* FIXME: pos != TOP to be implemented */
|
if (pos_type == GTK_POS_TOP)
|
||||||
if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP
|
height += XP_EDGE_SIZE;
|
||||||
&& xp_theme_draw (window,
|
|
||||||
gtk_notebook_get_current_page(notebook)==0
|
#if 0
|
||||||
? XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE
|
/* FIXME: pos != TOP to be implemented */
|
||||||
: XP_THEME_ELEMENT_TAB_ITEM,
|
else if (pos_type == GTK_POS_BOTTOM)
|
||||||
style, x, y, width, height
|
y -= XP_EDGE_SIZE;
|
||||||
/* FIXME: where does the magic number 2 come from? */
|
else if (pos_type == GTK_POS_RIGHT)
|
||||||
+ ( state_type == GTK_STATE_NORMAL
|
width += XP_EDGE_SIZE;
|
||||||
? 2 : 0), state_type))
|
else if (pos_type == GTK_POS_LEFT)
|
||||||
|
height -= XP_EDGE_SIZE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (xp_theme_draw (window,
|
||||||
|
gtk_notebook_get_current_page(notebook)==0
|
||||||
|
? XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE
|
||||||
|
: XP_THEME_ELEMENT_TAB_ITEM,
|
||||||
|
style, x, y, width, height, state_type))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1143,10 +1143,9 @@ draw_box_gap (GtkStyle *style, GdkWindow *window, GtkStateType state_type,
|
|||||||
{
|
{
|
||||||
GtkNotebook *notebook = GTK_NOTEBOOK(widget);
|
GtkNotebook *notebook = GTK_NOTEBOOK(widget);
|
||||||
|
|
||||||
/* FIXME: pos != TOP to be implemented */
|
/* FIXME: pos != TOP to be implemented */
|
||||||
if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP
|
if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP && xp_theme_draw(window, XP_THEME_ELEMENT_TAB_PANE, style, x, y, width, height,
|
||||||
&& xp_theme_draw(window, XP_THEME_ELEMENT_TAB_PANE, style, x, y, width, height,
|
state_type))
|
||||||
state_type))
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1171,10 +1170,6 @@ draw_flat_box (GtkStyle *style, GdkWindow *window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gtk_style_apply_default_background (style, window,
|
|
||||||
widget && !GTK_WIDGET_NO_WINDOW (widget),
|
|
||||||
state_type, area, x, y, width, height);
|
|
||||||
*/
|
|
||||||
parent_class->draw_flat_box(style, window, state_type, shadow_type,
|
parent_class->draw_flat_box(style, window, state_type, shadow_type,
|
||||||
area, widget, detail, x, y, width, height);
|
area, widget, detail, x, y, width, height);
|
||||||
}
|
}
|
||||||
@ -1194,12 +1189,6 @@ draw_shadow (GtkStyle *style,
|
|||||||
{
|
{
|
||||||
if(detail && ! strcmp(detail, "entry"))
|
if(detail && ! strcmp(detail, "entry"))
|
||||||
{
|
{
|
||||||
/* Is this necessary?
|
|
||||||
if(GTK_IS_COMBO(widget->parent))
|
|
||||||
width += 10;
|
|
||||||
if(GTK_WIDGET_HAS_FOCUS (widget))
|
|
||||||
state_type = GTK_STATE_PRELIGHT;
|
|
||||||
*/
|
|
||||||
if (xp_theme_draw(window, XP_THEME_ELEMENT_EDIT_TEXT, style,
|
if (xp_theme_draw(window, XP_THEME_ELEMENT_EDIT_TEXT, style,
|
||||||
x, y, width, height, state_type))
|
x, y, width, height, state_type))
|
||||||
{
|
{
|
||||||
@ -1210,6 +1199,70 @@ draw_shadow (GtkStyle *style,
|
|||||||
detail, x, y, width, height);
|
detail, x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw_hline (GtkStyle *style,
|
||||||
|
GdkWindow *window,
|
||||||
|
GtkStateType state_type,
|
||||||
|
GdkRectangle *area,
|
||||||
|
GtkWidget *widget,
|
||||||
|
const gchar *detail,
|
||||||
|
gint x1,
|
||||||
|
gint x2,
|
||||||
|
gint y)
|
||||||
|
{
|
||||||
|
/* TODO: GP_LINEHORIZ : LHS_FLAT, LHS_RAISED, LHS_SUNKEN*/
|
||||||
|
parent_class->draw_hline (style, window, state_type, area, widget,
|
||||||
|
detail, x1, x2, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw_vline (GtkStyle *style,
|
||||||
|
GdkWindow *window,
|
||||||
|
GtkStateType state_type,
|
||||||
|
GdkRectangle *area,
|
||||||
|
GtkWidget *widget,
|
||||||
|
const gchar *detail,
|
||||||
|
gint y1,
|
||||||
|
gint y2,
|
||||||
|
gint x)
|
||||||
|
{
|
||||||
|
/* TODO: GP_LINEVERT : LVS_FLAT, LVS_RAISED, LVS_SUNKEN */
|
||||||
|
parent_class->draw_vline (style, window, state_type, area, widget,
|
||||||
|
detail, y1, y2, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw_handle (GtkStyle *style,
|
||||||
|
GdkWindow *window,
|
||||||
|
GtkStateType state_type,
|
||||||
|
GtkShadowType shadow_type,
|
||||||
|
GdkRectangle *area,
|
||||||
|
GtkWidget *widget,
|
||||||
|
const gchar *detail,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
gint width,
|
||||||
|
gint height,
|
||||||
|
GtkOrientation orientation)
|
||||||
|
{
|
||||||
|
XpThemeElement hndl;
|
||||||
|
|
||||||
|
if (TRUE) {
|
||||||
|
if (orientation == GTK_ORIENTATION_VERTICAL)
|
||||||
|
hndl = XP_THEME_ELEMENT_GRIPPER_V;
|
||||||
|
else
|
||||||
|
hndl = XP_THEME_ELEMENT_GRIPPER_H;
|
||||||
|
|
||||||
|
if (xp_theme_draw(window, hndl, style, x, y, width, height, state_type))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parent_class->draw_handle (style, window, state_type, shadow_type, area, widget,
|
||||||
|
detail, x, y, width, height, orientation);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wimp_style_init_from_rc (GtkStyle * style, GtkRcStyle * rc_style)
|
wimp_style_init_from_rc (GtkStyle * style, GtkRcStyle * rc_style)
|
||||||
{
|
{
|
||||||
@ -1242,6 +1295,9 @@ wimp_style_class_init (WimpStyleClass *klass)
|
|||||||
style_class->draw_extension = draw_extension;
|
style_class->draw_extension = draw_extension;
|
||||||
style_class->draw_box_gap = draw_box_gap;
|
style_class->draw_box_gap = draw_box_gap;
|
||||||
style_class->draw_shadow = draw_shadow;
|
style_class->draw_shadow = draw_shadow;
|
||||||
|
style_class->draw_hline = draw_hline;
|
||||||
|
style_class->draw_vline = draw_vline;
|
||||||
|
style_class->draw_handle = draw_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
GType wimp_type_style = 0;
|
GType wimp_type_style = 0;
|
||||||
|
@ -40,6 +40,9 @@ static LPCWSTR class_descriptors[] =
|
|||||||
L"TreeView",
|
L"TreeView",
|
||||||
L"Spin",
|
L"Spin",
|
||||||
L"Progress",
|
L"Progress",
|
||||||
|
L"Tooltip",
|
||||||
|
L"Rebar",
|
||||||
|
L"Toolbar"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const short element_part_map[]=
|
static const short element_part_map[]=
|
||||||
@ -74,13 +77,18 @@ static const short element_part_map[]=
|
|||||||
PP_CHUNKVERT,
|
PP_CHUNKVERT,
|
||||||
PP_BAR,
|
PP_BAR,
|
||||||
PP_BARVERT,
|
PP_BARVERT,
|
||||||
|
TTP_STANDARD,
|
||||||
|
RP_BAND,
|
||||||
|
RP_GRIPPER,
|
||||||
|
RP_GRIPPERVERT,
|
||||||
|
TP_BUTTON
|
||||||
};
|
};
|
||||||
|
|
||||||
static HINSTANCE uxtheme_dll = NULL;
|
static HINSTANCE uxtheme_dll = NULL;
|
||||||
static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
|
static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
|
||||||
|
|
||||||
typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
|
typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
|
||||||
(HTHEME hTheme, int iFontID, FAR LOGFONTW *plf);
|
(HTHEME hTheme, int iFontID, FAR LOGFONT *plf);
|
||||||
typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
|
typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
|
||||||
(HWND hwnd, LPCWSTR pszClassList);
|
(HWND hwnd, LPCWSTR pszClassList);
|
||||||
typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
|
typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
|
||||||
@ -158,6 +166,20 @@ xp_theme_get_handle_by_element(XpThemeElement element)
|
|||||||
|
|
||||||
switch(element)
|
switch(element)
|
||||||
{
|
{
|
||||||
|
case XP_THEME_ELEMENT_TOOLTIP:
|
||||||
|
klazz = XP_THEME_CLASS_TOOLTIP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XP_THEME_ELEMENT_REBAR:
|
||||||
|
case XP_THEME_ELEMENT_GRIPPER_H:
|
||||||
|
case XP_THEME_ELEMENT_GRIPPER_V:
|
||||||
|
klazz = XP_THEME_CLASS_REBAR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XP_THEME_ELEMENT_TOOLBAR:
|
||||||
|
klazz = XP_THEME_CLASS_TOOLBAR;
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
|
case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
|
||||||
case XP_THEME_ELEMENT_CHECKBOX:
|
case XP_THEME_ELEMENT_CHECKBOX:
|
||||||
case XP_THEME_ELEMENT_BUTTON:
|
case XP_THEME_ELEMENT_BUTTON:
|
||||||
@ -231,10 +253,24 @@ xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
|
|||||||
|
|
||||||
switch(element)
|
switch(element)
|
||||||
{
|
{
|
||||||
case XP_THEME_ELEMENT_TAB_PANE:
|
case XP_THEME_ELEMENT_TOOLTIP:
|
||||||
|
ret = TTSS_NORMAL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XP_THEME_ELEMENT_REBAR:
|
||||||
|
case XP_THEME_ELEMENT_GRIPPER_H:
|
||||||
|
case XP_THEME_ELEMENT_GRIPPER_V:
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case XP_THEME_ELEMENT_TOOLBAR:
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XP_THEME_ELEMENT_TAB_PANE:
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
|
case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
|
||||||
case XP_THEME_ELEMENT_TAB_ITEM:
|
case XP_THEME_ELEMENT_TAB_ITEM:
|
||||||
switch(state)
|
switch(state)
|
||||||
@ -540,7 +576,7 @@ xp_theme_is_drawable(XpThemeElement element)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
xp_theme_get_system_font(LOGFONTW *lf)
|
xp_theme_get_system_font(LOGFONT *lf)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
if (get_theme_sys_font_func != NULL)
|
if (get_theme_sys_font_func != NULL)
|
||||||
|
@ -35,6 +35,9 @@ typedef enum
|
|||||||
XP_THEME_CLASS_TREEVIEW,
|
XP_THEME_CLASS_TREEVIEW,
|
||||||
XP_THEME_CLASS_SPIN,
|
XP_THEME_CLASS_SPIN,
|
||||||
XP_THEME_CLASS_PROGRESS,
|
XP_THEME_CLASS_PROGRESS,
|
||||||
|
XP_THEME_CLASS_TOOLTIP,
|
||||||
|
XP_THEME_CLASS_REBAR,
|
||||||
|
XP_THEME_CLASS_TOOLBAR,
|
||||||
XP_THEME_CLASS__SIZEOF
|
XP_THEME_CLASS__SIZEOF
|
||||||
} XpThemeClass;
|
} XpThemeClass;
|
||||||
|
|
||||||
@ -70,6 +73,11 @@ typedef enum
|
|||||||
XP_THEME_ELEMENT_PROGRESS_BAR_V,
|
XP_THEME_ELEMENT_PROGRESS_BAR_V,
|
||||||
XP_THEME_ELEMENT_PROGRESS_TROUGH_H,
|
XP_THEME_ELEMENT_PROGRESS_TROUGH_H,
|
||||||
XP_THEME_ELEMENT_PROGRESS_TROUGH_V,
|
XP_THEME_ELEMENT_PROGRESS_TROUGH_V,
|
||||||
|
XP_THEME_ELEMENT_TOOLTIP,
|
||||||
|
XP_THEME_ELEMENT_REBAR,
|
||||||
|
XP_THEME_ELEMENT_GRIPPER_H,
|
||||||
|
XP_THEME_ELEMENT_GRIPPER_V,
|
||||||
|
XP_THEME_ELEMENT_TOOLBAR,
|
||||||
XP_THEME_ELEMENT__SIZEOF
|
XP_THEME_ELEMENT__SIZEOF
|
||||||
} XpThemeElement;
|
} XpThemeElement;
|
||||||
|
|
||||||
@ -77,9 +85,7 @@ void xp_theme_init();
|
|||||||
void xp_theme_exit();
|
void xp_theme_exit();
|
||||||
gboolean xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
|
gboolean xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
|
||||||
int x, int y, int width, int height, GtkStateType state_type);
|
int x, int y, int width, int height, GtkStateType state_type);
|
||||||
gboolean xp_theme_can_draw(XpThemeElement element, GtkStyle *style,
|
|
||||||
int x, int y, int width, int height, GtkStateType state_type);
|
|
||||||
gboolean xp_theme_is_drawable(XpThemeElement element);
|
gboolean xp_theme_is_drawable(XpThemeElement element);
|
||||||
gboolean xp_theme_get_system_font(LOGFONTW *lf);
|
gboolean xp_theme_get_system_font(LOGFONT *lf);
|
||||||
|
|
||||||
#endif /* XP_THEME_H */
|
#endif /* XP_THEME_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user