GetParentForModalDialog() was called from the ctor initialized list before m_windowStyle could be initialized by the base class ctor in several different places, meaning that the check for wxDIALOG_NO_PARENT in this function was using uninitialized variable. Fix this by passing the style parameter explicitly to this function to allow using it from derived class ctors. Still keep an overload which uses the actual window parent and flags which is simpler to use for later calls to this function. Thanks valgrind for finding this one. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64019 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
209 lines
5.5 KiB
C++
209 lines
5.5 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: gtk/colordlg.cpp
|
|
// Purpose: Native wxColourDialog for GTK+
|
|
// Author: Vaclav Slavik
|
|
// Modified by:
|
|
// Created: 2004/06/04
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Vaclav Slavik, 2004
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_COLOURDLG
|
|
|
|
#include "wx/colordlg.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/intl.h"
|
|
#endif
|
|
|
|
#include "wx/gtk/private.h"
|
|
|
|
#if wxUSE_LIBHILDON
|
|
#include <hildon-widgets/hildon-color-selector.h>
|
|
#endif // wxUSE_LIBHILDON
|
|
|
|
#if wxUSE_LIBHILDON2
|
|
extern "C" {
|
|
#include <hildon/hildon.h>
|
|
}
|
|
#endif // wxUSE_LIBHILDON2
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxColourDialog, wxDialog)
|
|
|
|
wxColourDialog::wxColourDialog(wxWindow *parent, wxColourData *data)
|
|
{
|
|
Create(parent, data);
|
|
}
|
|
|
|
bool wxColourDialog::Create(wxWindow *parent, wxColourData *data)
|
|
{
|
|
if (data)
|
|
m_data = *data;
|
|
|
|
m_parent = GetParentForModalDialog(parent, 0);
|
|
GtkWindow * const parentGTK = m_parent ? GTK_WINDOW(m_parent->m_widget)
|
|
: NULL;
|
|
|
|
#if wxUSE_LIBHILDON
|
|
m_widget = hildon_color_selector_new(parentGTK);
|
|
#elif wxUSE_LIBHILDON2 // !wxUSE_LIBHILDON
|
|
m_widget = hildon_color_chooser_dialog_new();
|
|
#else // !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
wxString title(_("Choose colour"));
|
|
m_widget = gtk_color_selection_dialog_new(wxGTK_CONV(title));
|
|
#endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON
|
|
|
|
g_object_ref(m_widget);
|
|
|
|
if ( parentGTK )
|
|
{
|
|
gtk_window_set_transient_for(GTK_WINDOW(m_widget), parentGTK);
|
|
}
|
|
|
|
#if !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
GtkColorSelection *sel =
|
|
GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(m_widget)->colorsel);
|
|
gtk_color_selection_set_has_palette(sel, true);
|
|
#endif // !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
|
|
return true;
|
|
}
|
|
|
|
int wxColourDialog::ShowModal()
|
|
{
|
|
ColourDataToDialog();
|
|
|
|
gint result = gtk_dialog_run(GTK_DIALOG(m_widget));
|
|
gtk_widget_hide(m_widget);
|
|
|
|
switch (result)
|
|
{
|
|
default:
|
|
wxFAIL_MSG(wxT("unexpected GtkColorSelectionDialog return code"));
|
|
// fall through
|
|
|
|
case GTK_RESPONSE_CANCEL:
|
|
case GTK_RESPONSE_DELETE_EVENT:
|
|
case GTK_RESPONSE_CLOSE:
|
|
return wxID_CANCEL;
|
|
|
|
case GTK_RESPONSE_OK:
|
|
DialogToColourData();
|
|
return wxID_OK;
|
|
}
|
|
}
|
|
|
|
void wxColourDialog::ColourDataToDialog()
|
|
{
|
|
const GdkColor * const
|
|
col = m_data.GetColour().Ok() ? m_data.GetColour().GetColor()
|
|
: NULL;
|
|
|
|
#if wxUSE_LIBHILDON
|
|
HildonColorSelector * const sel = HILDON_COLOR_SELECTOR(m_widget);
|
|
hildon_color_selector_set_color(sel, const_cast<GdkColor *>(col));
|
|
#elif wxUSE_LIBHILDON2
|
|
GdkColor clr;
|
|
if (col)
|
|
clr = *col;
|
|
else {
|
|
clr.pixel = 0;
|
|
clr.red = 32768;
|
|
clr.green = 32768;
|
|
clr.blue = 32768;
|
|
}
|
|
|
|
hildon_color_chooser_dialog_set_color((HildonColorChooserDialog *)m_widget, &clr);
|
|
#else // !wxUSE_LIBHILDON2/!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
GtkColorSelection *sel =
|
|
GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(m_widget)->colorsel);
|
|
|
|
if ( col )
|
|
gtk_color_selection_set_current_color(sel, col);
|
|
|
|
// setup the palette:
|
|
|
|
GdkColor colors[16];
|
|
gint n_colors = 0;
|
|
for (unsigned i = 0; i < 16; i++)
|
|
{
|
|
wxColour c = m_data.GetCustomColour(i);
|
|
if (c.Ok())
|
|
{
|
|
colors[n_colors] = *c.GetColor();
|
|
n_colors++;
|
|
}
|
|
}
|
|
|
|
wxGtkString pal(gtk_color_selection_palette_to_string(colors, n_colors));
|
|
|
|
GtkSettings *settings = gtk_widget_get_settings(GTK_WIDGET(sel));
|
|
g_object_set(settings, "gtk-color-palette", pal.c_str(), NULL);
|
|
#endif // wxUSE_LIBHILDON / wxUSE_LIBHILDON2 /!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
}
|
|
|
|
void wxColourDialog::DialogToColourData()
|
|
{
|
|
#if wxUSE_LIBHILDON
|
|
HildonColorSelector * const sel = HILDON_COLOR_SELECTOR(m_widget);
|
|
const GdkColor * const clr = hildon_color_selector_get_color(sel);
|
|
if ( clr )
|
|
m_data.SetColour(*clr);
|
|
#elif wxUSE_LIBHILDON2 // !wxUSE_LIBHILDON
|
|
const GdkColor * const
|
|
col = m_data.GetColour().Ok() ? m_data.GetColour().GetColor() : NULL;
|
|
|
|
GdkColor clr;
|
|
if (col)
|
|
clr = *col;
|
|
else {
|
|
clr.pixel = 0;
|
|
clr.red = 32768;
|
|
clr.green = 32768;
|
|
clr.blue = 32768;
|
|
}
|
|
GdkColor new_color = clr;
|
|
hildon_color_chooser_dialog_get_color((HildonColorChooserDialog *)m_widget, &new_color);
|
|
|
|
m_data.SetColour(new_color);
|
|
#else // !wxUSE_LIBHILDON2
|
|
|
|
GtkColorSelection *sel =
|
|
GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(m_widget)->colorsel);
|
|
|
|
GdkColor clr;
|
|
gtk_color_selection_get_current_color(sel, &clr);
|
|
m_data.SetColour(clr);
|
|
|
|
// Extract custom palette:
|
|
|
|
GtkSettings *settings = gtk_widget_get_settings(GTK_WIDGET(sel));
|
|
gchar *pal;
|
|
g_object_get(settings, "gtk-color-palette", &pal, NULL);
|
|
|
|
GdkColor *colors;
|
|
gint n_colors;
|
|
if (gtk_color_selection_palette_from_string(pal, &colors, &n_colors))
|
|
{
|
|
for (int i = 0; i < wxMin(n_colors, 16); i++)
|
|
{
|
|
m_data.SetCustomColour(i, wxColour(colors[i]));
|
|
}
|
|
g_free(colors);
|
|
}
|
|
|
|
g_free(pal);
|
|
#endif // wxUSE_LIBHILDON / wxUSE_LIBHILDON2 /!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
|
|
}
|
|
|
|
#endif // wxUSE_COLOURDLG
|
|
|