P.B.
P.B.

Reputation: 190

How to use images in GTK Stack Switcher using C

I'm making application in gtk using C. I have a GtkStack with GtkStackSwitcher and I don't know how to set images/icons to buttons in stack switcher. I had similar problem with application in gtkmm and C++ but I was able to find required function in the documentation. This time, after searching the documentation for GtkStack, GtkStackSwitcher and GtkContainer, I didn't find anything useful in GtkStack and GtkStackSwitcher. In GtkContainer there is function gtk_container_child_set_property (). It may be the function I'm looking for but I have no idea how to put an icon-name into GValue and if it's possible. To sum up - can I set icon to GtkStackSwitcher's button with mentioned functions or using any other method?

Edit: Maybe it's possible to achieve this with css? Setting background-image for GtkStack and GtkStackSwticher doesn't work but setting background_image for buttons works. Works very bad but works. The image doesn't fit the button and button doesn't resize to be the image size (If i set button new from pixbuf the button does resize). So is it possible with css or is it a dead end?

Upvotes: 3

Views: 2556

Answers (1)

José Fonte
José Fonte

Reputation: 4114

From the GtkStack documentation, at Child Properties, you can see the property "icon-name":

The “icon-name” child property

“icon-name” gchar *

The icon name of the child page.

Flags: Read / Write

Default value: NULL

As you pointed out, we can use gtk_container_child_set_property on the GtkStack (a GtkContainer) and set the icon. The problem is that the stack uses the icon or the title, not both.

Here is a simple example in C code:

#include <gtk/gtk.h>

int main (int argc, char** argv) {
   GtkBox *box;
   GtkStack *stack;
   GtkLabel *label1;
   GtkLabel *label2;
   GtkWindow *window;
   GtkStackSwitcher *switcher;
   GValue iconval1 = G_VALUE_INIT;
   GValue iconval2 = G_VALUE_INIT;

   gtk_init (&argc, &argv);

   g_value_init (&iconval1, G_TYPE_STRING);
   g_value_init (&iconval2, G_TYPE_STRING);

   window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
   box    = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 6));
   stack  = GTK_STACK(gtk_stack_new ());
   switcher = GTK_STACK_SWITCHER(gtk_stack_switcher_new ());

   label1 = GTK_LABEL(gtk_label_new("Stack Page 1"));
   label2 = GTK_LABEL(gtk_label_new("Stack Page 2"));

   gtk_stack_add_titled(stack, GTK_WIDGET(label1), "Page 1", "Page 1");
   gtk_stack_add_titled(stack, GTK_WIDGET(label2), "Page 2", "Page 2");

   gtk_widget_set_halign (GTK_WIDGET(switcher), GTK_ALIGN_CENTER);

   g_value_set_string(&iconval1, "zoom-in-symbolic.symbolic");
   g_value_set_string(&iconval2, "zoom-out-symbolic.symbolic");

   gtk_container_child_set_property(GTK_CONTAINER(stack), GTK_WIDGET(label1), "icon-name", &iconval1);
   gtk_container_child_set_property(GTK_CONTAINER(stack), GTK_WIDGET(label2), "icon-name", &iconval2);

   gtk_stack_switcher_set_stack (switcher, stack);
   gtk_box_pack_start (box, GTK_WIDGET(switcher), FALSE, FALSE, 6);
   gtk_box_pack_start (box, GTK_WIDGET(stack), TRUE, TRUE, 6);

   gtk_container_add (GTK_CONTAINER(window), GTK_WIDGET(box));

   g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL);

   gtk_widget_show_all (GTK_WIDGET(window));

   gtk_main ();

   return 0;
}

Compile it with:

gcc -o test main.c `pkg-config --cflags --libs gtk+-3.0`

and the result should be:

enter image description here

EDIT:

As requested in the comments:

Can you tell me also how to change icon sizes of stack switcher icons? I see that stack switcher has property "icon-size"...

GtkStackSwitcher has the property "icon-size" but it was introduced in Gtk+ 3.20. So, in order to use this property there is this requirement.

To set a property to which Gtk+ does not provide a setter/getter you should use g_object_set (or set_full).

Using the code above:

   ...
   switcher = GTK_STACK_SWITCHER(gtk_stack_switcher_new ());

   g_object_set(G_OBJECT(switcher), "icon-size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);

   label1 = GTK_LABEL(gtk_label_new("Stack Page 1"));
   ...

The property is a gint value so you can try out some values and verify the size. There is also a enumerated type containing default sizes for icons, it's GtkIconSize. In the example i've used GTK_ICON_SIZE_LARGE_TOOLBAR (24px).

Upvotes: 5

Related Questions