X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9f2968ad0ba775e6785c3eb4a3fea5ad19352e26..0d53638f7147c18153f63fdfc096b17be6e22a27:/src/gtk/settings.cpp diff --git a/src/gtk/settings.cpp b/src/gtk/settings.cpp index 6e5e0f363f..97f72c61d4 100644 --- a/src/gtk/settings.cpp +++ b/src/gtk/settings.cpp @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Modified by: Mart Raudsepp (GetMetric) -// Id: $Id$ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,14 +13,15 @@ #include "wx/settings.h" #ifndef WX_PRECOMP - #include "wx/cmndata.h" #include "wx/toplevel.h" #endif #include "wx/fontutil.h" +#include "wx/fontenum.h" #include #include "wx/gtk/private/win_gtk.h" +#include "wx/gtk/private/gtk2-compat.h" bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int* bottom); @@ -44,26 +44,34 @@ static GtkContainer* ContainerWidget() } extern "C" { +#ifdef __WXGTK3__ +static void style_updated(GtkWidget*, void*) +#else static void style_set(GtkWidget*, GtkStyle*, void*) +#endif { gs_fontSystem = wxNullFont; } } -static const GtkStyle* ButtonStyle() +static GtkWidget* ButtonWidget() { static GtkWidget* s_widget; if (s_widget == NULL) { s_widget = gtk_button_new(); gtk_container_add(ContainerWidget(), s_widget); +#ifdef __WXGTK3__ + g_signal_connect(s_widget, "style_updated", G_CALLBACK(style_updated), NULL); +#else gtk_widget_ensure_style(s_widget); g_signal_connect(s_widget, "style_set", G_CALLBACK(style_set), NULL); +#endif } - return s_widget->style; + return s_widget; } -static const GtkStyle* ListStyle() +static GtkWidget* ListWidget() { static GtkWidget* s_widget; if (s_widget == NULL) @@ -71,60 +79,213 @@ static const GtkStyle* ListStyle() s_widget = gtk_tree_view_new_with_model( GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_INT))); gtk_container_add(ContainerWidget(), s_widget); +#ifndef __WXGTK3__ gtk_widget_ensure_style(s_widget); +#endif } - return s_widget->style; + return s_widget; } -static const GtkStyle* TextCtrlStyle() +static GtkWidget* TextCtrlWidget() { static GtkWidget* s_widget; if (s_widget == NULL) { s_widget = gtk_text_view_new(); gtk_container_add(ContainerWidget(), s_widget); +#ifndef __WXGTK3__ gtk_widget_ensure_style(s_widget); +#endif } - return s_widget->style; + return s_widget; } -static const GtkStyle* MenuItemStyle() +static GtkWidget* MenuItemWidget() { static GtkWidget* s_widget; if (s_widget == NULL) { s_widget = gtk_menu_item_new(); gtk_container_add(ContainerWidget(), s_widget); +#ifndef __WXGTK3__ gtk_widget_ensure_style(s_widget); +#endif } - return s_widget->style; + return s_widget; } -static const GtkStyle* MenuBarStyle() +static GtkWidget* MenuBarWidget() { static GtkWidget* s_widget; if (s_widget == NULL) { s_widget = gtk_menu_bar_new(); gtk_container_add(ContainerWidget(), s_widget); +#ifndef __WXGTK3__ gtk_widget_ensure_style(s_widget); +#endif } - return s_widget->style; + return s_widget; } -static const GtkStyle* ToolTipStyle() +static GtkWidget* ToolTipWidget() { static GtkWidget* s_widget; if (s_widget == NULL) { s_widget = gtk_window_new(GTK_WINDOW_POPUP); const char* name = "gtk-tooltip"; +#ifndef __WXGTK3__ if (gtk_check_version(2, 11, 0)) name = "gtk-tooltips"; +#endif gtk_widget_set_name(s_widget, name); +#ifndef __WXGTK3__ gtk_widget_ensure_style(s_widget); +#endif + } + return s_widget; +} + +#ifdef __WXGTK3__ +static void bg(GtkWidget* widget, GtkStateFlags state, GdkRGBA& gdkRGBA) +{ + GtkStyleContext* sc = gtk_widget_get_style_context(widget); + gtk_style_context_get_background_color(sc, state, &gdkRGBA); +} +static void fg(GtkWidget* widget, GtkStateFlags state, GdkRGBA& gdkRGBA) +{ + GtkStyleContext* sc = gtk_widget_get_style_context(widget); + gtk_style_context_get_color(sc, state, &gdkRGBA); +} +static void border(GtkWidget* widget, GtkStateFlags state, GdkRGBA& gdkRGBA) +{ + GtkStyleContext* sc = gtk_widget_get_style_context(widget); + gtk_style_context_get_border_color(sc, state, &gdkRGBA); +} + +wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) +{ + GdkRGBA gdkRGBA = { 0, 0, 0, 1 }; + switch (index) + { + case wxSYS_COLOUR_3DLIGHT: + case wxSYS_COLOUR_ACTIVEBORDER: + case wxSYS_COLOUR_BTNFACE: + case wxSYS_COLOUR_DESKTOP: + case wxSYS_COLOUR_INACTIVEBORDER: + case wxSYS_COLOUR_INACTIVECAPTION: + case wxSYS_COLOUR_SCROLLBAR: + case wxSYS_COLOUR_WINDOWFRAME: + bg(ButtonWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_BTNHIGHLIGHT: + case wxSYS_COLOUR_HIGHLIGHT: + bg(ButtonWidget(), GTK_STATE_FLAG_SELECTED, gdkRGBA); + break; + case wxSYS_COLOUR_BTNSHADOW: + border(ButtonWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_BTNTEXT: + case wxSYS_COLOUR_WINDOWTEXT: + fg(ButtonWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_GRAYTEXT: + case wxSYS_COLOUR_INACTIVECAPTIONTEXT: + fg(ButtonWidget(), GTK_STATE_FLAG_INSENSITIVE, gdkRGBA); + break; + case wxSYS_COLOUR_HIGHLIGHTTEXT: + fg(ButtonWidget(), GTK_STATE_FLAG_SELECTED, gdkRGBA); + break; + case wxSYS_COLOUR_HOTLIGHT: + { + static GtkWidget* s_widget; + if (s_widget == NULL) + { + s_widget = gtk_link_button_new(""); + gtk_container_add(ContainerWidget(), s_widget); + } + fg(s_widget, GTK_STATE_FLAG_NORMAL, gdkRGBA); + } + break; + case wxSYS_COLOUR_INFOBK: + bg(ToolTipWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_INFOTEXT: + fg(ToolTipWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_LISTBOX: + bg(ListWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT: + fg(ListWidget(), GTK_STATE_FLAG_SELECTED, gdkRGBA); + break; + case wxSYS_COLOUR_LISTBOXTEXT: + fg(ListWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_MENU: + bg(MenuItemWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_MENUBAR: + bg(MenuBarWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_ACTIVECAPTION: + case wxSYS_COLOUR_MENUHILIGHT: + bg(MenuItemWidget(), GTK_STATE_FLAG_SELECTED, gdkRGBA); + break; + case wxSYS_COLOUR_MENUTEXT: + fg(MenuItemWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_APPWORKSPACE: + case wxSYS_COLOUR_WINDOW: + bg(TextCtrlWidget(), GTK_STATE_FLAG_NORMAL, gdkRGBA); + break; + case wxSYS_COLOUR_CAPTIONTEXT: + { + GdkRGBA c = { 1, 1, 1, 1 }; + gdkRGBA = c; + } + break; + default: + wxFAIL_MSG("unknown system colour index"); + // fallthrough + case wxSYS_COLOUR_3DDKSHADOW: + case wxSYS_COLOUR_GRADIENTACTIVECAPTION: + case wxSYS_COLOUR_GRADIENTINACTIVECAPTION: + // black + break; } - return s_widget->style; + return wxColour(gdkRGBA); +} +#else +static const GtkStyle* ButtonStyle() +{ + return gtk_widget_get_style(ButtonWidget()); +} + +static const GtkStyle* ListStyle() +{ + return gtk_widget_get_style(ListWidget()); +} + +static const GtkStyle* TextCtrlStyle() +{ + return gtk_widget_get_style(TextCtrlWidget()); +} + +static const GtkStyle* MenuItemStyle() +{ + return gtk_widget_get_style(MenuItemWidget()); +} + +static const GtkStyle* MenuBarStyle() +{ + return gtk_widget_get_style(MenuBarWidget()); +} + +static const GtkStyle* ToolTipStyle() +{ + return gtk_widget_get_style(ToolTipWidget()); } wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) @@ -189,6 +350,12 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) color = wxColor(ListStyle()->text[GTK_STATE_NORMAL]); break; + case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT: + // This is for the text in a list control (or tree) when the + // item is selected, but not focused + color = wxColor(ListStyle()->text[GTK_STATE_ACTIVE]); + break; + case wxSYS_COLOUR_MENUTEXT: case wxSYS_COLOUR_WINDOWTEXT: case wxSYS_COLOUR_CAPTIONTEXT: @@ -227,13 +394,15 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_MAX: default: - wxFAIL_MSG( _T("unknown system colour index") ); + wxFAIL_MSG( wxT("unknown system colour index") ); color = *wxWHITE; break; } + wxASSERT(color.IsOk()); return color; } +#endif wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) { @@ -250,11 +419,26 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) case wxSYS_SYSTEM_FONT: case wxSYS_DEVICE_DEFAULT_FONT: case wxSYS_DEFAULT_GUI_FONT: - if (!gs_fontSystem.Ok()) + if (!gs_fontSystem.IsOk()) { wxNativeFontInfo info; +#ifdef __WXGTK3__ + GtkStyleContext* sc = gtk_widget_get_style_context(ButtonWidget()); + info.description = const_cast( + gtk_style_context_get_font(sc, GTK_STATE_FLAG_NORMAL)); +#else info.description = ButtonStyle()->font_desc; +#endif gs_fontSystem = wxFont(info); + +#if wxUSE_FONTENUM + // (try to) heal the default font (on some common systems e.g. Ubuntu + // it's "Sans Serif" but the real font is called "Sans"): + if (!wxFontEnumerator::IsValidFacename(gs_fontSystem.GetFaceName()) && + gs_fontSystem.GetFaceName() == "Sans Serif") + gs_fontSystem.SetFaceName("Sans"); +#endif // wxUSE_FONTENUM + info.description = NULL; } font = gs_fontSystem; @@ -263,6 +447,9 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) default: break; } + + wxASSERT( font.IsOk() ); + return font; } @@ -270,7 +457,7 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) // on or for the default screen if window is NULL static GtkSettings *GetSettingsForWindowScreen(GdkWindow *window) { - return window ? gtk_settings_get_for_screen(gdk_drawable_get_screen(window)) + return window ? gtk_settings_get_for_screen(gdk_window_get_screen(window)) : gtk_settings_get_default(); } @@ -279,16 +466,16 @@ static int GetBorderWidth(wxSystemMetric index, wxWindow* win) if (win->m_wxwindow) { wxPizza* pizza = WX_PIZZA(win->m_wxwindow); - int x, y; - pizza->get_border_widths(x, y); + GtkBorder border; + pizza->get_border(border); switch (index) { case wxSYS_BORDER_X: case wxSYS_EDGE_X: case wxSYS_FRAMESIZE_X: - return x; + return border.left; default: - return y; + return border.top; } } return -1; @@ -297,8 +484,8 @@ static int GetBorderWidth(wxSystemMetric index, wxWindow* win) int wxSystemSettingsNative::GetMetric( wxSystemMetric index, wxWindow* win ) { GdkWindow *window = NULL; - if(win && GTK_WIDGET_REALIZED(win->GetHandle())) - window = win->GetHandle()->window; + if (win) + window = gtk_widget_get_window(win->GetHandle()); switch (index) { @@ -339,7 +526,7 @@ int wxSystemSettingsNative::GetMetric( wxSystemMetric index, wxWindow* win ) case wxSYS_CURSOR_X: case wxSYS_CURSOR_Y: return gdk_display_get_default_cursor_size( - window ? gdk_drawable_get_display(window) + window ? gdk_window_get_display(window) : gdk_display_get_default()); case wxSYS_DCLICK_X: @@ -376,13 +563,13 @@ int wxSystemSettingsNative::GetMetric( wxSystemMetric index, wxWindow* win ) case wxSYS_SCREEN_X: if (window) - return gdk_screen_get_width(gdk_drawable_get_screen(window)); + return gdk_screen_get_width(gdk_window_get_screen(window)); else return gdk_screen_width(); case wxSYS_SCREEN_Y: if (window) - return gdk_screen_get_height(gdk_drawable_get_screen(window)); + return gdk_screen_get_height(gdk_window_get_screen(window)); else return gdk_screen_height();