/* Řádek pro editaci textu (GtkEntry) */ #include #include #include 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: * }}} */