#include "gtk/gtk.h"
#include "wx/gtk/win_gtk.h"
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
+//-----------------------------------------------------------------------------
+// data
//-----------------------------------------------------------------------------
extern wxList wxPendingDelete;
bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
{
+ if (g_isIdle) wxapp_install_idle_handler();
+
/*
printf( "OnDelete from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxDialog *win )
{
+ if (g_isIdle) wxapp_install_idle_handler();
+
if (!win->HasVMT()) return;
/*
static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win )
{
+ if (g_isIdle) wxapp_install_idle_handler();
+
if (!win->HasVMT()) return FALSE;
win->m_x = event->x;
return FALSE;
}
+//-----------------------------------------------------------------------------
+// "realize" from m_widget
+//-----------------------------------------------------------------------------
+
+/* we cannot MWM hints and icons before the widget has been realized,
+ so we do this directly after realization */
+
+static gint
+gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
+{
+ if (g_isIdle) wxapp_install_idle_handler();
+
+ /* reset the icon */
+ if (win->m_icon != wxNullIcon)
+ {
+ wxIcon icon( win->m_icon );
+ win->m_icon = wxNullIcon;
+ win->SetIcon( icon );
+ }
+
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// "map" from m_widget
+//-----------------------------------------------------------------------------
+
+static gint
+gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
+{
+ /* I haven''t been able to set the position of
+ the dialog before it is shown, so I do it here */
+ gtk_widget_set_uposition( widget, win->m_x, win->m_y );
+
+ /* all this is for Motif Window Manager "hints" and is supposed to be
+ recognized by other WM as well. not tested. */
+ long decor = (long) GDK_DECOR_BORDER;
+ long func = (long) GDK_FUNC_MOVE ;
+
+ if ((win->m_windowStyle & wxCAPTION) != 0)
+ decor |= GDK_DECOR_TITLE;
+ if ((win->m_windowStyle & wxSYSTEM_MENU) != 0)
+ {
+ decor |= GDK_DECOR_MENU;
+ func |= GDK_FUNC_CLOSE;
+ }
+ if ((win->m_windowStyle & wxMINIMIZE_BOX) != 0)
+ {
+ func |= GDK_FUNC_MINIMIZE;
+ decor |= GDK_DECOR_MINIMIZE;
+ }
+ if ((win->m_windowStyle & wxMAXIMIZE_BOX) != 0)
+ {
+ decor |= GDK_DECOR_MAXIMIZE;
+ func |= GDK_FUNC_MAXIMIZE;
+ }
+ if ((win->m_windowStyle & wxRESIZE_BORDER) != 0)
+ {
+ func |= GDK_FUNC_RESIZE;
+ decor |= GDK_DECOR_RESIZEH;
+ }
+ gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
+ gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
+
+ /* GTK's shrinking/growing policy */
+ if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
+ gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
+ else
+ gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
+
+ return FALSE;
+}
+
//-----------------------------------------------------------------------------
// wxDialog
//-----------------------------------------------------------------------------
PostCreation();
- gtk_widget_realize( m_widget );
+ /* we cannot set MWM hints before the widget has
+ been realized, so we do this directly after realization */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
+ GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
- /* all this is for Motif Window Manager "hints" and is supposed to be
- recognized by other WM as well. not tested. */
- long decor = (long) GDK_DECOR_ALL;
- long func = (long) GDK_FUNC_ALL;
-
- if ((m_windowStyle & wxCAPTION) == 0)
- decor |= GDK_DECOR_TITLE;
-/* if ((m_windowStyle & wxMINIMIZE) == 0)
- func |= GDK_FUNC_MINIMIZE;
- if ((m_windowStyle & wxMAXIMIZE) == 0)
- func |= GDK_FUNC_MAXIMIZE; */
- if ((m_windowStyle & wxSYSTEM_MENU) == 0)
- decor |= GDK_DECOR_MENU;
- if ((m_windowStyle & wxMINIMIZE_BOX) == 0)
- decor |= GDK_DECOR_MINIMIZE;
- if ((m_windowStyle & wxMAXIMIZE_BOX) == 0)
- decor |= GDK_DECOR_MAXIMIZE;
- if ((m_windowStyle & wxRESIZE_BORDER) == 0)
- func |= GDK_FUNC_RESIZE;
-
- gdk_window_set_decorations(m_widget->window, (GdkWMDecoration)decor);
- gdk_window_set_functions(m_widget->window, (GdkWMFunction)func);
-
- /* GTK's shrinking/growing policy */
- if ((m_windowStyle & wxRESIZE_BORDER) == 0)
- gtk_window_set_policy(GTK_WINDOW(m_widget), 0, 0, 1);
- else
- gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
+ /* we set the position of the window after the map event. setting it
+ before has no effect (with KWM) */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "map",
+ GTK_SIGNAL_FUNC(gtk_dialog_map_callback), (gpointer) this );
+ /* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );
{
if ((m_x != old_x) || (m_y != old_y))
{
- /* m_sizeSet = FALSE; */
+ /* we set the position here and when showing the dialog
+ for the first time in idle time */
gtk_widget_set_uposition( m_widget, m_x, m_y );
}
}
if ((m_width != old_width) || (m_height != old_height))
{
+ /* actual resizing is deferred to GtkOnSize in idle time and
+ when showing the dialog */
m_sizeSet = FALSE;
}
void wxDialog::OnInternalIdle()
{
- if (!m_sizeSet)
+ if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
GtkOnSize( m_x, m_y, m_width, m_height );
}
GtkOnSize( m_x, m_y, m_width, m_height );
}
- wxWindow::Show( show );
+ if (show != m_isShown)
+ {
+ if (show)
+ {
+ gtk_widget_show( m_widget );
+ }
+ else
+ gtk_widget_hide( m_widget );
+
+ m_isShown = show;
+ }
if (show) InitDialog();