Lately I am delighting to improve an application with GTK interface I would like to prevent the use of the X button in the corner since closing with that button destroys its contents preventing me from reopening the window.
I looked on the GTK site if it was possible to disable the button or to manage the event in order to hide instead of closing the window, unfortunately what I found is written in C and I was unable to translate it into FreeBASIC also because I use Glade to draw myself the interface and examples are written to be integrated into the source.
glade source
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkWindow" id="GFAM_preference">
<property name="name">GFAM_preference</property>
<property name="can-focus">False</property>
<signal name="delete-event" handler="on_GFAM_preference_delete_event" swapped="no"/>
<child>
<placeholder/>
</child>
</object>
<object class="GtkWindow">
<property name="can-focus">False</property>
<child>
<object class="GtkFixed">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
</interface>
Code: Select all
#DEFINE __USE_GTK3__
#INCLUDE ONCE "gtk/gtk.bi"
gtk_init(@__FB_ARGC__, @__FB_ARGV__)
SCOPE
VAR er = gtk_check_version_(3, 0, 0)
IF er THEN
?"Error (GTK-Version):"
?*er
END 1
END IF
END SCOPE
DIM SHARED AS GtkBuilder PTR XML
'Main
DIM SHARED AS GObject PTR _
GFAM_main
'preference
DIM SHARED AS GObject PTR _
GFAM_preference
XML = gtk_builder_new()
SCOPE
DIM AS GError PTR meld
IF 0 = gtk_builder_add_from_file(XML, "GFAM.ui", @meld) THEN
WITH *meld
?"Error (GTK-Builder):"
?*.message
END WITH
g_error_free(meld)
END 2
END IF
END SCOPE
'main
GFAM_main = gtk_builder_get_object(XML, "GFAM_main")
'preference
GFAM_preference = gtk_builder_get_object(XML, "GFAM_preference")
SUB on_GFAM_preference_delete_event CDECL ALIAS "on_GFAM_preference_delete_event" ( _
BYVAL widget AS GtkWidget PTR, _
BYVAL user_data AS gpointer) EXPORT
gtk_widget_hide(GTK_WIDGET(GFAM_preference))
END SUB
gtk_builder_connect_signals(XML, 0)
g_object_unref(XML)
gtk_widget_show_all(GTK_WIDGET(GFAM_main))
gtk_main()
Code: Select all
#include <gtk/gtk.h>
void
on_button_clicked(GtkButton *button, gpointer data)
{
GtkWidget *widget;
widget = (GtkWidget *) data;
if (widget == NULL)
return;
gtk_widget_show(widget);
return;
}
gboolean
on_widget_deleted(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_widget_hide(widget);
return TRUE;
}
int
main(int argc, char **argv)
{
GtkWidget *window1;
GtkWidget *window2;
GtkWidget *button;
gtk_init(&argc, &argv);
window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Show again...");
g_signal_connect(G_OBJECT(window1),
"destroy", gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(window2),
"delete-event", G_CALLBACK(on_widget_deleted), NULL);
g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(on_button_clicked), window2);
gtk_container_add(GTK_CONTAINER(window1), button);
gtk_widget_set_size_request(window1, 300, 100);
gtk_widget_set_size_request(window2, 300, 100);
gtk_widget_show_all(window1);
gtk_widget_show(window2);
gtk_main();
return 0;
}