static void add_child (GtkStackSwitcher *self, GtkWidget *widget) { GtkWidget *button; GList *group; button = gtk_radio_button_new (NULL); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); update_button (self, widget, button); group = gtk_container_get_children (GTK_CONTAINER (self)); if (group != NULL) { gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data)); g_list_free (group); } gtk_container_add (GTK_CONTAINER (self), button); g_object_set_data (G_OBJECT (button), "stack-child", widget); g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), self); g_signal_connect (widget, "child-notify::title", G_CALLBACK (on_title_icon_updated), self); g_signal_connect (widget, "child-notify::icon-name", G_CALLBACK (on_title_icon_updated), self); g_signal_connect (widget, "child-notify::position", G_CALLBACK (on_position_updated), self); g_hash_table_insert (self->priv->buttons, widget, button); }
/** \brief Create widget to control Printer[device]TextDevice resource * * \param[in] device device number * * \return GtkGrid */ GtkWidget *printer_output_mode_widget_create(int device) { GtkWidget *grid; GtkWidget *radio_text; GtkWidget *radio_gfx; GSList *group = NULL; char resource[256]; const char *value; /* can't use the resource base widgets here, since for some reason this * resource is a string with two possible values: "text" and "graphics" */ grid = uihelpers_create_grid_with_label("Output mode", 1); g_snprintf(resource, 256, "Printer%dOutput", device); resource_widget_set_resource_name(grid, resource); radio_text = gtk_radio_button_new_with_label(group, "Text"); g_object_set(radio_text, "margin-left", 16, NULL); radio_gfx = gtk_radio_button_new_with_label(group, "Graphics"); g_object_set(radio_gfx, "margin-left", 16, NULL); gtk_radio_button_join_group(GTK_RADIO_BUTTON(radio_gfx), GTK_RADIO_BUTTON(radio_text)); resources_get_string(resource, &value); if (strcmp(value, "text") == 0) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_text), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_gfx), TRUE); } gtk_grid_attach(GTK_GRID(grid), radio_text, 0, 1, 1, 1); gtk_grid_attach(GTK_GRID(grid), radio_gfx, 0, 2, 1, 1); g_signal_connect(radio_text, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"text"); g_signal_connect(radio_gfx, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"graphics"); g_signal_connect(grid, "destroy", G_CALLBACK(on_widget_destroy), NULL); gtk_widget_show_all(grid); return grid; }
/** \brief Create printer driver selection widget * * Creates a group of radio buttons to select the driver of printer # \a device. * Uses a custom property "DeviceNumber" for the radio buttons and the widget * itself to pass the device number to the event handler and to allow * printer_driver_widget_update() to select the proper radio button index. * * Printer 4/5: [ascii, mps803, nl10, raw] * Printer 6 : [1520, raw] * * \param[in] device device number (4-6) * * \return GtkGrid */ GtkWidget *printer_driver_widget_create(int device) { GtkWidget *grid; GtkWidget *radio_ascii = NULL; GtkWidget *radio_mps803 = NULL; GtkWidget *radio_nl10 = NULL; GtkWidget *radio_raw = NULL; GtkWidget *radio_1520 = NULL; GSList *group = NULL; const char *driver; /* build grid */ grid = uihelpers_create_grid_with_label("Driver", 1); /* set DeviceNumber property to allow the update function to work */ resource_widget_set_int(grid, "DeviceNumber", device); if (device == 4 || device == 5) { /* 'normal' printers */ /* ASCII */ radio_ascii = gtk_radio_button_new_with_label(group, "ASCII"); g_object_set_data(G_OBJECT(radio_ascii), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_ascii, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_ascii, 0, 1, 1, 1); /* MPS803 */ radio_mps803 = gtk_radio_button_new_with_label(group, "MPS-803"); gtk_radio_button_join_group(GTK_RADIO_BUTTON(radio_mps803), GTK_RADIO_BUTTON(radio_ascii)); g_object_set_data(G_OBJECT(radio_mps803), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_mps803, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_mps803, 0, 2, 1, 1); /* NL10 */ radio_nl10 = gtk_radio_button_new_with_label(group, "NL10"); gtk_radio_button_join_group(GTK_RADIO_BUTTON(radio_nl10), GTK_RADIO_BUTTON(radio_mps803)); g_object_set_data(G_OBJECT(radio_nl10), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_nl10, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_nl10, 0, 3, 1, 1); /* RAW */ radio_raw = gtk_radio_button_new_with_label(group, "RAW"); gtk_radio_button_join_group(GTK_RADIO_BUTTON(radio_raw), GTK_RADIO_BUTTON(radio_nl10)); g_object_set_data(G_OBJECT(radio_raw), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_raw, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_raw, 0, 4, 1, 1); } else if (device == 6) { /* plotter */ /* 1520 */ radio_1520 = gtk_radio_button_new_with_label(group, "1520"); g_object_set_data(G_OBJECT(radio_1520), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_1520, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_1520, 0, 1, 1, 1); /* RAW */ radio_raw = gtk_radio_button_new_with_label(group, "RAW"); gtk_radio_button_join_group(GTK_RADIO_BUTTON(radio_raw), GTK_RADIO_BUTTON(radio_1520)); g_object_set_data(G_OBJECT(radio_raw), "DeviceNumber", GINT_TO_POINTER(device)); g_object_set(radio_raw, "margin-left", 16, NULL); gtk_grid_attach(GTK_GRID(grid), radio_raw, 0, 2, 1, 1); } else { fprintf(stderr, "%s:%d:%s(): invalid device #%d\n", __FILE__, __LINE__, __func__, device); archdep_vice_exit(1); } /* set current driver from resource */ resources_get_string_sprintf("Printer%dDriver", &driver, device); printer_driver_widget_update(grid, driver); /* connect signal handlers */ g_signal_connect(radio_raw, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"raw"); if (device == 4 || device == 5) { g_signal_connect(radio_ascii, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"ascii"); g_signal_connect(radio_mps803, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"mps803"); g_signal_connect(radio_nl10, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"nl10"); } else if (device == 6) { g_signal_connect(radio_1520, "toggled", G_CALLBACK(on_radio_toggled), (gpointer)"1520"); } gtk_widget_show_all(grid); return grid; }
static void add_choice (GtkWidget *box, GVariant *choice, GHashTable *table) { const char *id; const char *name; g_autoptr(GVariant) options = NULL; const char *selected; g_variant_get (choice, "(&s&s@a(ss)&s)", &id, &name, &options, &selected); if (g_variant_n_children (options) == 0) { GtkWidget *button; button = gtk_check_button_new_with_label (name); g_object_set (button, "margin-top", 10, NULL); gtk_widget_show (button); if (strcmp (selected, "true") == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_container_add (GTK_CONTAINER (box), button); g_hash_table_insert (table, g_strdup (id), button); } else { GtkWidget *label; GtkWidget *group = NULL; int i; label = gtk_label_new (name); gtk_widget_show (label); gtk_widget_set_halign (label, GTK_ALIGN_START); g_object_set (label, "margin-top", 10, NULL); gtk_style_context_add_class (gtk_widget_get_style_context (label), "dim-label"); gtk_container_add (GTK_CONTAINER (box), label); for (i = 0; i < g_variant_n_children (options); i++) { const char *option_id; const char *option_name; GtkWidget *radio; g_variant_get_child (options, i, "(&s&s)", &option_id, &option_name); radio = gtk_radio_button_new_with_label (NULL, option_name); gtk_widget_show (radio); g_hash_table_insert (table, g_strconcat (id, ":", option_id, NULL), radio); if (group) gtk_radio_button_join_group (GTK_RADIO_BUTTON (radio), GTK_RADIO_BUTTON (group)); else group = radio; gtk_container_add (GTK_CONTAINER (box), radio); if (strcmp (selected, option_id) == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE); } } }