I have a Question where I am not sure that I am clearly Understand it.
If I need to catch events on a widget which has no window, then I need an EventBox.
An EventBox create (provide) a window for those widgets, and here is the part where I am not sure.
To actually have a X Window, one needs the following function call:
gtk_widget_realize ( event_box );
Now if is so, why I am getting
The EventBox has a Window
in the scroll_callback funcion where I am checking:
if ( gtk_widget_get_has_window ( widget )
Because the gtk_widget_realize call is commented.
Here is the program:
#include <gtk/gtk.h>
gboolean scroll_callback ( GtkWidget *widget, GdkEvent *event, gpointer data );
int main ( void )
{
GtkWidget *window;
GtkWidget *event_box;
gtk_init ( NULL, NULL );
/// ***
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
gtk_window_set_default_size ( GTK_WINDOW ( window ), 300, 250 );
g_signal_connect ( window, "destroy", gtk_main_quit, NULL );
gtk_container_set_border_width ( GTK_CONTAINER ( window ), 50 );
/// ***
event_box = gtk_event_box_new();
gtk_widget_set_events ( event_box, GDK_SCROLL_MASK );
gtk_container_add ( GTK_CONTAINER ( window ), event_box );
///gtk_widget_realize ( event_box );
/// ***
g_signal_connect ( event_box, "scroll_event", G_CALLBACK ( scroll_callback ), window );
/// ***
gtk_widget_show_all ( window );
gtk_main();
}
gboolean scroll_callback ( GtkWidget *widget, GdkEvent *event, gpointer data )
{
if ( gtk_widget_get_has_window ( widget ) )
{
printf ( "\n\tThe EventBox has a Window\n" );
if ( event->type == GDK_SCROLL ) /// Scroll the was Catched
{
if ( event->scroll.direction == GDK_SCROLL_DOWN )
{
g_print ( "Scroll-Down Detected\n" );
gtk_window_set_title ( GTK_WINDOW ( data ), "Scroll-Down Detected" );
}
if ( event->scroll.direction == GDK_SCROLL_UP )
{
g_print ( "Scroll-UP Detected\n" );
gtk_window_set_title ( GTK_WINDOW ( data ), "Scroll-UP Detected" );
}
return FALSE;
}
}
printf ( "\n\tThe EventBox has NO Window\n" );
return TRUE;
}