2 \brief The core of the Dasher application
4 Core routines for the Dasher application
9 #include "../Common/Common.h"
11 #include <sys/types.h>
25 // C++ STL headers (ideally minimise the use of C++ outside of the control)
29 // GTK/GDK headers and friends
35 #include <gconf/gconf.h>
38 #include <libbonobo.h>
39 #include <gnome-speech/gnome-speech.h>
43 #include <libgnomeui/libgnomeui.h>
44 #include <libgnome/libgnome.h>
48 #include "gpesettings_store.h"
51 // Other Dasher components
56 #include "Preferences.h"
57 #include "FontDialogues.h"
59 #include "AppSettings.h"
60 #include "../DasherCore/Parameters.h"
62 #include "accessibility.h"
64 #include "dasher_action_keyboard.h"
66 // We shouldn't need this - the functions which reference it are obsolete
67 #include "../DasherCore/Event.h"
69 #include "GtkDasherControl.h"
71 // Pointers to various GTK widgets
75 GtkWidget
*vbox
, *toolbar
;
76 GdkPixbuf
*p
; // Hmm... descriptive names
79 GtkAccelGroup
*dasher_accel
;
80 GtkWidget
*dasher_menu_bar
;
82 GtkWidget
*open_filesel
;
83 GtkWidget
*save_filesel
;
84 GtkWidget
*save_and_quit_filesel
;
85 GtkWidget
*import_filesel
;
86 GtkWidget
*append_filesel
;
88 GtkWidget
*g_pHiddenWindow
;
89 GtkWidget
*file_selector
;
91 GtkWidget
*pDasherWidget
= NULL
;
92 GtkWidget
*g_pEditPane
= 0;
93 GtkWidget
*g_pActionPane
= 0;
95 DasherAction
*g_pAction
= 0;
97 const gchar
*filename
= NULL
; // Filename of file currently being edited
99 // Apparently not obsolete, but should be sorted out
101 gboolean file_modified
= FALSE
; // Have unsaved changes been made to the current file
102 gint outputcharacters
;
104 const char *g_szAccessibleContext
= 0;
105 int g_iExpectedPosition
= -1;
106 int g_iOldPosition
= -1;
110 void LoadWindowState();
111 void InitialiseAppParameters();
112 void SetupPositioning();
114 // "member" variables for main window "class"
116 int g_bOnTop
= true; // Whether the window should always be on top
117 int g_bDock
= true; // Whether to dock the window
118 int g_iDockType
; // Ignored for now - will determine how the window is docked to the side of the screen
119 double g_dXFraction
= 0.25; // Fraction of the width of the screen to use;
120 double g_dYFraction
= 0.25; // Fraction of the height of the screen to use;
124 /// Initialise the main window and child components
125 /// This is actually closer to 'initialise application', so name
126 /// should really be changed to reflect this
129 extern "C" void on_window_map(GtkWidget
* pWidget
, gpointer pUserData
) {
131 // gtk_window_set_keep_above(GTK_WINDOW(window), true);
135 // A11y support disabled for now
140 void InitialiseMainWindow(int argc
, char **argv
, GladeXML
*pGladeXML
) {
142 // init_app_settings();
143 // load_app_parameters();
145 dasher_accel
= gtk_accel_group_new(); //?
147 widgets
= pGladeXML
; // obsolete? NO - used later in this file, but should be
148 // Grab some pointers to important GTK widgets from the Glade XML
149 // FIXME - do we actually need all of these?
151 window
= glade_xml_get_widget(pGladeXML
, "window");
152 toolbar
= glade_xml_get_widget(pGladeXML
, "toolbar");
153 vbox
= glade_xml_get_widget(pGladeXML
, "vbox1");
154 vpane
= glade_xml_get_widget(pGladeXML
, "hpaned1");
155 dasher_menu_bar
= glade_xml_get_widget(pGladeXML
, "dasher_menu_bar");
156 g_pEditPane
= glade_xml_get_widget(pGladeXML
, "vbox40");
157 g_pActionPane
= glade_xml_get_widget(pGladeXML
, "vbox39");
158 pDasherWidget
= glade_xml_get_widget(pGladeXML
, "DasherControl");
160 if( dasher_app_settings_get_bool(g_pDasherAppSettings
, APP_BP_SHOW_TOOLBAR
) ) {
161 gtk_widget_show( toolbar
);
164 // Add UI control node stuff (might be better elsewhere)
166 gtk_dasher_control_register_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
, "Speak", -1 );
167 gtk_dasher_control_register_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+1, "All", -1 );
168 gtk_dasher_control_register_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+2, "New", -1 );
169 gtk_dasher_control_register_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+3, "Repeat", -1 );
171 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
, Dasher::CControlManager::CTL_ROOT
, -2);
173 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+1, Dasher::CControlManager::CTL_USER
, -2);
174 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+2, Dasher::CControlManager::CTL_USER
, -2);
175 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_USER
+3, Dasher::CControlManager::CTL_USER
, -2);
177 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), -1, Dasher::CControlManager::CTL_USER
+1, -2);
178 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_ROOT
, Dasher::CControlManager::CTL_USER
+1, -2);
180 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), -1, Dasher::CControlManager::CTL_USER
+2, -2);
181 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_ROOT
, Dasher::CControlManager::CTL_USER
+2, -2);
183 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), -1, Dasher::CControlManager::CTL_USER
+3, -2);
184 gtk_dasher_control_connect_node( GTK_DASHER_CONTROL(pDasherWidget
), Dasher::CControlManager::CTL_ROOT
, Dasher::CControlManager::CTL_USER
+3, -2);
188 // This ought to be greyed out if not built with speech support
189 gtk_widget_set_sensitive(glade_xml_get_widget(pGladeXML
, "speakbutton"), false);
193 gtk_widget_hide(glade_xml_get_widget(pGladeXML
, "radiobutton9"));
196 // Initialise the various components
198 initialise_edit(pGladeXML
);
199 PopulateMenus(pGladeXML
);
200 initialise_preferences_dialogue(pGladeXML
);
201 InitialiseFontDialogues(pGladeXML
);
205 #ifdef PJC_EXPERIMENTAL
206 // SetupPositioning();
210 // We always want this on in the GPE version, otherwise it's entirely useless
211 // Well, I suppose you could give it to kids, or impress primitive tribes,
212 // or convince members of the appropriate sex that you're somehow deeply cool,
213 // but they're not really our design goals.
214 // dasher_set_parameter_bool(BOOL_KEYBOARDMODE, true);
217 g_pAction
= DASHER_ACTION(dasher_action_keyboard_new());
221 /// Functions that need to be called as we're shutting down
222 /// This gets called after the Gtk loop has exited, so the widgets will no longer exist
225 void interface_cleanup() {
227 // delete_app_settings();
231 void SetupWMHints(bool bTopMost
) {
234 Atom wm_window_protocols
[3];
236 wm_window_protocols
[0] = gdk_x11_get_xatom_by_name("WM_DELETE_WINDOW");
237 wm_window_protocols
[1] = gdk_x11_get_xatom_by_name("_NET_WM_PING");
238 wm_window_protocols
[2] = gdk_x11_get_xatom_by_name("WM_TAKE_FOCUS");
240 wm_hints
.flags
= InputHint
;
241 wm_hints
.input
= False
;
244 XSetWMHints(GDK_WINDOW_XDISPLAY(window
->window
), GDK_WINDOW_XWINDOW(window
->window
), &wm_hints
);
245 XSetWMProtocols(GDK_WINDOW_XDISPLAY(window
->window
), GDK_WINDOW_XWINDOW(window
->window
), wm_window_protocols
, 3);
246 gdk_window_add_filter(window
->window
, dasher_discard_take_focus_filter
, NULL
);
249 gdk_window_remove_filter(window
->window
, dasher_discard_take_focus_filter
, NULL
);
252 // XSetWMHints(GDK_WINDOW_XDISPLAY(g_pHiddenWindow->window), GDK_WINDOW_XWINDOW(g_pHiddenWindow->window), &wm_hints);
253 // XSetWMProtocols(GDK_WINDOW_XDISPLAY(g_pHiddenWindow->window), GDK_WINDOW_XWINDOW(g_pHiddenWindow->window), wm_window_protocols, 3);
254 // gdk_window_add_filter(g_pHiddenWindow->window, dasher_discard_take_focus_filter, NULL);
257 gtk_window_set_keep_above(GTK_WINDOW(window
), bTopMost
);
258 // gtk_window_set_keep_above(GTK_WINDOW(g_pHiddenWindow), true);
261 void SetupPositioning() {
263 if(!GTK_WIDGET_MAPPED(window
))
266 // FIXME - what does gravity actually achieve here?
271 // gtk_window_set_gravity(GTK_WINDOW(window), GDK_GRAVITY_SOUTH_EAST);
273 // gtk_window_resize(GTK_WINDOW(window),(int)round(gdk_screen_width() * g_dXFraction), (int)round(gdk_screen_height() * g_dYFraction) );
275 // gtk_window_get_size(GTK_WINDOW(window), &iWidth, &iHeight);
276 // gtk_window_move(GTK_WINDOW(window), gdk_screen_width() - iWidth - 32, gdk_screen_height() - iHeight - 32);
278 // gtk_window_get_size(GTK_WINDOW(g_pHiddenWindow), &iWidth, &iHeight);
279 // gtk_window_set_gravity(GTK_WINDOW(g_pHiddenWindow), GDK_GRAVITY_SOUTH_EAST);
280 // gtk_window_move(GTK_WINDOW(g_pHiddenWindow), gdk_screen_width() - iWidth - 32, gdk_screen_height() - iHeight - 32);
282 bool bShowEdit
= false;
283 bool bShowActions
= false;
284 bool bTopMost
= false;
286 switch(dasher_app_settings_get_long(g_pDasherAppSettings
, APP_LP_STYLE
)) {
288 std::cout
<< "Classic style" << std::endl
;
290 bShowActions
= false;
294 std::cout
<< "Composition style" << std::endl
;
300 std::cout
<< "Direct style" << std::endl
;
302 bShowActions
= false;
308 gtk_widget_show(g_pActionPane
);
311 gtk_widget_hide(g_pActionPane
);
315 gtk_widget_show(g_pEditPane
);
318 gtk_widget_hide(g_pEditPane
);
321 SetupWMHints(bTopMost
);
325 /// Notification callbacks for parameters having changed
328 extern "C" void parameter_notification(GtkDasherControl
*pDasherControl
, gint iParameter
, gpointer data
) {
329 if(iParameter
== LP_DASHER_FONTSIZE
) {
330 switch (gtk_dasher_control_get_parameter_long(GTK_DASHER_CONTROL(pDasherWidget
), LP_DASHER_FONTSIZE
)) {
332 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets
, "fontsizenormal")), TRUE
);
335 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets
, "fontsizelarge")), TRUE
);
338 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets
, "fontsizevlarge")), TRUE
);
342 else if(iParameter
== LP_UNIFORM
) {
343 gtk_range_set_value(GTK_RANGE(glade_xml_get_widget(widgets
, "uniformhscale")), gtk_dasher_control_get_parameter_long(GTK_DASHER_CONTROL(pDasherWidget
), LP_UNIFORM
) / 10.0);
345 else if(iParameter
== LP_LANGUAGE_MODEL_ID
) {
346 switch (gtk_dasher_control_get_parameter_long(GTK_DASHER_CONTROL(pDasherWidget
), LP_LANGUAGE_MODEL_ID
)) {
348 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton6"))) != TRUE
)
349 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton6")), TRUE
);
352 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton7"))) != TRUE
)
353 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton7")), TRUE
);
356 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton8"))) != TRUE
)
357 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton8")), TRUE
);
361 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton9"))) != TRUE
)
362 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton9")), TRUE
);
367 else if(iParameter
== LP_ORIENTATION
) {
368 switch (gtk_dasher_control_get_parameter_long(GTK_DASHER_CONTROL(pDasherWidget
), LP_ORIENTATION
)) {
370 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton1"))) != TRUE
)
371 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton1")), TRUE
);
373 case Opts::LeftToRight
:
374 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton2"))) != TRUE
)
375 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton2")), TRUE
);
377 case Opts::RightToLeft
:
378 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton3"))) != TRUE
)
379 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton3")), TRUE
);
381 case Opts::TopToBottom
:
382 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton4"))) != TRUE
)
383 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton4")), TRUE
);
385 case Opts::BottomToTop
:
386 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton5"))) != TRUE
)
387 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "radiobutton5")), TRUE
);
391 else if(iParameter
== BP_SHOW_SLIDER
) {
392 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "speedsliderbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_SHOW_SLIDER
));
394 else if(iParameter
== BP_DRAW_MOUSE
) {
395 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "showmousebutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_DRAW_MOUSE
));
397 else if(iParameter
== BP_DRAW_MOUSE_LINE
) {
398 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "showmouselinebutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_DRAW_MOUSE_LINE
));
400 else if(iParameter
== BP_NUMBER_DIMENSIONS
) {
401 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "onedbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_NUMBER_DIMENSIONS
));
403 else if(iParameter
== BP_EYETRACKER_MODE
) {
404 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "eyetrackerbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_EYETRACKER_MODE
));
406 else if(iParameter
== BP_START_MOUSE
) {
407 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "leftbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_START_MOUSE
));
409 else if(iParameter
== BP_START_SPACE
) {
410 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "spacebutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_START_SPACE
));
412 else if((iParameter
== BP_MOUSEPOS_MODE
) || (iParameter
== BP_CIRCLE_START
)) {
413 // FIXME - duplicated code from Preferences.cpp
414 if(dasher_app_settings_get_bool(g_pDasherAppSettings
, BP_MOUSEPOS_MODE
)) {
415 gtk_combo_box_set_active(GTK_COMBO_BOX(glade_xml_get_widget(widgets
, "MousePosStyle")), 1);
416 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "mouseposbutton")), true);
418 else if(dasher_app_settings_get_bool(g_pDasherAppSettings
, BP_CIRCLE_START
)) {
419 gtk_combo_box_set_active(GTK_COMBO_BOX(glade_xml_get_widget(widgets
, "MousePosStyle")), 0);
420 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "mouseposbutton")), true);
423 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "mouseposbutton")), false);
426 else if(iParameter
== BP_KEY_CONTROL
) {
427 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "keyboardbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_KEY_CONTROL
));
429 else if(iParameter
== BP_CONTROL_MODE
) {
430 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "keyboardbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_KEY_CONTROL
));
432 else if(iParameter
== BP_OUTLINE_MODE
) {
433 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets
, "outlinebutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget
), BP_OUTLINE_MODE
));
435 // else if(iParameter == BP_KEYBOARD_MODE) {
436 // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets, "keyboardbutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget), BP_KEYBOARD_MODE));
439 // FIXME - this is now part of the colour selection group
441 // else if(iParameter == BP_PALETTE_CHANGE) {
442 // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(widgets, "palettebutton")), gtk_dasher_control_get_parameter_bool(GTK_DASHER_CONTROL(pDasherWidget), BP_PALETTE_CHANGE));
445 // See if AppSettings wants to do anything:
447 // Hmm - this seems to be the wrong way around...
449 handle_core_change(iParameter
);
453 void main_handle_parameter_change(int iParameter
) {
455 case APP_SP_EDIT_FONT
:
456 set_editbox_font(dasher_app_settings_get_string(g_pDasherAppSettings
, APP_SP_EDIT_FONT
));
466 /// Load the window state (dimensions etc.) from GConf
469 void LoadWindowState() {
474 iWindowWidth
= dasher_app_settings_get_long(g_pDasherAppSettings
, APP_LP_SCREEN_WIDTH
);
475 iWindowHeight
= dasher_app_settings_get_long(g_pDasherAppSettings
, APP_LP_SCREEN_HEIGHT
);
476 gtk_window_set_default_size(GTK_WINDOW(window
), iWindowWidth
, iWindowHeight
);
478 iEditHeight
= dasher_app_settings_get_long(g_pDasherAppSettings
, APP_LP_EDIT_HEIGHT
);
479 gtk_paned_set_position(GTK_PANED(glade_xml_get_widget(widgets
, "hpaned1")), iEditHeight
);
483 /// Save the window state to GConf
486 void SaveWindowState() {
491 gtk_window_get_size(GTK_WINDOW(window
), &iWindowWidth
, &iWindowHeight
);
492 dasher_app_settings_set_long(g_pDasherAppSettings
, APP_LP_SCREEN_WIDTH
, iWindowWidth
);
493 dasher_app_settings_set_long(g_pDasherAppSettings
, APP_LP_SCREEN_HEIGHT
, iWindowHeight
);
495 iEditHeight
= gtk_paned_get_position(GTK_PANED(glade_xml_get_widget(widgets
, "hpaned1")));
496 dasher_app_settings_set_long(g_pDasherAppSettings
, APP_LP_EDIT_HEIGHT
, iEditHeight
);
500 /// Signal handler for "dasher_start" events - emitted whenever Dasher is started
503 extern "C" void handle_start_event(GtkDasherControl
*pDasherControl
, gpointer data
) {
508 /// Signal handler for "dasher_stop" events - emitted whenever Dasher
509 /// is stopped. This is the place to deal with things like speak on
510 /// stop, copy all on stop etc.
513 extern "C" void handle_stop_event(GtkDasherControl
*pDasherControl
, gpointer data
) {
514 if(dasher_app_settings_get_bool(g_pDasherAppSettings
, APP_BP_SPEECH_MODE
))
515 SPEAK_DAMN_YOU(get_new_text());
517 if(dasher_app_settings_get_bool(g_pDasherAppSettings
, APP_BP_COPY_ALL_ON_STOP
))
518 gtk2_clipboard_callback(CLIPBOARD_COPYALL
);
520 // Send the text to an external application
522 // SendText(get_new_text());
525 extern "C" void handle_context_request(GtkDasherControl
* pDasherControl
, gint iMaxLength
, gpointer data
) {
526 RefreshContext(iMaxLength
);
530 /// Signal handler for control nodes
534 extern "C" void handle_control_event(GtkDasherControl
*pDasherControl
, gint iEvent
, gpointer data
) {
536 if(!edit_handle_control_event(iEvent
)) {
538 case Dasher::CControlManager::CTL_USER
+1: // Speak all
539 SPEAK_DAMN_YOU(get_all_text());
541 case Dasher::CControlManager::CTL_USER
+2: // Speak new
542 SPEAK_DAMN_YOU(get_new_text());
544 case Dasher::CControlManager::CTL_USER
+3: // Repeat speech
551 extern "C" bool focus_in_event(GtkWidget
*widget
, GdkEventFocus
*event
, gpointer data
) {
555 extern "C" void handle_request_settings(GtkDasherControl
* pDasherControl
, gpointer data
) {
556 preferences_display(0,0);
559 extern "C" void RestoreButton_Clicked(GtkWidget
*widget
, gpointer user_data
) {
560 #ifdef PJC_EXPERIMENTAL
561 gtk_widget_show(window
);
562 gtk_widget_hide(g_pHiddenWindow
);
563 // SetupPositioning();
568 extern "C" void DoneButton_Clicked(GtkWidget
*widget
, gpointer user_data
) {
569 SendText(get_all_text());
572 dasher_action_execute(g_pAction
, get_all_text());
575 gtk_dasher_control_invalidate_context(GTK_DASHER_CONTROL(pDasherWidget
));
577 // gtk_widget_show(g_pHiddenWindow);
578 // gtk_widget_hide(window);
579 // SetupPositioning();
583 extern "C" void CancelButton_Clicked(GtkWidget
*widget
, gpointer user_data
) {
585 gtk_dasher_control_invalidate_context(GTK_DASHER_CONTROL(pDasherWidget
));
586 // gtk_widget_show(g_pHiddenWindow);
587 // gtk_widget_hide(window);
588 // SetupPositioning();
592 extern "C" GtkWidget
*create_dasher_control(gchar
*szName
, gchar
*szString1
, gchar
*szString2
, gint iInt1
, gint iInt2
) {
593 GtkWidget
*pDasherControl
= gtk_dasher_control_new();
594 return pDasherControl
;