Fixed bug in DasherActionKeyboard gobject code Made load/save window state
[dasher.git] / Src / Gtk2 / dasher.cc
blob3fc27c8ba811d8a9bfec2f8a4d76068e004649a1
1 /*! \file dasher.cc
2 \brief The core of the Dasher application
4 Core routines for the Dasher application
5 */
7 // System headers
9 #include "../Common/Common.h"
11 #include <sys/types.h>
12 #include <sys/time.h>
13 #include <sys/stat.h>
14 #include <stdlib.h>
15 #include <libintl.h>
16 #include <locale.h>
17 #include <string>
18 #include <vector>
19 #include <stdio.h>
20 #include <time.h>
21 #include <dirent.h>
22 #include <X11/Xlib.h>
23 #include "Output.h"
25 // C++ STL headers (ideally minimise the use of C++ outside of the control)
27 #include <iostream>
29 // GTK/GDK headers and friends
31 #include <gtk/gtk.h>
32 #include <gdk/gdk.h>
33 #include <gdk/gdkx.h>
35 #include <gconf/gconf.h>
37 #ifdef GNOME_SPEECH
38 #include <libbonobo.h>
39 #include <gnome-speech/gnome-speech.h>
40 #endif
42 #ifdef GNOME_LIBS
43 #include <libgnomeui/libgnomeui.h>
44 #include <libgnome/libgnome.h>
45 #endif
47 #ifdef WITH_GPE
48 #include "gpesettings_store.h"
49 #endif
51 // Other Dasher components
53 #include "dasher.h"
54 #include "edit.h"
55 #include "fileops.h"
56 #include "Preferences.h"
57 #include "FontDialogues.h"
58 #include "Menu.h"
59 #include "AppSettings.h"
60 #include "../DasherCore/Parameters.h"
61 #include "speech.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
73 GladeXML *widgets;
75 GtkWidget *vbox, *toolbar;
76 GdkPixbuf *p; // Hmm... descriptive names
77 GtkWidget *pw;
78 GtkStyle *style;
79 GtkAccelGroup *dasher_accel;
80 GtkWidget *dasher_menu_bar;
81 GtkWidget *vpane;
82 GtkWidget *open_filesel;
83 GtkWidget *save_filesel;
84 GtkWidget *save_and_quit_filesel;
85 GtkWidget *import_filesel;
86 GtkWidget *append_filesel;
87 GtkWidget *window;
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;
108 // 'Private' methods
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) {
130 // if(g_bOnTop)
131 // gtk_window_set_keep_above(GTK_WINDOW(window), true);
133 // SetupWMHints();
134 SetupPositioning();
135 // A11y support disabled for now
136 setupa11y();
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);
185 // ---
187 #ifndef GNOME_SPEECH
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);
190 #endif
192 #ifndef JAPANESE
193 gtk_widget_hide(glade_xml_get_widget(pGladeXML, "radiobutton9"));
194 #endif
196 // Initialise the various components
198 initialise_edit(pGladeXML);
199 PopulateMenus(pGladeXML);
200 initialise_preferences_dialogue(pGladeXML);
201 InitialiseFontDialogues(pGladeXML);
204 LoadWindowState();
205 #ifdef PJC_EXPERIMENTAL
206 // SetupPositioning();
207 #endif
209 #ifdef WITH_GPE
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);
215 #endif
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() {
226 cleanup_edit();
227 // delete_app_settings();
231 void SetupWMHints(bool bTopMost) {
232 #ifndef WITH_MAEMO
233 XWMHints wm_hints;
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;
243 if(bTopMost) {
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);
248 else {
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);
255 #endif
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))
264 return;
266 // FIXME - what does gravity actually achieve here?
268 // gint iWidth;
269 // gint iHeight;
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)) {
287 case 0:
288 std::cout << "Classic style" << std::endl;
289 bShowEdit = true;
290 bShowActions = false;
291 bTopMost = false;
292 break;
293 case 1:
294 std::cout << "Composition style" << std::endl;
295 bShowEdit = true;
296 bShowActions = true;
297 bTopMost = true;
298 break;
299 case 2:
300 std::cout << "Direct style" << std::endl;
301 bShowEdit = false;
302 bShowActions = false;
303 bTopMost = true;
304 break;
307 if(bShowActions) {
308 gtk_widget_show(g_pActionPane);
310 else {
311 gtk_widget_hide(g_pActionPane);
314 if(bShowEdit) {
315 gtk_widget_show(g_pEditPane);
317 else {
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)) {
331 case Opts::Normal:
332 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets, "fontsizenormal")), TRUE);
333 break;
334 case Opts::Big:
335 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets, "fontsizelarge")), TRUE);
336 break;
337 case Opts::VBig:
338 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(widgets, "fontsizevlarge")), TRUE);
339 break;
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)) {
347 case 0:
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);
350 break;
351 case 2:
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);
354 break;
355 case 3:
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);
358 break;
359 #ifdef JAPANESE
360 case 4:
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);
363 break;
364 #endif
367 else if(iParameter == LP_ORIENTATION) {
368 switch (gtk_dasher_control_get_parameter_long(GTK_DASHER_CONTROL(pDasherWidget), LP_ORIENTATION)) {
369 case Opts::Alphabet:
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);
372 break;
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);
376 break;
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);
380 break;
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);
384 break;
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);
388 break;
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);
422 else {
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));
437 // }
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));
443 // }
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) {
454 switch(iParameter) {
455 case APP_SP_EDIT_FONT:
456 set_editbox_font(dasher_app_settings_get_string(g_pDasherAppSettings, APP_SP_EDIT_FONT));
457 break;
458 case APP_LP_STYLE:
459 SetupPositioning();
460 break;
466 /// Load the window state (dimensions etc.) from GConf
469 void LoadWindowState() {
470 int iWindowWidth;
471 int iWindowHeight;
472 int iEditHeight;
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() {
487 int iWindowWidth;
488 int iWindowHeight;
489 int iEditHeight;
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) {
504 set_mark();
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)) {
537 switch( iEvent ) {
538 case Dasher::CControlManager::CTL_USER+1: // Speak all
539 SPEAK_DAMN_YOU(get_all_text());
540 break;
541 case Dasher::CControlManager::CTL_USER+2: // Speak new
542 SPEAK_DAMN_YOU(get_new_text());
543 break;
544 case Dasher::CControlManager::CTL_USER+3: // Repeat speech
545 repeat_speech();
546 break;
551 extern "C" bool focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) {
552 return grab_focus();
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();
564 // SetupWMHints();
565 #endif
568 extern "C" void DoneButton_Clicked(GtkWidget *widget, gpointer user_data) {
569 SendText(get_all_text());
571 if(g_pAction)
572 dasher_action_execute(g_pAction, get_all_text());
574 clear_edit();
575 gtk_dasher_control_invalidate_context(GTK_DASHER_CONTROL(pDasherWidget));
577 // gtk_widget_show(g_pHiddenWindow);
578 // gtk_widget_hide(window);
579 // SetupPositioning();
580 //SetupWMHints();
583 extern "C" void CancelButton_Clicked(GtkWidget *widget, gpointer user_data) {
584 clear_edit();
585 gtk_dasher_control_invalidate_context(GTK_DASHER_CONTROL(pDasherWidget));
586 // gtk_widget_show(g_pHiddenWindow);
587 // gtk_widget_hide(window);
588 // SetupPositioning();
589 // SetupWMHints();
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;