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;
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
{
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)
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;
{
// attaching to style changed signal after realization avoids initial
// changes we don't care about
- g_signal_connect(m_wxwindow,
+ const gchar *detailed_signal =
#ifdef __WXGTK3__
- "style_updated",
+ "style_updated";
#else
- "style_set",
+ "style_set";
#endif
+ g_signal_connect(m_wxwindow,
+ detailed_signal,
G_CALLBACK(style_updated), this);
}
}
// 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"));