X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e24b680c59e78f092c1be432b17b36f849065c36..ff534ba469473a9ace193e736ca131144df307f9:/src/gtk1/settings.cpp diff --git a/src/gtk1/settings.cpp b/src/gtk1/settings.cpp index 5efb1a3ebc..815c1e0aee 100644 --- a/src/gtk1/settings.cpp +++ b/src/gtk1/settings.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: gtk/settings.cpp +// Name: src/gtk1/settings.cpp // Purpose: // Author: Robert Roebling // Modified by: Mart Raudsepp (GetMetric) @@ -8,19 +8,16 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "settings.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #include "wx/settings.h" -#include "wx/debug.h" -#include "wx/cmndata.h" + +#ifndef WX_PRECOMP + #include "wx/toplevel.h" +#endif + #include "wx/fontutil.h" -#include "wx/toplevel.h" #include #include @@ -44,7 +41,9 @@ struct wxSystemObjects m_colHighlightText, m_colListBox, m_colBtnText, - m_colMenuItemHighlight; + m_colMenuItemHighlight, + m_colTooltip, + m_colTooltipText; wxFont m_fontSystem; }; @@ -82,7 +81,7 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, switch ( type ) { default: - wxFAIL_MSG( _T("unexpected GTK widget type") ); + wxFAIL_MSG( wxT("unexpected GTK widget type") ); // fall through case wxGTK_BUTTON: @@ -108,7 +107,7 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, switch ( colour ) { default: - wxFAIL_MSG( _T("unexpected GTK colour type") ); + wxFAIL_MSG( wxT("unexpected GTK colour type") ); // fall through case wxGTK_FG: @@ -128,11 +127,11 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, green = col[state].green; blue = col[state].blue; - ok = TRUE; + ok = true; } else { - ok = FALSE; + ok = false; } gtk_widget_destroy( widget ); @@ -140,6 +139,18 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, return ok; } +static void GetTooltipColors() +{ + GtkTooltips* tooltips = gtk_tooltips_new(); + gtk_tooltips_force_window(tooltips); + gtk_widget_ensure_style(tooltips->tip_window); + GdkColor c = tooltips->tip_window->style->bg[GTK_STATE_NORMAL]; + gs_objects.m_colTooltip = wxColor(c.red >> SHIFT, c.green >> SHIFT, c.blue >> SHIFT); + c = tooltips->tip_window->style->fg[GTK_STATE_NORMAL]; + gs_objects.m_colTooltipText = wxColor(c.red >> SHIFT, c.green >> SHIFT, c.blue >> SHIFT); + gtk_object_sink(reinterpret_cast(tooltips)); +} + wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) { switch (index) @@ -154,7 +165,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_BTNFACE: case wxSYS_COLOUR_MENUBAR: case wxSYS_COLOUR_3DLIGHT: - if (!gs_objects.m_colBtnFace.Ok()) + if (!gs_objects.m_colBtnFace.IsOk()) { int red, green, blue; if ( !GetColourFromGTKWidget(red, green, blue) ) @@ -179,7 +190,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_GRAYTEXT: case wxSYS_COLOUR_BTNSHADOW: //case wxSYS_COLOUR_3DSHADOW: - if (!gs_objects.m_colBtnShadow.Ok()) + if (!gs_objects.m_colBtnShadow.IsOk()) { wxColour faceColour(GetColour(wxSYS_COLOUR_3DFACE)); gs_objects.m_colBtnShadow = @@ -195,7 +206,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) return * wxWHITE; case wxSYS_COLOUR_HIGHLIGHT: - if (!gs_objects.m_colHighlight.Ok()) + if (!gs_objects.m_colHighlight.IsOk()) { int red, green, blue; if ( !GetColourFromGTKWidget(red, green, blue, @@ -214,7 +225,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) return gs_objects.m_colHighlight; case wxSYS_COLOUR_LISTBOX: - if (!gs_objects.m_colListBox.Ok()) + if (!gs_objects.m_colListBox.IsOk()) { int red, green, blue; if ( GetColourFromGTKWidget(red, green, blue, @@ -238,8 +249,8 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_CAPTIONTEXT: case wxSYS_COLOUR_INACTIVECAPTIONTEXT: case wxSYS_COLOUR_BTNTEXT: - case wxSYS_COLOUR_INFOTEXT: - if (!gs_objects.m_colBtnText.Ok()) + case wxSYS_COLOUR_LISTBOXTEXT: + if (!gs_objects.m_colBtnText.IsOk()) { int red, green, blue; if ( !GetColourFromGTKWidget(red, green, blue, @@ -258,14 +269,21 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) } return gs_objects.m_colBtnText; - // this (as well as wxSYS_COLOUR_INFOTEXT above) is used for - // tooltip windows - Robert, please change this code to use the - // real GTK tooltips when/if you can (TODO) case wxSYS_COLOUR_INFOBK: - return wxColour(255, 255, 225); + if (!gs_objects.m_colTooltip.IsOk()) { + GetTooltipColors(); + } + return gs_objects.m_colTooltip; + case wxSYS_COLOUR_INFOTEXT: + if (!gs_objects.m_colTooltipText.IsOk()) { + GetTooltipColors(); + } + return gs_objects.m_colTooltipText; + + case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT: case wxSYS_COLOUR_HIGHLIGHTTEXT: - if (!gs_objects.m_colHighlightText.Ok()) + if (!gs_objects.m_colHighlightText.IsOk()) { wxColour hclr = GetColour(wxSYS_COLOUR_HIGHLIGHT); if (hclr.Red() > 200 && hclr.Green() > 200 && hclr.Blue() > 200) @@ -280,7 +298,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_ACTIVECAPTION: case wxSYS_COLOUR_MENUHILIGHT: - if (!gs_objects.m_colMenuItemHighlight.Ok()) + if (!gs_objects.m_colMenuItemHighlight.IsOk()) { int red, green, blue; if ( !GetColourFromGTKWidget(red, green, blue, @@ -307,7 +325,7 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_MAX: default: - wxFAIL_MSG( _T("unknown system colour index") ); + wxFAIL_MSG( wxT("unknown system colour index") ); } return *wxWHITE; @@ -328,38 +346,9 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) case wxSYS_DEVICE_DEFAULT_FONT: case wxSYS_DEFAULT_GUI_FONT: { - if (!gs_objects.m_fontSystem.Ok()) + if (!gs_objects.m_fontSystem.IsOk()) { -#ifdef __WXGTK20__ - GtkWidget *widget = gtk_button_new(); - GtkStyle *def = gtk_rc_get_style( widget ); - if ( !def || !def->font_desc ) - def = gtk_widget_get_default_style(); - if ( def && def->font_desc ) - { - wxNativeFontInfo info; - info.description = - pango_font_description_copy(def->font_desc); - gs_objects.m_fontSystem = wxFont(info); - } - else - { - GtkSettings *settings = gtk_settings_get_default(); - gchar *font_name = NULL; - g_object_get ( settings, - "gtk-font-name", - &font_name, - NULL); - if (!font_name) - gs_objects.m_fontSystem = wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL ); - else - gs_objects.m_fontSystem = wxFont(wxString::FromAscii(font_name)); - g_free (font_name); - } - gtk_widget_destroy( widget ); -#else gs_objects.m_fontSystem = wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL ); -#endif } return gs_objects.m_fontSystem; } @@ -369,186 +358,30 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) } } -int wxSystemSettingsNative::GetMetric( wxSystemMetric index, wxWindow* win ) +int +wxSystemSettingsNative::GetMetric(wxSystemMetric index, wxWindow* WXUNUSED(win)) { -#ifdef __WXGTK20__ - bool success = false; - - guchar *data = NULL; - GdkWindow *window = NULL; - if(win && GTK_WIDGET_REALIZED(win->GetHandle())) - window = win->GetHandle()->window; -#endif - switch (index) { -#ifdef __WXGTK20__ - case wxSYS_BORDER_X: - case wxSYS_BORDER_Y: - case wxSYS_EDGE_X: - case wxSYS_EDGE_Y: - case wxSYS_FRAMESIZE_X: - case wxSYS_FRAMESIZE_Y: - // If a window is specified/realized, and it is a toplevel window, we can query from wm. - // The returned border thickness is outside the client area in that case. - if (window) - { - wxTopLevelWindow *tlw = wxDynamicCast(win, wxTopLevelWindow); - if (!tlw) - return -1; // not a tlw, not sure how to approach - else - { - // Check if wm supports frame extents - we can't know - // the border widths if it does not. -#if GTK_CHECK_VERSION(2,2,0) - if (!gtk_check_version(2,2,0)) - { - if (!gdk_x11_screen_supports_net_wm_hint( - gdk_drawable_get_screen(window), - gdk_atom_intern("_NET_FRAME_EXTENTS", false) ) ) - return -1; - } - else -#endif - { - if (!gdk_net_wm_supports(gdk_atom_intern("_NET_FRAME_EXTENTS", false))) - return -1; - } - - // Get the frame extents from the windowmanager. - // In most cases the top extent is the titlebar, so we use the bottom extent - // for the heights. - - Atom type; - gint format; - gulong nitems; - -#if GTK_CHECK_VERSION(2,2,0) - if (!gtk_check_version(2,2,0)) - { - gulong bytes_after; - success = (XGetWindowProperty (GDK_DISPLAY_XDISPLAY(gdk_drawable_get_display(window)), - GDK_WINDOW_XWINDOW(window), - gdk_x11_get_xatom_by_name_for_display ( - gdk_drawable_get_display(window), - "_NET_FRAME_EXTENTS" ), - 0, // left, right, top, bottom, CARDINAL[4]/32 - G_MAXLONG, // size of long - false, // do not delete property - XA_CARDINAL, // 32 bit - &type, &format, &nitems, &bytes_after, &data - ) == Success); - } -#endif - if (success) - { - int border_return = -1; - - if ((type == XA_CARDINAL) && (format == 32) && (nitems >= 4) && (data)) - { - long *borders; - borders = (long*)data; - switch(index) - { - case wxSYS_BORDER_X: - case wxSYS_EDGE_X: - case wxSYS_FRAMESIZE_X: - border_return = borders[1]; // width of right extent - break; - default: - border_return = borders[3]; // height of bottom extent - break; - } - } - - if (data) - XFree(data); - - return border_return; - } - } - } - - return -1; // no window specified -#endif // gtk2 - case wxSYS_CURSOR_X: case wxSYS_CURSOR_Y: -#ifdef __WXGTK24__ - if (!gtk_check_version(2,4,0)) - { - if (window) - return gdk_display_get_default_cursor_size(gdk_drawable_get_display(window)); - else - return gdk_display_get_default_cursor_size(gdk_display_get_default()); - } - else -#endif - return 16; - -#ifdef __WXGTK20__ - case wxSYS_DCLICK_X: - case wxSYS_DCLICK_Y: - gint dclick_distance; -#if GTK_CHECK_VERSION(2,2,0) - if (window && !gtk_check_version(2,2,0)) - g_object_get(gtk_settings_get_for_screen(gdk_drawable_get_screen(window)), - "gtk-double-click-distance", &dclick_distance, NULL); - else -#endif - g_object_get(gtk_settings_get_default(), - "gtk-double-click-distance", &dclick_distance, NULL); - - return dclick_distance * 2; -#endif // gtk2 - -#ifdef __WXGTK20__ - case wxSYS_DRAG_X: - case wxSYS_DRAG_Y: - gint drag_threshold; -#if GTK_CHECK_VERSION(2,2,0) - if (window && !gtk_check_version(2,2,0)) - { - g_object_get( - gtk_settings_get_for_screen(gdk_drawable_get_screen(window)), - "gtk-dnd-drag-threshold", - &drag_threshold, NULL); - } - else -#endif - { - g_object_get(gtk_settings_get_default(), - "gtk-dnd-drag-threshold", &drag_threshold, NULL); - } - - return drag_threshold * 2; -#endif + return 16; // MBN: ditto for icons case wxSYS_ICON_X: return 32; case wxSYS_ICON_Y: return 32; case wxSYS_SCREEN_X: -#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,2,0) - if (window && !gtk_check_version(2,2,0)) - return gdk_screen_get_width(gdk_drawable_get_screen(window)); - else -#endif - return gdk_screen_width(); + return gdk_screen_width(); case wxSYS_SCREEN_Y: -#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,2,0) - if (window && !gtk_check_version(2,2,0)) - return gdk_screen_get_height(gdk_drawable_get_screen(window)); - else -#endif - return gdk_screen_height(); + return gdk_screen_height(); case wxSYS_HSCROLL_Y: return 15; case wxSYS_VSCROLL_X: return 15; // a gtk1 implementation should be possible too if gtk2 efficiency/convenience functions aren't used -#ifdef __WXGTK20__ +#if 0 case wxSYS_CAPTION_Y: if (!window) // No realized window specified, and no implementation for that case yet. @@ -636,13 +469,13 @@ bool wxSystemSettingsNative::HasFeature(wxSystemFeature index) { switch (index) { - case wxSYS_CAN_ICONIZE_FRAME: - return FALSE; - break; + case wxSYS_CAN_ICONIZE_FRAME: + return false; + case wxSYS_CAN_DRAW_FRAME_DECORATIONS: - return TRUE; - break; + return true; + default: - return FALSE; + return false; } }