forked from AuroraMiddleware/gtk
9948053cd7
GtkDialog is too flexible in terms of UI (headerbars vs action bar, etc), and has archaic APIs. It is time to retire it.
166 lines
5.9 KiB
C
166 lines
5.9 KiB
C
/* gcc -g -Wall -O2 -o dialog-test dialog-test.c `pkg-config --cflags --libs gtk4` */
|
|
#include <gtk/gtk.h>
|
|
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
|
|
static GtkWidget *window;
|
|
static GtkWidget *width_chars_spin;
|
|
static GtkWidget *max_width_chars_spin;
|
|
static GtkWidget *default_width_spin;
|
|
static GtkWidget *default_height_spin;
|
|
static GtkWidget *resizable_check;
|
|
|
|
static gboolean
|
|
set_label_idle (gpointer user_data)
|
|
{
|
|
GtkLabel *label = user_data;
|
|
GtkNative *native = gtk_widget_get_native (GTK_WIDGET (label));
|
|
GdkSurface *surface = gtk_native_get_surface (native);
|
|
char *str;
|
|
|
|
str = g_strdup_printf ("%d x %d",
|
|
gdk_surface_get_width (surface),
|
|
gdk_surface_get_height (surface));
|
|
gtk_label_set_label (label, str);
|
|
g_free (str);
|
|
|
|
return G_SOURCE_REMOVE;
|
|
}
|
|
|
|
static void
|
|
layout_cb (GdkSurface *surface, int width, int height, GtkLabel *label)
|
|
{
|
|
g_idle_add (set_label_idle, label);
|
|
}
|
|
|
|
static void
|
|
show_dialog (void)
|
|
{
|
|
GtkWidget *dialog;
|
|
GtkWidget *label;
|
|
int width_chars, max_width_chars, default_width, default_height;
|
|
gboolean resizable;
|
|
|
|
width_chars = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (width_chars_spin));
|
|
max_width_chars = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (max_width_chars_spin));
|
|
default_width = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (default_width_spin));
|
|
default_height = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (default_height_spin));
|
|
resizable = gtk_check_button_get_active (GTK_CHECK_BUTTON (resizable_check));
|
|
|
|
dialog = gtk_dialog_new_with_buttons ("Test", GTK_WINDOW (window),
|
|
GTK_DIALOG_MODAL,
|
|
"_Close", GTK_RESPONSE_CANCEL,
|
|
NULL);
|
|
|
|
label = gtk_label_new ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
"Nulla innn urna ac dui malesuada ornare. Nullam dictum "
|
|
"tempor mi et tincidunt. Aliquam metus nulla, auctor "
|
|
"vitae pulvinar nec, egestas at mi. Class aptent taciti "
|
|
"sociosqu ad litora torquent per conubia nostra, per "
|
|
"inceptos himenaeos. Aliquam sagittis, tellus congue "
|
|
"cursus congue, diam massa mollis enim, sit amet gravida "
|
|
"magna turpis egestas sapien. Aenean vel molestie nunc. "
|
|
"In hac habitasse platea dictumst. Suspendisse lacinia"
|
|
"mi eu ipsum vestibulum in venenatis enim commodo. "
|
|
"Vivamus non malesuada ligula.");
|
|
|
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
|
gtk_label_set_width_chars (GTK_LABEL (label), width_chars);
|
|
gtk_label_set_max_width_chars (GTK_LABEL (label), max_width_chars);
|
|
gtk_window_set_default_size (GTK_WINDOW (dialog), default_width, default_height);
|
|
gtk_window_set_resizable (GTK_WINDOW (dialog), resizable);
|
|
|
|
|
|
gtk_box_append (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
|
|
label);
|
|
|
|
label = gtk_label_new ("? x ?");
|
|
|
|
gtk_dialog_add_action_widget (GTK_DIALOG (dialog), label, GTK_RESPONSE_HELP);
|
|
gtk_widget_realize (dialog);
|
|
g_signal_connect (gtk_native_get_surface (GTK_NATIVE (dialog)), "layout",
|
|
G_CALLBACK (layout_cb), label);
|
|
g_signal_connect (dialog, "response",
|
|
G_CALLBACK (gtk_window_destroy),
|
|
NULL);
|
|
gtk_widget_show (dialog);
|
|
}
|
|
|
|
static void
|
|
create_window (void)
|
|
{
|
|
GtkWidget *grid;
|
|
GtkWidget *label;
|
|
GtkWidget *button;
|
|
|
|
window = gtk_window_new ();
|
|
gtk_window_set_title (GTK_WINDOW (window), "Window size");
|
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_window_set_child (GTK_WINDOW (window), grid);
|
|
|
|
label = gtk_label_new ("Width chars");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
width_chars_spin = gtk_spin_button_new_with_range (-1, 1000, 1);
|
|
gtk_widget_set_halign (width_chars_spin, GTK_ALIGN_START);
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), width_chars_spin, 1, 0, 1, 1);
|
|
|
|
label = gtk_label_new ("Max width chars");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
max_width_chars_spin = gtk_spin_button_new_with_range (-1, 1000, 1);
|
|
gtk_widget_set_halign (width_chars_spin, GTK_ALIGN_START);
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), max_width_chars_spin, 1, 1, 1, 1);
|
|
|
|
label = gtk_label_new ("Default size");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
default_width_spin = gtk_spin_button_new_with_range (-1, 1000, 1);
|
|
gtk_widget_set_halign (default_width_spin, GTK_ALIGN_START);
|
|
default_height_spin = gtk_spin_button_new_with_range (-1, 1000, 1);
|
|
gtk_widget_set_halign (default_height_spin, GTK_ALIGN_START);
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), default_width_spin, 1, 2, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), default_height_spin, 2, 2, 1, 1);
|
|
|
|
label = gtk_label_new ("Resizable");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
resizable_check = gtk_check_button_new ();
|
|
gtk_widget_set_halign (resizable_check, GTK_ALIGN_START);
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), resizable_check, 1, 3, 1, 1);
|
|
|
|
button = gtk_button_new_with_label ("Show");
|
|
g_signal_connect (button, "clicked", G_CALLBACK (show_dialog), NULL);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 2, 4, 1, 1);
|
|
|
|
gtk_widget_show (window);
|
|
|
|
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
|
|
|
|
g_signal_connect_swapped (window, "destroy",
|
|
G_CALLBACK (g_main_loop_quit),
|
|
loop);
|
|
|
|
g_main_loop_run (loop);
|
|
|
|
g_main_loop_unref (loop);
|
|
}
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
gtk_init ();
|
|
|
|
create_window ();
|
|
|
|
return 0;
|
|
}
|