22 ******************************************************************************
33 * Xenia : Xbox 360 Emulator Research Project *
44 ******************************************************************************
5- * Copyright 2022 Ben Vanik. All rights reserved. *
5+ * Copyright 2025 Ben Vanik. All rights reserved. *
66 * Released under the BSD license - see LICENSE in the root for more details. *
77 ******************************************************************************
88 */
@@ -64,7 +64,7 @@ bool GTKWindow::OpenImpl() {
6464
6565 // Add the main menu (even if fullscreen was requested, for the initial layout
6666 // calculation).
67- const GTKMenuItem * main_menu = static_cast <const GTKMenuItem*>(GetMainMenu ());
67+ const auto * main_menu = dynamic_cast <const GTKMenuItem*>(GetMainMenu ());
6868 GtkWidget* main_menu_widget = main_menu ? main_menu->handle () : nullptr ;
6969 if (main_menu_widget) {
7070 gtk_box_pack_start (GTK_BOX (box_), main_menu_widget, FALSE , FALSE , 0 );
@@ -151,7 +151,7 @@ void GTKWindow::ApplyNewFullscreen() {
151151 // fullscreen being toggled from inside this function.
152152 WindowDestructionReceiver destruction_receiver (this );
153153
154- const GTKMenuItem * main_menu = static_cast <const GTKMenuItem*>(GetMainMenu ());
154+ const auto * main_menu = dynamic_cast <const GTKMenuItem*>(GetMainMenu ());
155155 GtkWidget* main_menu_widget = main_menu ? main_menu->handle () : nullptr ;
156156
157157 // Changing the menu and the fullscreen state may change the size of the
@@ -233,7 +233,7 @@ void GTKWindow::ApplyNewMainMenu(MenuItem* old_main_menu) {
233233
234234 if (old_main_menu) {
235235 const GTKMenuItem& old_gtk_main_menu =
236- *static_cast <const GTKMenuItem*>(old_main_menu);
236+ *dynamic_cast <const GTKMenuItem*>(old_main_menu);
237237 gtk_container_remove (GTK_CONTAINER (box_), old_gtk_main_menu.handle ());
238238 if (destruction_receiver.IsWindowDestroyedOrClosed () || IsFullscreen ()) {
239239 if (!destruction_receiver.IsWindowDestroyed ()) {
@@ -243,8 +243,8 @@ void GTKWindow::ApplyNewMainMenu(MenuItem* old_main_menu) {
243243 }
244244 }
245245
246- const GTKMenuItem * new_main_menu =
247- static_cast <const GTKMenuItem*>(GetMainMenu ());
246+ const auto * new_main_menu =
247+ dynamic_cast <const GTKMenuItem*>(GetMainMenu ());
248248 if (!new_main_menu) {
249249 EndBatchedSizeUpdate (destruction_receiver);
250250 return ;
@@ -350,6 +350,148 @@ void GTKWindow::EndBatchedSizeUpdate(
350350 }
351351}
352352
353+ VirtualKey GTKWindow::TranslateVirtualKey (guint keyval) {
354+ switch (keyval) {
355+ case GDK_KEY_a:
356+ case GDK_KEY_A:
357+ return VirtualKey::kA ;
358+ case GDK_KEY_b:
359+ case GDK_KEY_B:
360+ return VirtualKey::kB ;
361+ case GDK_KEY_c:
362+ case GDK_KEY_C:
363+ return VirtualKey::kC ;
364+ case GDK_KEY_d:
365+ case GDK_KEY_D:
366+ return VirtualKey::kD ;
367+ case GDK_KEY_e:
368+ case GDK_KEY_E:
369+ return VirtualKey::kE ;
370+ case GDK_KEY_f:
371+ case GDK_KEY_F:
372+ return VirtualKey::kF ;
373+ case GDK_KEY_g:
374+ case GDK_KEY_G:
375+ return VirtualKey::kG ;
376+ case GDK_KEY_h:
377+ case GDK_KEY_H:
378+ return VirtualKey::kH ;
379+ case GDK_KEY_i:
380+ case GDK_KEY_I:
381+ return VirtualKey::kI ;
382+ case GDK_KEY_j:
383+ case GDK_KEY_J:
384+ return VirtualKey::kJ ;
385+ case GDK_KEY_k:
386+ case GDK_KEY_K:
387+ return VirtualKey::kK ;
388+ case GDK_KEY_l:
389+ case GDK_KEY_L:
390+ return VirtualKey::kL ;
391+ case GDK_KEY_m:
392+ case GDK_KEY_M:
393+ return VirtualKey::kM ;
394+ case GDK_KEY_n:
395+ case GDK_KEY_N:
396+ return VirtualKey::kN ;
397+ case GDK_KEY_o:
398+ case GDK_KEY_O:
399+ return VirtualKey::kO ;
400+ case GDK_KEY_p:
401+ case GDK_KEY_P:
402+ return VirtualKey::kP ;
403+ case GDK_KEY_q:
404+ case GDK_KEY_Q:
405+ return VirtualKey::kQ ;
406+ case GDK_KEY_r:
407+ case GDK_KEY_R:
408+ return VirtualKey::kR ;
409+ case GDK_KEY_s:
410+ case GDK_KEY_S:
411+ return VirtualKey::kS ;
412+ case GDK_KEY_t:
413+ case GDK_KEY_T:
414+ return VirtualKey::kT ;
415+ case GDK_KEY_u:
416+ case GDK_KEY_U:
417+ return VirtualKey::kU ;
418+ case GDK_KEY_v:
419+ case GDK_KEY_V:
420+ return VirtualKey::kV ;
421+ case GDK_KEY_w:
422+ case GDK_KEY_W:
423+ return VirtualKey::kW ;
424+ case GDK_KEY_x:
425+ case GDK_KEY_X:
426+ return VirtualKey::kX ;
427+ case GDK_KEY_y:
428+ case GDK_KEY_Y:
429+ return VirtualKey::kY ;
430+ case GDK_KEY_z:
431+ case GDK_KEY_Z:
432+ return VirtualKey::kZ ;
433+ case GDK_KEY_0:
434+ return VirtualKey::k0;
435+ case GDK_KEY_1:
436+ return VirtualKey::k1;
437+ case GDK_KEY_2:
438+ return VirtualKey::k2;
439+ case GDK_KEY_3:
440+ return VirtualKey::k3;
441+ case GDK_KEY_4:
442+ return VirtualKey::k4;
443+ case GDK_KEY_5:
444+ return VirtualKey::k5;
445+ case GDK_KEY_6:
446+ return VirtualKey::k6;
447+ case GDK_KEY_7:
448+ return VirtualKey::k7;
449+ case GDK_KEY_8:
450+ return VirtualKey::k8;
451+ case GDK_KEY_9:
452+ return VirtualKey::k9;
453+ case GDK_KEY_semicolon:
454+ return VirtualKey::kOem1 ;
455+ case GDK_KEY_apostrophe:
456+ return VirtualKey::kOem7 ;
457+ case GDK_KEY_comma:
458+ return VirtualKey::kOemComma ;
459+ case GDK_KEY_period:
460+ return VirtualKey::kOemPeriod ;
461+ case GDK_KEY_Up:
462+ return VirtualKey::kUp ;
463+ case GDK_KEY_Down:
464+ return VirtualKey::kDown ;
465+ case GDK_KEY_Left:
466+ return VirtualKey::kLeft ;
467+ case GDK_KEY_Right:
468+ return VirtualKey::kRight ;
469+ case GDK_KEY_BackSpace:
470+ return VirtualKey::kBack ;
471+ case GDK_KEY_Tab:
472+ return VirtualKey::kTab ;
473+ case GDK_KEY_Return:
474+ return VirtualKey::kReturn ;
475+ case GDK_KEY_Control_L:
476+ return VirtualKey::kLControl ;
477+ case GDK_KEY_Control_R:
478+ return VirtualKey::kRControl ;
479+ case GDK_KEY_Alt_L:
480+ return VirtualKey::kLMenu ;
481+ case GDK_KEY_Alt_R:
482+ return VirtualKey::kRMenu ;
483+ case GDK_KEY_Shift_L:
484+ return VirtualKey::kLShift ;
485+ case GDK_KEY_Shift_R:
486+ return VirtualKey::kRShift ;
487+ case GDK_KEY_space:
488+ return VirtualKey::kSpace ;
489+ default :
490+ XELOGW (" Unhandled key code: {}" , keyval);
491+ return VirtualKey (keyval);
492+ }
493+ }
494+
353495bool GTKWindow::HandleMouse (GdkEvent* event,
354496 WindowDestructionReceiver& destruction_receiver) {
355497 MouseEvent::Button button = MouseEvent::Button::kNone ;
@@ -432,8 +574,7 @@ bool GTKWindow::HandleKeyboard(
432574 bool alt_pressed = modifiers & GDK_META_MASK;
433575 bool super_pressed = modifiers & GDK_SUPER_MASK;
434576 uint32_t key_char = gdk_keyval_to_unicode (event->keyval );
435- // TODO(Triang3l): event->hardware_keycode to VirtualKey translation.
436- KeyEvent e (this , VirtualKey (event->hardware_keycode ), 1 ,
577+ KeyEvent e (this , TranslateVirtualKey (event->keyval ), 1 ,
437578 event->type == GDK_KEY_RELEASE, shift_pressed, ctrl_pressed,
438579 alt_pressed, super_pressed);
439580 switch (event->type ) {
@@ -512,7 +653,7 @@ gboolean GTKWindow::WindowEventHandler(GdkEvent* event) {
512653
513654gboolean GTKWindow::WindowEventHandlerThunk (GtkWidget* widget, GdkEvent* event,
514655 gpointer user_data) {
515- GTKWindow * window = reinterpret_cast <GTKWindow*>(user_data);
656+ auto * window = static_cast <GTKWindow*>(user_data);
516657 if (!window || widget != window->window_ ||
517658 reinterpret_cast <const GdkEventAny*>(event)->window !=
518659 gtk_widget_get_window (window->window_ )) {
@@ -558,7 +699,7 @@ gboolean GTKWindow::DrawingAreaEventHandler(GdkEvent* event) {
558699gboolean GTKWindow::DrawingAreaEventHandlerThunk (GtkWidget* widget,
559700 GdkEvent* event,
560701 gpointer user_data) {
561- GTKWindow * window = reinterpret_cast <GTKWindow*>(user_data);
702+ auto * window = static_cast <GTKWindow*>(user_data);
562703 if (!window || widget != window->drawing_area_ ||
563704 reinterpret_cast <const GdkEventAny*>(event)->window !=
564705 gtk_widget_get_window (window->drawing_area_ )) {
@@ -569,7 +710,7 @@ gboolean GTKWindow::DrawingAreaEventHandlerThunk(GtkWidget* widget,
569710
570711gboolean GTKWindow::DrawHandler (GtkWidget* widget, cairo_t * cr,
571712 gpointer user_data) {
572- GTKWindow * window = reinterpret_cast <GTKWindow*>(user_data);
713+ auto * window = static_cast <GTKWindow*>(user_data);
573714 if (!window || widget != window->drawing_area_ ) {
574715 return FALSE ;
575716 }
@@ -602,7 +743,7 @@ GTKMenuItem::GTKMenuItem(Type type, const std::string& text,
602743 // TODO(dougvj) Would we ever need to escape underscores?
603744 // Replace & with _ for gtk to see the memonic
604745 std::replace (label.begin (), label.end (), ' &' , ' _' );
605- const gchar * gtk_label = reinterpret_cast < const gchar*>( label.c_str () );
746+ const auto * gtk_label = label.c_str ();
606747 switch (type) {
607748 case MenuItem::Type::kNormal :
608749 default :
@@ -628,7 +769,7 @@ GTKMenuItem::GTKMenuItem(Type type, const std::string& text,
628769 g_object_ref_sink (menu_);
629770 if (GTK_IS_MENU_ITEM (menu_)) {
630771 g_signal_connect (menu_, " activate" , G_CALLBACK (ActivateHandler),
631- reinterpret_cast <gpointer>( this ) );
772+ this );
632773 }
633774 }
634775}
@@ -640,13 +781,13 @@ GTKMenuItem::~GTKMenuItem() {
640781}
641782
642783void GTKMenuItem::OnChildAdded (MenuItem* generic_child_item) {
643- auto child_item = static_cast <GTKMenuItem*>(generic_child_item);
784+ auto child_item = dynamic_cast <GTKMenuItem*>(generic_child_item);
644785 GtkWidget* submenu = nullptr ;
645786 switch (child_item->type ()) {
646- case MenuItem:: Type::kNormal :
787+ case Type::kNormal :
647788 // Nothing special.
648789 break ;
649- case MenuItem:: Type::kPopup :
790+ case Type::kPopup :
650791 if (GTK_IS_MENU_ITEM (menu_)) {
651792 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_));
652793 // Get sub menu and if it doesn't exist create it
@@ -659,8 +800,8 @@ void GTKMenuItem::OnChildAdded(MenuItem* generic_child_item) {
659800 gtk_menu_shell_append (GTK_MENU_SHELL (menu_), child_item->handle ());
660801 }
661802 break ;
662- case MenuItem:: Type::kSeparator :
663- case MenuItem:: Type::kString :
803+ case Type::kSeparator :
804+ case Type::kString :
664805 assert (GTK_IS_MENU_ITEM (menu_));
665806 // Get sub menu and if it doesn't exist create it
666807 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_));
@@ -673,9 +814,7 @@ void GTKMenuItem::OnChildAdded(MenuItem* generic_child_item) {
673814 }
674815}
675816
676- // TODO(dougvj)
677817void GTKMenuItem::OnChildRemoved (MenuItem* generic_child_item) {
678- assert_always ();
679818}
680819
681820} // namespace ui
0 commit comments