Search code examples
cgtk3gtk2gtk4

How do I create a close button for notebook tab with GTK/C?


I searching a way to create a small close button for notebook tabs. Here is a common way to create a big close button for GTK 2.24, GTK 3 and 4:

GtkWidget *head, *content, *image, *btn, *label = gtk_label_new ("Title");

// create empty boxes
#if GTK_CHECK_VERSION (3,0,0)
    head = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
    content = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
#else
    head = gtk_hbox_new (FALSE, 0);
    content = gtk_vbox_new (FALSE, 0);
#endif

// add text to box
#if GTK_CHECK_VERSION (4,0,0)
    gtk_box_append (GTK_BOX (head), label);
#else
    gtk_box_pack_start (GTK_BOX (head), label, FALSE, FALSE, 0);
#endif

// create close button
#if GTK_CHECK_VERSION (4,0,0)
    btn = gtk_button_new_from_icon_name ("gtk-close");
    gtk_button_set_has_frame (GTK_BUTTON (btn), FALSE);
#else
    btn = gtk_button_new ();
    gtk_button_set_image (GTK_BUTTON (btn), gtk_image_new_from_icon_name ("gtk-close", GTK_ICON_SIZE_MENU));
    gtk_button_set_relief (GTK_BUTTON (btn), GTK_RELIEF_NONE);
#endif
#if GTK_CHECK_VERSION (3,20,0)
    gtk_widget_set_focus_on_click (btn, FALSE);
#else
    gtk_button_set_focus_on_click (GTK_BUTTON (btn), FALSE);
#endif

// add button to box
#if GTK_CHECK_VERSION (4,0,0)
    gtk_box_append (GTK_BOX (head), btn);
#else
    gtk_box_pack_start (GTK_BOX (head), btn, FALSE, FALSE, 0);
#endif

#if !GTK_CHECK_VERSION (4,0,0)
    gtk_widget_show_all (head);
#endif

// add boxes to notebook
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), content, head);
gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (notebook), content, TRUE);

The problem, buttons are oversized:
enter image description here

Compared to mate-terminal or geany:
enter image description here

Is someone have a good idea?


Solution

  • So a solution:

    #if GTK_CHECK_VERSION (4,0,0)
        GtkCssProvider* provider = gtk_css_provider_new ();
        gtk_css_provider_load_from_data (provider, "* { padding:0; }", -1);
        gtk_style_context_add_provider (
            gtk_widget_get_style_context (GTK_WIDGET (btn)),
            GTK_STYLE_PROVIDER (provider),
            GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    #elif GTK_CHECK_VERSION (3,0,0)
        GtkCssProvider* provider = gtk_css_provider_new ();
        gtk_css_provider_load_from_data (provider, "* { padding:0; }", -1, NULL);
        gtk_style_context_add_provider (
            gtk_widget_get_style_context (GTK_WIDGET (btn)),
            GTK_STYLE_PROVIDER (provider),
            GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    #else
        gtk_widget_set_name (btn, "close-button");
        gtk_rc_parse_string ("style \"close-button\"\n"
            "{\n"
                "GtkWidget::focus-padding = 0\n"
                "GtkWidget::focus-line-width = 0\n"
                "xthickness = 0\n"
                "ythickness = 0\n"
            "}\n"
            "widget \"*.close-button\" style \"close-button\"");
    #endif