Re: Accelerators for GtkNotebook to switch between pages



Hi infirit,

crazy. I rebuilt the relevant parts in a demo app and there it's working
as expected. *argh*.
For completeness here's what I mean.

The code that creates my GtkNotebook:

      /* notebook */
      notebook = gtk_notebook_new();
      gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
      gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
      gtk_container_add(GTK_CONTAINER(frame), notebook);

      /* notebook page 1 */
      label = gtk_label_new("Tab1");
      gtk_widget_show(label);
      page = gtk_frame_new("Content1");
      gtk_widget_show(page);
      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);

      /* notebook page 2 */
      label = gtk_label_new("Tab2");
      gtk_widget_show(label);
      page = gtk_frame_new("Content2");
      gtk_widget_show(page);
      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);

      create_tab_menu(notebook);



And this is the content of the create_tab_menu() function to create the
context menu of the tab, that actually contains the action to be
triggered by the accelerator:

    void create_tab_menu(GtkWidget *notebook)
    {
       GtkWidget *menu;
       GtkBuilder *builder;
       GSimpleActionGroup *actiongroup;
       int i;
       struct accel_map {
          char *action;
          const char * const accel[2];
       };

       /* define actions */
       static GActionEntry tab_actions[] = {
          {"test_action", test_cb, NULL, NULL, NULL, {}}
       };

       /* define accelerators */
       static struct accel_map tab_accels[] = {
          {"tab.test_action", {"<Primary>t", NULL}}
       };

       /* define menu structure */
       builder = gtk_builder_new();
       gtk_builder_add_from_string(builder,
             "<interface>"
             "  <menu id='tab-menu'>"
             "    <section>"
             "      <item>"
             "        <attribute name='label'>Test Action</attribute>"
             "        <attribute name='action'>tab.test_action</attribute>"
             "        <attribute
    name='icon'>weather-clear-symbolic</attribute>"
             "      </item>"
             "    </section>"
             "  </menu>"
             "</interface>", -1, NULL);

       /* create actiongroup and map actions */
       actiongroup = g_simple_action_group_new();
       g_action_map_add_action_entries(G_ACTION_MAP(actiongroup),
    tab_actions,
             G_N_ELEMENTS(tab_actions), NULL);

       /* map accelerators to actions */
       for (i = 0; i < G_N_ELEMENTS(tab_accels); i++)
          gtk_application_set_accels_for_action(GTK_APPLICATION(app),
                tab_accels[i].action, tab_accels[i].accel);

       /* create new GtkMenu from GtkBuilder */
       menu =
    gtk_menu_new_from_model(G_MENU_MODEL(gtk_builder_get_object(builder,
    "tab-menu")));

       /* insert action group into menu */
       gtk_widget_insert_action_group(menu, "tab",
    G_ACTION_GROUP(actiongroup));

       /* connect tab menu to right-click handler of notebook */
       g_signal_connect(G_OBJECT(notebook), "button-press-event",
    G_CALLBACK(context_cb), menu);

       g_object_unref(builder);

    }




And for completeness the right-click handler:

    gboolean context_cb(GtkWidget *notebook, GdkEventButton *event,
    gpointer data)
    {
       (void) notebook;

       if (event->button == 3) {
          gtk_menu_popup_at_pointer(GTK_MENU(data), (GdkEvent*)event);
          return TRUE;
       }

       return FALSE;
    }



However, I'm afraid I'm back on my own and just have to find where it
goes wrong in my application.

Thanks


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]