/* Řádek pro editaci textu (GtkEntry) */
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
GtkWidget *window; /* GtkWindow, hlavní okno programu */
GtkWidget *view; /* Label v hlavním okně, který zobrazuje obsah dialog_data */
GtkWidget *toggle; /* Toggle button pro zobrazování dialogu */
GtkWidget *dialog; /* GtkDialog */
GtkWidget *scale; /* GtkScale v dialogu */
GSList *radios; /* Radio buttons v dialogu */
gboolean modal; /* TRUE pro modální dialog */
gint delete_event_handler; /* Handler dialogu pro "delete-event" */
/* Vyžaduje potvrzení před zavřením hlavního okna */
static gboolean main_delete(GtkWidget *widget, GdkEvent *event, gpointer data) /* {{{ */
{
GtkWidget *dialog;
gint resp;
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Naozaj ukoncit program?");
resp = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
switch (resp)
{
case GTK_RESPONSE_NONE:
g_printerr("No response from message dialog\n");
return TRUE;
case GTK_RESPONSE_YES:
g_printerr("Response YES from message dialog\n");
return FALSE;
case GTK_RESPONSE_NO:
g_printerr("Response NO from message dialog\n");
return TRUE;
case GTK_RESPONSE_DELETE_EVENT:
g_printerr("Message dialog deleted\n");
return TRUE;
default:
g_printerr("Response %d from message dialog\n", resp);
return TRUE;
}
} /* }}} */
/* Událost "delete-event" nezruší dialog. Standardní obsluha "delete-event"
* vygeneruje signál "response" s hodnotou GTK_RESPONSE_DELETE_EVENT. Tato
* standardní obsluha se volá jako první, takže proběhne, i když
* dialog_delete() vratí TRUE. Funkce gtk_dialog_run() si přidá ještě svůj
* handler, který ukončuje rekurzivně volanou smyčku událostí. Tento handler
* se nezavolá díky návratové hodnotě TRUE z dialog_delete(). To ale nevadí,
* protože standardní obsluha "response" také ukončí vnořenou smyčku událostí.
*/
static gboolean dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data) /* {{{ */
{
g_printerr("dialog_delete() called\n");
return TRUE;
} /* }}} */
/* Zobrazení/schování dialogu (modální nebo nemodální) */
static void show_dialog(GtkWidget *widget, gpointer data) /* {{{ */
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
/* Zobrazit */
if(modal) {
gtk_dialog_run(GTK_DIALOG(data));
} else
gtk_widget_show(GTK_WIDGET(data));
} else
gtk_widget_hide(GTK_WIDGET(data));
} /* }}} */
/* Handler signálu "response", volá se při zavření dialogu */
static void response_handler(GtkDialog *dialog, gint resp, gpointer data) /* {{{ */
{
switch(resp) {
case GTK_RESPONSE_NONE:
g_printerr("No response from dialog\n");
break;
case GTK_RESPONSE_OK:
g_printerr("Response OK from dialog\n");
// get_dialog_data(GTK_WIDGET(dialog), &dialog_data);
// update_label(GTK_LABEL(view));
break;
case GTK_RESPONSE_CANCEL:
g_printerr("Response Cancel from dialog\n");
break;
case GTK_RESPONSE_DELETE_EVENT:
g_printerr("Dialog deleted\n");
break;
default:
g_printerr("Response %d from dialog\n", resp);
break;
}
/* Vygeneruje "toggled", zavolá se show_dialog() a schová dialog. */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), FALSE);
} /* }}} */
/* Aktivace editačního řádku (stisk Enter) */
static void activate(GtkWidget *widget, gpointer data)
{
g_print("ACTIVATED: %s\n", gtk_entry_get_text(GTK_ENTRY(widget)));
}
int main(int argc, char *argv[])
{
int i;
char buf[20];
GtkWidget *box, *buttons, *widget, *entry, *notebook;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
gtk_window_set_title(GTK_WINDOW(window), "TELZOZN");
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(main_delete), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
box = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(window), box);
/* Label */
view = gtk_label_new("Enter phone number:");
gtk_label_set_justify(GTK_LABEL(view), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(view), 0, 0.5);
gtk_box_pack_start(GTK_BOX(box), view, FALSE, FALSE, 0);
/* Edit line */
entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(activate), NULL);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
/* Submit button */
toggle = gtk_toggle_button_new_with_mnemonic("_Show dialog");
GTK_WIDGET_SET_FLAGS(toggle, GTK_CAN_DEFAULT);
gtk_box_pack_end(GTK_BOX(box), toggle, FALSE, FALSE, 0);
gtk_widget_grab_default(toggle);
/* Dialog */
dialog = gtk_dialog_new();
delete_event_handler = g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(dialog_delete), NULL);
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(response_handler), toggle);
gtk_window_set_title(GTK_WINDOW(dialog), "A dialog");
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(window));
gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 5);
/* Vytvořit notebook a vložit do okna */
notebook = gtk_notebook_new();
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook, TRUE, TRUE, 0);
/* Povolit scrollování, pokud je záložek více, než se vejde do okna */
gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
/* Povolit popup menu se seznamem stránek */
gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
/* Vytvořit stránky notebooku */
for(i=1; i<=10; i++) {
box = gtk_alignment_new(0.5, 0.5, 0, 0);
g_snprintf(buf, 20, "Button %d", i);
widget = gtk_button_new_with_label(buf);
gtk_container_add(GTK_CONTAINER(box), widget);
g_snprintf(buf, 20, "Page %d", i);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box,
gtk_label_new(buf));
}
/*
box = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), box, FALSE, FALSE, 0);
widget = gtk_label_new_with_mnemonic("_Scale:");
gtk_box_pack_start(GTK_BOX(box), widget, FALSE, FALSE, 0);
scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, -10, 10, 0.1, 1, 0)));
g_object_set_data(G_OBJECT(scale), "get-data-fun", get_scale_val);
g_object_set_data(G_OBJECT(scale), "data-offset", GINT_TO_POINTER(G_STRUCT_OFFSET(struct dialog_data, scale)));
gtk_label_set_mnemonic_widget(GTK_LABEL(widget), scale);
gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_RIGHT);
gtk_box_pack_start(GTK_BOX(box), scale, TRUE, TRUE, 0);
frame = gtk_frame_new("Radio buttons in frame");
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 0);
box = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(frame), box);
widget = gtk_radio_button_new_with_mnemonic(NULL, "_A");
g_object_set_data(G_OBJECT(widget), "get-data-fun", get_radio_val);
g_object_set_data(G_OBJECT(widget), "data-offset", GINT_TO_POINTER(G_STRUCT_OFFSET(struct dialog_data, radio)));
gtk_box_pack_start(GTK_BOX(box), widget, FALSE, FALSE, 0);
widget = gtk_radio_button_new_with_mnemonic_from_widget( GTK_RADIO_BUTTON(widget), "_B");
g_object_set_data(G_OBJECT(widget), "get-data-fun", get_radio_val);
g_object_set_data(G_OBJECT(widget), "data-offset", GINT_TO_POINTER(G_STRUCT_OFFSET(struct dialog_data, radio)));
gtk_box_pack_start(GTK_BOX(box), widget, FALSE, FALSE, 0);
widget = gtk_radio_button_new_with_mnemonic_from_widget( GTK_RADIO_BUTTON(widget), "_C");
g_object_set_data(G_OBJECT(widget), "get-data-fun", get_radio_val);
g_object_set_data(G_OBJECT(widget), "data-offset", GINT_TO_POINTER(G_STRUCT_OFFSET(struct dialog_data, radio)));
gtk_box_pack_start(GTK_BOX(box), widget, FALSE, FALSE, 0);
widget = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK);
GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_DEFAULT);
gtk_widget_grab_default(widget);
gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
*/
g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(show_dialog), dialog);
gtk_container_foreach(GTK_CONTAINER(dialog), (GtkCallback)gtk_widget_show_all, NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
/* Modeline for ViM {{{
* vim: set ts=4:
* vim600: fdm=marker fdl=0 fdc=3:
* }}} */
Platon Group <platon@platon.org> http://platon.org/
|