static NmtEditorGridFormState * get_form_state (NmtNewtWidget *widget) { NmtNewtForm *form = nmt_newt_widget_get_form (widget); NmtEditorGridFormState *state; if (!form) return NULL; state = g_object_get_data (G_OBJECT (form), "NmtEditorGridFormState"); if (state) return state; state = g_new0 (NmtEditorGridFormState, 1); g_object_set_data_full (G_OBJECT (form), "NmtEditorGridFormState", state, g_free); return state; }
static void maybe_save_input_and_exit (NmtNewtWidget *widget, gpointer dialog) { NmtPasswordDialogPrivate *priv = NMT_PASSWORD_DIALOG_GET_PRIVATE (dialog); int i; /* This gets invoked when the user types Return in the final entry, * but the form may not be fully valid in that case. */ if (!nmt_newt_widget_get_valid (priv->secret_grid)) return; priv->succeeded = TRUE; for (i = 0; i < priv->secrets->len; i++) { NMSecretAgentSimpleSecret *secret = priv->secrets->pdata[i]; g_free (secret->value); g_object_get (priv->entries->pdata[i], "text", &secret->value, NULL); } nmt_newt_form_quit (nmt_newt_widget_get_form (widget)); }
static void ensure_widgets (NmtWidgetList *list) { NmtWidgetListPrivate *priv = NMT_WIDGET_LIST_GET_PRIVATE (list); NmtNewtWidget *widget, *button, *focus; gboolean was_empty; NmtNewtForm *form; int i; was_empty = priv->widgets->len == 0; if (priv->length < priv->widgets->len) { /* remove excess widgets */ for (i = priv->length; i < priv->widgets->len; i++) { nmt_newt_container_remove (NMT_NEWT_CONTAINER (list), priv->widgets->pdata[i]); nmt_newt_container_remove (NMT_NEWT_CONTAINER (list), priv->remove_buttons->pdata[i]); } g_ptr_array_set_size (priv->widgets, priv->length); g_ptr_array_set_size (priv->remove_buttons, priv->length); } else if (priv->length > priv->widgets->len) { /* add new widgets */ for (i = priv->widgets->len; i < priv->length; i++) { widget = NMT_WIDGET_LIST_GET_CLASS (list)->create_widget (list, i); nmt_newt_grid_add (NMT_NEWT_GRID (list), widget, 0, i); g_ptr_array_add (priv->widgets, widget); button = nmt_newt_button_new (_("Remove")); g_signal_connect (button, "clicked", G_CALLBACK (remove_clicked), list); nmt_newt_grid_add (NMT_NEWT_GRID (list), button, 1, i); nmt_newt_widget_set_padding (button, 1, 0, 0, 0); g_ptr_array_add (priv->remove_buttons, button); } } else return; if (priv->widgets->len == 0 && priv->empty_widget) { nmt_newt_widget_set_visible (priv->empty_widget, TRUE); nmt_newt_grid_move (NMT_NEWT_GRID (list), priv->add_button, 0, 1); } else { if (was_empty && priv->empty_widget) nmt_newt_widget_set_visible (priv->empty_widget, FALSE); nmt_newt_grid_move (NMT_NEWT_GRID (list), priv->add_button, 0, priv->length); } form = nmt_newt_widget_get_form (NMT_NEWT_WIDGET (list)); if (form) { if (priv->widgets->len) { if (was_empty) focus = priv->widgets->pdata[0]; else focus = priv->widgets->pdata[priv->widgets->len - 1]; } else focus = priv->add_button; nmt_newt_form_set_focus (form, focus); } g_clear_object (&priv->add_sensitivity); if (priv->widgets->len) { widget = priv->widgets->pdata[priv->widgets->len - 1]; priv->add_sensitivity = g_object_bind_property (widget, "valid", priv->add_button, "sensitive", G_BINDING_SYNC_CREATE); g_object_add_weak_pointer (G_OBJECT (priv->add_sensitivity), (gpointer *)&priv->add_sensitivity); } }
static void nmt_newt_popup_activated (NmtNewtWidget *widget) { NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (widget); NmtNewtPopupEntry *entries = (NmtNewtPopupEntry *)priv->entries->data; NmtNewtForm *form; NmtNewtWidget *listbox, *ret; int button_x, button_y; int window_x, window_y; int list_w, list_h; int i, active; listbox = nmt_newt_listbox_new (priv->entries->len, 0); nmt_newt_widget_set_exit_on_activate (listbox, TRUE); for (i = 0; i < priv->entries->len; i++) nmt_newt_listbox_append (NMT_NEWT_LISTBOX (listbox), entries[i].label, NULL); nmt_newt_listbox_set_active (NMT_NEWT_LISTBOX (listbox), priv->active); nmt_newt_widget_set_padding (listbox, 1, 0, 1, 0); nmt_newt_widget_size_request (listbox, &list_w, &list_h); g_object_get (nmt_newt_widget_get_form (widget), "x", &window_x, "y", &window_y, NULL); newtComponentGetPosition (nmt_newt_component_get_component (NMT_NEWT_COMPONENT (widget)), &button_x, &button_y); /* (window_x + button_x) is the screen X coordinate of the newtComponent. A * newtButton labelled "Foo" is rendered as " <Foo>" (with a preceding * space), so the "F" is at (window_x + button_x + 2). We've added 1 column * of padding to the left of the listbox, so we need to position the popup * at (window_x + button_x + 1) in order for its text to be aligned with the * button's text. (The x and y coordinates given to NmtNewtForm are the * coordinates of the top left of the window content, ignoring the border * graphics.) */ window_x += button_x + 1; window_y += button_y - priv->active; form = g_object_new (NMT_TYPE_NEWT_FORM, "x", window_x, "y", window_y, "width", list_w, "height", list_h, "padding", 0, "escape-exits", TRUE, NULL); nmt_newt_form_set_content (form, listbox); ret = nmt_newt_form_run_sync (form); if (ret == listbox) active = nmt_newt_listbox_get_active (NMT_NEWT_LISTBOX (listbox)); else active = priv->active; g_object_unref (form); if (active != priv->active) { priv->active = active; g_object_notify (G_OBJECT (widget), "active"); g_object_notify (G_OBJECT (widget), "active-id"); nmt_newt_widget_needs_rebuild (widget); } NMT_NEWT_WIDGET_CLASS (nmt_newt_popup_parent_class)->activated (widget); }