Changeset View
Changeset View
Standalone View
Standalone View
efl/pinentry-efl.c
- This file was added.
| /* pinentry-efl.c | |||||
| Copyright (C) 2017 Obsidian-Studios, Inc. | |||||
| Author William L. Thomson Jr. <wlt@o-sinc.com> | |||||
| Based on pinentry-gtk2.c | |||||
| Copyright (C) 1999 Robert Bihlmeyer <robbe@orcus.priv.at> | |||||
| Copyright (C) 2001, 2002, 2007, 2015 g10 Code GmbH | |||||
| Copyright (C) 2004 by Albrecht Dreß <albrecht.dress@arcor.de> | |||||
| pinentry-efl is a pinentry application for the EFL widget set. | |||||
| It tries to follow the Gnome Human Interface Guide as close as | |||||
| possible. | |||||
| This program is free software; you can redistribute it and/or modify | |||||
| it under the terms of the GNU General Public License as published by | |||||
| the Free Software Foundation; either version 2 of the License, or | |||||
| (at your option) any later version. | |||||
| This program is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| GNU General Public License for more details. | |||||
| You should have received a copy of the GNU General Public License | |||||
| along with this program; if not, write to the Free Software | |||||
| Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| */ | |||||
| #ifdef HAVE_CONFIG_H | |||||
| #include "config.h" | |||||
| #endif | |||||
| #include <Elementary.h> | |||||
| #include <Ecore_X.h> | |||||
| #include <gpg-error.h> | |||||
| #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) | |||||
| #pragma GCC diagnostic push | |||||
| #pragma GCC diagnostic ignored "-Wstrict-prototypes" | |||||
| #endif | |||||
| #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) | |||||
| #pragma GCC diagnostic pop | |||||
| #endif | |||||
| #ifdef HAVE_GETOPT_H | |||||
| #include <getopt.h> | |||||
| #else | |||||
| #include "getopt.h" | |||||
| #endif /* HAVE_GETOPT_H */ | |||||
| #include "pinentry.h" | |||||
| #ifdef FALLBACK_CURSES | |||||
| #include "pinentry-curses.h" | |||||
| #endif | |||||
| #define PGMNAME "pinentry-efl" | |||||
| #ifndef VERSION | |||||
| #define VERSION | |||||
| #endif | |||||
| #define ENTRY_HIDE "Hide entry" | |||||
| #define ENTRY_SHOW "Show entry" | |||||
| typedef enum { CONFIRM_CANCEL, CONFIRM_OK, CONFIRM_NOTOK } confirm_value_t; | |||||
| static const int WIDTH = 480; | |||||
| static const int BUTTON_HEIGHT = 27; | |||||
| static const int BUTTON_WIDTH = 70; | |||||
| static const int BUTTON_ICON_SIZE = 13; | |||||
| static const int PADDING = 5; | |||||
| static Eina_Bool got_input; | |||||
| static Ecore_Timer *timer; | |||||
| static Evas_Object *error_label, *check_label; | |||||
| static Evas_Object *win, *entry, *repeat_entry, *qualitybar; | |||||
| static char **pargv; | |||||
| static int grab_failed; | |||||
| static int passphrase_ok; | |||||
| static int confirm_mode; | |||||
| static int pargc; | |||||
| static confirm_value_t confirm_value; | |||||
| static pinentry_t pinentry; | |||||
| pinentry_cmd_handler_t pinentry_cmd_handler; | |||||
| static void | |||||
| quit (void) | |||||
| { | |||||
| evas_object_del(win); | |||||
| elm_exit(); | |||||
| ecore_main_loop_quit (); | |||||
| } | |||||
| static void | |||||
| delete_event (void *data EINA_UNUSED, | |||||
| Evas_Object *obj EINA_UNUSED, | |||||
| void *event EINA_UNUSED) | |||||
| { | |||||
| pinentry->close_button = 1; | |||||
| quit (); | |||||
| } | |||||
| static void | |||||
| changed_text_handler (void *data EINA_UNUSED, | |||||
| Evas_Object *obj, | |||||
| void *event EINA_UNUSED) | |||||
| { | |||||
| const char *s; | |||||
| int length; | |||||
| int percent; | |||||
| got_input = EINA_TRUE; | |||||
| if (pinentry->repeat_passphrase && repeat_entry) | |||||
| { | |||||
| elm_object_text_set (repeat_entry, ""); | |||||
| elm_object_text_set (error_label, ""); | |||||
| } | |||||
| if (!qualitybar || !pinentry->quality_bar) | |||||
| return; | |||||
| s = elm_object_text_get (obj); | |||||
| if (!s) | |||||
| s = ""; | |||||
| length = strlen (s); | |||||
| percent = length? pinentry_inq_quality (pinentry, s, length) : 0; | |||||
| // Hack to work around broken quality function, next 2 lines | |||||
| // Will move 10% per character, not validating quality at all | |||||
| if(percent<0) | |||||
| percent = -percent; | |||||
| evas_object_color_set(qualitybar, | |||||
| 255 - ( 2.55 * percent ), | |||||
| 2.55 * percent, 0, 255); | |||||
| elm_progressbar_value_set (qualitybar, (double) percent / 100.0); | |||||
| } | |||||
| static void | |||||
| on_check (void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) | |||||
| { | |||||
| if(elm_check_state_get(obj)) | |||||
| { | |||||
| elm_entry_password_set(entry, EINA_FALSE); | |||||
| elm_object_text_set(check_label,ENTRY_HIDE); | |||||
| } | |||||
| else | |||||
| { | |||||
| elm_entry_password_set(entry, EINA_TRUE); | |||||
| elm_object_text_set(check_label,ENTRY_SHOW); | |||||
| } | |||||
| /* | |||||
| evas_object_size_hint_weight_set(check_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | |||||
| */ | |||||
| evas_object_size_hint_min_set(check_label, | |||||
| ELM_SCALE_SIZE(BUTTON_WIDTH), | |||||
| ELM_SCALE_SIZE(BUTTON_HEIGHT)); | |||||
| evas_object_size_hint_align_set(check_label, 0, 1); | |||||
| } | |||||
| static void | |||||
| on_click (void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) | |||||
| { | |||||
| if (confirm_mode) | |||||
| { | |||||
| confirm_value = (confirm_value_t) data; | |||||
| quit (); | |||||
| return; | |||||
| } | |||||
| if (data) | |||||
| { | |||||
| const char *s, *s2; | |||||
| s = elm_entry_entry_get (entry); | |||||
| if (!s) | |||||
| s = ""; | |||||
| if (pinentry->repeat_passphrase && repeat_entry) | |||||
| { | |||||
| s2 = elm_entry_entry_get (repeat_entry); | |||||
| if (!s2) | |||||
| s2 = ""; | |||||
| if (strcmp (s, s2)) | |||||
| { | |||||
| elm_object_text_set(error_label, | |||||
| elm_entry_utf8_to_markup( | |||||
| pinentry->repeat_error_string? | |||||
| pinentry->repeat_error_string: | |||||
| "not correctly repeated")); | |||||
| elm_object_focus_set(entry,EINA_TRUE); | |||||
| return; | |||||
| } | |||||
| pinentry->repeat_okay = 1; | |||||
| } | |||||
| passphrase_ok = 1; | |||||
| pinentry_setbufferlen (pinentry, strlen (s) + 1); | |||||
| if (pinentry->pin) | |||||
| strcpy (pinentry->pin, s); | |||||
| } | |||||
| quit (); | |||||
| } | |||||
| static void | |||||
| enter_callback (void *data, Evas_Object * obj, void *event_info EINA_UNUSED) | |||||
| { | |||||
| if (data) | |||||
| elm_object_focus_set (data, 1); | |||||
| else | |||||
| on_click ((void *) CONFIRM_OK, obj, NULL); | |||||
| } | |||||
| static Eina_Bool | |||||
| timeout_cb (const void * data) | |||||
| { | |||||
| pinentry_t pe = (pinentry_t)data; | |||||
| if (!got_input) | |||||
| { | |||||
| ecore_main_loop_quit(); | |||||
| if (pe) | |||||
| pe->specific_err = gpg_error (GPG_ERR_TIMEOUT); | |||||
| } | |||||
| timer = NULL; | |||||
| return ECORE_CALLBACK_DONE; | |||||
| } | |||||
| static void | |||||
| create_window (void) | |||||
| { | |||||
| char *txt; | |||||
| Evas_Object *table, *icon, *obj; | |||||
| int btn_txt_len = 0; | |||||
| int row = 0; | |||||
| int ok_len = 0; | |||||
| win = elm_win_util_dialog_add(NULL,"pinentry","enter pin"); | |||||
| elm_win_autodel_set(win, EINA_TRUE); | |||||
| elm_win_center(win,EINA_TRUE,EINA_TRUE); | |||||
| evas_object_smart_callback_add(win, "delete,request", delete_event, NULL); | |||||
| table = elm_table_add(win); | |||||
| elm_table_padding_set(table,ELM_SCALE_SIZE(PADDING),0); | |||||
| evas_object_size_hint_padding_set (table, | |||||
| ELM_SCALE_SIZE(PADDING), | |||||
| ELM_SCALE_SIZE(PADDING), | |||||
| ELM_SCALE_SIZE(PADDING), | |||||
| ELM_SCALE_SIZE(PADDING)); | |||||
| evas_object_show(table); | |||||
| if (pinentry->title) | |||||
| { | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, | |||||
| pinentry->title); | |||||
| elm_win_title_set ( win, txt ); | |||||
| free (txt); | |||||
| } | |||||
| /* Description Label */ | |||||
| if (pinentry->description) | |||||
| { | |||||
| char* aligned; | |||||
| int len; | |||||
| obj = elm_label_add(table); | |||||
| elm_label_line_wrap_set (obj, ELM_WRAP_WORD); | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->description); | |||||
| len = strlen(txt)+20; // 20 chars for align tag | |||||
| aligned = calloc(len+1,sizeof(char)); | |||||
| if(aligned) | |||||
| { | |||||
| snprintf(aligned,len, "<align=left>%s</align>",elm_entry_utf8_to_markup(txt)); | |||||
| elm_object_text_set(obj,aligned); | |||||
| free (aligned); | |||||
| } else | |||||
| elm_object_text_set(obj,elm_entry_utf8_to_markup(txt)); | |||||
| free (txt); | |||||
| evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0); | |||||
| evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0); | |||||
| elm_table_pack(table, obj, 1, row, 5, 1); | |||||
| evas_object_show(obj); | |||||
| row++; | |||||
| } | |||||
| if (!confirm_mode && (pinentry->error || pinentry->repeat_passphrase)) | |||||
| { | |||||
| /* Error Label */ | |||||
| if (pinentry->error) | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->error); | |||||
| else | |||||
| txt = ""; | |||||
| obj = elm_label_add(table); | |||||
| evas_object_color_set(obj, 255, 0, 0, 255); | |||||
| elm_object_text_set(obj,txt); | |||||
| elm_object_style_set(obj,"slide_bounce"); | |||||
| elm_label_slide_duration_set(obj, 10); | |||||
| elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_ALWAYS); | |||||
| elm_label_slide_go(obj); | |||||
| evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0); | |||||
| evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0); | |||||
| elm_table_pack(table, obj, 1, row, 5, 1); | |||||
| evas_object_show(obj); | |||||
| if (pinentry->error) | |||||
| free (txt); | |||||
| row++; | |||||
| } | |||||
| qualitybar = NULL; | |||||
| if (!confirm_mode) | |||||
| { | |||||
| if (pinentry->prompt) | |||||
| { | |||||
| /* Entry/Prompt Label */ | |||||
| obj = elm_label_add(table); | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->prompt); | |||||
| elm_object_text_set(obj,elm_entry_utf8_to_markup(txt)); | |||||
| free (txt); | |||||
| evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); | |||||
| evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); | |||||
| elm_table_pack(table, obj, 1, row, 1, 1); | |||||
| evas_object_show(obj); | |||||
| } | |||||
| entry = elm_entry_add(table); | |||||
| elm_entry_scrollable_set(entry, EINA_TRUE); | |||||
| elm_scroller_policy_set(entry, | |||||
| ELM_SCROLLER_POLICY_OFF, | |||||
| ELM_SCROLLER_POLICY_OFF); | |||||
| elm_entry_password_set(entry, EINA_TRUE); | |||||
| elm_entry_single_line_set(entry, EINA_TRUE); | |||||
| evas_object_size_hint_weight_set(entry, 0, 0); | |||||
| evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0); | |||||
| elm_table_pack(table, entry, 2, row, 4, 1); | |||||
| evas_object_smart_callback_add(entry, | |||||
| "changed", | |||||
| changed_text_handler, | |||||
| NULL); | |||||
| evas_object_show(entry); | |||||
| row++; | |||||
| /* Check box */ | |||||
| obj = elm_check_add(table); | |||||
| evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); | |||||
| elm_table_pack(table, obj, 1, row, 1, 1); | |||||
| evas_object_smart_callback_add(obj, "changed", on_check, NULL); | |||||
| evas_object_show(obj); | |||||
| /* Check Label */ | |||||
| check_label = elm_label_add(table); | |||||
| on_check((void *)NULL, obj, (void *)NULL); | |||||
| elm_table_pack(table, check_label, 2, row, 4, 1); | |||||
| evas_object_show(check_label); | |||||
| row++; | |||||
| if (pinentry->quality_bar) | |||||
| { | |||||
| /* Quality Bar Label */ | |||||
| obj = elm_label_add(table); | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, | |||||
| pinentry->quality_bar); | |||||
| elm_object_text_set(obj,txt); | |||||
| free (txt); | |||||
| evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); | |||||
| evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); | |||||
| elm_table_pack(table, obj, 1, row, 1, 1); | |||||
| evas_object_show(obj); | |||||
| qualitybar = elm_progressbar_add(table); | |||||
| evas_object_color_set(qualitybar, 255, 0, 0, 255); | |||||
| evas_object_show(qualitybar); | |||||
| if (pinentry->quality_bar_tt) | |||||
| elm_object_tooltip_text_set (qualitybar, | |||||
| pinentry->quality_bar_tt); | |||||
| evas_object_size_hint_weight_set(qualitybar, EVAS_HINT_EXPAND, 0); | |||||
| evas_object_size_hint_align_set(qualitybar, EVAS_HINT_FILL, 0); | |||||
| elm_table_pack(table, qualitybar, 2, row, 4, 1); | |||||
| row++; | |||||
| } | |||||
| if (pinentry->repeat_passphrase) | |||||
| { | |||||
| /* Repeat Label */ | |||||
| obj = elm_label_add(table); | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, | |||||
| pinentry->repeat_passphrase); | |||||
| elm_object_text_set(obj,txt); | |||||
| free (txt); | |||||
| evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); | |||||
| evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); | |||||
| elm_table_pack(table, obj, 1, row, 1, 1); | |||||
| evas_object_show(obj); | |||||
| repeat_entry = elm_entry_add(table); | |||||
| elm_entry_scrollable_set(repeat_entry, EINA_TRUE); | |||||
| elm_scroller_policy_set(repeat_entry, | |||||
| ELM_SCROLLER_POLICY_OFF, | |||||
| ELM_SCROLLER_POLICY_OFF); | |||||
| elm_entry_password_set(repeat_entry, EINA_TRUE); | |||||
| elm_entry_single_line_set(repeat_entry, EINA_TRUE); | |||||
| evas_object_size_hint_weight_set(repeat_entry, 0, 0); | |||||
| evas_object_size_hint_align_set(repeat_entry, EVAS_HINT_FILL, 0); | |||||
| elm_table_pack(table, repeat_entry, 2, row, 4, 1); | |||||
| evas_object_smart_callback_add (repeat_entry, "activated", | |||||
| enter_callback, NULL); | |||||
| evas_object_show(repeat_entry); | |||||
| evas_object_smart_callback_add (entry, | |||||
| "activated", | |||||
| enter_callback, | |||||
| repeat_entry); | |||||
| evas_object_smart_callback_add(repeat_entry, | |||||
| "activated", | |||||
| on_click, | |||||
| (void *) CONFIRM_OK); | |||||
| row++; | |||||
| } | |||||
| else | |||||
| evas_object_smart_callback_add(entry, | |||||
| "activated", | |||||
| on_click, | |||||
| (void *) CONFIRM_OK); | |||||
| } | |||||
| /* Cancel Button */ | |||||
| if (!pinentry->one_button) | |||||
| { | |||||
| obj = elm_button_add(table); | |||||
| icon = elm_icon_add (table); | |||||
| evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); | |||||
| if (elm_icon_standard_set (icon, "dialog-cancel") || | |||||
| elm_icon_standard_set (icon, "window-close")) | |||||
| { | |||||
| evas_object_size_hint_min_set(icon, | |||||
| ELM_SCALE_SIZE(BUTTON_ICON_SIZE), | |||||
| ELM_SCALE_SIZE(BUTTON_ICON_SIZE)); | |||||
| elm_object_part_content_set(obj, "icon", icon); | |||||
| evas_object_show (icon); | |||||
| } | |||||
| else | |||||
| evas_object_del(icon); | |||||
| if (pinentry->cancel || pinentry->default_cancel) | |||||
| { | |||||
| if(pinentry->cancel) | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->cancel); | |||||
| else | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, | |||||
| pinentry->default_cancel); | |||||
| if(txt[0]=='_') | |||||
| elm_object_text_set(obj,txt+1); | |||||
| else | |||||
| elm_object_text_set(obj,txt); | |||||
| btn_txt_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5)); | |||||
| free (txt); | |||||
| } | |||||
| else | |||||
| elm_object_text_set(obj, "Cancel"); //STOCK_CANCEL | |||||
| evas_object_size_hint_align_set(obj, 0, 0); | |||||
| if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH)) | |||||
| evas_object_size_hint_min_set(obj, | |||||
| btn_txt_len, | |||||
| ELM_SCALE_SIZE(BUTTON_HEIGHT)); | |||||
| else | |||||
| evas_object_size_hint_min_set(obj, | |||||
| ELM_SCALE_SIZE(BUTTON_WIDTH), | |||||
| ELM_SCALE_SIZE(BUTTON_HEIGHT)); | |||||
| elm_table_pack(table, obj, 4, row, 1, 1); | |||||
| evas_object_smart_callback_add(obj, | |||||
| "clicked", | |||||
| on_click, | |||||
| (void *) CONFIRM_CANCEL); | |||||
| evas_object_show(obj); | |||||
| } | |||||
| /* OK Button */ | |||||
| obj = elm_button_add(table); | |||||
| icon = elm_icon_add (table); | |||||
| evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); | |||||
| if (elm_icon_standard_set (icon, "dialog-ok") || | |||||
| elm_icon_standard_set (icon, "list-add")) | |||||
| { | |||||
| evas_object_size_hint_min_set(icon, | |||||
| ELM_SCALE_SIZE(BUTTON_ICON_SIZE), | |||||
| ELM_SCALE_SIZE(BUTTON_ICON_SIZE)); | |||||
| elm_object_part_content_set(obj, "icon", icon); | |||||
| evas_object_show (icon); | |||||
| } | |||||
| else | |||||
| evas_object_del(icon); | |||||
| if (pinentry->ok || pinentry->default_ok) | |||||
| { | |||||
| if(pinentry->ok) | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->ok); | |||||
| else | |||||
| txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->default_ok); | |||||
| if(txt[0]=='_') | |||||
| elm_object_text_set(obj,txt+1); | |||||
| else | |||||
| elm_object_text_set(obj,txt); | |||||
| ok_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5)); | |||||
| if(ok_len>btn_txt_len) | |||||
| btn_txt_len = ok_len; | |||||
| free (txt); | |||||
| } | |||||
| else | |||||
| elm_object_text_set(obj,"OK"); //STOCK_OK | |||||
| evas_object_size_hint_align_set(obj, 0, 0); | |||||
| if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH)) | |||||
| evas_object_size_hint_min_set(obj, | |||||
| btn_txt_len, | |||||
| ELM_SCALE_SIZE(BUTTON_HEIGHT)); | |||||
| else | |||||
| evas_object_size_hint_min_set(obj, | |||||
| ELM_SCALE_SIZE(BUTTON_WIDTH), | |||||
| ELM_SCALE_SIZE(BUTTON_HEIGHT)); | |||||
| elm_table_pack(table, obj, 5, row, 1, 1); | |||||
| evas_object_smart_callback_add(obj, "clicked", on_click, (void *) CONFIRM_OK); | |||||
| evas_object_show(obj); | |||||
| /* Key/Lock Icon */ | |||||
| obj = elm_icon_add (win); | |||||
| evas_object_size_hint_aspect_set (obj, EVAS_ASPECT_CONTROL_BOTH, 1, 1); | |||||
| if (elm_icon_standard_set (obj, "dialog-password")) | |||||
| { | |||||
| double ic_size = WIDTH/5; | |||||
| if(row==0) | |||||
| ic_size = ic_size/3.5; | |||||
| else if(row<4) | |||||
| ic_size = ic_size - ic_size/row; | |||||
| evas_object_size_hint_min_set(obj, | |||||
| ELM_SCALE_SIZE(ic_size), | |||||
| ELM_SCALE_SIZE(ic_size)); | |||||
| evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | |||||
| evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5); | |||||
| elm_table_pack(table, obj, 0, 0, 1, row? row:1); | |||||
| evas_object_show (obj); | |||||
| } | |||||
| else | |||||
| evas_object_del(obj); | |||||
| /* Box for padding */ | |||||
| obj = elm_box_add (win); | |||||
| elm_box_pack_end (obj, table); | |||||
| evas_object_show (obj); | |||||
| elm_win_resize_object_add(win,obj); | |||||
| evas_object_show(win); | |||||
| if(entry) | |||||
| elm_object_focus_set (entry, EINA_TRUE); | |||||
| if (pinentry->timeout > 0) | |||||
| timer = ecore_timer_add (pinentry->timeout, | |||||
| (Ecore_Task_Cb)timeout_cb, | |||||
| pinentry); | |||||
| } | |||||
| static int | |||||
| efl_cmd_handler (pinentry_t pe) | |||||
| { | |||||
| int want_pass = !!pe->pin; | |||||
| got_input = EINA_FALSE; | |||||
| pinentry = pe; | |||||
| confirm_value = CONFIRM_CANCEL; | |||||
| passphrase_ok = 0; | |||||
| confirm_mode = want_pass ? 0 : 1; | |||||
| /* init ecore-x explicitly using DISPLAY since this can launch | |||||
| * from console | |||||
| */ | |||||
| if (pe->display) | |||||
| ecore_x_init (pe->display); | |||||
| elm_init (pargc, pargv); | |||||
| create_window (); | |||||
| ecore_main_loop_begin (); | |||||
| if (timer) | |||||
| { | |||||
| ecore_timer_del (timer); | |||||
| timer = NULL; | |||||
| } | |||||
| if (confirm_value == CONFIRM_CANCEL || grab_failed) | |||||
| pe->canceled = 1; | |||||
| pinentry = NULL; | |||||
| if (want_pass) | |||||
| { | |||||
| if (passphrase_ok && pe->pin) | |||||
| return strlen (pe->pin); | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| else | |||||
| return (confirm_value == CONFIRM_OK) ? 1 : 0; | |||||
| } | |||||
| int | |||||
| main (int argc, char *argv[]) | |||||
| { | |||||
| pinentry_init (PGMNAME); | |||||
| #ifdef FALLBACK_CURSES | |||||
| if (pinentry_have_display (argc, argv)) | |||||
| { | |||||
| #endif | |||||
| pinentry_cmd_handler = efl_cmd_handler; | |||||
| pargc = argc; | |||||
| pargv = argv; | |||||
| #ifdef FALLBACK_CURSES | |||||
| } | |||||
| else | |||||
| { | |||||
| pinentry_cmd_handler = curses_cmd_handler; | |||||
| //pinentry_set_flavor_flag ("curses"); | |||||
| } | |||||
| #endif | |||||
| pinentry_parse_opts (argc, argv); | |||||
| if (pinentry_loop ()) | |||||
| return 1; | |||||
| return 0; | |||||
| } | |||||