GtkCellRendererAccel accel edited signal prints "Gdk-CRITICAL **:"

I am monitoring the GtkCellRendererAccel’s accel-edited Signal and every time the accel_edited_clbk it is called I am getting this message in the console:

(Demo:5644): Gdk-CRITICAL **: 13:37:41.156: gdk_window_get_window_type: assertion 'GDK_IS_WINDOW (window)' failed

and I am not sure why.

Here is a piece of code:

#include <gtk/gtk.h>

enum
{
    ACCEL_MODS_COL,
    ACCEL_KEY_COL,
    KEYCODE_COL,
    N_COLS
};

struct entry
{
    gint    accel_mods;
    guint   accel_key;
    guint   keycode;
} entry;

static struct entry entries[] =
{
    { GDK_CONTROL_MASK,  GDK_KEY_X, 0  }
};


GtkTreeModel *create_model ( void );
void create_renderer_column ( GtkWidget *tree_view, GtkTreeModel *tree_model );

static void accel_edited_clbk ( G_GNUC_UNUSED GtkCellRendererText *cell,
                                const gchar         *path_string,
                                guint                key_val,
                                GdkModifierType      modifier,
                                guint                keycode,
                                gpointer             data )
{
    GtkTreeIter iter;
    GtkTreeModel *model;
    GtkTreePath *path;

    /// ***
    model = GTK_TREE_MODEL ( data );
    path  = gtk_tree_path_new_from_string ( path_string );
    gtk_tree_model_get_iter ( model, &iter, path );

    /// ***
    gtk_tree_store_set ( GTK_TREE_STORE ( model ), &iter,
                         ACCEL_MODS_COL, modifier,
                         ACCEL_KEY_COL,  key_val,
                         KEYCODE_COL,    keycode,
                         -1 );

    /// ***
    gtk_tree_path_free ( path );

    /// ***
    g_print ( "%u %d %u\n", key_val, modifier, keycode );
}

gint main ( void )
{
    GtkWidget    *window;
    GtkWidget    *tree_view;
    GtkTreeModel *tree_model;

    /// ***
    gtk_init ( NULL, NULL );

    /// *** Crate the Window
    window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_default_size ( GTK_WINDOW ( window ), 200, 200 );

    /// *** Create the Model
    tree_model = create_model();

    /// *** Create the View
    tree_view = gtk_tree_view_new_with_model ( tree_model );
    gtk_container_add ( GTK_CONTAINER ( window ), tree_view );

    /// *** Create the Renderer and the Column
    create_renderer_column ( tree_view, tree_model );

    /// *** Showing all
    gtk_widget_show_all ( window );

    /// ***
    gtk_main ();
}

GtkTreeModel *create_model ( void )
{
    GtkTreeStore *tree_store;
    GtkTreeIter   iter;

    /// ***
    tree_store = gtk_tree_store_new ( N_COLS, G_TYPE_INT, G_TYPE_UINT, G_TYPE_UINT );

    /// ***
    for ( guint index = 0; index < G_N_ELEMENTS ( entries ) ; index++ )
    {
        gtk_tree_store_append ( tree_store, &iter, NULL );
        gtk_tree_store_set ( tree_store, &iter,
                             ACCEL_MODS_COL, entries[index].accel_mods,
                             ACCEL_KEY_COL,  entries[index].accel_key,
                             KEYCODE_COL,    entries[index].keycode,
                             -1 );
    }

    /// ***
    return GTK_TREE_MODEL ( tree_store );
}

void create_renderer_column ( GtkWidget *tree_view, GtkTreeModel *tree_model )
{
    GtkCellRenderer   *renderer;
    GtkTreeViewColumn *column;

    /// ***
    renderer = gtk_cell_renderer_accel_new ();
    g_object_set ( renderer,
                   "accel-mode", GTK_CELL_RENDERER_ACCEL_MODE_GTK,
                   "editable",   TRUE,
                   NULL );

    /// ***
    g_signal_connect ( renderer, "accel-edited", G_CALLBACK ( accel_edited_clbk ), tree_model );

    /// ***
    column  = gtk_tree_view_column_new_with_attributes ( "Accel", renderer,
              "accel-mods", ACCEL_MODS_COL,
              "accel-key",  ACCEL_KEY_COL,
              "keycode",    KEYCODE_COL,
              NULL );

    /// ***
    gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ), column );
}

How can I fix this?

You’ll have to do some more digging. My suggestion is to write a very small, self-contained test case that exhibits the same issue; then, run the test case under GDB, and export G_DEBUG=fatal-criticals in your environment to break at the point of the warning, e.g.:

G_DEBUG=fatal-criticals gdb --args ./test-case

Once you get the critical warning, you should get a backtrace using bt. If the trace does not contain any of your code, then you might want to file a bug, and attach the test case and backtrace to it.

until now I got this:

Starting program: /home/michi/Templates/Demo/bin/Debug/Demo
[Thread debugging using libthread_db enabled]
Using host libthread_db library “/lib/x86_64-linux-gnu/libthread_db.so.1”.
[New Thread 0x7ffff597d700 (LWP 1505)]
[New Thread 0x7ffff517c700 (LWP 1506)]
^C
Thread 1 “Demo” received signal SIGINT, Interrupt.
0x00007ffff7595aff in __GI___poll (fds=0x5555558a1c50, nfds=3, timeout=2447) at …/sysdeps/unix/sysv/linux/poll.c:29
29 …/sysdeps/unix/sysv/linux/poll.c: No such file or directory.

The problem is that once that I run :

G_DEBUG=fatal-criticals gdb --args ./Demo

and I double click on CTRL+X:
accell_edited

Everything freezes and I can not issue any input anymore, but if I run the compiled program normally (without GDB) works fine.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.