static GObject* seahorse_widget_constructor (GType type, guint n_props, GObjectConstructParam* props) { SeahorseWidget *swidget; GObject *obj; GtkWindow *window; gint width, height; gchar *widthkey, *heightkey; obj = G_OBJECT_CLASS (parent_class)->constructor (type, n_props, props); swidget = SEAHORSE_WIDGET (obj); /* Load window size for windows that aren't dialogs */ window = GTK_WINDOW (seahorse_widget_get_toplevel (swidget)); if (!GTK_IS_DIALOG (window)) { widthkey = g_strdup_printf ("%s%s%s", WINDOW_SIZE, swidget->name, "_width"); width = seahorse_gconf_get_integer (widthkey); heightkey = g_strdup_printf ("%s%s%s", WINDOW_SIZE, swidget->name, "_height"); height = seahorse_gconf_get_integer (heightkey); if (width > 0 && height > 0) gtk_window_resize (window, width, height); g_free (widthkey); g_free (heightkey); } return obj; }
G_MODULE_EXPORT void on_gpgme_revoke_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); SeahorseRevokeReason reason; SeahorseGpgmeSubkey *subkey; const gchar *description; gpgme_error_t err; GtkWidget *widget; GtkTreeModel *model; GtkTreeIter iter; GValue value; widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "reason")); model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget)); gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter); memset (&value, 0, sizeof(value)); gtk_tree_model_get_value (model, &iter, COLUMN_INT, &value); reason = g_value_get_int (&value); g_value_unset (&value); description = gtk_entry_get_text (GTK_ENTRY (seahorse_widget_get_widget (swidget, "description"))); subkey = g_object_get_data (G_OBJECT (swidget), "subkey"); g_return_if_fail (SEAHORSE_IS_GPGME_SUBKEY (subkey)); err = seahorse_gpgme_key_op_revoke_subkey (subkey, reason, description); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't revoke subkey")); seahorse_widget_destroy (swidget); }
/* Disconnects callbacks, destroys main window widget, * and frees the xml definition and any other data */ static void object_finalize (GObject *gobject) { SeahorseWidget *swidget; swidget = SEAHORSE_WIDGET (gobject); /* Remove widget from hash and destroy hash if empty */ if (widgets) { g_hash_table_remove (widgets, swidget->name); if (g_hash_table_size (widgets) == 0) { g_hash_table_destroy (widgets); widgets = NULL; } } if (seahorse_widget_get_widget (swidget, swidget->name)) gtk_widget_destroy (GTK_WIDGET (seahorse_widget_get_widget (swidget, swidget->name))); g_object_unref (swidget->gtkbuilder); swidget->gtkbuilder = NULL; g_free (swidget->name); G_OBJECT_CLASS (parent_class)->finalize (gobject); }
static void object_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { SeahorseWidget *swidget; GtkWidget *w; char *path; swidget = SEAHORSE_WIDGET (object); switch (prop_id) { /* Loads gtkbuilder xml definition from name, connects common callbacks */ case PROP_NAME: g_return_if_fail (swidget->name == NULL); swidget->name = g_value_dup_string (value); path = g_strdup_printf ("%sseahorse-%s.xml", SEAHORSE_UIDIR, swidget->name); swidget->gtkbuilder = gtk_builder_new (); gtk_builder_add_from_file (swidget->gtkbuilder, path, NULL); g_free (path); g_return_if_fail (swidget->gtkbuilder != NULL); gtk_builder_connect_signals (swidget->gtkbuilder, swidget); w = GTK_WIDGET (seahorse_widget_get_widget (swidget, swidget->name)); /*TODO: glade_xml_ensure_accel (swidget->gtkbuilder);*/ gtk_window_set_icon_name (GTK_WINDOW (w), "seahorse"); break; } }
static void on_app_close (GtkAction* action, SeahorseKeyserverResults* self) { g_return_if_fail (SEAHORSE_IS_KEYSERVER_RESULTS (self)); g_return_if_fail (action == NULL || GTK_IS_ACTION (action)); seahorse_widget_destroy (SEAHORSE_WIDGET (self)); }
G_MODULE_EXPORT void on_prefs_add_keyserver_uri_changed (GtkWidget *unused, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkWidget *widget; gchar **types; gchar *t; gint active; widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "ok")); g_return_if_fail (widget != NULL); t = calculate_keyserver_uri (swidget); gtk_widget_set_sensitive (widget, t != NULL); g_free (t); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "keyserver-type")); g_return_if_fail (widget != NULL); /* Show or hide the port section based on whether 'custom' is selected */ active = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)); if (active > -1) { types = g_object_get_data (G_OBJECT (swidget), "keyserver-types"); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "port-block")); g_return_if_fail (widget != NULL); if (types && types[active] && types[active][0]) gtk_widget_show (widget); else gtk_widget_hide (widget); } }
SeahorseWidget* seahorse_widget_find (const gchar *name) { /* Check if have widget hash */ if (widgets != NULL) return SEAHORSE_WIDGET (g_hash_table_lookup (widgets, name)); return NULL; }
static void on_settings_keyserver_changed (GSettings *settings, const gchar *key, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); gchar **keyservers; keyservers = g_settings_get_strv (settings, key); populate_keyservers (swidget, keyservers); g_strfreev (keyservers); }
G_MODULE_EXPORT void on_prefs_keyserver_add_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *sw = SEAHORSE_WIDGET (user_data); SeahorseWidget *swidget; gchar **types; GtkWidget *widget; gint response; gchar *result = NULL; GtkTreeView *treeview; GtkTreeStore *store; GtkTreeIter iter; guint i; swidget = seahorse_widget_new_allow_multiple ("add-keyserver", GTK_WINDOW (seahorse_widget_get_widget (sw, sw->name))); g_return_if_fail (swidget != NULL); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "keyserver-type")); g_return_if_fail (widget != NULL); /* The list of types */ types = seahorse_servers_get_types (); /* Save these away for later */ g_object_set_data_full (G_OBJECT (swidget), "keyserver-types", types, (GDestroyNotify)g_strfreev); /* The description for the key server types, plus custom */ for (i = 0; types[i] != NULL; i++) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), seahorse_servers_get_description (types[i])); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("Custom")); gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0); response = gtk_dialog_run (GTK_DIALOG (seahorse_widget_get_toplevel (swidget))); if (response == GTK_RESPONSE_ACCEPT) { result = calculate_keyserver_uri (swidget); if (result != NULL) { treeview = GTK_TREE_VIEW (seahorse_widget_get_widget (sw, "keyservers")); g_return_if_fail (treeview != NULL); store = GTK_TREE_STORE (gtk_tree_view_get_model (treeview)); gtk_tree_store_append (store, &iter, NULL); gtk_tree_store_set (store, &iter, KEYSERVER_COLUMN, result, -1); } g_free (result); } seahorse_widget_destroy (swidget); }
/* User wants to remove selected rows */ G_MODULE_EXPORT void on_prefs_keyserver_remove_clicked (GtkWidget *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkTreeView *treeview; GtkTreeSelection *selection; treeview = GTK_TREE_VIEW (seahorse_widget_get_widget (swidget, "keyservers")); selection = gtk_tree_view_get_selection (treeview); gtk_tree_selection_selected_foreach (selection, remove_row, NULL); }
static void object_dispose (GObject *object) { SeahorseWidget *swidget = SEAHORSE_WIDGET (object); if (!swidget->in_destruction) { swidget->in_destruction = TRUE; g_signal_emit (swidget, signals[DESTROY], 0); swidget->in_destruction = FALSE; } G_OBJECT_CLASS (parent_class)->dispose (object); }
void seahorse_keyserver_results_show (SeahorseOperation* op, GtkWindow* parent, const char* search_text) { SeahorseKeyserverResults* res; GtkWindow *window; g_return_if_fail (SEAHORSE_IS_OPERATION (op)); g_return_if_fail (parent == NULL || GTK_IS_WINDOW (parent)); g_return_if_fail (search_text != NULL); res = g_object_new (SEAHORSE_TYPE_KEYSERVER_RESULTS, "name", "keyserver-results", "search", search_text, NULL); /* Destorys itself with destroy */ g_object_ref_sink (res); if (parent != NULL) { window = GTK_WINDOW (seahorse_widget_get_toplevel (SEAHORSE_WIDGET (res))); gtk_window_set_transient_for (window, parent); } seahorse_progress_status_set_operation (SEAHORSE_WIDGET (res), op); }
G_MODULE_EXPORT void on_gpgme_expire_toggled (GtkWidget *widget, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkWidget *expire; GtkWidget *cal; expire = GTK_WIDGET (seahorse_widget_get_widget (swidget, "expire")); cal = GTK_WIDGET (seahorse_widget_get_widget (swidget, "calendar")); gtk_widget_set_sensitive (cal, !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (expire))); }
G_MODULE_EXPORT void on_gpgme_add_subkey_never_expires_toggled (GtkToggleButton *togglebutton, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkWidget *widget; widget = GTK_WIDGET (g_object_get_data (G_OBJECT (swidget), "expires-datetime")); g_return_if_fail (widget); gtk_widget_set_sensitive (GTK_WIDGET (widget), !gtk_toggle_button_get_active (togglebutton)); }
static void object_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SeahorseWidget *swidget; swidget = SEAHORSE_WIDGET (object); switch (prop_id) { case PROP_NAME: g_value_set_string (value, swidget->name); break; default: break; } }
G_MODULE_EXPORT void on_gpgme_expire_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkWidget *widget; SeahorseGpgmeSubkey *subkey; gpgme_error_t err; time_t expiry = 0; struct tm when; subkey = SEAHORSE_GPGME_SUBKEY (g_object_get_data (G_OBJECT (swidget), "subkey")); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "expire")); if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { memset (&when, 0, sizeof (when)); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "calendar")); gtk_calendar_get_date (GTK_CALENDAR (widget), (guint*)&(when.tm_year), (guint*)&(when.tm_mon), (guint*)&(when.tm_mday)); when.tm_year -= 1900; expiry = mktime (&when); if (expiry <= time (NULL)) { seahorse_util_show_error (widget, _("Invalid expiry date"), _("The expiry date must be in the future")); return; } } widget = seahorse_widget_get_widget (swidget, "all-controls"); gtk_widget_set_sensitive (widget, FALSE); g_object_ref (swidget); g_object_ref (subkey); if (expiry != (time_t)seahorse_pgp_subkey_get_expires (SEAHORSE_PGP_SUBKEY (subkey))) { err = seahorse_gpgme_key_op_set_expires (subkey, expiry); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't change expiry date")); } g_object_unref (subkey); g_object_unref (swidget); seahorse_widget_destroy (swidget); }
G_MODULE_EXPORT void hanlder_gpgme_add_subkey_type_changed (GtkComboBox *combo, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); gint type; GtkSpinButton *length; GtkTreeModel *model; GtkTreeIter iter; length = GTK_SPIN_BUTTON (seahorse_widget_get_widget (swidget, LENGTH)); model = gtk_combo_box_get_model (combo); gtk_combo_box_get_active_iter (combo, &iter); gtk_tree_model_get (model, &iter, COMBO_INT, &type, -1); switch (type) { /* DSA */ case 0: gtk_spin_button_set_range (length, DSA_MIN, DSA_MAX); gtk_spin_button_set_value (length, LENGTH_DEFAULT < DSA_MAX ? LENGTH_DEFAULT : DSA_MAX); break; /* ElGamal */ case 1: gtk_spin_button_set_range (length, ELGAMAL_MIN, LENGTH_MAX); gtk_spin_button_set_value (length, LENGTH_DEFAULT); break; /* RSA */ default: gtk_spin_button_set_range (length, RSA_MIN, LENGTH_MAX); gtk_spin_button_set_value (length, LENGTH_DEFAULT); break; } }
static GObject* seahorse_keyserver_results_constructor (GType type, guint n_props, GObjectConstructParam *props) { SeahorseKeyserverResults *self = SEAHORSE_KEYSERVER_RESULTS (G_OBJECT_CLASS (seahorse_keyserver_results_parent_class)->constructor(type, n_props, props)); GtkActionGroup* actions; GtkTreeSelection *selection; GtkWindow *window; char* title; g_return_val_if_fail (self, NULL); if (g_utf8_strlen (self->pv->search_string, -1) == 0) { title = g_strdup (_("Remote Keys")); } else { title = g_strdup_printf (_ ("Remote Keys Containing '%s'"), self->pv->search_string); } window = seahorse_viewer_get_window (SEAHORSE_VIEWER (self)); gtk_window_set_title (window, title); g_free (title); g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), self); actions = gtk_action_group_new ("general"); gtk_action_group_set_translation_domain (actions, GETTEXT_PACKAGE); gtk_action_group_add_actions (actions, GENERAL_ENTRIES, G_N_ELEMENTS (GENERAL_ENTRIES), self); seahorse_viewer_include_actions (SEAHORSE_VIEWER (self), actions); actions = gtk_action_group_new ("keyserver"); gtk_action_group_set_translation_domain (actions, GETTEXT_PACKAGE); gtk_action_group_add_actions (actions, SERVER_ENTRIES, G_N_ELEMENTS (SERVER_ENTRIES), self); seahorse_viewer_include_actions (SEAHORSE_VIEWER (self), actions); /* init key list & selection settings */ self->pv->view = GTK_TREE_VIEW (seahorse_widget_get_widget (SEAHORSE_WIDGET (self), "key_list")); selection = gtk_tree_view_get_selection (self->pv->view); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); g_signal_connect_object (selection, "changed", G_CALLBACK (on_view_selection_changed), self, 0); g_signal_connect_object (self->pv->view, "row-activated", G_CALLBACK (on_row_activated), self, 0); g_signal_connect_object (self->pv->view, "button-press-event", G_CALLBACK (on_key_list_button_pressed), self, 0); g_signal_connect_object (self->pv->view, "popup-menu", G_CALLBACK (on_key_list_popup_menu), self, 0); gtk_widget_realize (GTK_WIDGET (self->pv->view)); /* Set focus to the current key list */ gtk_widget_grab_focus (GTK_WIDGET (self->pv->view)); /* To avoid flicker */ seahorse_viewer_ensure_updated (SEAHORSE_VIEWER (self)); seahorse_widget_show (SEAHORSE_WIDGET (SEAHORSE_VIEWER (self))); /* Our predicate for filtering keys */ self->pv->pred.tag = g_quark_from_string ("openpgp"); self->pv->pred.location = SEAHORSE_LOCATION_REMOTE; self->pv->pred.custom = (SeahorseObjectPredicateFunc)on_filter_objects; self->pv->pred.custom_target = self; /* Our set all nicely filtered */ self->pv->objects = seahorse_set_new_full (&self->pv->pred); self->pv->store = seahorse_key_manager_store_new (self->pv->objects, self->pv->view); on_view_selection_changed (selection, self); return G_OBJECT (self); }
G_MODULE_EXPORT void on_gpgme_add_subkey_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); SeahorseObjectWidget *skwidget; SeahorseKeyEncType real_type; gint type; guint length; time_t expires; gpgme_error_t err; GtkWidget *widget; GtkComboBox *combo; GtkTreeModel *model; GtkTreeIter iter; skwidget = SEAHORSE_OBJECT_WIDGET (swidget); combo = GTK_COMBO_BOX (seahorse_widget_get_widget (swidget, "type")); gtk_combo_box_get_active_iter (combo, &iter); model = gtk_combo_box_get_model (combo); gtk_tree_model_get (model, &iter, COMBO_INT, &type, -1); length = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ( seahorse_widget_get_widget (swidget, LENGTH))); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON ( seahorse_widget_get_widget (swidget, "never_expires")))) expires = 0; else { widget = GTK_WIDGET (g_object_get_data (G_OBJECT (swidget), "expires-datetime")); g_return_if_fail (widget); egg_datetime_get_as_time_t (EGG_DATETIME (widget), &expires); } switch (type) { case 0: real_type = DSA; break; case 1: real_type = ELGAMAL; break; case 2: real_type = RSA_SIGN; break; default: real_type = RSA_ENCRYPT; break; } widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, swidget->name)); gtk_widget_set_sensitive (widget, FALSE); err = seahorse_gpgme_key_op_add_subkey (SEAHORSE_GPGME_KEY (skwidget->object), real_type, length, expires); gtk_widget_set_sensitive (widget, TRUE); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't add subkey")); seahorse_widget_destroy (swidget); }