focus affects GtkPopover triggering popup through motion
Steps to reproduce
failed:
1: Move the mouse to "@@@@@"
The correct operation steps of 'popup':
1: Use tab to switch focus
2: Move the mouse to "@@@@@"
mini code
#include <gtk/gtk.h>
static void _gtk_popover_popup( GtkWidget* widget )
{
g_message( "%s: %d", __FUNCTION__, gtk_widget_get_visible( widget ) );
gtk_popover_popup( ( gpointer )widget );
}
int main( int argc, char** argv )
{
gtk_init();
GtkWidget* win = gtk_window_new();
gtk_window_set_default_size( GTK_WINDOW( win ), 640, 480 );
GtkWidget* main_box = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 );
gtk_window_set_child( ( gpointer )win, main_box );
gtk_box_append( ( gpointer )main_box, gtk_entry_new() );
gtk_box_append( ( gpointer )main_box, gtk_entry_new() );
// gtk_root_set_focus( gtk_widget_get_root( ( gpointer )win ), ( gpointer )win);
GtkWidget* label = gtk_label_new( "@@@@@@@@@@" );
GtkWidget* popover = gtk_popover_new();
gtk_widget_insert_before( popover, label, NULL );
gtk_box_append( ( gpointer )main_box, label );
GtkWidget* scale = gtk_scale_new( GTK_ORIENTATION_VERTICAL, NULL );
gtk_popover_set_child( ( gpointer )popover, scale );
gtk_range_set_range( ( gpointer )scale, 0.0, 1.0 );
gtk_widget_set_size_request( ( gpointer )scale, -1, 180 );
gtk_widget_set_size_request( ( gpointer )popover, -1, 180 );
gtk_popover_set_position( ( gpointer )popover, GTK_POS_TOP );
GtkEventController* motion = gtk_event_controller_motion_new();
gtk_widget_add_controller( ( gpointer )label, motion );
g_signal_connect_swapped( motion, "enter", G_CALLBACK( _gtk_popover_popup ), popover );
g_signal_connect_swapped( motion, "motion", G_CALLBACK( g_print ), "motion:::::" );
GtkGesture* click_event = gtk_gesture_click_new();
gtk_widget_add_controller( ( gpointer )label, ( gpointer )click_event );
g_signal_connect_swapped( click_event, "released", G_CALLBACK( gtk_popover_popup ), popover );
gtk_window_present( ( gpointer )win );
while ( TRUE )
g_main_context_iteration( NULL, TRUE );
return 0;
}
Current behavior
Can be correctly triggered by the click event. When GtkPopover does not pop up correctly (without any exception information), the application will not be able to continue to use, and the mouse events at this time will not be delivered correctly. Can only be restarted.
Expected outcome
Version information
Gtk 4.10.3 in flatpak
Additional information
I have a GtkEntry and by default it gets focus after launching the program. But I don't want that. So I use
gtk_root_set_focus( gtk_widget_get_root ( ( gpointer ) window ), ( gpointer ) window );
toggle focus.
But this causes motion::enter to fail to make GtkPopover pop correctly. When popup is called, it gets a size of 0x0+0+0. At this point, you cannot turn off GtkPopover for any mouse events and keyboard events, and the esc key is invalid.