diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-10-12 21:17:43 +0100 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2016-11-24 11:59:15 +0000 |
commit | 83dc2227f35795aee4e2ccaccbb7d67d4c50ba3f (patch) | |
tree | 60a0320e0f732e8ad93e8baff81a9e7424d12cfe | |
parent | 2c24cc40e37ffb09d6a4fa88ca9d9b9d346982cc (diff) |
Resolves: tdf#92776 backport gtk3 >= 3.20 themeing improvements
Related: tdf#92776 set parent style of notebook to toplevel window style
Change-Id: Iec16b2617c82c363a540f967f66c514b5b2b104b
(cherry picked from commit 570669631359021a8ad420753c87bcf4419d06cd)
Related: tdf#101699 gtk3: get correct combobox and listbox arrows
Change-Id: Ib2322bfda09b05925c74d93a530b9ed9fac73032
(cherry picked from commit 6e8dbdbe1a9d15d7e7d000e4132fd5df3fecd660)
Related: tdf#101699 gtk3: get correct arrow width
Change-Id: If02c598306ec6f19cf83958c4a176cafa67076dc
(cherry picked from commit 4cb720836ab03701ce508e302790c115c7808619)
silence warnings
Change-Id: I80abf5092c7d4e7b8cf75e4b79ffdb9a5e0c7580
(cherry picked from commit 7ae079274d15ab309c9811c0b3966bed727a6afe)
loplugin:nullptr
Change-Id: Id9f702b2772a23c52a9b829093d10c83a5ab3acd
(cherry picked from commit 1f8f140601bd654f97d0c1e6e05b3bef949ddfaf)
bundle duplicate code together
Change-Id: Id67e5026e21138c0583df8099436da01e4e2dab3
(cherry picked from commit e3fca8b4a0f5e517f994b35f1d4ff152fb17c3a2)
split these ifdefs into larger blocks
Change-Id: I501d06096aa51066af8806277b7d392e39747494
(cherry picked from commit d5b8b98393f529d1181b0305313a95ab90ef0bf2)
gtk3: select old/new gtk theme behaviour etc at runtime
Reviewed-on: https://gerrit.libreoffice.org/29969
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 70f7697c4243739c28feaa33b091f6c64a8356cb)
Change-Id: Ie09419049e3d839315f4fc8a937f0dde74688d98
need 3.19.2 or above for these
(cherry picked from commit dd04278bfc3c89336283fcab1222147dcd796a77)
Change-Id: If385b45b12c72a0d7460a9a4c9d0b0e3bfc1195e
use released 3.20.0 instead of 3.19.2
(cherry picked from commit 4fce8bd59eae6d2ed6e5a3f9a3d4898fcd3431a9)
Change-Id: Iac311e0c326cf79a2dbacb889d39ab49ccaa9325
Resolves: tdf#101699 get combobox junction right
gtk3-demo has examples of foreign drawing, follow
the patterns there to figure out what to do, add
stuff to gtk3-demo to demo what we need to do if
any particular case here is lacking
Change-Id: Ia1a22280161c97a3eab2d94fc4744fe971d31727
(cherry picked from commit e2af8f92a7308bc28c257b7905ec3a8a724554b1)
gtk3: rework theme code to separate old and new theming schemes
Change-Id: I7c1341a920c4607937ffab06c182a0ba0e0b26fd
(cherry picked from commit ac53789077eef17e2d895826abfe22888716600a)
older gtk3 versions still out there to build against
Change-Id: I64cb12185fc3943a211928e35e756b82942095b0
(cherry picked from commit a906f24a7830a12c4f1e2f8fa0c3df7961a64d6c)
GTK_STYLE_CLASS_POPUP not defined in older gtks
Change-Id: I6192d13419aab42993e4b6dc011db30a4c3c1787
(cherry picked from commit 7403c95540ba96a304eaebcb4845e910746133bb)
Resolves: tdf#92776 ensure correct notebook tab font color
despite various theme layout differences
Change-Id: I209258583571b57b2b7869937fa4821855125eac
(cherry picked from commit 69c9acd4b8dcd7ec8a5c3c380ad5cd8b797661ea)
gtk3: split out gtk->vcl font mapping code
(cherry picked from commit eb935ee8f511265038a949f74958ae716ac0e8ca)
Change-Id: Ic379307ba9e663e0ffc27c945852f6d68197f995
gtk3: use theme tab font
Change-Id: I3ea5a9e65e62133c910945e603bdc1155c9a07c3
(cherry picked from commit d786606b33cfc146a3a1f3adf814196993d3b310)
gtk3: split tabitem rendering to a standalone thing
Change-Id: I88cd8926b733717c9ea0ecf64a9882eaa777dcfe
(cherry picked from commit dcfddd3f079a45fc59fe50475020091c6c4694e2)
GTK_STYLE_CLASS_LABEL no defined in all versions
Change-Id: I648067e30d5a2e725111b2bc920367ac2d5e0f80
(cherry picked from commit 352ddafd05c5de4335746d52c79e8cf9689cba86)
Resolves: tdf#89760 get correct menubar text color for 'close preview'
Change-Id: Ife6f2665eabeefd6125a53318404dbd7b9af42ee
(cherry picked from commit b5f9fdff49e6955550cffa5318bee9d5c09f3479)
-Werror,-Wimplicit-fallthrough
Change-Id: I13a6a64f118bcfb99f47cd47a0dc638c5c9a5a14
(cherry picked from commit e64ea98801d20e5024da900a0ac8faaf565f4bf3)
Resolves: tdf#100251 gtk3 toolbar separators are white in Adwaita
Change-Id: Iceeba474535026cd13393432ef9a2e25121c134a
(cherry picked from commit 3498ed37527b7af795f00dc6a55c11e65a313186)
Resolves: tdf#103320 pressed buttons appear as hover buttons in toolbar
since...
commit 3498ed37527b7af795f00dc6a55c11e65a313186
Author: Caolán McNamara <caolanm@redhat.com>
Date: Tue Oct 18 13:08:47 2016 +0100
Resolves: tdf#100251 gtk3 toolbar separators are white in Adwaita
so remove setting the parent of the toolbar again, colors remain good
cause we ended up using gtk_render_background+gtk_render_frame for
the new-style code path anyway
Change-Id: Idd01537acbd92d6b41e0ff7fa2306b8c49f23ad3
(cherry picked from commit 7f6f5519079e3508ac1302aa5907cfc6098c525e)
Resolves: tdf#92776 tab names unreadable under Ambiance theme 3.20
thanks Benjamin
Reviewed-on: https://gerrit.libreoffice.org/30910
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 567580bddfa7b3d437b072698de77968c6513513)
Change-Id: I7ea0f6c8a8b8b35f864036844f1dc786e1f6bda8
gtk3: spinbuttons under Ambiance don't look beautiful enough
lets draw the frame after the sub-contents are done, and
use a dedicated entry child
Change-Id: I7db1ac56e5cfb1a46ddd2fb56c5e95deaa83a95d
(cherry picked from commit 4579c43861635dda15158478404aa90151228e91)
put the render frame at the end of these blocks too
Change-Id: I72270faa4138377ea04467ad0c6f01a3de0156b6
(cherry picked from commit 7f1af0a1c7401552704eaba2091b078890567cd8)
Reviewed-on: https://gerrit.libreoffice.org/30936
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | vcl/inc/unx/gtk/gtkgdi.hxx | 88 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx | 1692 |
2 files changed, 1215 insertions, 565 deletions
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx index 3aac4d103039..7e097075b459 100644 --- a/vcl/inc/unx/gtk/gtkgdi.hxx +++ b/vcl/inc/unx/gtk/gtkgdi.hxx @@ -35,6 +35,7 @@ enum class GtkControlPart { + ToplevelWindow, Button, LinkButton, CheckButton, @@ -42,36 +43,60 @@ enum class GtkControlPart RadioButton, RadioButtonRadio, Entry, + Combobox, + ComboboxBox, + ComboboxBoxEntry, + ComboboxBoxButton, + ComboboxBoxButtonBox, + ComboboxBoxButtonBoxArrow, + Listbox, + ListboxBox, + ListboxBoxButton, + ListboxBoxButtonBox, + ListboxBoxButtonBoxArrow, SpinButton, + SpinButtonEntry, SpinButtonUpButton, SpinButtonDownButton, ScrollbarVertical, + ScrollbarVerticalContents, + ScrollbarVerticalTrough, + ScrollbarVerticalSlider, + ScrollbarVerticalButton, ScrollbarHorizontal, - ScrollbarContents, - ScrollbarTrough, - ScrollbarSlider, - ScrollbarButton, + ScrollbarHorizontalContents, + ScrollbarHorizontalTrough, + ScrollbarHorizontalSlider, + ScrollbarHorizontalButton, ProgressBar, ProgressBarTrough, ProgressBarProgress, + Notebook, + NotebookHeader, + NotebookStack, + NotebookHeaderTabs, + NotebookHeaderTabsTab, + NotebookHeaderTabsTabLabel, + NotebookHeaderTabsTabActiveLabel, + NotebookHeaderTabsTabHoverLabel, + FrameBorder, MenuBar, + MenuBarItem, + MenuWindow, + Menu, MenuItem, + MenuItemLabel, MenuItemArrow, - Menu, CheckMenuItem, CheckMenuItemCheck, RadioMenuItem, RadioMenuItemRadio, SeparatorMenuItem, SeparatorMenuItemSeparator, - Notebook, - NotebookHeader, - NotebookStack, - NotebookHeaderTabs, - NotebookHeaderTabsTab, - FrameBorder, }; +typedef void (*gtk_widget_path_iter_set_object_nameFunc)(GtkWidgetPath *, guint, const char*); + class GtkSalGraphics : public SvpSalGraphics { GtkSalFrame *mpFrame; @@ -99,8 +124,14 @@ public: static void signalSettingsNotify( GObject*, GParamSpec *pSpec, gpointer ); virtual void GetResolution(sal_Int32& rDPIX, sal_Int32& rDPIY) override; + + GtkStyleContext* createStyleContext(gtk_widget_path_iter_set_object_nameFunc set_object_name, GtkControlPart ePart); + GtkStyleContext* createNewContext(GtkControlPart ePart, gtk_widget_path_iter_set_object_nameFunc set_object_name); + GtkStyleContext* createOldContext(GtkControlPart ePart); + GtkStyleContext* makeContext(GtkWidgetPath *pPath, GtkStyleContext *pParent); private: GtkWidget *mpWindow; + static GtkStyleContext *mpWindowStyle; static GtkStyleContext *mpButtonStyle; static GtkStyleContext *mpLinkButtonStyle; static GtkStyleContext *mpEntryStyle; @@ -119,22 +150,24 @@ private: static GtkStyleContext *mpToolButtonStyle; static GtkStyleContext *mpToolbarSeperatorStyle; static GtkStyleContext *mpCheckButtonStyle; + static GtkStyleContext *mpCheckButtonCheckStyle; static GtkStyleContext *mpRadioButtonStyle; - static GtkStyleContext *mpMenuBarStyle; - static GtkStyleContext *mpMenuBarItemStyle; - static GtkStyleContext *mpMenuStyle; + static GtkStyleContext *mpRadioButtonRadioStyle; static GtkStyleContext *mpSpinStyle; + static GtkStyleContext *mpSpinEntryStyle; static GtkStyleContext *mpSpinUpStyle; static GtkStyleContext *mpSpinDownStyle; - static GtkStyleContext *mpMenuItemStyle; - static GtkStyleContext *mpMenuItemArrowStyle; - static GtkStyleContext *mpCheckMenuItemStyle; - static GtkStyleContext *mpRadioMenuItemStyle; - static GtkStyleContext *mpSeparatorMenuItemStyle; static GtkStyleContext *mpComboboxStyle; + static GtkStyleContext *mpComboboxBoxStyle; + static GtkStyleContext *mpComboboxEntryStyle; static GtkStyleContext *mpComboboxButtonStyle; + static GtkStyleContext *mpComboboxButtonBoxStyle; + static GtkStyleContext *mpComboboxButtonArrowStyle; static GtkStyleContext *mpListboxStyle; + static GtkStyleContext *mpListboxBoxStyle; static GtkStyleContext *mpListboxButtonStyle; + static GtkStyleContext *mpListboxButtonBoxStyle; + static GtkStyleContext *mpListboxButtonArrowStyle; static GtkStyleContext *mpFrameInStyle; static GtkStyleContext *mpFrameOutStyle; static GtkStyleContext *mpFixedHoriLineStyle; @@ -149,6 +182,21 @@ private: static GtkStyleContext *mpNotebookHeaderTabsStyle; static GtkStyleContext *mpNotebookHeaderTabsTabStyle; static GtkStyleContext *mpNotebookHeaderTabsTabLabelStyle; + static GtkStyleContext *mpNotebookHeaderTabsTabActiveLabelStyle; + static GtkStyleContext *mpNotebookHeaderTabsTabHoverLabelStyle; + static GtkStyleContext *mpMenuBarStyle; + static GtkStyleContext *mpMenuBarItemStyle; + static GtkStyleContext *mpMenuWindowStyle; + static GtkStyleContext *mpMenuStyle; + static GtkStyleContext *mpMenuItemStyle; + static GtkStyleContext *mpMenuItemLabelStyle; + static GtkStyleContext *mpMenuItemArrowStyle; + static GtkStyleContext *mpCheckMenuItemStyle; + static GtkStyleContext *mpCheckMenuItemCheckStyle; + static GtkStyleContext *mpRadioMenuItemStyle; + static GtkStyleContext *mpRadioMenuItemRadioStyle; + static GtkStyleContext *mpSeparatorMenuItemStyle; + static GtkStyleContext *mpSeparatorMenuItemSeparatorStyle; static Rectangle NWGetScrollButtonRect( ControlPart nPart, Rectangle aAreaRect ); static Rectangle NWGetSpinButtonRect( ControlPart nPart, Rectangle aAreaRect); @@ -166,7 +214,7 @@ private: ControlPart nPart, Rectangle aAreaRect, ControlState nState ); - void PaintSpinButton(GtkStyleContext *context, + void PaintSpinButton(GtkStateFlags flags, cairo_t *cr, const Rectangle& rControlRectangle, ControlType nType, diff --git a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx index 52c32463bb18..d1f24ddc6ebd 100644 --- a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx @@ -21,6 +21,7 @@ #include <boost/optional.hpp> +GtkStyleContext* GtkSalGraphics::mpWindowStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpButtonStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpLinkButtonStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpEntryStyle = nullptr; @@ -39,22 +40,24 @@ GtkStyleContext* GtkSalGraphics::mpToolbarStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpToolButtonStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpToolbarSeperatorStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpCheckButtonStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpCheckButtonCheckStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpRadioButtonStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpMenuBarStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpMenuBarItemStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpMenuStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpMenuItemStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpMenuItemArrowStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpCheckMenuItemStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpRadioMenuItemStyle = nullptr; -GtkStyleContext* GtkSalGraphics::mpSeparatorMenuItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpRadioButtonRadioStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpSpinStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpSpinEntryStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpSpinUpStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpSpinDownStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpComboboxStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpComboboxBoxStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpComboboxEntryStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpComboboxButtonStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpComboboxButtonBoxStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpComboboxButtonArrowStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpListboxStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpListboxBoxStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpListboxButtonStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpListboxButtonBoxStyle= nullptr; +GtkStyleContext* GtkSalGraphics::mpListboxButtonArrowStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpFrameInStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpFrameOutStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpFixedHoriLineStyle = nullptr; @@ -68,6 +71,22 @@ GtkStyleContext* GtkSalGraphics::mpNotebookStackStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpNotebookHeaderStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpNotebookHeaderTabsStyle = nullptr; GtkStyleContext* GtkSalGraphics::mpNotebookHeaderTabsTabStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpNotebookHeaderTabsTabLabelStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpNotebookHeaderTabsTabActiveLabelStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpNotebookHeaderTabsTabHoverLabelStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuBarStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuBarItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuWindowStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuItemArrowStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpMenuItemLabelStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpCheckMenuItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpCheckMenuItemCheckStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpRadioMenuItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpRadioMenuItemRadioStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpSeparatorMenuItemStyle = nullptr; +GtkStyleContext* GtkSalGraphics::mpSeparatorMenuItemSeparatorStyle = nullptr; bool GtkSalGraphics::style_loaded = false; /************************************************************************ @@ -125,6 +144,7 @@ enum class RenderType { Expander, Icon, Progress, + TabItem, Focus }; @@ -290,6 +310,56 @@ static GtkWidget* gMenuItemMenuBarWidget; static GtkWidget* gCheckMenuItemWidget; static GtkWidget* gTreeViewWidget; +namespace +{ + void parent_styles_context_set_state(GtkStyleContext* context, GtkStateFlags flags) + { + while ((context = gtk_style_context_get_parent(context))) + { + gtk_style_context_set_state(context, flags); + } + } + + void style_context_set_state(GtkStyleContext* context, GtkStateFlags flags) + { + gtk_style_context_set_state(context, flags); + parent_styles_context_set_state(context, flags); + } + + Rectangle render_common(GtkStyleContext *pContext, cairo_t *cr, const Rectangle &rIn, GtkStateFlags flags) + { + if (!pContext) + return rIn; + + gtk_style_context_set_state(pContext, flags); + + Rectangle aRect(rIn); + GtkBorder margin; + gtk_style_context_get_margin(pContext, gtk_style_context_get_state(pContext), &margin); + + aRect.Left() += margin.left; + aRect.Top() += margin.top; + aRect.Right() -= margin.right; + aRect.Bottom() -= margin.bottom; + + gtk_render_background(pContext, cr, aRect.Left(), aRect.Top(), + aRect.GetWidth(), aRect.GetHeight()); + gtk_render_frame(pContext, cr, aRect.Left(), aRect.Top(), + aRect.GetWidth(), aRect.GetHeight()); + + GtkBorder border, padding; + gtk_style_context_get_border(pContext, gtk_style_context_get_state(pContext), &border); + gtk_style_context_get_padding(pContext, gtk_style_context_get_state(pContext), &padding); + + aRect.Left() += border.left + padding.left; + aRect.Top() += border.top + padding.top; + aRect.Right() -= border.right + padding.right; + aRect.Bottom() -= border.bottom + padding.bottom; + + return aRect; + } +} + void GtkSalGraphics::PaintScrollbar(GtkStyleContext *context, cairo_t *cr, const Rectangle& rControlRectangle, @@ -613,9 +683,6 @@ void GtkSalGraphics::PaintOneSpinButton( GtkStyleContext *context, gtk_render_background(context, cr, buttonRect.Left(), buttonRect.Top(), buttonRect.GetWidth(), buttonRect.GetHeight() ); - gtk_render_frame(context, cr, - buttonRect.Left(), buttonRect.Top(), - buttonRect.GetWidth(), buttonRect.GetHeight() ); gint iconWidth = (buttonRect.GetWidth() - padding.left - padding.right - border.left - border.right); gint iconHeight = (buttonRect.GetHeight() - padding.top - padding.bottom - border.top - border.bottom); @@ -638,9 +705,13 @@ void GtkSalGraphics::PaintOneSpinButton( GtkStyleContext *context, gtk_render_icon(context, cr, pixbuf, arrowRect.Left(), arrowRect.Top()); g_object_unref(pixbuf); + + gtk_render_frame(context, cr, + buttonRect.Left(), buttonRect.Top(), + buttonRect.GetWidth(), buttonRect.GetHeight() ); } -void GtkSalGraphics::PaintSpinButton(GtkStyleContext *context, +void GtkSalGraphics::PaintSpinButton(GtkStateFlags flags, cairo_t *cr, const Rectangle& rControlRectangle, ControlType nType, @@ -664,21 +735,28 @@ void GtkSalGraphics::PaintSpinButton(GtkStyleContext *context, if (nPart == ControlPart::Entire) { - gtk_render_background(context, cr, + gtk_style_context_set_state(mpSpinStyle, flags); + + gtk_render_background(mpSpinStyle, cr, 0, 0, rControlRectangle.GetWidth(), rControlRectangle.GetHeight() ); - gtk_render_frame(context, cr, - 0, 0, - rControlRectangle.GetWidth(), rControlRectangle.GetHeight() ); } cairo_translate(cr, -rControlRectangle.Left(), -rControlRectangle.Top()); PaintOneSpinButton(mpSpinUpStyle, cr, nType, upBtnPart, rControlRectangle, upBtnState ); PaintOneSpinButton(mpSpinDownStyle, cr, nType, downBtnPart, rControlRectangle, downBtnState ); cairo_translate(cr, rControlRectangle.Left(), rControlRectangle.Top()); + + if (nPart == ControlPart::Entire) + { + gtk_render_frame(mpSpinStyle, cr, + 0, 0, + rControlRectangle.GetWidth(), rControlRectangle.GetHeight() ); + } } -#define ARROW_SIZE 11 * 0.85 +#define FALLBACK_ARROW_SIZE 11 * 0.85 + Rectangle GtkSalGraphics::NWGetComboBoxButtonRect( ControlType nType, ControlPart nPart, Rectangle aAreaRect ) @@ -690,7 +768,14 @@ Rectangle GtkSalGraphics::NWGetComboBoxButtonRect( ControlType nType, GtkBorder padding; gtk_style_context_get_padding( mpButtonStyle, gtk_style_context_get_state(mpButtonStyle), &padding); - gint nArrowWidth = ARROW_SIZE; + gint nArrowWidth = FALLBACK_ARROW_SIZE; + if (gtk_check_version(3, 20, 0) == nullptr) + { + gtk_style_context_get(mpComboboxButtonArrowStyle, + gtk_style_context_get_state(mpComboboxButtonArrowStyle), + "min-width", &nArrowWidth, nullptr); + } + gint nButtonWidth = nArrowWidth + padding.left + padding.right; if( nPart == ControlPart::ButtonDown ) { @@ -736,66 +821,69 @@ void GtkSalGraphics::PaintCombobox( GtkStateFlags flags, cairo_t *cr, areaRect = rControlRectangle; buttonRect = NWGetComboBoxButtonRect( nType, ControlPart::ButtonDown, areaRect ); - if( nPart == ControlPart::ButtonDown ) - buttonRect.Left() += 1; Rectangle aEditBoxRect( areaRect ); aEditBoxRect.SetSize( Size( areaRect.GetWidth() - buttonRect.GetWidth(), aEditBoxRect.GetHeight() ) ); if (AllSettings::GetLayoutRTL()) aEditBoxRect.SetPos( Point( areaRect.Left() + buttonRect.GetWidth(), areaRect.Top() ) ); - arrowRect.SetSize( Size( (gint)(ARROW_SIZE), - (gint)(ARROW_SIZE) ) ); + gint arrow_width = FALLBACK_ARROW_SIZE, arrow_height = FALLBACK_ARROW_SIZE; + if (gtk_check_version(3, 20, 0) == nullptr) + { + if (nType == ControlType::Combobox) + { + gtk_style_context_get(mpComboboxButtonArrowStyle, + gtk_style_context_get_state(mpComboboxButtonArrowStyle), + "min-width", &arrow_width, "min-height", &arrow_height, nullptr); + } + else if (nType == ControlType::Listbox) + { + gtk_style_context_get(mpListboxButtonArrowStyle, + gtk_style_context_get_state(mpListboxButtonArrowStyle), + "min-width", &arrow_width, "min-height", &arrow_height, nullptr); + } + } + + arrowRect.SetSize(Size(arrow_width, arrow_height)); arrowRect.SetPos( Point( buttonRect.Left() + (gint)((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2), buttonRect.Top() + (gint)((buttonRect.GetHeight() - arrowRect.GetHeight()) / 2) ) ); - if ( nType == ControlType::Combobox ) - { - gtk_style_context_save(mpComboboxButtonStyle); - gtk_style_context_set_state(mpComboboxButtonStyle, flags); + Rectangle aRect(Point(0, 0), Size(areaRect.GetWidth(), areaRect.GetHeight())); + if (nType == ControlType::Combobox) + { if( nPart == ControlPart::Entire ) { - GtkJunctionSides eJuncSides = gtk_style_context_get_junction_sides(mpEntryStyle); - gtk_style_context_set_state(mpEntryStyle, flags); + render_common(mpComboboxStyle, cr, aRect, flags); + render_common(mpComboboxBoxStyle, cr, aRect, flags); + Rectangle aEntryRect(Point(aEditBoxRect.Left() - areaRect.Left(), + aEditBoxRect.Top() - areaRect.Top()), + Size(aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight())); + + GtkJunctionSides eJuncSides = gtk_style_context_get_junction_sides(mpComboboxEntryStyle); if (AllSettings::GetLayoutRTL()) - gtk_style_context_set_junction_sides(mpEntryStyle, GTK_JUNCTION_LEFT); + gtk_style_context_set_junction_sides(mpComboboxEntryStyle, GTK_JUNCTION_LEFT); else - gtk_style_context_set_junction_sides(mpEntryStyle, GTK_JUNCTION_RIGHT); + gtk_style_context_set_junction_sides(mpComboboxEntryStyle, GTK_JUNCTION_RIGHT); + render_common(mpComboboxEntryStyle, cr, aEntryRect, flags); + gtk_style_context_set_junction_sides(mpComboboxEntryStyle, eJuncSides); + } - gtk_render_background(mpComboboxStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); - gtk_render_frame(mpComboboxStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); - gtk_render_background(mpEntryStyle, cr, - (aEditBoxRect.Left() - areaRect.Left()), - (aEditBoxRect.Top() - areaRect.Top()), - aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() ); - gtk_render_frame(mpEntryStyle, cr, - (aEditBoxRect.Left() - areaRect.Left()), - (aEditBoxRect.Top() - areaRect.Top()), - aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() ); - gtk_style_context_set_junction_sides(mpEntryStyle, eJuncSides); - } - - gtk_render_background(mpComboboxButtonStyle, cr, - (buttonRect.Left() - areaRect.Left()), - (buttonRect.Top() - areaRect.Top()), - buttonRect.GetWidth(), buttonRect.GetHeight() ); - gtk_render_frame(mpComboboxButtonStyle, cr, - (buttonRect.Left() - areaRect.Left()), - (buttonRect.Top() - areaRect.Top()), - buttonRect.GetWidth(), buttonRect.GetHeight() ); - - gtk_render_arrow(mpComboboxStyle, cr, + Rectangle aButtonRect(Point(buttonRect.Left() - areaRect.Left(), buttonRect.Top() - areaRect.Top()), + Size(buttonRect.GetWidth(), buttonRect.GetHeight())); + GtkJunctionSides eJuncSides = gtk_style_context_get_junction_sides(mpComboboxButtonStyle); + if (AllSettings::GetLayoutRTL()) + gtk_style_context_set_junction_sides(mpComboboxButtonStyle, GTK_JUNCTION_RIGHT); + else + gtk_style_context_set_junction_sides(mpComboboxButtonStyle, GTK_JUNCTION_LEFT); + render_common(mpComboboxButtonStyle, cr, aButtonRect, flags); + gtk_style_context_set_junction_sides(mpComboboxButtonStyle, eJuncSides); + + gtk_render_arrow(mpComboboxButtonArrowStyle, cr, G_PI, (arrowRect.Left() - areaRect.Left()), (arrowRect.Top() - areaRect.Top()), arrowRect.GetWidth() ); - - gtk_style_context_restore(mpComboboxButtonStyle); } else if (nType == ControlType::Listbox) { @@ -808,347 +896,855 @@ void GtkSalGraphics::PaintCombobox( GtkStateFlags flags, cairo_t *cr, } else { - gtk_style_context_save(mpListboxButtonStyle); - gtk_style_context_set_state(mpListboxButtonStyle, flags); - - gtk_render_background(mpListboxStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); - gtk_render_frame(mpListboxStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); + render_common(mpListboxStyle, cr, aRect, flags); + render_common(mpListboxBoxStyle, cr, aRect, flags); - gtk_render_background(mpListboxButtonStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); - gtk_render_frame(mpListboxButtonStyle, cr, - 0, 0, - areaRect.GetWidth(), areaRect.GetHeight()); + render_common(mpListboxButtonStyle, cr, aRect, flags); - gtk_render_arrow(mpListboxStyle, cr, + gtk_render_arrow(mpListboxButtonArrowStyle, cr, G_PI, (arrowRect.Left() - areaRect.Left()), (arrowRect.Top() - areaRect.Top()), arrowRect.GetWidth() ); - - gtk_style_context_restore(mpListboxButtonStyle); } } } -static GtkStyleContext* createStyleContext(GtkControlPart ePart, GtkStyleContext* parent = nullptr) +static void appendComboEntry(GtkWidgetPath* pSiblingsPath, gtk_widget_path_iter_set_object_nameFunc set_object_name) +{ + gtk_widget_path_append_type(pSiblingsPath, GTK_TYPE_ENTRY); + set_object_name(pSiblingsPath, -1, "entry"); + gtk_widget_path_iter_add_class(pSiblingsPath, -1, "combo"); +} + +static void appendComboButton(GtkWidgetPath* pSiblingsPath, gtk_widget_path_iter_set_object_nameFunc set_object_name) +{ + gtk_widget_path_append_type(pSiblingsPath, GTK_TYPE_BUTTON); + set_object_name(pSiblingsPath, -1, "button"); + gtk_widget_path_iter_add_class(pSiblingsPath, -1, "combo"); +} + +static GtkWidgetPath* buildLTRComboSiblingsPath(gtk_widget_path_iter_set_object_nameFunc set_object_name) +{ + GtkWidgetPath* pSiblingsPath = gtk_widget_path_new(); + + appendComboEntry(pSiblingsPath, set_object_name); + appendComboButton(pSiblingsPath, set_object_name); + + return pSiblingsPath; +} + +static GtkWidgetPath* buildRTLComboSiblingsPath(gtk_widget_path_iter_set_object_nameFunc set_object_name) +{ + GtkWidgetPath* pSiblingsPath = gtk_widget_path_new(); + + appendComboButton(pSiblingsPath, set_object_name); + appendComboEntry(pSiblingsPath, set_object_name); + + return pSiblingsPath; +} + +GtkStyleContext* GtkSalGraphics::makeContext(GtkWidgetPath *pPath, GtkStyleContext *pParent) +{ + GtkStyleContext* context = gtk_style_context_new(); + gtk_style_context_set_screen(context, gtk_window_get_screen(GTK_WINDOW(mpWindow))); + gtk_style_context_set_path(context, pPath); + gtk_style_context_set_parent(context, pParent); + gtk_widget_path_unref(pPath); + return context; +} + +GtkStyleContext* GtkSalGraphics::createNewContext(GtkControlPart ePart, gtk_widget_path_iter_set_object_nameFunc set_object_name) { - GtkWidgetPath *path = parent ? gtk_widget_path_copy(gtk_style_context_get_path(parent)) : gtk_widget_path_new(); switch (ePart) { + case GtkControlPart::ToplevelWindow: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "window"); + gtk_widget_path_iter_add_class(path, -1, "background"); + return makeContext(path, nullptr); + } case GtkControlPart::Button: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "button"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); -#endif - break; + set_object_name(path, -1, "button"); + return makeContext(path, nullptr); + } case GtkControlPart::LinkButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "button"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); -#endif + set_object_name(path, -1, "button"); gtk_widget_path_iter_add_class(path, -1, "link"); - break; + return makeContext(path, nullptr); + } case GtkControlPart::CheckButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_CHECK_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "checkbutton"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_CHECK); -#endif - break; + set_object_name(path, -1, "checkbutton"); + return makeContext(path, nullptr); + } case GtkControlPart::CheckButtonCheck: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpCheckButtonStyle)); gtk_widget_path_append_type(path, GTK_TYPE_CHECK_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "check"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_CHECK); -#endif - break; + set_object_name(path, -1, "check"); + return makeContext(path, mpCheckButtonStyle); + } case GtkControlPart::RadioButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_RADIO_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "radiobutton"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_RADIO); -#endif - break; + set_object_name(path, -1, "radiobutton"); + return makeContext(path, nullptr); + } case GtkControlPart::RadioButtonRadio: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpRadioButtonStyle)); gtk_widget_path_append_type(path, GTK_TYPE_RADIO_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "radio"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_RADIO); + set_object_name(path, -1, "radio"); + return makeContext(path, mpRadioButtonStyle); + } + case GtkControlPart::ComboboxBoxButtonBoxArrow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpComboboxButtonBoxStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_RADIO_BUTTON); + gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); + set_object_name(path, -1, "arrow"); + return makeContext(path, mpComboboxButtonBoxStyle); + } + case GtkControlPart::ListboxBoxButtonBoxArrow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpListboxButtonBoxStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_RADIO_BUTTON); + gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); + set_object_name(path, -1, "arrow"); + return makeContext(path, mpListboxButtonBoxStyle); + } + case GtkControlPart::Entry: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_ENTRY); + set_object_name(path, -1, "entry"); + return makeContext(path, nullptr); + } + case GtkControlPart::Combobox: + case GtkControlPart::Listbox: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "combobox"); + return makeContext(path, nullptr); + } + case GtkControlPart::ComboboxBox: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpComboboxStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "box"); + gtk_widget_path_iter_add_class(path, -1, "horizontal"); + gtk_widget_path_iter_add_class(path, -1, "linked"); + return makeContext(path, mpComboboxStyle); + } + case GtkControlPart::ListboxBox: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpListboxStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "box"); + gtk_widget_path_iter_add_class(path, -1, "horizontal"); + gtk_widget_path_iter_add_class(path, -1, "linked"); + return makeContext(path, mpListboxStyle); + } + case GtkControlPart::ComboboxBoxEntry: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpComboboxBoxStyle)); + GtkWidgetPath* pSiblingsPath; + if (AllSettings::GetLayoutRTL()) + { + pSiblingsPath = buildRTLComboSiblingsPath(set_object_name); + gtk_widget_path_append_with_siblings(path, pSiblingsPath, 1); + } + else + { + pSiblingsPath = buildLTRComboSiblingsPath(set_object_name); + gtk_widget_path_append_with_siblings(path, pSiblingsPath, 0); + } + gtk_widget_path_unref(pSiblingsPath); + return makeContext(path, mpComboboxBoxStyle); + } + case GtkControlPart::ComboboxBoxButton: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpComboboxBoxStyle)); + GtkWidgetPath* pSiblingsPath; + if (AllSettings::GetLayoutRTL()) + { + pSiblingsPath = buildRTLComboSiblingsPath(set_object_name); + gtk_widget_path_append_with_siblings(path, pSiblingsPath, 0); + } + else + { + pSiblingsPath = buildLTRComboSiblingsPath(set_object_name); + gtk_widget_path_append_with_siblings(path, pSiblingsPath, 1); + } + gtk_widget_path_unref(pSiblingsPath); + return makeContext(path, mpComboboxBoxStyle); + } + case GtkControlPart::ListboxBoxButton: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpListboxBoxStyle)); + GtkWidgetPath* pSiblingsPath = gtk_widget_path_new(); + + gtk_widget_path_append_type(pSiblingsPath, GTK_TYPE_BUTTON); + set_object_name(pSiblingsPath, -1, "button"); + gtk_widget_path_iter_add_class(pSiblingsPath, -1, "combo"); + + gtk_widget_path_append_with_siblings(path, pSiblingsPath, 0); + gtk_widget_path_unref(pSiblingsPath); + return makeContext(path, mpListboxBoxStyle); + } + case GtkControlPart::ComboboxBoxButtonBox: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpComboboxButtonStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "box"); + gtk_widget_path_iter_add_class(path, -1, "horizontal"); + return makeContext(path, mpComboboxButtonStyle); + } + case GtkControlPart::ListboxBoxButtonBox: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpListboxButtonStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "box"); + gtk_widget_path_iter_add_class(path, -1, "horizontal"); + return makeContext(path, mpListboxButtonStyle); + } + case GtkControlPart::SpinButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_SPIN_BUTTON); + set_object_name(path, -1, "spinbutton"); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HORIZONTAL); + return makeContext(path, nullptr); + } + case GtkControlPart::SpinButtonEntry: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpSpinStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "entry"); + return makeContext(path, mpSpinStyle); + } + case GtkControlPart::SpinButtonUpButton: + case GtkControlPart::SpinButtonDownButton: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpSpinStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_SPIN_BUTTON); + set_object_name(path, -1, "button"); + gtk_widget_path_iter_add_class(path, -1, ePart == GtkControlPart::SpinButtonUpButton ? "up" : "down"); + return makeContext(path, mpSpinStyle); + } + case GtkControlPart::ScrollbarVertical: + case GtkControlPart::ScrollbarHorizontal: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); + set_object_name(path, -1, "scrollbar"); + gtk_widget_path_iter_add_class(path, -1, ePart == GtkControlPart::ScrollbarVertical ? "vertical" : "horizontal"); + return makeContext(path, nullptr); + } + case GtkControlPart::ScrollbarVerticalContents: + case GtkControlPart::ScrollbarHorizontalContents: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalContents) ? mpVScrollbarStyle : mpHScrollbarStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); + gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); + set_object_name(path, -1, "contents"); + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarVerticalTrough: + case GtkControlPart::ScrollbarHorizontalTrough: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalTrough) ? mpVScrollbarContentsStyle : mpHScrollbarContentsStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); + gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); + set_object_name(path, -1, "trough"); + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarVerticalSlider: + case GtkControlPart::ScrollbarHorizontalSlider: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalSlider) ? mpVScrollbarTroughStyle : mpHScrollbarTroughStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); + gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); + set_object_name(path, -1, "slider"); + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarVerticalButton: + case GtkControlPart::ScrollbarHorizontalButton: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalButton) ? mpVScrollbarStyle : mpHScrollbarStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); + gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); + set_object_name(path, -1, "button"); + return makeContext(path, pParent); + } + case GtkControlPart::ProgressBar: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); + set_object_name(path, -1, "progressbar"); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HORIZONTAL); + return makeContext(path, nullptr); + } + case GtkControlPart::ProgressBarTrough: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpProgressBarStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); + set_object_name(path, -1, "trough"); + return makeContext(path, mpProgressBarStyle); + } + case GtkControlPart::ProgressBarProgress: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpProgressBarTroughStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); + set_object_name(path, -1, "progress"); + return makeContext(path, mpProgressBarTroughStyle); + } + case GtkControlPart::Notebook: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpWindowStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + set_object_name(path, -1, "notebook"); + return makeContext(path, mpWindowStyle); + } + case GtkControlPart::NotebookStack: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + set_object_name(path, -1, "stack"); + return makeContext(path, mpNotebookStyle); + } + case GtkControlPart::NotebookHeader: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + set_object_name(path, -1, "header"); + gtk_widget_path_iter_add_class(path, -1, "frame"); + gtk_widget_path_iter_add_class(path, -1, "top"); + return makeContext(path, mpNotebookStyle); + } + case GtkControlPart::NotebookHeaderTabs: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + set_object_name(path, -1, "tabs"); + gtk_widget_path_iter_add_class(path, -1, "top"); + return makeContext(path, mpNotebookHeaderStyle); + } + case GtkControlPart::NotebookHeaderTabsTab: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + set_object_name(path, -1, "tab"); + gtk_widget_path_iter_add_class(path, -1, "top"); + return makeContext(path, mpNotebookHeaderTabsStyle); + } + case GtkControlPart::NotebookHeaderTabsTabLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsTabStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "label"); + return makeContext(path, mpNotebookHeaderTabsTabStyle); + } + case GtkControlPart::NotebookHeaderTabsTabActiveLabel: + case GtkControlPart::NotebookHeaderTabsTabHoverLabel: + return mpNotebookHeaderTabsTabLabelStyle; + case GtkControlPart::FrameBorder: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_FRAME); + set_object_name(path, -1, "frame"); + gtk_widget_path_iter_add_class(path, -1, "frame"); + return makeContext(path, nullptr); + } + case GtkControlPart::MenuBar: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpWindowStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU_BAR); + set_object_name(path, -1, "menubar"); + return makeContext(path, mpWindowStyle); + } + case GtkControlPart::MenuBarItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuBarStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); + set_object_name(path, -1, "menuitem"); + return makeContext(path, mpMenuBarStyle); + } + case GtkControlPart::MenuWindow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuBarItemStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "window"); + gtk_widget_path_iter_add_class(path, -1, "background"); + gtk_widget_path_iter_add_class(path, -1, "popup"); + return makeContext(path, mpMenuBarItemStyle); + } + case GtkControlPart::Menu: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuWindowStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU); + set_object_name(path, -1, "menu"); + return makeContext(path, mpMenuWindowStyle); + } + case GtkControlPart::MenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); + set_object_name(path, -1, "menuitem"); + return makeContext(path, mpMenuStyle); + } + case GtkControlPart::MenuItemLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuItemStyle)); + gtk_widget_path_append_type(path, G_TYPE_NONE); + set_object_name(path, -1, "label"); + return makeContext(path, mpMenuItemStyle); + } + case GtkControlPart::MenuItemArrow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); + set_object_name(path, -1, "arrow"); + return makeContext(path, mpMenuItemStyle); + } + case GtkControlPart::CheckMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_CHECK_MENU_ITEM); + set_object_name(path, -1, "menuitem"); + return makeContext(path, mpMenuStyle); + } + case GtkControlPart::CheckMenuItemCheck: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpCheckMenuItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_CHECK_MENU_ITEM); + set_object_name(path, -1, "check"); + return makeContext(path, mpCheckMenuItemStyle); + } + case GtkControlPart::RadioMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_RADIO_MENU_ITEM); + set_object_name(path, -1, "menuitem"); + return makeContext(path, mpMenuStyle); + } + case GtkControlPart::RadioMenuItemRadio: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpRadioMenuItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_RADIO_MENU_ITEM); + set_object_name(path, -1, "radio"); + return makeContext(path, mpRadioMenuItemStyle); + } + case GtkControlPart::SeparatorMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_SEPARATOR_MENU_ITEM); + set_object_name(path, -1, "menuitem"); + return makeContext(path, mpMenuStyle); + } + case GtkControlPart::SeparatorMenuItemSeparator: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpSeparatorMenuItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_SEPARATOR_MENU_ITEM); + set_object_name(path, -1, "separator"); + return makeContext(path, mpSeparatorMenuItemStyle); + } + } + + return nullptr; +} + +#ifndef GTK_STYLE_CLASS_POPUP +#define GTK_STYLE_CLASS_POPUP "popup" #endif - break; - case GtkControlPart::Entry: +#ifndef GTK_STYLE_CLASS_LABEL +#define GTK_STYLE_CLASS_LABEL "label" +#endif + +GtkStyleContext* GtkSalGraphics::createOldContext(GtkControlPart ePart) +{ + switch (ePart) + { + case GtkControlPart::ToplevelWindow: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_WINDOW); + gtk_widget_path_iter_add_class(path, -1, "background"); + return makeContext(path, nullptr); + } + case GtkControlPart::Button: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); + gtk_widget_path_iter_add_class(path, -1, "button"); + gtk_widget_path_iter_add_class(path, -1, "text-button"); + return makeContext(path, nullptr); + } + case GtkControlPart::LinkButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_LINK_BUTTON); + gtk_widget_path_iter_add_class(path, -1, "text-button"); + return makeContext(path, nullptr); + } + case GtkControlPart::CheckButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_CHECK_BUTTON); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_CHECK); + gtk_widget_path_iter_add_class(path, -1, "text-button"); + return makeContext(path, nullptr); + } + case GtkControlPart::CheckButtonCheck: + return mpCheckButtonStyle; + case GtkControlPart::RadioButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_RADIO_BUTTON); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_RADIO); + gtk_widget_path_iter_add_class(path, -1, "text-button"); + return makeContext(path, nullptr); + } + case GtkControlPart::RadioButtonRadio: + return mpRadioButtonStyle; + case GtkControlPart::ComboboxBoxButtonBoxArrow: + case GtkControlPart::ListboxBoxButtonBoxArrow: + { + return (ePart == GtkControlPart::ComboboxBoxButtonBoxArrow) + ? mpComboboxButtonStyle : mpListboxButtonStyle; + } + case GtkControlPart::Entry: + case GtkControlPart::ComboboxBoxEntry: + case GtkControlPart::SpinButtonEntry: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_ENTRY); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "entry"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_ENTRY); -#endif - break; + return makeContext(path, nullptr); + } + case GtkControlPart::Combobox: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_COMBO_BOX_TEXT); + return makeContext(path, nullptr); + } + case GtkControlPart::Listbox: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_COMBO_BOX); + return makeContext(path, nullptr); + } + case GtkControlPart::ComboboxBoxButton: + case GtkControlPart::ListboxBoxButton: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ComboboxBoxButton ) ? mpComboboxStyle : mpListboxStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); + gtk_widget_path_append_type(path, GTK_TYPE_TOGGLE_BUTTON); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); + gtk_widget_path_iter_add_class(path, -1, "the-button-in-the-combobox"); + return makeContext(path, pParent); + } case GtkControlPart::SpinButton: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_SPIN_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "spinbutton"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SPINBUTTON); -#endif + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_ENTRY); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HORIZONTAL); - break; + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SPINBUTTON); + return makeContext(path, nullptr); + } case GtkControlPart::SpinButtonUpButton: case GtkControlPart::SpinButtonDownButton: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpSpinStyle)); gtk_widget_path_append_type(path, GTK_TYPE_SPIN_BUTTON); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "button"); - gtk_widget_path_iter_add_class(path, -1, ePart == GtkControlPart::SpinButtonUpButton ? "up" : "down"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SPINBUTTON); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); -#endif - break; + return makeContext(path, mpSpinStyle); + } case GtkControlPart::ScrollbarVertical: case GtkControlPart::ScrollbarHorizontal: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "scrollbar"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SCROLLBAR); -#endif gtk_widget_path_iter_add_class(path, -1, ePart == GtkControlPart::ScrollbarVertical ? "vertical" : "horizontal"); - break; - case GtkControlPart::ScrollbarContents: + return makeContext(path, nullptr); + } + case GtkControlPart::ScrollbarVerticalContents: + case GtkControlPart::ScrollbarHorizontalContents: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalContents) ? mpVScrollbarStyle : mpHScrollbarStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "contents"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SCROLLBAR); gtk_widget_path_iter_add_class(path, -1, "contents"); -#endif - break; - case GtkControlPart::ScrollbarTrough: + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarHorizontalTrough: + case GtkControlPart::ScrollbarVerticalTrough: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalTrough) ? mpVScrollbarContentsStyle : mpHScrollbarContentsStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "trough"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SCROLLBAR); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_TROUGH); -#endif - break; - case GtkControlPart::ScrollbarSlider: + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarHorizontalSlider: + case GtkControlPart::ScrollbarVerticalSlider: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalSlider) ? mpVScrollbarContentsStyle : mpHScrollbarContentsStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "slider"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SCROLLBAR); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SLIDER); -#endif - break; - case GtkControlPart::ScrollbarButton: + return makeContext(path, pParent); + } + case GtkControlPart::ScrollbarHorizontalButton: + case GtkControlPart::ScrollbarVerticalButton: + { + GtkStyleContext *pParent = + (ePart == GtkControlPart::ScrollbarVerticalButton) ? mpVScrollbarStyle : mpHScrollbarStyle; + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(pParent)); gtk_widget_path_append_type(path, GTK_TYPE_SCROLLBAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "button"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SCROLLBAR); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_BUTTON); -#endif - break; + return makeContext(path, pParent); + } case GtkControlPart::ProgressBar: + { + GtkWidgetPath *path = gtk_widget_path_new(); gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "progressbar"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_PROGRESSBAR); -#endif gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HORIZONTAL); - break; + return makeContext(path, nullptr); + } case GtkControlPart::ProgressBarTrough: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpProgressBarStyle)); gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "trough"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_PROGRESSBAR); gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_TROUGH); -#endif - break; + return makeContext(path, mpProgressBarStyle); + } case GtkControlPart::ProgressBarProgress: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpProgressBarTroughStyle)); gtk_widget_path_append_type(path, GTK_TYPE_PROGRESS_BAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "progress"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_PROGRESSBAR); -#endif - break; + return makeContext(path, mpProgressBarTroughStyle); + } + case GtkControlPart::Notebook: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpWindowStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_NOTEBOOK); + gtk_widget_path_iter_add_class(path, -1, "frame"); + return makeContext(path, mpWindowStyle); + } + case GtkControlPart::NotebookStack: + return mpNotebookStyle; + case GtkControlPart::NotebookHeader: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookStyle)); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HEADER); + gtk_widget_path_iter_add_class(path, -1, "top"); + return makeContext(path, gtk_style_context_get_parent(mpNotebookStyle)); + } + case GtkControlPart::NotebookHeaderTabs: + return mpNotebookHeaderStyle; + case GtkControlPart::NotebookHeaderTabsTab: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HEADER); + gtk_widget_path_iter_add_class(path, -1, "top"); + gtk_widget_path_iter_add_region(path, -1, GTK_STYLE_REGION_TAB, static_cast<GtkRegionFlags>(GTK_REGION_EVEN | GTK_REGION_FIRST)); + return makeContext(path, mpNotebookHeaderTabsStyle); + } + case GtkControlPart::NotebookHeaderTabsTabLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsTabStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_LABEL); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_LABEL); + return makeContext(path, mpNotebookHeaderTabsTabStyle); + } + case GtkControlPart::NotebookHeaderTabsTabActiveLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsTabStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_LABEL); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_LABEL); + gtk_widget_path_iter_add_class(path, -1, "active-page"); + return makeContext(path, mpNotebookHeaderTabsTabStyle); + } + case GtkControlPart::NotebookHeaderTabsTabHoverLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpNotebookHeaderTabsTabStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_LABEL); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_LABEL); + gtk_widget_path_iter_add_class(path, -1, "prelight-page"); + return makeContext(path, mpNotebookHeaderTabsTabStyle); + } + case GtkControlPart::FrameBorder: + { + GtkWidgetPath *path = gtk_widget_path_new(); + gtk_widget_path_append_type(path, GTK_TYPE_FRAME); + gtk_widget_path_iter_add_class(path, -1, "frame"); + return makeContext(path, nullptr); + } case GtkControlPart::MenuBar: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpWindowStyle)); gtk_widget_path_append_type(path, GTK_TYPE_MENU_BAR); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menubar"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUBAR); -#endif - break; + return makeContext(path, mpWindowStyle); + } + case GtkControlPart::MenuBarItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuBarStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUITEM); + return makeContext(path, mpMenuBarStyle); + } + case GtkControlPart::MenuWindow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuBarItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_WINDOW); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_POPUP); + gtk_widget_path_iter_add_class(path, -1, "background"); + return makeContext(path, mpMenuBarItemStyle); + } + case GtkControlPart::Menu: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuWindowStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_MENU); + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENU); + return makeContext(path, mpMenuWindowStyle); + } case GtkControlPart::MenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menuitem"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUITEM); -#endif - break; + return makeContext(path, mpMenuStyle); + } + case GtkControlPart::MenuItemLabel: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuItemStyle)); + gtk_widget_path_append_type(path, GTK_TYPE_LABEL); + return makeContext(path, mpMenuItemStyle); + } case GtkControlPart::MenuItemArrow: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuItemStyle)); gtk_widget_path_append_type(path, GTK_TYPE_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "arrow"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_ARROW); -#endif - break; - case GtkControlPart::Menu: - gtk_widget_path_append_type(path, GTK_TYPE_MENU); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menu"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENU); -#endif - break; + return makeContext(path, mpMenuItemStyle); + } case GtkControlPart::CheckMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); gtk_widget_path_append_type(path, GTK_TYPE_CHECK_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menuitem"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUITEM); -#endif - break; + gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_CHECK); + return makeContext(path, mpMenuStyle); + } case GtkControlPart::CheckMenuItemCheck: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpCheckMenuItemStyle)); gtk_widget_path_append_type(path, GTK_TYPE_CHECK_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "check"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_CHECK); -#endif - break; + return makeContext(path, mpCheckMenuItemStyle); + } case GtkControlPart::RadioMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); gtk_widget_path_append_type(path, GTK_TYPE_RADIO_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menuitem"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUITEM); -#endif - break; + return makeContext(path, mpMenuStyle); + } case GtkControlPart::RadioMenuItemRadio: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpRadioMenuItemStyle)); gtk_widget_path_append_type(path, GTK_TYPE_RADIO_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "radio"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_RADIO); -#endif - break; + return makeContext(path, mpRadioMenuItemStyle); + } case GtkControlPart::SeparatorMenuItem: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpMenuStyle)); gtk_widget_path_append_type(path, GTK_TYPE_SEPARATOR_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "menuitem"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_MENUITEM); -#endif - break; + return makeContext(path, mpMenuStyle); + } case GtkControlPart::SeparatorMenuItemSeparator: + { + GtkWidgetPath *path = gtk_widget_path_copy(gtk_style_context_get_path(mpSeparatorMenuItemStyle)); gtk_widget_path_append_type(path, GTK_TYPE_SEPARATOR_MENU_ITEM); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "separator"); -#else gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_SEPARATOR); -#endif - break; - case GtkControlPart::Notebook: - gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "notebook"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_NOTEBOOK); -#endif - gtk_widget_path_iter_add_class(path, -1, "frame"); - break; - case GtkControlPart::NotebookStack: - gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "stack"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_NOTEBOOK); -#endif - break; - case GtkControlPart::NotebookHeader: - gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "header"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HEADER); -#endif - gtk_widget_path_iter_add_class(path, -1, "frame"); - gtk_widget_path_iter_add_class(path, -1, "top"); - break; - case GtkControlPart::NotebookHeaderTabs: - gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "tabs"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HEADER); -#endif - gtk_widget_path_iter_add_class(path, -1, "top"); - break; - case GtkControlPart::NotebookHeaderTabsTab: - gtk_widget_path_append_type(path, GTK_TYPE_NOTEBOOK); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "tab"); -#else - gtk_widget_path_iter_add_class(path, -1, GTK_STYLE_CLASS_HEADER); -#endif - gtk_widget_path_iter_add_class(path, -1, "top"); - break; - case GtkControlPart::FrameBorder: - gtk_widget_path_append_type(path, GTK_TYPE_FRAME); -#if GTK_CHECK_VERSION(3, 19, 2) - gtk_widget_path_iter_set_object_name(path, -1, "frame"); -#endif - gtk_widget_path_iter_add_class(path, -1, "frame"); + return makeContext(path, mpSeparatorMenuItemStyle); + } + case GtkControlPart::ComboboxBox: + case GtkControlPart::ListboxBox: + case GtkControlPart::ComboboxBoxButtonBox: + case GtkControlPart::ListboxBoxButtonBox: + return nullptr; + default: break; } - GtkStyleContext* context = gtk_style_context_new(); - gtk_style_context_set_path(context, path); - gtk_style_context_set_parent(context, parent); - gtk_widget_path_unref (path); - -#if !GTK_CHECK_VERSION(3, 19, 2) - if (ePart == GtkControlPart::NotebookHeaderTabsTab) - { - gtk_style_context_add_region(context, GTK_STYLE_REGION_TAB, GTK_REGION_ONLY); - } -#endif + return mpButtonStyle; +} - return context; +GtkStyleContext* GtkSalGraphics::createStyleContext(gtk_widget_path_iter_set_object_nameFunc set_object_name, + GtkControlPart ePart) +{ + if (set_object_name) + return createNewContext(ePart, set_object_name); + return createOldContext(ePart); } -#if GTK_CHECK_VERSION(3,13,7) -# define CHECKED GTK_STATE_FLAG_CHECKED -#else -# define CHECKED GTK_STATE_FLAG_ACTIVE +namespace +{ + GtkStateFlags CHECKED() + { +#if GTK_CHECK_VERSION(3,14,0) + if (gtk_check_version(3, 14, 0) == nullptr) + return GTK_STATE_FLAG_CHECKED; #endif + return GTK_STATE_FLAG_ACTIVE; + } -#if GTK_CHECK_VERSION(3,19,11) -# define ACTIVE_TAB GTK_STATE_FLAG_CHECKED -#else -# define ACTIVE_TAB GTK_STATE_FLAG_ACTIVE + GtkStateFlags ACTIVE_TAB() + { +#if GTK_CHECK_VERSION(3,20,0) + if (gtk_check_version(3, 20, 0) == nullptr) + return GTK_STATE_FLAG_CHECKED; #endif + return GTK_STATE_FLAG_ACTIVE; + } +} void GtkSalGraphics::PaintCheckOrRadio(cairo_t *cr, GtkStyleContext *context, const Rectangle& rControlRectangle, bool bIsCheck, bool bInMenu) @@ -1161,12 +1757,13 @@ void GtkSalGraphics::PaintCheckOrRadio(cairo_t *cr, GtkStyleContext *context, if (!bInMenu) gtk_render_background(context, cr, x, y, indicator_size, indicator_size); - gtk_render_frame(context, cr, x, y, indicator_size, indicator_size); if (bIsCheck) gtk_render_check(context, cr, x, y, indicator_size, indicator_size); else gtk_render_option(context, cr, x, y, indicator_size, indicator_size); + + gtk_render_frame(context, cr, x, y, indicator_size, indicator_size); } void GtkSalGraphics::PaintCheck(cairo_t *cr, GtkStyleContext *context, @@ -1181,14 +1778,6 @@ void GtkSalGraphics::PaintRadio(cairo_t *cr, GtkStyleContext *context, PaintCheckOrRadio(cr, context, rControlRectangle, false, bInMenu); } -void parent_styles_context_set_state(GtkStyleContext* context, GtkStateFlags flags) -{ - while ((context = gtk_style_context_get_parent(context))) - { - gtk_style_context_set_state(context, flags); - } -} - static gfloat getArrowSize(GtkStyleContext* context) { gfloat arrow_scaling = 1.0; @@ -1203,9 +1792,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co { RenderType renderType = nPart == ControlPart::Focus ? RenderType::Focus : RenderType::BackgroundAndFrame; GtkStyleContext *context = nullptr; -#if !GTK_CHECK_VERSION(3,19,2) const gchar *styleClass = nullptr; -#endif GdkPixbuf *pixbuf = nullptr; bool bInMenu = false; @@ -1215,7 +1802,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co { case ControlType::Spinbox: case ControlType::SpinButtons: - context = mpEntryStyle; + context = mpSpinStyle; renderType = RenderType::Spinbutton; break; case ControlType::Editbox: @@ -1229,8 +1816,16 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co renderType = RenderType::Combobox; break; case ControlType::Listbox: - context = mpListboxStyle; - renderType = nPart == ControlPart::Focus ? RenderType::Focus : RenderType::Combobox; + if (nPart == ControlPart::Focus) + { + renderType = RenderType::Focus; + context = mpListboxButtonStyle; + } + else + { + renderType = RenderType::Combobox; + context = mpListboxStyle; + } break; case ControlType::MenuPopup: bInMenu = true; @@ -1246,45 +1841,48 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co renderType = RenderType::BackgroundAndFrame; break; case ControlPart::MenuItemCheckMark: -#if GTK_CHECK_VERSION(3,19,2) - context = mpCheckMenuItemStyle; -#else - context = gtk_widget_get_style_context(gCheckMenuItemWidget); - styleClass = GTK_STYLE_CLASS_CHECK; -#endif + if (gtk_check_version(3, 20, 0) == nullptr) + context = mpCheckMenuItemCheckStyle; + else + { + context = gtk_widget_get_style_context(gCheckMenuItemWidget); + styleClass = GTK_STYLE_CLASS_CHECK; + } renderType = RenderType::Check; nType = ControlType::Checkbox; if (nState & ControlState::PRESSED) { - flags = (GtkStateFlags)(flags | CHECKED); + flags = (GtkStateFlags)(flags | CHECKED()); } break; case ControlPart::MenuItemRadioMark: -#if GTK_CHECK_VERSION(3,19,2) - context = mpRadioMenuItemStyle; -#else - context = gtk_widget_get_style_context(gCheckMenuItemWidget); - styleClass = GTK_STYLE_CLASS_RADIO; -#endif + if (gtk_check_version(3, 20, 0) == nullptr) + context = mpRadioMenuItemRadioStyle; + else + { + context = gtk_widget_get_style_context(gCheckMenuItemWidget); + styleClass = GTK_STYLE_CLASS_RADIO; + } renderType = RenderType::Radio; nType = ControlType::Radiobutton; if (nState & ControlState::PRESSED) { - flags = (GtkStateFlags)(flags | CHECKED); + flags = (GtkStateFlags)(flags | CHECKED()); } break; case ControlPart::Separator: - context = mpSeparatorMenuItemStyle; + context = mpSeparatorMenuItemSeparatorStyle; flags = (GtkStateFlags)(GTK_STATE_FLAG_BACKDROP | GTK_STATE_FLAG_INSENSITIVE); //GTK_STATE_FLAG_BACKDROP hack ? renderType = RenderType::MenuSeparator; break; case ControlPart::SubmenuArrow: -#if GTK_CHECK_VERSION(3,19,2) - context = mpMenuItemArrowStyle; -#else - context = gtk_widget_get_style_context(gCheckMenuItemWidget); - styleClass = GTK_STYLE_CLASS_ARROW; -#endif + if (gtk_check_version(3, 20, 0) == nullptr) + context = mpMenuItemArrowStyle; + else + { + context = gtk_widget_get_style_context(gCheckMenuItemWidget); + styleClass = GTK_STYLE_CLASS_ARROW; + } renderType = RenderType::Arrow; break; case ControlPart::Entire: @@ -1317,16 +1915,16 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co break; case ControlType::Radiobutton: flags = (GtkStateFlags)(flags | - ( (rValue.getTristateVal() == ButtonValue::On) ? CHECKED : GTK_STATE_FLAG_NORMAL)); - context = mpRadioButtonStyle; + ( (rValue.getTristateVal() == ButtonValue::On) ? CHECKED() : GTK_STATE_FLAG_NORMAL)); + context = mpRadioButtonRadioStyle; renderType = nPart == ControlPart::Focus ? RenderType::Focus : RenderType::Radio; break; case ControlType::Checkbox: flags = (GtkStateFlags)(flags | - ( (rValue.getTristateVal() == ButtonValue::On) ? CHECKED : + ( (rValue.getTristateVal() == ButtonValue::On) ? CHECKED() : (rValue.getTristateVal() == ButtonValue::Mixed) ? GTK_STATE_FLAG_INCONSISTENT : GTK_STATE_FLAG_NORMAL)); - context = mpCheckButtonStyle; + context = mpCheckButtonCheckStyle; renderType = nPart == ControlPart::Focus ? RenderType::Focus : RenderType::Check; break; case ControlType::Pushbutton: @@ -1359,7 +1957,8 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co case ControlType::TabItem: context = mpNotebookHeaderTabsTabStyle; if (nState & ControlState::SELECTED) - flags = (GtkStateFlags) (flags | ACTIVE_TAB); + flags = (GtkStateFlags) (flags | ACTIVE_TAB()); + renderType = RenderType::TabItem; break; case ControlType::WindowBackground: context = gtk_widget_get_style_context(mpWindow); @@ -1397,7 +1996,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co context = mpTreeHeaderButtonStyle; ButtonValue aButtonValue = rValue.getTristateVal(); if (aButtonValue == ButtonValue::On) - flags = (GtkStateFlags) (flags | CHECKED); + flags = (GtkStateFlags) (flags | CHECKED()); renderType = RenderType::Expander; break; } @@ -1431,31 +2030,12 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co long nWidth = rControlRegion.GetWidth(); long nHeight = rControlRegion.GetHeight(); - gtk_style_context_set_state(context, flags); - parent_styles_context_set_state(context, flags); - if (nType == ControlType::TabItem) - { - GtkBorder margin; -#if GTK_CHECK_VERSION(3,19,2) - gtk_style_context_get_margin(mpNotebookHeaderTabsTabStyle, gtk_style_context_get_state(mpNotebookHeaderTabsTabStyle), &margin); -#else - gint initial_gap(0); - gtk_style_context_get_style(mpNotebookStyle, - "initial-gap", &initial_gap, - nullptr); + style_context_set_state(context, flags); - margin.left = margin.right = initial_gap/2; -#endif - nX += margin.left; - nWidth -= (margin.left + margin.right); - } - -#if !GTK_CHECK_VERSION(3,19,2) if (styleClass) { gtk_style_context_add_class(context, styleClass); } -#endif switch(renderType) { @@ -1483,10 +2063,37 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co rControlRegion.GetWidth() - 1, rControlRegion.GetHeight() / 2); break; case RenderType::ToolbarSeparator: - gtk_render_line(context, cr, - rControlRegion.GetWidth() / 2, rControlRegion.GetHeight() * 0.2, - rControlRegion.GetWidth() / 2, rControlRegion.GetHeight() * 0.8 ); + { + const bool bNewStyle = gtk_check_version(3, 20, 0) == nullptr; + + gint nSeparatorWidth = 1; + + if (bNewStyle) + { + gtk_style_context_get(context, + gtk_style_context_get_state(context), + "min-width", &nSeparatorWidth, nullptr); + } + + gint nHalfSeparatorWidth = nSeparatorWidth / 2; + gint nHalfRegionWidth = rControlRegion.GetWidth() / 2; + + nX = nX + nHalfRegionWidth - nHalfSeparatorWidth; + nWidth = nSeparatorWidth; + nY = rControlRegion.GetHeight() * 0.1; + nHeight = rControlRegion.GetHeight() - (2 * nY); + + if (bNewStyle) + { + gtk_render_background(context, cr, nX, nY, nSeparatorWidth, nHeight); + gtk_render_frame(context, cr, nX, nY, nSeparatorWidth, nHeight); + } + else + { + gtk_render_line(context, cr, nX, nY, nX, nY + nHeight); + } break; + } case RenderType::Separator: if (nPart == ControlPart::SeparatorHorz) gtk_render_line(context, cr, 0, nHeight / 2, nWidth - 1, nHeight / 2); @@ -1505,7 +2112,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co PaintScrollbar(context, cr, rControlRegion, nType, nPart, rValue); break; case RenderType::Spinbutton: - PaintSpinButton(context, cr, rControlRegion, nType, nPart, rValue); + PaintSpinButton(flags, cr, rControlRegion, nType, nPart, rValue); break; case RenderType::Combobox: PaintCombobox(flags, cr, rControlRegion, nType, nPart, rValue); @@ -1535,7 +2142,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co case RenderType::Progress: { gtk_render_background(mpProgressBarTroughStyle, cr, nX, nY, nWidth, nHeight); - gtk_render_frame(mpProgressBarTroughStyle, cr, nX, nY, nWidth, nHeight); + long nProgressWidth = rValue.getNumericVal(); if (nProgressWidth) { @@ -1550,18 +2157,34 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co gtk_render_frame(context, cr, nX, nY, nProgressWidth, nHeight); } + gtk_render_frame(mpProgressBarTroughStyle, cr, nX, nY, nWidth, nHeight); + + break; + } + case RenderType::TabItem: + { + if (gtk_check_version(3, 20, 0) != nullptr) + { + gint initial_gap(0); + gtk_style_context_get_style(mpNotebookStyle, + "initial-gap", &initial_gap, + nullptr); + + nX += initial_gap/2; + nWidth -= initial_gap; + } + Rectangle aRect(Point(nX, nY), Size(nWidth, nHeight)); + render_common(mpNotebookHeaderTabsTabStyle, cr, aRect, flags); break; } default: break; } -#if !GTK_CHECK_VERSION(3,19,2) if (styleClass) { gtk_style_context_remove_class(context, styleClass); } -#endif cairo_destroy(cr); // unref @@ -1611,7 +2234,7 @@ bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPar { rNativeBoundingRegion = rControlRegion; - GtkStyleContext *pButtonStyle = (nType == ControlType::Checkbox) ? mpCheckButtonStyle : mpRadioButtonStyle; + GtkStyleContext *pButtonStyle = (nType == ControlType::Checkbox) ? mpCheckButtonCheckStyle : mpRadioButtonRadioStyle; gtk_style_context_get_style( pButtonStyle, @@ -1641,7 +2264,8 @@ bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPar { indicator_size = 0; - GtkStyleContext *pMenuItemStyle = (nPart == ControlPart::MenuItemCheckMark ) ? mpCheckMenuItemStyle : mpRadioMenuItemStyle; + GtkStyleContext *pMenuItemStyle = (nPart == ControlPart::MenuItemCheckMark ) ? mpCheckMenuItemCheckStyle + : mpRadioMenuItemRadioStyle; gtk_style_context_get_style( pMenuItemStyle, "indicator-size", &indicator_size, @@ -1655,7 +2279,7 @@ bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPar { gint separator_height, separator_width, wide_separators; - gtk_style_context_get_style (mpSeparatorMenuItemStyle, + gtk_style_context_get_style (mpSeparatorMenuItemSeparatorStyle, "wide-separators", &wide_separators, "separator-width", &separator_width, "separator-height", &separator_height, @@ -1685,10 +2309,6 @@ bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPar return true; } - if( (nType == ControlType::Menubar) && (nPart == ControlPart::Entire) ) - { - aEditRect = GetWidgetSize(rControlRegion, gMenuBarWidget); - } else if ( (nType==ControlType::Spinbox) && ((nPart==ControlPart::ButtonUp) || (nPart==ControlPart::ButtonDown) || (nPart==ControlPart::SubEdit)) ) @@ -1776,39 +2396,8 @@ static inline ::Color getColor( const GdkRGBA& rCol ) return ::Color( (int)(rCol.red * 0xFFFF) >> 8, (int)(rCol.green * 0xFFFF) >> 8, (int)(rCol.blue * 0xFFFF) >> 8 ); } -void GtkSalGraphics::updateSettings( AllSettings& rSettings ) +static vcl::Font getFont(GtkStyleContext* pStyle, const css::lang::Locale& rLocale) { - GtkStyleContext* pStyle = gtk_widget_get_style_context( mpWindow ); - GtkSettings* pSettings = gtk_widget_get_settings( mpWindow ); - StyleSettings aStyleSet = rSettings.GetStyleSettings(); - GdkRGBA color; - - // text colors - GdkRGBA text_color; - gtk_style_context_set_state(pStyle, GTK_STATE_FLAG_NORMAL); - gtk_style_context_get_color(pStyle, gtk_style_context_get_state(pStyle), &text_color); - ::Color aTextColor = getColor( text_color ); - aStyleSet.SetDialogTextColor( aTextColor ); - aStyleSet.SetButtonTextColor( aTextColor ); - aStyleSet.SetRadioCheckTextColor( aTextColor ); - aStyleSet.SetGroupTextColor( aTextColor ); - aStyleSet.SetLabelTextColor( aTextColor ); - aStyleSet.SetInfoTextColor( aTextColor ); - aStyleSet.SetWindowTextColor( aTextColor ); - aStyleSet.SetFieldTextColor( aTextColor ); - - // background colors - GdkRGBA background_color; - gtk_style_context_get_background_color(pStyle, gtk_style_context_get_state(pStyle), &background_color); - - ::Color aBackColor = getColor( background_color ); - aStyleSet.Set3DColors( aBackColor ); - aStyleSet.SetFaceColor( aBackColor ); - aStyleSet.SetDialogColor( aBackColor ); - aStyleSet.SetWorkspaceColor( aBackColor ); - aStyleSet.SetCheckedColorSpecialCase( ); - - // UI font const PangoFontDescription* font = gtk_style_context_get_font(pStyle, gtk_style_context_get_state(pStyle)); OString aFamily = pango_font_description_get_family( font ); int nPangoHeight = pango_font_description_get_size( font ); @@ -1856,7 +2445,7 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) #endif // match font to e.g. resolve "Sans" - psp::PrintFontManager::get().matchFont( aInfo, rSettings.GetUILanguageTag().getLocale() ); + psp::PrintFontManager::get().matchFont(aInfo, rLocale); #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", @@ -1865,13 +2454,6 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) #endif int nPointHeight = 0; - /*sal_Int32 nDispDPIY = GetDisplay()->GetResolution().B(); - static gboolean(*pAbso)(const PangoFontDescription*) = - (gboolean(*)(const PangoFontDescription*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "pango_font_description_get_size_is_absolute" ); - - if( pAbso && pAbso( font ) ) - nPointHeight = (nPangoHeight * 72 + nDispDPIY*PANGO_SCALE/2) / (nDispDPIY * PANGO_SCALE); - else*/ nPointHeight = nPangoHeight/PANGO_SCALE; vcl::Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); @@ -1883,6 +2465,43 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) aFont.SetItalic( aInfo.m_eItalic ); if( aInfo.m_ePitch != PITCH_DONTKNOW ) aFont.SetPitch( aInfo.m_ePitch ); + return aFont; +} + +void GtkSalGraphics::updateSettings( AllSettings& rSettings ) +{ + GtkStyleContext* pStyle = gtk_widget_get_style_context( mpWindow ); + GtkSettings* pSettings = gtk_widget_get_settings( mpWindow ); + StyleSettings aStyleSet = rSettings.GetStyleSettings(); + GdkRGBA color; + + // text colors + GdkRGBA text_color; + style_context_set_state(pStyle, GTK_STATE_FLAG_NORMAL); + gtk_style_context_get_color(pStyle, gtk_style_context_get_state(pStyle), &text_color); + ::Color aTextColor = getColor( text_color ); + aStyleSet.SetDialogTextColor( aTextColor ); + aStyleSet.SetButtonTextColor( aTextColor ); + aStyleSet.SetRadioCheckTextColor( aTextColor ); + aStyleSet.SetGroupTextColor( aTextColor ); + aStyleSet.SetLabelTextColor( aTextColor ); + aStyleSet.SetInfoTextColor( aTextColor ); + aStyleSet.SetWindowTextColor( aTextColor ); + aStyleSet.SetFieldTextColor( aTextColor ); + + // background colors + GdkRGBA background_color; + gtk_style_context_get_background_color(pStyle, gtk_style_context_get_state(pStyle), &background_color); + + ::Color aBackColor = getColor( background_color ); + aStyleSet.Set3DColors( aBackColor ); + aStyleSet.SetFaceColor( aBackColor ); + aStyleSet.SetDialogColor( aBackColor ); + aStyleSet.SetWorkspaceColor( aBackColor ); + aStyleSet.SetCheckedColorSpecialCase( ); + + // UI font + vcl::Font aFont(getFont(pStyle, rSettings.GetUILanguageTag().getLocale())); aStyleSet.SetAppFont( aFont ); aStyleSet.SetHelpFont( aFont ); @@ -1897,12 +2516,11 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) aStyleSet.SetGroupFont( aFont ); aFont.SetWeight( WEIGHT_BOLD ); - aStyleSet.SetTabFont( aFont ); //pull from notebook style + GTK_STYLE_REGION_TAB ? aStyleSet.SetTitleFont( aFont ); aStyleSet.SetFloatTitleFont( aFont ); // mouse over text colors - gtk_style_context_set_state(pStyle, GTK_STATE_FLAG_PRELIGHT); + style_context_set_state(pStyle, GTK_STATE_FLAG_PRELIGHT); gtk_style_context_get_color(pStyle, gtk_style_context_get_state(pStyle), &text_color); aTextColor = getColor( text_color ); aStyleSet.SetButtonRolloverTextColor( aTextColor ); @@ -1916,15 +2534,13 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) guint pos = gtk_widget_path_append_type(pCPath, GTK_TYPE_WINDOW); gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_TOOLTIP); pos = gtk_widget_path_append_type (pCPath, GTK_TYPE_LABEL); -#if GTK_CHECK_VERSION(3,16,0) gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_LABEL); -#endif pCStyle = gtk_style_context_new(); gtk_style_context_set_path(pCStyle, pCPath); gtk_widget_path_free(pCPath); GdkRGBA tooltip_bg_color, tooltip_fg_color; - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); + style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &tooltip_fg_color); gtk_style_context_get_background_color(pCStyle, gtk_style_context_get_state(pCStyle), &tooltip_bg_color); g_object_unref( pCStyle ); @@ -1944,7 +2560,7 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) gtk_widget_path_free( pCPath ); // highlighting colors - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_SELECTED); + style_context_set_state(pCStyle, GTK_STATE_FLAG_SELECTED); gtk_style_context_get_background_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); ::Color aHighlightColor = getColor( text_color ); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); @@ -1954,7 +2570,7 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) // field background color GdkRGBA field_background_color; - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); + style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color(pCStyle, gtk_style_context_get_state(pCStyle), &field_background_color); ::Color aBackFieldColor = getColor( field_background_color ); @@ -1963,7 +2579,7 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) aStyleSet.SetWindowColor( aBackFieldColor ); // Dark shadow color - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_INSENSITIVE); + style_context_set_state(pCStyle, GTK_STATE_FLAG_INSENSITIVE); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &color); ::Color aDarkShadowColor = getColor( color ); aStyleSet.SetDarkShadowColor( aDarkShadowColor ); @@ -1980,112 +2596,79 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) aStyleSet.SetAcceleratorsInContextMenus( false ); // menu colors - gtk_style_context_set_state(mpMenuStyle, GTK_STATE_FLAG_NORMAL); + style_context_set_state(mpMenuStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color( mpMenuStyle, gtk_style_context_get_state(mpMenuStyle), &background_color ); aBackColor = getColor( background_color ); aStyleSet.SetMenuColor( aBackColor ); - // menu items - gtk_style_context_get_color( mpMenuStyle, gtk_style_context_get_state(mpMenuStyle), &color ); - aTextColor = getColor( color ); - aStyleSet.SetMenuTextColor( aTextColor ); - // menu bar - gtk_style_context_set_state(mpMenuBarStyle, GTK_STATE_FLAG_NORMAL); + style_context_set_state(mpMenuBarStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color( mpMenuBarStyle, gtk_style_context_get_state(mpMenuBarStyle), &background_color ); aBackColor = getColor( background_color ); aStyleSet.SetMenuBarColor( aBackColor ); aStyleSet.SetMenuBarRolloverColor( aBackColor ); - gtk_style_context_set_state(mpMenuBarItemStyle, GTK_STATE_FLAG_NORMAL); + style_context_set_state(mpMenuBarItemStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_color( mpMenuBarItemStyle, gtk_style_context_get_state(mpMenuBarItemStyle), &text_color ); aTextColor = aStyleSet.GetPersonaMenuBarTextColor().get_value_or( getColor( text_color ) ); aStyleSet.SetMenuBarTextColor( aTextColor ); aStyleSet.SetMenuBarRolloverTextColor( aTextColor ); - gtk_style_context_set_state(mpMenuBarItemStyle, GTK_STATE_FLAG_PRELIGHT); + style_context_set_state(mpMenuBarItemStyle, GTK_STATE_FLAG_PRELIGHT); gtk_style_context_get_color( mpMenuBarItemStyle, gtk_style_context_get_state(mpMenuBarItemStyle), &text_color ); aTextColor = aStyleSet.GetPersonaMenuBarTextColor().get_value_or( getColor( text_color ) ); aStyleSet.SetMenuBarHighlightTextColor( aTextColor ); - gtk_style_context_set_state(mpMenuItemStyle, GTK_STATE_FLAG_PRELIGHT); - gtk_style_context_get_background_color( mpMenuItemStyle, gtk_style_context_get_state(mpMenuItemStyle), &background_color ); + // menu items + style_context_set_state(mpMenuItemLabelStyle, GTK_STATE_FLAG_NORMAL); + gtk_style_context_get_color(mpMenuItemLabelStyle, gtk_style_context_get_state(mpMenuItemLabelStyle), &color); + aTextColor = getColor(color); + aStyleSet.SetMenuTextColor(aTextColor); + + style_context_set_state(mpMenuItemLabelStyle, GTK_STATE_FLAG_PRELIGHT); + gtk_style_context_get_background_color( mpMenuItemLabelStyle, gtk_style_context_get_state(mpMenuItemLabelStyle), &background_color ); ::Color aHighlightColor = getColor( background_color ); aStyleSet.SetMenuHighlightColor( aHighlightColor ); - gtk_style_context_get_color( mpMenuItemStyle, gtk_style_context_get_state(mpMenuItemStyle), &color ); + gtk_style_context_get_color( mpMenuItemLabelStyle, gtk_style_context_get_state(mpMenuItemLabelStyle), &color ); ::Color aHighlightTextColor = getColor( color ); aStyleSet.SetMenuHighlightTextColor( aHighlightTextColor ); #if GTK_CHECK_VERSION(3, 12, 0) // hyperlink colors - gtk_style_context_set_state(mpLinkButtonStyle, GTK_STATE_FLAG_LINK); + style_context_set_state(mpLinkButtonStyle, GTK_STATE_FLAG_LINK); gtk_style_context_get_color(mpLinkButtonStyle, gtk_style_context_get_state(mpLinkButtonStyle), &text_color); aStyleSet.SetLinkColor(getColor(text_color)); - gtk_style_context_set_state(mpLinkButtonStyle, GTK_STATE_FLAG_VISITED); + style_context_set_state(mpLinkButtonStyle, GTK_STATE_FLAG_VISITED); gtk_style_context_get_color(mpLinkButtonStyle, gtk_style_context_get_state(mpLinkButtonStyle), &text_color); aStyleSet.SetVisitedLinkColor(getColor(text_color)); #endif -#if GTK_CHECK_VERSION(3, 19, 2) { - GtkStyleContext *pCStyle = mpNotebookHeaderTabsTabStyle; - - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); + GtkStyleContext *pCStyle = mpNotebookHeaderTabsTabLabelStyle; + style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); aTextColor = getColor( text_color ); aStyleSet.SetTabTextColor(aTextColor); - - // mouse over text colors - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_PRELIGHT); - gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); - aTextColor = getColor( text_color ); - aStyleSet.SetTabRolloverTextColor(aTextColor); - - gtk_style_context_set_state(pCStyle, ACTIVE_TAB); - gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); - aTextColor = getColor( text_color ); - aStyleSet.SetTabHighlightTextColor(aTextColor); + aStyleSet.SetTabFont(getFont(mpNotebookHeaderTabsTabLabelStyle, rSettings.GetUILanguageTag().getLocale())); } -#else - { - GtkStyleContext *pCStyle = gtk_style_context_new(); - gtk_style_context_set_screen( pCStyle, gtk_window_get_screen( GTK_WINDOW( mpWindow ) ) ); - GtkWidgetPath *pCPath = gtk_widget_path_new(); - guint pos = gtk_widget_path_append_type(pCPath, GTK_TYPE_NOTEBOOK); - gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_NOTEBOOK); - gtk_widget_path_iter_add_region(pCPath, pos, GTK_STYLE_REGION_TAB, static_cast<GtkRegionFlags>(GTK_REGION_EVEN | GTK_REGION_FIRST)); - pos = gtk_widget_path_append_type (pCPath, GTK_TYPE_LABEL); -#if GTK_CHECK_VERSION(3,16,0) - gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_LABEL); -#endif - pCStyle = gtk_style_context_new(); - gtk_style_context_set_path(pCStyle, pCPath); - gtk_widget_path_free(pCPath); - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL); - gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); - aTextColor = getColor( text_color ); - aStyleSet.SetTabTextColor(aTextColor); - - // mouse over text colors - gtk_style_context_add_class(pCStyle, "prelight-page"); - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_PRELIGHT); + // mouse over text colors + { + GtkStyleContext *pCStyle = mpNotebookHeaderTabsTabHoverLabelStyle; + style_context_set_state(pCStyle, GTK_STATE_FLAG_PRELIGHT); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); - gtk_style_context_remove_class(pCStyle, "prelight-page"); aTextColor = getColor( text_color ); aStyleSet.SetTabRolloverTextColor(aTextColor); + } - gtk_style_context_add_class(pCStyle, "active-page"); - gtk_style_context_set_state(pCStyle, GTK_STATE_FLAG_ACTIVE); + { + GtkStyleContext *pCStyle = mpNotebookHeaderTabsTabActiveLabelStyle; + style_context_set_state(pCStyle, ACTIVE_TAB()); gtk_style_context_get_color(pCStyle, gtk_style_context_get_state(pCStyle), &text_color); - gtk_style_context_remove_class(pCStyle, "active-page"); aTextColor = getColor( text_color ); aStyleSet.SetTabHighlightTextColor(aTextColor); - - g_object_unref( pCStyle ); - } -#endif + } // get cursor blink time gboolean blink = false; @@ -2336,13 +2919,18 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) mpFrame( pFrame ), mpWindow( pWindow ) { - if(style_loaded) + if (style_loaded) return; style_loaded = true; + /* Load the GtkStyleContexts, it might be a bit slow, but usually, * gtk apps create a lot of widgets at startup, so, it shouldn't be * too slow */ + gtk_widget_path_iter_set_object_nameFunc set_object_name = + reinterpret_cast<gtk_widget_path_iter_set_object_nameFunc>(osl_getAsciiFunctionSymbol(nullptr, + "gtk_widget_path_iter_set_object_name")); + gCacheWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gDumbContainer = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(gCacheWindow), gDumbContainer); @@ -2351,12 +2939,14 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) gEntryBox = gtk_entry_new(); gtk_container_add(GTK_CONTAINER(gDumbContainer), gEntryBox); - mpEntryStyle = createStyleContext(GtkControlPart::Entry); + + mpWindowStyle = createStyleContext(set_object_name, GtkControlPart::ToplevelWindow); + mpEntryStyle = createStyleContext(set_object_name, GtkControlPart::Entry); getStyleContext(&mpTextViewStyle, gtk_text_view_new()); - mpButtonStyle = createStyleContext(GtkControlPart::Button); - mpLinkButtonStyle = createStyleContext(GtkControlPart::LinkButton); + mpButtonStyle = createStyleContext(set_object_name, GtkControlPart::Button); + mpLinkButtonStyle = createStyleContext(set_object_name, GtkControlPart::LinkButton); GtkWidget* pToolbar = gtk_toolbar_new(); mpToolbarStyle = gtk_widget_get_style_context(pToolbar); @@ -2371,28 +2961,60 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), item, -1); mpToolButtonStyle = gtk_widget_get_style_context(GTK_WIDGET(pButton)); - mpVScrollbarStyle = createStyleContext(GtkControlPart::ScrollbarVertical); - mpVScrollbarContentsStyle = createStyleContext(GtkControlPart::ScrollbarContents, mpVScrollbarStyle); - mpVScrollbarTroughStyle = createStyleContext(GtkControlPart::ScrollbarTrough, mpVScrollbarContentsStyle); - mpVScrollbarSliderStyle = createStyleContext(GtkControlPart::ScrollbarSlider, mpVScrollbarTroughStyle); - mpVScrollbarButtonStyle = createStyleContext(GtkControlPart::ScrollbarButton, mpVScrollbarStyle); - mpHScrollbarStyle = createStyleContext(GtkControlPart::ScrollbarHorizontal); - mpHScrollbarContentsStyle = createStyleContext(GtkControlPart::ScrollbarContents, mpHScrollbarStyle); - mpHScrollbarTroughStyle = createStyleContext(GtkControlPart::ScrollbarTrough, mpHScrollbarContentsStyle); - mpHScrollbarSliderStyle = createStyleContext(GtkControlPart::ScrollbarSlider, mpHScrollbarTroughStyle); - mpHScrollbarButtonStyle = createStyleContext(GtkControlPart::ScrollbarButton, mpHScrollbarStyle); + mpVScrollbarStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarVertical); + mpVScrollbarContentsStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarVerticalContents); + mpVScrollbarTroughStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarVerticalTrough); + mpVScrollbarSliderStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarVerticalSlider); + mpVScrollbarButtonStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarVerticalButton); + mpHScrollbarStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarHorizontal); + mpHScrollbarContentsStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarHorizontalContents); + mpHScrollbarTroughStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarHorizontalTrough); + mpHScrollbarSliderStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarHorizontalSlider); + mpHScrollbarButtonStyle = createStyleContext(set_object_name, GtkControlPart::ScrollbarHorizontalButton); - { - GtkStyleContext* parentContext = createStyleContext(GtkControlPart::CheckButton); - mpCheckButtonStyle = createStyleContext(GtkControlPart::CheckButtonCheck, parentContext); - g_object_unref(parentContext); - } + mpCheckButtonStyle = createStyleContext(set_object_name, GtkControlPart::CheckButton); + mpCheckButtonCheckStyle = createStyleContext(set_object_name, GtkControlPart::CheckButtonCheck); - { - GtkStyleContext* parentContext = createStyleContext(GtkControlPart::RadioButton); - mpRadioButtonStyle = createStyleContext(GtkControlPart::RadioButtonRadio, parentContext); - g_object_unref(parentContext); - } + mpRadioButtonStyle = createStyleContext(set_object_name, GtkControlPart::RadioButton); + mpRadioButtonRadioStyle = createStyleContext(set_object_name, GtkControlPart::RadioButtonRadio); + + /* Spinbutton */ + gSpinBox = gtk_spin_button_new(nullptr, 0, 0); + gtk_container_add(GTK_CONTAINER(gDumbContainer), gSpinBox); + mpSpinStyle = createStyleContext(set_object_name, GtkControlPart::SpinButton); + mpSpinEntryStyle = createStyleContext(set_object_name, GtkControlPart::SpinButtonEntry); + mpSpinUpStyle = createStyleContext(set_object_name, GtkControlPart::SpinButtonUpButton); + mpSpinDownStyle = createStyleContext(set_object_name, GtkControlPart::SpinButtonDownButton); + + /* NoteBook */ + mpNotebookStyle = createStyleContext(set_object_name, GtkControlPart::Notebook); + mpNotebookStackStyle = createStyleContext(set_object_name, GtkControlPart::NotebookStack); + mpNotebookHeaderStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeader); + mpNotebookHeaderTabsStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeaderTabs); + mpNotebookHeaderTabsTabStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeaderTabsTab); + mpNotebookHeaderTabsTabLabelStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeaderTabsTabLabel); + mpNotebookHeaderTabsTabActiveLabelStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeaderTabsTabActiveLabel); + mpNotebookHeaderTabsTabHoverLabelStyle = createStyleContext(set_object_name, GtkControlPart::NotebookHeaderTabsTabHoverLabel); + + /* Combobox */ + gComboBox = gtk_combo_box_text_new_with_entry(); + gtk_container_add(GTK_CONTAINER(gDumbContainer), gComboBox); + mpComboboxStyle = createStyleContext(set_object_name, GtkControlPart::Combobox); + mpComboboxBoxStyle = createStyleContext(set_object_name, GtkControlPart::ComboboxBox); + mpComboboxEntryStyle = createStyleContext(set_object_name, GtkControlPart::ComboboxBoxEntry); + mpComboboxButtonStyle = createStyleContext(set_object_name, GtkControlPart::ComboboxBoxButton); + mpComboboxButtonBoxStyle = createStyleContext(set_object_name, GtkControlPart::ComboboxBoxButtonBox); + mpComboboxButtonArrowStyle = createStyleContext(set_object_name, GtkControlPart::ComboboxBoxButtonBoxArrow); + + /* Listbox */ + gListBox = gtk_combo_box_text_new(); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gListBox), "sample"); + gtk_container_add(GTK_CONTAINER(gDumbContainer), gListBox); + mpListboxStyle = createStyleContext(set_object_name, GtkControlPart::Listbox); + mpListboxBoxStyle = createStyleContext(set_object_name, GtkControlPart::ListboxBox); + mpListboxButtonStyle = createStyleContext(set_object_name, GtkControlPart::ListboxBoxButton); + mpListboxButtonBoxStyle = createStyleContext(set_object_name, GtkControlPart::ListboxBoxButtonBox); + mpListboxButtonArrowStyle = createStyleContext(set_object_name, GtkControlPart::ListboxBoxButtonBoxArrow); /* Menu bar */ gMenuBarWidget = gtk_menu_bar_new(); @@ -2400,11 +3022,12 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) gtk_menu_shell_append(GTK_MENU_SHELL(gMenuBarWidget), gMenuItemMenuBarWidget); gtk_container_add(GTK_CONTAINER(gDumbContainer), gMenuBarWidget); - mpMenuBarStyle = createStyleContext(GtkControlPart::MenuBar, gtk_widget_get_style_context(mpWindow)); - mpMenuBarItemStyle = createStyleContext(GtkControlPart::MenuItem, mpMenuBarStyle); + mpMenuBarStyle = createStyleContext(set_object_name, GtkControlPart::MenuBar); + mpMenuBarItemStyle = createStyleContext(set_object_name, GtkControlPart::MenuBarItem); /* Menu */ - mpMenuStyle = createStyleContext(GtkControlPart::Menu, gtk_widget_get_style_context(mpWindow)); + mpMenuWindowStyle = createStyleContext(set_object_name, GtkControlPart::MenuWindow); + mpMenuStyle = createStyleContext(set_object_name, GtkControlPart::Menu); GtkWidget *menu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(gMenuItemMenuBarWidget), menu); @@ -2412,39 +3035,18 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), gCheckMenuItemWidget); - mpMenuItemStyle = createStyleContext(GtkControlPart::MenuItem, mpMenuStyle); - mpMenuItemArrowStyle = createStyleContext(GtkControlPart::MenuItemArrow, mpMenuItemStyle); - mpCheckMenuItemStyle = createStyleContext(GtkControlPart::CheckMenuItemCheck, mpMenuItemStyle); - mpRadioMenuItemStyle = createStyleContext(GtkControlPart::RadioMenuItemRadio, mpMenuItemStyle); - mpSeparatorMenuItemStyle = createStyleContext(GtkControlPart::SeparatorMenuItemSeparator, mpMenuItemStyle); - - /* Spinbutton */ - gSpinBox = gtk_spin_button_new(nullptr, 0, 0); - gtk_container_add(GTK_CONTAINER(gDumbContainer), gSpinBox); - mpSpinStyle = createStyleContext(GtkControlPart::SpinButton); - mpSpinUpStyle = createStyleContext(GtkControlPart::SpinButtonUpButton, mpSpinStyle); - mpSpinDownStyle = createStyleContext(GtkControlPart::SpinButtonDownButton, mpSpinStyle); - - /* NoteBook */ - mpNotebookStyle = createStyleContext(GtkControlPart::Notebook); - mpNotebookStackStyle = createStyleContext(GtkControlPart::NotebookStack, mpNotebookStyle); - mpNotebookHeaderStyle = createStyleContext(GtkControlPart::NotebookHeader, mpNotebookStyle); - mpNotebookHeaderTabsStyle = createStyleContext(GtkControlPart::NotebookHeaderTabs, mpNotebookHeaderStyle); - mpNotebookHeaderTabsTabStyle = createStyleContext(GtkControlPart::NotebookHeaderTabsTab, mpNotebookHeaderTabsStyle); - - /* Combobox */ - gComboBox = gtk_combo_box_text_new_with_entry(); - getStyleContext(&mpComboboxStyle, gComboBox); - mpComboboxButtonStyle = createStyleContext(GtkControlPart::Button, mpComboboxStyle); - - /* Listbox */ - gListBox = gtk_combo_box_text_new(); - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gListBox), "sample"); - getStyleContext(&mpListboxStyle, gListBox); - mpListboxButtonStyle = createStyleContext(GtkControlPart::Button, mpListboxStyle); + mpMenuItemStyle = createStyleContext(set_object_name, GtkControlPart::MenuItem); + mpMenuItemLabelStyle = createStyleContext(set_object_name, GtkControlPart::MenuItemLabel); + mpMenuItemArrowStyle = createStyleContext(set_object_name, GtkControlPart::MenuItemArrow); + mpCheckMenuItemStyle = createStyleContext(set_object_name, GtkControlPart::CheckMenuItem); + mpCheckMenuItemCheckStyle = createStyleContext(set_object_name, GtkControlPart::CheckMenuItemCheck); + mpRadioMenuItemStyle = createStyleContext(set_object_name, GtkControlPart::RadioMenuItem); + mpRadioMenuItemRadioStyle = createStyleContext(set_object_name, GtkControlPart::RadioMenuItemRadio); + mpSeparatorMenuItemStyle = createStyleContext(set_object_name, GtkControlPart::SeparatorMenuItem); + mpSeparatorMenuItemSeparatorStyle = createStyleContext(set_object_name, GtkControlPart::SeparatorMenuItemSeparator); /* Frames */ - mpFrameOutStyle = mpFrameInStyle = createStyleContext(GtkControlPart::FrameBorder); + mpFrameOutStyle = mpFrameInStyle = createStyleContext(set_object_name, GtkControlPart::FrameBorder); getStyleContext(&mpFixedHoriLineStyle, gtk_separator_new(GTK_ORIENTATION_HORIZONTAL)); getStyleContext(&mpFixedVertLineStyle, gtk_separator_new(GTK_ORIENTATION_VERTICAL)); @@ -2471,9 +3073,9 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) mpTreeHeaderButtonStyle = gtk_widget_get_style_context(pTreeHeaderCellWidget); /* Progress Bar */ - mpProgressBarStyle = createStyleContext(GtkControlPart::ProgressBar); - mpProgressBarTroughStyle = createStyleContext(GtkControlPart::ProgressBar, mpProgressBarStyle); - mpProgressBarProgressStyle = createStyleContext(GtkControlPart::ProgressBarProgress, mpProgressBarTroughStyle); + mpProgressBarStyle = createStyleContext(set_object_name, GtkControlPart::ProgressBar); + mpProgressBarTroughStyle = createStyleContext(set_object_name, GtkControlPart::ProgressBar); + mpProgressBarProgressStyle = createStyleContext(set_object_name, GtkControlPart::ProgressBarProgress); gtk_widget_show_all(gDumbContainer); } |