summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/textarea.c20
-rw-r--r--apps/gui/textarea.h6
-rw-r--r--apps/gui/yesno.c34
3 files changed, 28 insertions, 32 deletions
diff --git a/apps/gui/textarea.c b/apps/gui/textarea.c
index 0dd063c493..b30667df4e 100644
--- a/apps/gui/textarea.c
+++ b/apps/gui/textarea.c
@@ -19,6 +19,8 @@
19 19
20#include "textarea.h" 20#include "textarea.h"
21#include "font.h" 21#include "font.h"
22#include "lang.h"
23#include "talk.h"
22 24
23void gui_textarea_clear(struct screen * display) 25void gui_textarea_clear(struct screen * display)
24{ 26{
@@ -51,7 +53,8 @@ int gui_textarea_put_message(struct screen * display,
51 int i; 53 int i;
52 gui_textarea_clear(display); 54 gui_textarea_clear(display);
53 for(i=0;i<message->nb_lines && i+ystart<display->nb_lines;i++) 55 for(i=0;i<message->nb_lines && i+ystart<display->nb_lines;i++)
54 display->puts_scroll(0, i+ystart, (unsigned char *)message->message_lines[i]); 56 display->puts_scroll(0, i+ystart, P2STR((unsigned char *)message->
57 message_lines[i]));
55 gui_textarea_update(display); 58 gui_textarea_update(display);
56 return(i); 59 return(i);
57} 60}
@@ -74,3 +77,18 @@ void gui_textarea_update_nblines(struct screen * display)
74#endif 77#endif
75 display->nb_lines = height / display->char_height; 78 display->nb_lines = height / display->char_height;
76} 79}
80
81void talk_text_message(struct text_message * message, bool enqueue)
82{
83 int line;
84 if(message)
85 for(line=0; line<message->nb_lines; line++)
86 {
87 long id = P2ID((unsigned char *)message->message_lines[line]);
88 if(id>=0)
89 {
90 talk_id(id, enqueue);
91 enqueue = true;
92 }
93 }
94}
diff --git a/apps/gui/textarea.h b/apps/gui/textarea.h
index 413169db24..765add084a 100644
--- a/apps/gui/textarea.h
+++ b/apps/gui/textarea.h
@@ -59,6 +59,12 @@ extern int gui_textarea_put_message(struct screen * display,
59 */ 59 */
60extern void gui_textarea_update_nblines(struct screen * display); 60extern void gui_textarea_update_nblines(struct screen * display);
61 61
62/*
63 * Speak a text_message. The message's lines may be virtual pointers
64 * representing language / voicefont IDs (see settings.h).
65 */
66extern void talk_text_message(struct text_message * message, bool enqueue);
67
62#ifdef HAVE_LCD_BITMAP 68#ifdef HAVE_LCD_BITMAP
63/* 69/*
64 * Compute the number of pixels from which text can be displayed 70 * Compute the number of pixels from which text can be displayed
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c
index 4e86b017ca..891e73809b 100644
--- a/apps/gui/yesno.c
+++ b/apps/gui/yesno.c
@@ -101,25 +101,6 @@ static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
101 101
102#include "debug.h" 102#include "debug.h"
103 103
104/* Processes a text_message whose lines may be virtual pointers
105 representing language / voicefont IDs (see settings.h). Copies out
106 the IDs to the ids array, which is of length maxlen, and replaces
107 the pointers in the text_message with the actual language strings.
108 The ids array is terminated with the TALK_FINAL_ID sentinel
109 element. */
110static void extract_talk_ids(struct text_message *m, long *ids, int maxlen)
111{
112 int line, i=0;
113 if(m)
114 for(line=0; line<m->nb_lines; line++) {
115 long id = P2ID((unsigned char *)m->message_lines[line]);
116 if(id>=0 && i<maxlen-1)
117 ids[i++] = id;
118 m->message_lines[line] = (char *)P2STR((unsigned char *)m->message_lines[line]);
119 }
120 ids[i] = TALK_FINAL_ID;
121}
122
123enum yesno_res gui_syncyesno_run(struct text_message * main_message, 104enum yesno_res gui_syncyesno_run(struct text_message * main_message,
124 struct text_message * yes_message, 105 struct text_message * yes_message,
125 struct text_message * no_message) 106 struct text_message * no_message)
@@ -129,13 +110,7 @@ enum yesno_res gui_syncyesno_run(struct text_message * main_message,
129 int result=-1; 110 int result=-1;
130 bool result_displayed; 111 bool result_displayed;
131 struct gui_yesno yn[NB_SCREENS]; 112 struct gui_yesno yn[NB_SCREENS];
132 long voice_ids[5];
133 long talked_tick = 0; 113 long talked_tick = 0;
134 /* The text messages may contain virtual pointers to IDs (see
135 settings.h) instead of plain strings. Copy the IDs out so we
136 can speak them, and unwrap the actual language strings. */
137 extract_talk_ids(main_message, voice_ids,
138 sizeof(voice_ids)/sizeof(voice_ids[0]));
139 FOR_NB_SCREENS(i) 114 FOR_NB_SCREENS(i)
140 { 115 {
141 gui_yesno_init(&(yn[i]), main_message, yes_message, no_message); 116 gui_yesno_init(&(yn[i]), main_message, yes_message, no_message);
@@ -149,7 +124,7 @@ enum yesno_res gui_syncyesno_run(struct text_message * main_message,
149 && (talked_tick==0 || TIME_AFTER(current_tick, talked_tick+HZ*5))) 124 && (talked_tick==0 || TIME_AFTER(current_tick, talked_tick+HZ*5)))
150 { 125 {
151 talked_tick = current_tick; 126 talked_tick = current_tick;
152 talk_idarray(voice_ids, false); 127 talk_text_message(main_message, false);
153 } 128 }
154 button = get_action(CONTEXT_YESNOSCREEN, HZ*5); 129 button = get_action(CONTEXT_YESNOSCREEN, HZ*5);
155 switch (button) 130 switch (button)
@@ -168,16 +143,13 @@ enum yesno_res gui_syncyesno_run(struct text_message * main_message,
168 } 143 }
169 } 144 }
170 145
171 /* extract_talk_ids also converts ID to STR */
172 extract_talk_ids((result == YESNO_YES) ? yes_message : no_message,
173 voice_ids, sizeof(voice_ids)/sizeof(voice_ids[0]));
174
175 FOR_NB_SCREENS(i) 146 FOR_NB_SCREENS(i)
176 result_displayed=gui_yesno_draw_result(&(yn[i]), result); 147 result_displayed=gui_yesno_draw_result(&(yn[i]), result);
177 148
178 if (global_settings.talk_menu) 149 if (global_settings.talk_menu)
179 { 150 {
180 talk_idarray(voice_ids, false); 151 talk_text_message((result == YESNO_YES) ? yes_message
152 : no_message, false);
181 talk_force_enqueue_next(); 153 talk_force_enqueue_next();
182 } 154 }
183 if(result_displayed) 155 if(result_displayed)