X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/222ed1d678dff2f5c3c4164321dd05e8f47de487..b77b87881bae2e6306366d79e7fe160334b3d4a2:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 9f1d174de7..303cad80ea 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -8,15 +8,17 @@ ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "window.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #ifdef __VMS #define XWarpPointer XWARPPOINTER #endif -#include "wx/defs.h" #include "wx/window.h" #include "wx/dcclient.h" #include "wx/frame.h" @@ -255,9 +257,9 @@ wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL; // send any activate events at all static int g_sendActivateEvent = -1; -/* hack: we need something to pass to gtk_menu_popup, so we store the time of - the last click here */ -static guint32 gs_timeLastClick = 0; +// hack: we need something to pass to gtk_menu_popup, so we store the time of +// the last click here +static guint32 gs_timeLastClick = 0; extern bool g_mainThreadLocked; @@ -477,12 +479,18 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU // "size_request" of m_widget //----------------------------------------------------------------------------- -static void gtk_window_size_request_callback( GtkWidget *widget, GtkRequisition *requisition, wxWindow *win ) +// make it extern because wxStatitText needs to disconnect this one +extern "C" +void wxgtk_window_size_request_callback(GtkWidget *widget, + GtkRequisition *requisition, + wxWindow *win) { - int w,h; + int w, h; win->GetSize( &w, &h ); - if (w < 2) w = 2; - if (h < 2) h = 2; + if (w < 2) + w = 2; + if (h < 2) + h = 2; requisition->height = h; requisition->width = w; @@ -520,6 +528,18 @@ static int gtk_window_expose_callback( GtkWidget *widget, (int)gdk_event->area.width, (int)gdk_event->area.height ); } + + gtk_paint_box + ( + win->m_wxwindow->style, + pizza->bin_window, + GTK_STATE_NORMAL, + GTK_SHADOW_OUT, + (GdkRectangle*) NULL, + win->m_wxwindow, + (char *)"button", // const_cast + 20,20,24,24 + ); #endif win->GetUpdateRegion() = wxRegion( gdk_event->region ); @@ -591,10 +611,11 @@ static void gtk_window_draw_callback( GtkWidget *widget, if (g_isIdle) wxapp_install_idle_handler(); - // The wxNO_FULL_REPAINT_ON_RESIZE flag only works if - // there are no child windows. - if ((win->HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) && - (win->GetChildren().GetCount() == 0)) + // if there are any children we must refresh everything + // + // VZ: why? + if ( !win->HasFlag(wxFULL_REPAINT_ON_RESIZE) && + win->GetChildren().IsEmpty() ) { return; } @@ -1240,8 +1261,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, #ifdef __WXGTK20__ static void gtk_wxwindow_commit_cb (GtkIMContext *context, - const gchar *str, - wxWindow *window) + const gchar *str, + wxWindow *window) { bool ret = FALSE; @@ -1501,7 +1522,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEvent *peek_event = gdk_event_peek(); if (peek_event) { - if (peek_event->type == GDK_2BUTTON_PRESS) + if ((peek_event->type == GDK_2BUTTON_PRESS) || + (peek_event->type == GDK_3BUTTON_PRESS)) { gdk_event_free( peek_event ); return TRUE; @@ -1521,6 +1543,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, { case GDK_BUTTON_PRESS: event_type = wxEVT_LEFT_DOWN; break; case GDK_2BUTTON_PRESS: event_type = wxEVT_LEFT_DCLICK; break; + case GDK_3BUTTON_PRESS: return FALSE; default: break; } } @@ -1760,6 +1783,61 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, return FALSE; } +#ifdef __WXGTK20__ +//----------------------------------------------------------------------------- +// "mouse_wheel_event" +//----------------------------------------------------------------------------- + +static gint gtk_window_wheel_callback (GtkWidget * widget, + GdkEventScroll * gdk_event, + wxWindowGTK * win) +{ + DEBUG_MAIN_THREAD + + if (g_isIdle) + wxapp_install_idle_handler(); + + wxEventType event_type = wxEVT_NULL; + if (gdk_event->direction == GDK_SCROLL_UP) + event_type = wxEVT_MOUSEWHEEL; + else if (gdk_event->direction == GDK_SCROLL_DOWN) + event_type = wxEVT_MOUSEWHEEL; + else + return FALSE; + + wxMouseEvent event( event_type ); + // Can't use InitMouse macro because scroll events don't have button + event.SetTimestamp( gdk_event->time ); + event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); + event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); + event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); + event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); + event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); + event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); + event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); + if (gdk_event->direction == GDK_SCROLL_UP) + event.m_wheelRotation = 120; + else + event.m_wheelRotation = -120; + + wxPoint pt = win->GetClientAreaOrigin(); + event.m_x = (wxCoord)gdk_event->x - pt.x; + event.m_y = (wxCoord)gdk_event->y - pt.y; + + event.SetEventObject( win ); + event.SetId( win->GetId() ); + event.SetTimestamp( gdk_event->time ); + + if (win->GetEventHandler()->ProcessEvent( event )) + { + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "scroll_event" ); + return TRUE; + } + + return FALSE; +} +#endif + //----------------------------------------------------------------------------- // "focus_in_event" //----------------------------------------------------------------------------- @@ -2423,9 +2501,6 @@ wxWindow *wxGetActiveWindow() void wxWindowGTK::Init() { - // common init - InitBase(); - // GTK specific m_widget = (GtkWidget *) NULL; m_wxwindow = (GtkWidget *) NULL; @@ -2645,9 +2720,6 @@ wxWindowGTK::~wxWindowGTK() DestroyChildren(); - if (m_parent) - m_parent->RemoveChild( this ); - #ifdef HAVE_XIM if (m_ic) gdk_ic_destroy (m_ic); @@ -2729,13 +2801,13 @@ void wxWindowGTK::PostCreation() gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); - if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) + if (!HasFlag(wxFULL_REPAINT_ON_RESIZE)) { gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event", GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this ); } #else - // gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) ); + // gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), !HasFlag( wxFULL_REPAINT_ON_RESIZE ) ); #endif #ifdef __WXGTK20__ @@ -2797,7 +2869,7 @@ void wxWindowGTK::PostCreation() GTK_SIGNAL_FUNC(gtk_wxwindow_size_callback), (gpointer)this ); } - if (!GTK_IS_COMBO(m_widget)) + 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 @@ -2805,7 +2877,8 @@ void wxWindowGTK::PostCreation() // 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 ); + GTK_SIGNAL_FUNC(wxgtk_window_size_request_callback), + (gpointer) this ); } m_hasVMT = TRUE; @@ -2828,6 +2901,11 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) gtk_signal_connect( GTK_OBJECT(widget), "motion_notify_event", GTK_SIGNAL_FUNC(gtk_window_motion_notify_callback), (gpointer)this ); +#ifdef __WXGTK20__ + gtk_signal_connect( GTK_OBJECT(widget), "scroll_event", + GTK_SIGNAL_FUNC(gtk_window_wheel_callback), (gpointer)this ); +#endif + gtk_signal_connect( GTK_OBJECT(widget), "enter_notify_event", GTK_SIGNAL_FUNC(gtk_window_enter_callback), (gpointer)this ); @@ -2863,9 +2941,9 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags int currentX, currentY; GetPosition(¤tX, ¤tY); - if (x == -1) + if (x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) x = currentX; - if (y == -1) + if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) y = currentY; AdjustForParentClientOrigin(x, y, sizeFlags); @@ -3353,7 +3431,7 @@ int wxWindowGTK::GetCharWidth() const PangoFontDescription *desc = m_font.GetNativeFontInfo()->description; PangoLayout *layout = pango_layout_new(context); pango_layout_set_font_description(layout, desc); - pango_layout_set_text(layout, "H", 1); + pango_layout_set_text(layout, "g", 1); PangoLayoutLine *line = (PangoLayoutLine *)pango_layout_get_lines(layout)->data; PangoRectangle rect; @@ -3365,7 +3443,7 @@ int wxWindowGTK::GetCharWidth() const #else GdkFont *font = m_font.GetInternalFont( 1.0 ); - return gdk_string_width( font, "H" ); + return gdk_string_width( font, "g" ); #endif } @@ -3853,7 +3931,7 @@ void wxWindowGTK::GtkSendPaintEvents() m_updateRegion.Clear(); } -void wxWindowGTK::Clear() +void wxWindowGTK::ClearBackground() { wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); @@ -4210,7 +4288,11 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) wxPopupMenuPositionCallback, // function to position it NULL, // client data 0, // button used to activate it +#ifdef __WXGTK20__ + gtk_get_current_event_time() +#else gs_timeLastClick // the time of activation +#endif ); while (is_waiting) @@ -4259,9 +4341,7 @@ bool wxWindowGTK::IsOwnGtkWindow( GdkWindow *window ) bool wxWindowGTK::SetFont( const wxFont &font ) { - wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") ); - - if (!wxWindowBase::SetFont(font)) + if (!wxWindowBase::SetFont(font) || !m_widget) { return FALSE; }