grim/glade-template

Cycle the icon when clicking on it
draft default tip
2021-04-30, Gary Kramlich
48884acdf40f
Parents b20293b143e8
Children
Cycle the icon when clicking on it
--- a/fancywindow.c Fri Apr 30 01:26:49 2021 -0500
+++ b/fancywindow.c Fri Apr 30 01:49:16 2021 -0500
@@ -1,12 +1,46 @@
+#include <glib/gstdio.h>
+
#include "fancywindow.h"
struct _FancyWindow {
GtkWindow parent;
+
+ GtkWidget *image;
};
+static const gchar *icons[4] = {
+ "computer",
+ "audio-x-generic",
+ "start-here",
+ "user-trash",
+};
+static gint current_icon = 0;
+
G_DEFINE_TYPE(FancyWindow, fancy_window, GTK_TYPE_WINDOW)
static void
+fancy_window_clicked_cb(GtkButton *button, gpointer data) {
+ g_printf("Button %p was clicked, with data %p\n", button, data);
+}
+
+static gboolean
+fancy_window_image_clicked_cb(GtkWidget *widget, GdkEvent *event,
+ gpointer data)
+{
+ FancyWindow *window = FANCY_WINDOW(data);
+
+ current_icon = current_icon + 1;
+ if(current_icon >= G_N_ELEMENTS(icons)) {
+ current_icon = 0;
+ }
+
+ gtk_image_set_from_icon_name(GTK_IMAGE(window->image), icons[current_icon],
+ GTK_ICON_SIZE_DIALOG);
+
+ return TRUE;
+}
+
+static void
fancy_window_init(FancyWindow *window) {
gtk_widget_init_template(GTK_WIDGET(window));
}
@@ -17,6 +51,13 @@
gtk_widget_class_set_template_from_resource(widget_class,
"/fancy/fancywindow.ui");
+
+ gtk_widget_class_bind_template_child(widget_class, FancyWindow, image);
+
+ gtk_widget_class_bind_template_callback(widget_class,
+ fancy_window_clicked_cb);
+ gtk_widget_class_bind_template_callback(widget_class,
+ fancy_window_image_clicked_cb);
}
GtkWidget *
--- a/fancywindow.ui Fri Apr 30 01:26:49 2021 -0500
+++ b/fancywindow.ui Fri Apr 30 01:49:16 2021 -0500
@@ -29,6 +29,7 @@
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
+ <signal name="clicked" handler="fancy_window_clicked_cb" object="FancyWindow" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -37,11 +38,18 @@
</packing>
</child>
<child>
- <object class="GtkImage">
+ <object class="GtkEventBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
- <property name="icon-name">computer</property>
- <property name="icon_size">6</property>
+ <signal name="button-release-event" handler="fancy_window_image_clicked_cb" object="FancyWindow" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">computer</property>
+ <property name="icon_size">6</property>
+ </object>
+ </child>
</object>
<packing>
<property name="expand">False</property>
--- a/fancywindow.ui~ Fri Apr 30 01:26:49 2021 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2 -->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <template class="FancyWindow" parent="GtkWindow">
- <property name="can-focus">False</property>
- <property name="border-width">8</property>
- <signal name="delete-event" handler="gtk_widget_destroy" swapped="no"/>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">First!</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton">
- <property name="label" translatable="yes">Second</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="icon-name">computer</property>
- <property name="icon_size">6</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </template>
-</interface>