]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/popupwin.cpp
Fixed strange situation when we had wxPathExists and wxDirExists with the same fincti...
[wxWidgets.git] / src / gtk / popupwin.cpp
index 236a69d036ba98a5372904522f13abfce28f1f9b..9593f43a573284e9b63492fd6b8b03783941833e 100644 (file)
@@ -7,11 +7,12 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "popupwin.h"
 #endif
 
-#include "wx/defs.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
 #if wxUSE_POPUPWIN
 
 extern void wxapp_install_idle_handler();
 extern bool g_isIdle;
 
+//-----------------------------------------------------------------------------
+// "button_press"
+//-----------------------------------------------------------------------------
+
+static gint gtk_popup_button_press (GtkWidget *widget, GdkEvent *gdk_event, wxPopupWindow* win )
+{
+    GtkWidget *child = gtk_get_event_widget (gdk_event);
+
+  /* We don't ask for button press events on the grab widget, so
+   *  if an event is reported directly to the grab widget, it must
+   *  be on a window outside the application (and thus we remove
+   *  the popup window). Otherwise, we check if the widget is a child
+   *  of the grab widget, and only remove the popup window if it
+   *  is not.
+   */
+    if (child != widget)
+    {
+        while (child)
+           {
+               if (child == widget)
+                   return FALSE;
+            child = child->parent;
+        }
+    }
+
+    wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
+    event.SetEventObject( win );
+
+    (void)win->GetEventHandler()->ProcessEvent( event );
+
+    return TRUE;
+}
+
 //-----------------------------------------------------------------------------
 // "focus" from m_window
 //-----------------------------------------------------------------------------
@@ -102,11 +136,7 @@ gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxPopupWindow *win )
     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->GetWindowStyle() & 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);
+    gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
 
     return FALSE;
 }
@@ -117,7 +147,7 @@ gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxPopupWindow *win )
 
 /* Callback for wxFrame. This very strange beast has to be used because
  * C++ has no virtual methods in a constructor. We have to emulate a
- * virtual function here as wxWindows requires different ways to insert
+ * virtual function here as wxWidgets requires different ways to insert
  * a child in container classes. */
 
 static void wxInsertChildInDialog( wxPopupWindow* parent, wxWindow* child )
@@ -147,12 +177,8 @@ BEGIN_EVENT_TABLE(wxPopupWindow,wxPopupWindowBase)
 #endif
 END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow)
-
 wxPopupWindow::~wxPopupWindow()
 {
-    if (GTK_WIDGET_HAS_GRAB(m_widget))
-        gtk_grab_remove( m_widget );
 }
 
 bool wxPopupWindow::Create( wxWindow *parent, int style )
@@ -196,14 +222,17 @@ bool wxPopupWindow::Create( wxWindow *parent, int style )
     gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
                         GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
 
-    /* the user resized the frame by dragging etc. */
+    // 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 );
 
-    /* disable native tab traversal */
+    // disable native tab traversal
     gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
         GTK_SIGNAL_FUNC(gtk_dialog_focus_callback), (gpointer)this );
 
+    gtk_signal_connect (GTK_OBJECT(m_widget), "button_press_event",
+        GTK_SIGNAL_FUNC(gtk_popup_button_press), (gpointer)this );
+        
     return TRUE;
 }
 
@@ -298,30 +327,30 @@ void wxPopupWindow::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int
     m_width = width;
     m_height = height;
 
+    /* FIXME: is this a hack? */
+    /* since for some reason GTK will revert to using maximum size ever set
+       for this window, we have to set geometry hints maxsize to match
+       size given. */
     int minWidth = GetMinWidth(),
-        minHeight = GetMinHeight(),
-        maxWidth = GetMaxWidth(),
-        maxHeight = GetMaxHeight();
+        minHeight = GetMinHeight();
 
     if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth;
     if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight;
-    if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth;
-    if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight;
 
     /* set size hints */
-    gint flag = 0; // GDK_HINT_POS;
+    gint flag = GDK_HINT_MAX_SIZE; // GDK_HINT_POS;
     if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
-    if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
     GdkGeometry geom;
     geom.min_width = minWidth;
     geom.min_height = minHeight;
-    geom.max_width = maxWidth;
-    geom.max_height = maxHeight;
+    geom.max_width = m_width;
+    geom.max_height = m_height;
     gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
                                    (GtkWidget*) NULL,
                                    &geom,
                                    (GdkWindowHints) flag );
 
+
     m_sizeSet = TRUE;
 
     wxSizeEvent event( wxSize(m_width,m_height), GetId() );
@@ -349,14 +378,8 @@ bool wxPopupWindow::Show( bool show )
         GtkOnSize( m_x, m_y, m_width, m_height );
     }
     
-    if (!show)
-        gtk_grab_remove( m_widget );
-    
     bool ret = wxWindow::Show( show );
     
-    if (show)
-        gtk_grab_add( m_widget );
-    
     return ret;
 }