X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c38373bd542fe5b38d24503f87392c9d998ae15e..6a3f00bd6660d0326904d774d6e7a48a13af1f6f:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 36344c4139..2a60441507 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -314,21 +314,25 @@ draw_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win) if (win->HasFlag(wxBORDER_RAISED)) shadow = GTK_SHADOW_OUT; - // Style detail to use + GtkStyle* style; const char* detail; - if (win->m_widget == win->m_wxwindow) - // for non-scrollable wxWindows - detail = "entry"; - else - // for scrollable ones + if (win->HasFlag(wxHSCROLL | wxVSCROLL)) + { + style = gtk_widget_get_style(wxGTKPrivate::GetTreeWidget()); detail = "viewport"; + } + else + { + style = gtk_widget_get_style(wxGTKPrivate::GetEntryWidget()); + detail = "entry"; + } // clip rect is required to avoid painting background // over upper left (w,h) of parent window GdkRectangle clipRect = { x, y, w, h }; gtk_paint_shadow( - gtk_widget_get_style(win->m_wxwindow), gdk_event->window, GTK_STATE_NORMAL, - shadow, &clipRect, wxGTKPrivate::GetEntryWidget(), detail, x, y, w, h); + style, gdk_event->window, GTK_STATE_NORMAL, + shadow, &clipRect, widget, detail, x, y, w, h); #endif // !__WXGTK3__ } return false; @@ -947,8 +951,37 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget), return TRUE; } - // Emit KEY_DOWN event - ret = win->HandleWindowEvent( event ); + // Next check for accelerators. +#if wxUSE_ACCEL + wxWindowGTK *ancestor = win; + while (ancestor) + { + int command = ancestor->GetAcceleratorTable()->GetCommand( event ); + if (command != -1) + { + wxCommandEvent menu_event( wxEVT_COMMAND_MENU_SELECTED, command ); + ret = ancestor->HandleWindowEvent( menu_event ); + + if ( !ret ) + { + // if the accelerator wasn't handled as menu event, try + // it as button click (for compatibility with other + // platforms): + wxCommandEvent button_event( wxEVT_COMMAND_BUTTON_CLICKED, command ); + ret = ancestor->HandleWindowEvent( button_event ); + } + + break; + } + if (ancestor->IsTopLevel()) + break; + ancestor = ancestor->GetParent(); + } +#endif // wxUSE_ACCEL + + // If not an accelerator, then emit KEY_DOWN event + if ( !ret ) + ret = win->HandleWindowEvent( event ); } else { @@ -977,36 +1010,6 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget), if (return_after_IM) return FALSE; -#if wxUSE_ACCEL - if (!ret) - { - wxWindowGTK *ancestor = win; - while (ancestor) - { - int command = ancestor->GetAcceleratorTable()->GetCommand( event ); - if (command != -1) - { - wxCommandEvent menu_event( wxEVT_COMMAND_MENU_SELECTED, command ); - ret = ancestor->HandleWindowEvent( menu_event ); - - if ( !ret ) - { - // if the accelerator wasn't handled as menu event, try - // it as button click (for compatibility with other - // platforms): - wxCommandEvent button_event( wxEVT_COMMAND_BUTTON_CLICKED, command ); - ret = ancestor->HandleWindowEvent( button_event ); - } - - break; - } - if (ancestor->IsTopLevel()) - break; - ancestor = ancestor->GetParent(); - } - } -#endif // wxUSE_ACCEL - // Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x // will only be sent if it is not in an accelerator table. if (!ret) @@ -1309,142 +1312,79 @@ gtk_window_button_press_callback( GtkWidget* WXUNUSED_IN_GTK3(widget), g_lastButtonNumber = gdk_event->button; - // GDK sends surplus button down events - // before a double click event. We - // need to filter these out. - if ((gdk_event->type == GDK_BUTTON_PRESS) && (win->m_wxwindow)) + wxEventType event_type; + wxEventType down; + wxEventType dclick; + switch (gdk_event->button) { - GdkEvent *peek_event = gdk_event_peek(); - if (peek_event) - { - if ((peek_event->type == GDK_2BUTTON_PRESS) || - (peek_event->type == GDK_3BUTTON_PRESS)) + case 1: + down = wxEVT_LEFT_DOWN; + dclick = wxEVT_LEFT_DCLICK; + break; + case 2: + down = wxEVT_MIDDLE_DOWN; + dclick = wxEVT_MIDDLE_DCLICK; + break; + case 3: + down = wxEVT_RIGHT_DOWN; + dclick = wxEVT_RIGHT_DCLICK; + break; + case 8: + down = wxEVT_AUX1_DOWN; + dclick = wxEVT_AUX1_DCLICK; + break; + case 9: + down = wxEVT_AUX2_DOWN; + dclick = wxEVT_AUX2_DCLICK; + break; + default: + return false; + } + switch (gdk_event->type) + { + case GDK_BUTTON_PRESS: + event_type = down; + // GDK sends surplus button down events + // before a double click event. We + // need to filter these out. + if (win->m_wxwindow) { - gdk_event_free( peek_event ); - return TRUE; + GdkEvent* peek_event = gdk_event_peek(); + if (peek_event) + { + const GdkEventType peek_event_type = peek_event->type; + gdk_event_free(peek_event); + if (peek_event_type == GDK_2BUTTON_PRESS || + peek_event_type == GDK_3BUTTON_PRESS) + { + return true; + } + } } - else + break; + case GDK_2BUTTON_PRESS: + event_type = dclick; +#ifndef __WXGTK3__ + if (gdk_event->button >= 1 && gdk_event->button <= 3) { - gdk_event_free( peek_event ); + // Reset GDK internal timestamp variables in order to disable GDK + // triple click events. GDK will then next time believe no button has + // been clicked just before, and send a normal button click event. + GdkDisplay* display = gtk_widget_get_display(widget); + display->button_click_time[1] = 0; + display->button_click_time[0] = 0; } - } - } - - wxEventType event_type = wxEVT_NULL; - -#ifndef __WXGTK3__ - if ( gdk_event->type == GDK_2BUTTON_PRESS && - gdk_event->button >= 1 && gdk_event->button <= 3 ) - { - // Reset GDK internal timestamp variables in order to disable GDK - // triple click events. GDK will then next time believe no button has - // been clicked just before, and send a normal button click event. - GdkDisplay* display = gtk_widget_get_display (widget); - display->button_click_time[1] = 0; - display->button_click_time[0] = 0; - } #endif // !__WXGTK3__ - - if (gdk_event->button == 1) - { - // note that GDK generates triple click events which are not supported - // by wxWidgets but still have to be passed to the app as otherwise - // clicks would simply go missing - switch (gdk_event->type) - { - // we shouldn't get triple clicks at all for GTK2 because we - // suppress them artificially using the code above but we still - // should map them to something for GTK1 and not just ignore them - // as this would lose clicks - case GDK_3BUTTON_PRESS: // we could also map this to DCLICK... - case GDK_BUTTON_PRESS: - event_type = wxEVT_LEFT_DOWN; - break; - - case GDK_2BUTTON_PRESS: - event_type = wxEVT_LEFT_DCLICK; - break; - - default: - // just to silence gcc warnings - ; - } - } - else if (gdk_event->button == 2) - { - switch (gdk_event->type) - { - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_PRESS: - event_type = wxEVT_MIDDLE_DOWN; - break; - - case GDK_2BUTTON_PRESS: - event_type = wxEVT_MIDDLE_DCLICK; - break; - - default: - ; - } - } - else if (gdk_event->button == 3) - { - switch (gdk_event->type) - { - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_PRESS: - event_type = wxEVT_RIGHT_DOWN; - break; - - case GDK_2BUTTON_PRESS: - event_type = wxEVT_RIGHT_DCLICK; - break; - - default: - ; - } - } - - else if (gdk_event->button == 8) - { - switch (gdk_event->type) - { - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_PRESS: - event_type = wxEVT_AUX1_DOWN; - break; - - case GDK_2BUTTON_PRESS: - event_type = wxEVT_AUX1_DCLICK; - break; - - default: - ; - } - } - - else if (gdk_event->button == 9) - { - switch (gdk_event->type) - { - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_PRESS: - event_type = wxEVT_AUX2_DOWN; - break; - - case GDK_2BUTTON_PRESS: - event_type = wxEVT_AUX2_DCLICK; - break; - - default: - ; - } - } - - if ( event_type == wxEVT_NULL ) - { - // unknown mouse button or click type - return FALSE; + break; + // we shouldn't get triple clicks at all for GTK2 because we + // suppress them artificially using the code above but we still + // should map them to something for GTK3 and not just ignore them + // as this would lose clicks + case GDK_3BUTTON_PRESS: + event_type = down; + break; + default: + return false; } g_lastMouseEvent = (GdkEvent*) gdk_event; @@ -2143,7 +2083,7 @@ wxWindow *wxGetActiveWindow() // Under Unix this is implemented using X11 functions in utilsx11.cpp but we // need to have this function under Windows too, so provide at least a stub. -#ifdef __WINDOWS__ +#ifndef GDK_WINDOWING_X11 bool wxGetKeyState(wxKeyCode WXUNUSED(key)) { wxFAIL_MSG(wxS("Not implemented under Windows"));