X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7e14e49f384b19c88a98796a6bc3a911d9cffdf3..f5ba273ecd799f652736ce2bc830283787302a56:/src/gtk/dialog.cpp diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index fb8e676622..55d5e95511 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -14,16 +14,13 @@ #include "wx/dialog.h" #include "wx/frame.h" #include "wx/app.h" - -#include "gdk/gdk.h" -#include "gtk/gtk.h" -#include "wx/gtk/win_gtk.h" #include "wx/cursor.h" -/* -#include "gdk/gdkprivate.h" -#include "gdk/gdkx.h" -*/ +#include +#include +#include + +#include "wx/gtk/win_gtk.h" //----------------------------------------------------------------------------- // idle system @@ -31,6 +28,7 @@ extern void wxapp_install_idle_handler(); extern bool g_isIdle; +extern int g_openDialogs; //----------------------------------------------------------------------------- // data @@ -38,6 +36,20 @@ extern bool g_isIdle; extern wxList wxPendingDelete; +//----------------------------------------------------------------------------- +// "focus" from m_window +//----------------------------------------------------------------------------- + +static gint gtk_dialog_focus_callback( GtkWidget *widget, GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) ) +{ + if (g_isIdle) + wxapp_install_idle_handler(); + + // This disables GTK's tab traversal + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus" ); + return TRUE; +} + //----------------------------------------------------------------------------- // "delete_event" //----------------------------------------------------------------------------- @@ -47,7 +59,8 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED if (g_isIdle) wxapp_install_idle_handler(); - win->Close(); + if (win->IsEnabled()) + win->Close(); return TRUE; } @@ -67,7 +80,7 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation { win->m_width = alloc->width; win->m_height = alloc->height; - win->UpdateSize(); + win->GtkUpdateSize(); } } @@ -76,7 +89,7 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation //----------------------------------------------------------------------------- static gint -#if (GTK_MINOR_VERSON > 0) +#if (GTK_MINOR_VERSION > 0) gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDialog *win ) #else gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win ) @@ -87,7 +100,7 @@ gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *e if (!win->m_hasVMT) return FALSE; -#if (GTK_MINOR_VERSON > 0) +#if (GTK_MINOR_VERSION > 0) int x = 0; int y = 0; gdk_window_get_root_origin( win->m_widget->window, &x, &y ); @@ -118,13 +131,10 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win ) if (g_isIdle) wxapp_install_idle_handler(); - // FIXME I don't know when does it appear, but it's not in 1.2.2 -#if GTK_CHECK_VERSION(1, 2, 3) /* I haven't been able to set the position of the dialog before it is shown, so I set the position in "realize" */ - gtk_window_reposition( GTK_WINDOW(widget), win->m_x, win->m_y ); -#endif // GTK > 1.2.2 + 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. */ @@ -171,16 +181,16 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win ) gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); /* set size hints */ - gint flag = GDK_HINT_POS; + gint flag = 0; // GDK_HINT_POS; if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE; if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE; if (flag) { gdk_window_set_hints( win->m_widget->window, - win->m_x, win->m_y, - win->GetMinWidth(), win->GetMinHeight(), - win->GetMaxWidth(), win->GetMaxHeight(), - flag ); + win->m_x, win->m_y, + win->GetMinWidth(), win->GetMinHeight(), + win->GetMaxWidth(), win->GetMaxHeight(), + flag ); } /* reset the icon */ @@ -265,9 +275,12 @@ bool wxDialog::Create( wxWindow *parent, !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { wxFAIL_MSG( wxT("wxDialog creation failed") ); - return FALSE; + return FALSE; } + // All dialogs should really have this style + m_windowStyle |= wxTAB_TRAVERSAL; + m_insertCallback = (wxInsertChildFunction) wxInsertChildInDialog; m_widget = gtk_window_new( GTK_WINDOW_DIALOG ); @@ -307,6 +320,10 @@ bool wxDialog::Create( wxWindow *parent, gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", GTK_SIGNAL_FUNC(gtk_dialog_configure_callback), (gpointer)this ); + /* disable native tab traversal */ + gtk_signal_connect( GTK_OBJECT(m_widget), "focus", + GTK_SIGNAL_FUNC(gtk_dialog_focus_callback), (gpointer)this ); + return TRUE; } @@ -321,7 +338,8 @@ wxDialog::~wxDialog() wxTheApp->SetTopWindow( (wxWindow*) NULL ); } - if (wxTopLevelWindows.Number() == 0) + if ((wxTopLevelWindows.Number() == 0) && + (wxTheApp->GetExitOnFrameDelete())) { wxTheApp->ExitMainLoop(); } @@ -449,6 +467,11 @@ void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) } } +void wxDialog::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) ) +{ + wxFAIL_MSG( wxT("DoMoveWindow called for wxDialog") ); +} + void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") ); @@ -459,6 +482,7 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) int old_x = m_x; int old_y = m_y; + int old_width = m_width; int old_height = m_height; @@ -494,18 +518,15 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; - // FIXME I don't know when does it appear, but it's not in 1.2.2 -#if GTK_CHECK_VERSION(1, 2, 3) if ((m_x != -1) || (m_y != -1)) { if ((m_x != old_x) || (m_y != old_y)) { /* we set the position here and when showing the dialog for the first time in idle time */ - gtk_window_reposition( GTK_WINDOW(m_widget), m_x, m_y ); + gtk_widget_set_uposition( m_widget, m_x, m_y ); } } -#endif // GTK > 1.2.2 if ((m_width != old_width) || (m_height != old_height)) { @@ -606,10 +627,14 @@ int wxDialog::ShowModal() m_modalShowing = TRUE; + g_openDialogs++; + gtk_grab_add( m_widget ); gtk_main(); gtk_grab_remove( m_widget ); + g_openDialogs--; + return GetReturnCode(); }