X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/789dbcd4e35cdab7085c6f15c2cb10615cdb3624..437a79a631586ff7f25558abfcdecbad22d9864b:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 1bd4d35d83..18713c609d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -655,6 +655,21 @@ static long map_to_wx_keysym( KeySym keysym ) return (key_code); } +//----------------------------------------------------------------------------- +// "size_request" of m_widget +//----------------------------------------------------------------------------- + +static void gtk_window_size_request_callback( GtkWidget *widget, GtkRequisition *requisition, wxWindow *win ) +{ + int w,h; + win->GetSize( &w, &h ); + if (w < 2) w = 2; + if (h < 2) h = 2; + + requisition->height = h; + requisition->width = w; +} + //----------------------------------------------------------------------------- // "expose_event" of m_wxwindow //----------------------------------------------------------------------------- @@ -680,18 +695,15 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev */ GtkPizza *pizza = GTK_PIZZA (widget); - - if (win->IsTopLevel()) - { - gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, - GTK_SHADOW_NONE, &gdk_event->area, win->m_widget, "base", 0, 0, -1, -1); - } - - wxWindow *parent = win->GetParent(); - if (parent && GTK_IS_NOTEBOOK(parent->m_widget)) + + if (win->GetThemeEnabled()) { - while (!parent->IsTopLevel()) + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) parent = parent->GetParent(); + if (!parent) + parent = win; + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, &gdk_event->area, parent->m_widget, "base", 0, 0, -1, -1); } @@ -701,18 +713,22 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev gdk_event->area.width, gdk_event->area.height ); - if (gdk_event->count == 0) - { - wxEraseEvent eevent( win->GetId() ); - eevent.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent(eevent); - - wxPaintEvent event( win->GetId() ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + if (gdk_event->count == 0) + { + win->m_clipPaintRegion = TRUE; + + wxEraseEvent eevent( win->GetId() ); + eevent.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent(eevent); - win->GetUpdateRegion().Clear(); - } + wxPaintEvent event( win->GetId() ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); + + win->GetUpdateRegion().Clear(); + + win->m_clipPaintRegion = FALSE; + } /* The following code will result in all window-less widgets being redrawn if the wxWindows class is given a chance to @@ -776,7 +792,13 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW if (g_isIdle) wxapp_install_idle_handler(); - + + if ((win->HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) && + (win->GetChildren().GetCount() == 0)) + { + return; + } + /* if (win->GetName() == wxT("panel")) { @@ -792,48 +814,46 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW GtkPizza *pizza = GTK_PIZZA (widget); - if (win->IsTopLevel()) + if (win->GetThemeEnabled()) { - gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, - GTK_SHADOW_NONE, rect, win->m_widget, "base", 0, 0, -1, -1); - } - - wxWindow *parent = win->GetParent(); - if (parent && GTK_IS_NOTEBOOK(parent->m_widget)) - { - while (!parent->IsTopLevel()) + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) parent = parent->GetParent(); + if (!parent) + parent = win; + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, rect, parent->m_widget, "base", 0, 0, -1, -1); } - if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && - (pizza->clear_on_draw)) - { - gdk_window_clear_area( pizza->bin_window, + + if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && + (pizza->clear_on_draw)) + { + gdk_window_clear_area( pizza->bin_window, rect->x, rect->y, rect->width, rect->height); - } + } - win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); + win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); - win->m_clipPaintRegion = TRUE; + win->m_clipPaintRegion = TRUE; - wxEraseEvent eevent( win->GetId() ); - eevent.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent(eevent); + wxEraseEvent eevent( win->GetId() ); + eevent.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent(eevent); - wxPaintEvent event( win->GetId() ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxPaintEvent event( win->GetId() ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); - win->GetUpdateRegion().Clear(); + win->GetUpdateRegion().Clear(); - win->m_clipPaintRegion = FALSE; + win->m_clipPaintRegion = FALSE; - GList *children = pizza->children; - while (children) - { + GList *children = pizza->children; + while (children) + { GtkPizzaChild *child = (GtkPizzaChild*) children->data; children = children->next; @@ -842,7 +862,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW { gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); } - } + } } //----------------------------------------------------------------------------- @@ -1073,25 +1093,29 @@ static void AdjustEventButtonState(wxMouseEvent& event) // for compatibility with MSW and common sense we want m_leftDown be TRUE // for a LEFT_DOWN event, not FALSE, so we will invert // left/right/middleDown for the corresponding click events - switch ( event.GetEventType() ) + + if ((event.GetEventType() == wxEVT_LEFT_DOWN) || + (event.GetEventType() == wxEVT_LEFT_DCLICK) || + (event.GetEventType() == wxEVT_LEFT_UP)) { - case wxEVT_LEFT_DOWN: - case wxEVT_LEFT_DCLICK: - case wxEVT_LEFT_UP: - event.m_leftDown = !event.m_leftDown; - break; + event.m_leftDown = !event.m_leftDown; + return; + } - case wxEVT_MIDDLE_DOWN: - case wxEVT_MIDDLE_DCLICK: - case wxEVT_MIDDLE_UP: - event.m_middleDown = !event.m_middleDown; - break; + if ((event.GetEventType() == wxEVT_MIDDLE_DOWN) || + (event.GetEventType() == wxEVT_MIDDLE_DCLICK) || + (event.GetEventType() == wxEVT_MIDDLE_UP)) + { + event.m_middleDown = !event.m_middleDown; + return; + } - case wxEVT_RIGHT_DOWN: - case wxEVT_RIGHT_DCLICK: - case wxEVT_RIGHT_UP: - event.m_rightDown = !event.m_rightDown; - break; + if ((event.GetEventType() == wxEVT_RIGHT_DOWN) || + (event.GetEventType() == wxEVT_RIGHT_DCLICK) || + (event.GetEventType() == wxEVT_RIGHT_UP)) + { + event.m_rightDown = !event.m_rightDown; + return; } } @@ -2395,14 +2419,17 @@ void wxWindow::PostCreation() gtk_pizza_set_external( GTK_PIZZA(m_wxwindow), TRUE ); - gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event", - GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); + + if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) + { + gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event", + GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this ); + } } #if (GTK_MINOR_VERSION > 0) @@ -2446,19 +2473,30 @@ void wxWindow::PostCreation() if (m_wxwindow) { - /* Catch native resize events. */ + // Catch native resize events gtk_signal_connect( GTK_OBJECT(m_wxwindow), "size_allocate", GTK_SIGNAL_FUNC(gtk_window_size_callback), (gpointer)this ); - /* Initialize XIM support. */ + // Initialize XIM support gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize", GTK_SIGNAL_FUNC(gtk_wxwindow_realized_callback), (gpointer) this ); - /* And resize XIM window. */ + // And resize XIM window gtk_signal_connect( GTK_OBJECT(m_wxwindow), "size_allocate", GTK_SIGNAL_FUNC(gtk_wxwindow_size_callback), (gpointer)this ); } + if (!GTK_IS_COMBO(m_widget)) + { + // This is needed if we want to add our windows into native + // GTK control, such as the toolbar. With this callback, the + // toolbar gets to know the correct size (the one set by the + // programmer). Sadly, it misbehaves for wxComboBox. FIXME + // when moving to GTK 2.0. + gtk_signal_connect( GTK_OBJECT(m_widget), "size_request", + GTK_SIGNAL_FUNC(gtk_window_size_request_callback), (gpointer) this ); + } + m_hasVMT = TRUE; }