#include <gtk/gtk.h>
#include <string.h>
 
void hello(GtkApplication *app, gpointer data);
gchar *prompt(GtkWidget *window);
void getname(GtkEntry *entry, GtkWidget *parent) {
	g_signal_emit_by_name(parent, "response", 42);
}
 
int main(int argc, char *argv[])
{
	GtkApplication *app;
	int status;
 
	app = gtk_application_new("null.localhost.hello", G_APPLICATION_FLAGS_NONE);
	g_signal_connect(app, "activate", G_CALLBACK(hello), NULL);
	status = g_application_run(G_APPLICATION(app), argc, argv);
	g_object_unref(app);
 
	return status;
}
 
void hello(GtkApplication *app, gpointer data) {
	GtkWidget *win_hello;
	GtkWidget *label;
	gchar *name = NULL;
	gchar hello_str[] = "Hello, ";
	gchar *greeting;
 
	win_hello = gtk_application_window_new(app);
	gtk_window_set_title(GTK_WINDOW(win_hello), "Hello");
	gtk_window_set_default_size(GTK_WINDOW(win_hello), 180, 100);
	gtk_container_set_border_width(GTK_CONTAINER(win_hello), 10);
 
	name = prompt(win_hello);
	if (name == NULL) {
		gtk_application_remove_window(app, GTK_WINDOW(win_hello));
	} else {
		greeting 
= g_malloc
(sizeof(gchar
) * (strlen(name
) + 1) + sizeof(hello_str
));		g_strlcpy(greeting, hello_str, sizeof(hello_str));
		g_strlcat
(greeting
, name
, strlen(name
) + sizeof(hello_str
) + 1);		g_strlcat(greeting, "!", 1);
		label = gtk_label_new(greeting);
		gtk_container_add(GTK_CONTAINER(win_hello), label);
 
		gtk_widget_show_all(win_hello);
	}
}
 
gchar *prompt(GtkWidget *window) {
	GtkWidget *win_prompt;
	GtkWidget *content_area;
	GtkWidget *label;
	GtkWidget *entry;
	GtkWidget *box;
	GtkDialogFlags flags = GTK_DIALOG_MODAL;
	const gchar *in_data;
	gchar *buffer;
	gint result;
 
	win_prompt = gtk_dialog_new_with_buttons("Prompt", GTK_WINDOW(window), flags, "OK", GTK_RESPONSE_ACCEPT, "Cancel", GTK_RESPONSE_REJECT, NULL);
	content_area = gtk_dialog_get_content_area(GTK_DIALOG(win_prompt));
 
	box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
	gtk_container_add(GTK_CONTAINER(content_area), box);
 
	label = gtk_label_new("Your name:");
	gtk_box_pack_start(GTK_BOX(box), label, TRUE, FALSE, FALSE);
 
	entry = gtk_entry_new();
	g_signal_connect(entry, "activate", G_CALLBACK(getname), win_prompt);
	gtk_box_pack_start(GTK_BOX(box), entry, TRUE, FALSE, FALSE);
 
	gtk_widget_show_all(win_prompt);
 
	result = gtk_dialog_run(GTK_DIALOG(win_prompt));
 
	switch(result) {
	case GTK_RESPONSE_REJECT:
		gtk_widget_destroy(win_prompt);
		return NULL;
	case GTK_RESPONSE_ACCEPT:
	default:
		in_data = gtk_entry_get_text(GTK_ENTRY(entry));
		buffer = g_strdup(in_data);
		gtk_widget_destroy(win_prompt);
		return buffer;
	}
}
				I2luY2x1ZGUgPGd0ay9ndGsuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCBoZWxsbyhHdGtBcHBsaWNhdGlvbiAqYXBwLCBncG9pbnRlciBkYXRhKTsKZ2NoYXIgKnByb21wdChHdGtXaWRnZXQgKndpbmRvdyk7CnZvaWQgZ2V0bmFtZShHdGtFbnRyeSAqZW50cnksIEd0a1dpZGdldCAqcGFyZW50KSB7CglnX3NpZ25hbF9lbWl0X2J5X25hbWUocGFyZW50LCAicmVzcG9uc2UiLCA0Mik7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCUd0a0FwcGxpY2F0aW9uICphcHA7CglpbnQgc3RhdHVzOwoKCWFwcCA9IGd0a19hcHBsaWNhdGlvbl9uZXcoIm51bGwubG9jYWxob3N0LmhlbGxvIiwgR19BUFBMSUNBVElPTl9GTEFHU19OT05FKTsKCWdfc2lnbmFsX2Nvbm5lY3QoYXBwLCAiYWN0aXZhdGUiLCBHX0NBTExCQUNLKGhlbGxvKSwgTlVMTCk7CglzdGF0dXMgPSBnX2FwcGxpY2F0aW9uX3J1bihHX0FQUExJQ0FUSU9OKGFwcCksIGFyZ2MsIGFyZ3YpOwoJZ19vYmplY3RfdW5yZWYoYXBwKTsKCglyZXR1cm4gc3RhdHVzOwp9Cgp2b2lkIGhlbGxvKEd0a0FwcGxpY2F0aW9uICphcHAsIGdwb2ludGVyIGRhdGEpIHsKCUd0a1dpZGdldCAqd2luX2hlbGxvOwoJR3RrV2lkZ2V0ICpsYWJlbDsKCWdjaGFyICpuYW1lID0gTlVMTDsKCWdjaGFyIGhlbGxvX3N0cltdID0gIkhlbGxvLCAiOwoJZ2NoYXIgKmdyZWV0aW5nOwoKCXdpbl9oZWxsbyA9IGd0a19hcHBsaWNhdGlvbl93aW5kb3dfbmV3KGFwcCk7CglndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKHdpbl9oZWxsbyksICJIZWxsbyIpOwoJZ3RrX3dpbmRvd19zZXRfZGVmYXVsdF9zaXplKEdUS19XSU5ET1cod2luX2hlbGxvKSwgMTgwLCAxMDApOwoJZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIod2luX2hlbGxvKSwgMTApOwoKCW5hbWUgPSBwcm9tcHQod2luX2hlbGxvKTsKCWlmIChuYW1lID09IE5VTEwpIHsKCQlndGtfYXBwbGljYXRpb25fcmVtb3ZlX3dpbmRvdyhhcHAsIEdUS19XSU5ET1cod2luX2hlbGxvKSk7Cgl9IGVsc2UgewoJCWdyZWV0aW5nID0gZ19tYWxsb2Moc2l6ZW9mKGdjaGFyKSAqIChzdHJsZW4obmFtZSkgKyAxKSArIHNpemVvZihoZWxsb19zdHIpKTsKCQlnX3N0cmxjcHkoZ3JlZXRpbmcsIGhlbGxvX3N0ciwgc2l6ZW9mKGhlbGxvX3N0cikpOwoJCWdfc3RybGNhdChncmVldGluZywgbmFtZSwgc3RybGVuKG5hbWUpICsgc2l6ZW9mKGhlbGxvX3N0cikgKyAxKTsKCQlnX3N0cmxjYXQoZ3JlZXRpbmcsICIhIiwgMSk7CgkJbGFiZWwgPSBndGtfbGFiZWxfbmV3KGdyZWV0aW5nKTsKCQlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHdpbl9oZWxsbyksIGxhYmVsKTsKCgkJZ3RrX3dpZGdldF9zaG93X2FsbCh3aW5faGVsbG8pOwoJfQp9CgpnY2hhciAqcHJvbXB0KEd0a1dpZGdldCAqd2luZG93KSB7CglHdGtXaWRnZXQgKndpbl9wcm9tcHQ7CglHdGtXaWRnZXQgKmNvbnRlbnRfYXJlYTsKCUd0a1dpZGdldCAqbGFiZWw7CglHdGtXaWRnZXQgKmVudHJ5OwoJR3RrV2lkZ2V0ICpib3g7CglHdGtEaWFsb2dGbGFncyBmbGFncyA9IEdUS19ESUFMT0dfTU9EQUw7Cgljb25zdCBnY2hhciAqaW5fZGF0YTsKCWdjaGFyICpidWZmZXI7CglnaW50IHJlc3VsdDsKCgl3aW5fcHJvbXB0ID0gZ3RrX2RpYWxvZ19uZXdfd2l0aF9idXR0b25zKCJQcm9tcHQiLCBHVEtfV0lORE9XKHdpbmRvdyksIGZsYWdzLCAiT0siLCBHVEtfUkVTUE9OU0VfQUNDRVBULCAiQ2FuY2VsIiwgR1RLX1JFU1BPTlNFX1JFSkVDVCwgTlVMTCk7Cgljb250ZW50X2FyZWEgPSBndGtfZGlhbG9nX2dldF9jb250ZW50X2FyZWEoR1RLX0RJQUxPRyh3aW5fcHJvbXB0KSk7CgoJYm94ID0gZ3RrX2JveF9uZXcoR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLCAxMCk7CglndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKGNvbnRlbnRfYXJlYSksIGJveCk7CgoJbGFiZWwgPSBndGtfbGFiZWxfbmV3KCJZb3VyIG5hbWU6Iik7CglndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChib3gpLCBsYWJlbCwgVFJVRSwgRkFMU0UsIEZBTFNFKTsKCgllbnRyeSA9IGd0a19lbnRyeV9uZXcoKTsKCWdfc2lnbmFsX2Nvbm5lY3QoZW50cnksICJhY3RpdmF0ZSIsIEdfQ0FMTEJBQ0soZ2V0bmFtZSksIHdpbl9wcm9tcHQpOwoJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goYm94KSwgZW50cnksIFRSVUUsIEZBTFNFLCBGQUxTRSk7CgoJZ3RrX3dpZGdldF9zaG93X2FsbCh3aW5fcHJvbXB0KTsKCglyZXN1bHQgPSBndGtfZGlhbG9nX3J1bihHVEtfRElBTE9HKHdpbl9wcm9tcHQpKTsKCglzd2l0Y2gocmVzdWx0KSB7CgljYXNlIEdUS19SRVNQT05TRV9SRUpFQ1Q6CgkJZ3RrX3dpZGdldF9kZXN0cm95KHdpbl9wcm9tcHQpOwoJCXJldHVybiBOVUxMOwoJY2FzZSBHVEtfUkVTUE9OU0VfQUNDRVBUOgoJZGVmYXVsdDoKCQlpbl9kYXRhID0gZ3RrX2VudHJ5X2dldF90ZXh0KEdUS19FTlRSWShlbnRyeSkpOwoJCWJ1ZmZlciA9IGdfc3RyZHVwKGluX2RhdGEpOwoJCWd0a193aWRnZXRfZGVzdHJveSh3aW5fcHJvbXB0KTsKCQlyZXR1cm4gYnVmZmVyOwoJfQp9