X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fcdd53359135f790b85728c4254b97095a56dad8..fada8bef05c36e3bae29f9442f8d32b024905207:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 3de7239792..7fc84be912 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -205,7 +205,7 @@ extern wxCursor g_globalCursor; // mouse capture state: the window which has it and if the mouse is currently // inside it -static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; +static wxWindowGTK *g_captureWindow = NULL; static bool g_captureWindowHasMouse = false; // The window that currently has focus: @@ -220,7 +220,7 @@ static wxWindowGTK *gs_deferredFocusOut = NULL; // global variables because GTK+ DnD want to have the // mouse event that caused it -GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL; +GdkEvent *g_lastMouseEvent = NULL; int g_lastButtonNumber = 0; //----------------------------------------------------------------------------- @@ -257,11 +257,11 @@ gdk_window_warp_pointer (GdkWindow *window, // "size_request" of m_widget //----------------------------------------------------------------------------- -// make it extern because wxStaticText needs to disconnect this one extern "C" { -void wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget), - GtkRequisition *requisition, - wxWindow * win) +static void +wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget), + GtkRequisition *requisition, + wxWindow * win) { int w, h; win->GetSize( &w, &h ); @@ -1182,7 +1182,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) } else { - if ((child->m_wxwindow == (GtkWidget*) NULL) && + if ((child->m_wxwindow == NULL) && (child->m_x <= xx) && (child->m_y <= yy) && (child->m_x+child->m_width >= xx) && @@ -1547,6 +1547,38 @@ gtk_window_motion_notify_callback( GtkWidget * WXUNUSED(widget), // "scroll_event" (mouse wheel event) //----------------------------------------------------------------------------- +static gboolean +window_scroll_event_hscrollbar(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) +{ + if (gdk_event->direction != GDK_SCROLL_LEFT && + gdk_event->direction != GDK_SCROLL_RIGHT) + { + return false; + } + + wxMouseEvent event(wxEVT_MOUSEWHEEL); + InitMouseEvent(win, event, gdk_event); + + GtkRange *range = win->m_scrollBar[wxWindow::ScrollDir_Horz]; + if (!range) return FALSE; + + if (range && GTK_WIDGET_VISIBLE (range)) + { + GtkAdjustment *adj = range->adjustment; + gdouble delta = adj->step_increment * 3; + if (gdk_event->direction == GDK_SCROLL_LEFT) + delta = -delta; + + gdouble new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + + gtk_adjustment_set_value (adj, new_value); + + return TRUE; + } + + return FALSE; +} + static gboolean window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) { @@ -1567,7 +1599,27 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) else event.m_wheelRotation = -120; - return win->GTKProcessEvent(event); + if (win->GTKProcessEvent(event)) + return TRUE; + + GtkRange *range = win->m_scrollBar[wxWindow::ScrollDir_Vert]; + if (!range) return FALSE; + + if (range && GTK_WIDGET_VISIBLE (range)) + { + GtkAdjustment *adj = range->adjustment; + gdouble delta = adj->step_increment * 3; + if (gdk_event->direction == GDK_SCROLL_UP) + delta = -delta; + + gdouble new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + + gtk_adjustment_set_value (adj, new_value); + + return TRUE; + } + + return FALSE; } //----------------------------------------------------------------------------- @@ -1977,9 +2029,9 @@ wxMouseState wxGetMouseState() void wxWindowGTK::Init() { // GTK specific - m_widget = (GtkWidget *) NULL; - m_wxwindow = (GtkWidget *) NULL; - m_focusWidget = (GtkWidget *) NULL; + m_widget = NULL; + m_wxwindow = NULL; + m_focusWidget = NULL; // position/size m_x = 0; @@ -1988,9 +2040,8 @@ void wxWindowGTK::Init() m_height = 0; m_hasVMT = false; - m_isBeingDeleted = false; - m_showOnIdle= false; + m_showOnIdle = false; m_noExpose = false; m_nativeSizeEvent = false; @@ -2044,6 +2095,7 @@ bool wxWindowGTK::Create( wxWindow *parent, { // Get default border wxBorder border = GetBorder(style); + style &= ~wxBORDER_MASK; style |= border; @@ -2054,8 +2106,14 @@ bool wxWindowGTK::Create( wxWindow *parent, return false; } + // We should accept the native look +#if 0 + GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); + scroll_class->scrollbar_spacing = 0; +#endif - m_wxwindow = wxPizza::New(m_windowStyle); + + m_wxwindow = wxPizza::New(m_windowStyle,this); #ifndef __WXUNIVERSAL__ if (HasFlag(wxPizza::BORDER_STYLES)) { @@ -2067,13 +2125,10 @@ bool wxWindowGTK::Create( wxWindow *parent, m_widget = m_wxwindow; else { - m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); + m_widget = gtk_scrolled_window_new( NULL, NULL ); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); - GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); - scroll_class->scrollbar_spacing = 0; - // There is a conflict with default bindings at GTK+ // level between scrolled windows and notebooks both of which want to use // Ctrl-PageUp/Down: scrolled windows for scrolling in the horizontal @@ -2158,7 +2213,6 @@ wxWindowGTK::~wxWindowGTK() if ( gs_deferredFocusOut == this ) gs_deferredFocusOut = NULL; - m_isBeingDeleted = true; m_hasVMT = false; // destroy children before destroying this window itself @@ -2356,8 +2410,16 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) G_CALLBACK (gtk_window_button_release_callback), this); g_signal_connect (widget, "motion_notify_event", G_CALLBACK (gtk_window_motion_notify_callback), this); + g_signal_connect (widget, "scroll_event", G_CALLBACK (window_scroll_event), this); + if (m_scrollBar[ScrollDir_Horz]) + g_signal_connect (m_scrollBar[ScrollDir_Horz], "scroll_event", + G_CALLBACK (window_scroll_event_hscrollbar), this); + if (m_scrollBar[ScrollDir_Vert]) + g_signal_connect (m_scrollBar[ScrollDir_Vert], "scroll_event", + G_CALLBACK (window_scroll_event), this); + g_signal_connect (widget, "popup_menu", G_CALLBACK (wxgtk_window_popup_menu_callback), this); g_signal_connect (widget, "enter_notify_event", @@ -2619,12 +2681,15 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const continue; } + GtkScrolledWindowClass *scroll_class = + GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); + GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(range), &req); if (i == ScrollDir_Horz) - h -= req.height; + h -= req.height + scroll_class->scrollbar_spacing; else - w -= req.width; + w -= req.width + scroll_class->scrollbar_spacing; } } @@ -2658,7 +2723,7 @@ void wxWindowGTK::DoGetPosition( int *x, int *y ) const if (m_x == -1 && m_y == -1) { - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -2688,7 +2753,7 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -2725,7 +2790,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -3410,7 +3475,7 @@ void wxWindowGTK::WarpPointer( int x, int y ) // We provide this function ourselves as it is // missing in GDK (top of this file). - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else @@ -3938,8 +4003,8 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) menu->m_popupShown = true; gtk_menu_popup( GTK_MENU(menu->m_menu), - (GtkWidget *) NULL, // parent menu shell - (GtkWidget *) NULL, // parent menu item + NULL, // parent menu shell + NULL, // parent menu item posfunc, // function to position it userdata, // client data 0, // button used to activate it @@ -3964,12 +4029,12 @@ void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget ) GtkWidget *dnd_widget = GetConnectWidget(); - if (m_dropTarget) m_dropTarget->UnregisterWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->GtkUnregisterWidget( dnd_widget ); if (m_dropTarget) delete m_dropTarget; m_dropTarget = dropTarget; - if (m_dropTarget) m_dropTarget->RegisterWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->GtkRegisterWidget( dnd_widget ); } #endif // wxUSE_DRAG_AND_DROP @@ -4014,7 +4079,7 @@ void wxWindowGTK::DoCaptureMouse() { wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else @@ -4032,7 +4097,7 @@ void wxWindowGTK::DoCaptureMouse() GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK), - (GdkWindow *) NULL, + NULL, cursor->GetCursor(), (guint32)GDK_CURRENT_TIME ); g_captureWindow = this; @@ -4045,9 +4110,9 @@ void wxWindowGTK::DoReleaseMouse() wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") ); - g_captureWindow = (wxWindowGTK*) NULL; + g_captureWindow = NULL; - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else