/////////////////////////////////////////////////////////////////////////////
-// Name: gtk/settings.cpp
+// Name: src/gtk1/settings.cpp
// Purpose:
// Author: Robert Roebling
// Modified by: Mart Raudsepp (GetMetric)
// 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 <gdk/gdk.h>
#include <gdk/gdkx.h>
m_colHighlightText,
m_colListBox,
m_colBtnText,
- m_colMenuItemHighlight;
+ m_colMenuItemHighlight,
+ m_colTooltip,
+ m_colTooltipText;
wxFont m_fontSystem;
};
switch ( type )
{
default:
- wxFAIL_MSG( _T("unexpected GTK widget type") );
+ wxFAIL_MSG( wxT("unexpected GTK widget type") );
// fall through
case wxGTK_BUTTON:
case wxGTK_LIST:
widget = gtk_list_new();
-
+ break;
+
case wxGTK_MENUITEM:
widget = gtk_menu_item_new();
}
switch ( colour )
{
default:
- wxFAIL_MSG( _T("unexpected GTK colour type") );
+ wxFAIL_MSG( wxT("unexpected GTK colour type") );
// fall through
case wxGTK_FG:
green = col[state].green;
blue = col[state].blue;
- ok = TRUE;
+ ok = true;
}
else
{
- ok = FALSE;
+ ok = false;
}
gtk_widget_destroy( widget );
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<GtkObject*>(tooltips));
+}
+
wxColour wxSystemSettingsNative::GetColour( wxSystemColour index )
{
switch (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) )
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 =
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,
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,
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,
}
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)
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,
case wxSYS_COLOUR_MAX:
default:
- wxFAIL_MSG( _T("unknown system colour index") );
- }
+ wxFAIL_MSG( wxT("unknown system colour index") );
+ }
- return *wxWHITE;
+ return *wxWHITE;
}
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;
}
}
}
-int wxSystemSettingsNative::GetMetric( wxSystemMetric index, wxWindow* win )
+int
+wxSystemSettingsNative::GetMetric(wxSystemMetric index, wxWindow* WXUNUSED(win))
{
-#ifdef __WXGTK20__
- 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;
- gulong bytes_after;
-
- if (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)
- {
- 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.
Atom type;
gint format;
gulong nitems;
- gulong bytes_after;
- if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY(gdk_drawable_get_display(window)),
+#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),
false, // do not delete property
XA_CARDINAL, // 32 bit
&type, &format, &nitems, &bytes_after, &data
- ) == Success)
+ ) == Success);
+ }
+#endif
+ if (success)
{
int caption_height = -1;
{
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;
}
}