From 64ae9e8693aaaf09cb4e35b63d029d446ef361b0 Mon Sep 17 00:00:00 2001 From: John-Mark Bell Date: Tue, 22 Jan 2013 08:51:58 +0000 Subject: Fix paste. Store clipboard as UTF-8 internally, to avoid unnecessary data loss when copying internally. --- riscos/gui.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'riscos/gui.c') diff --git a/riscos/gui.c b/riscos/gui.c index de5dc4af4..e786f67d8 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -1282,6 +1282,22 @@ void ro_gui_drag_end(wimp_dragged *drag) * Handle Key_Pressed events. */ +static void ro_gui_keypress_cb(void *pw) +{ + wimp_key *key = (wimp_key *) pw; + + if (ro_gui_wimp_event_keypress(key) == false) { + os_error *error = xwimp_process_key(key->c); + if (error) { + LOG(("xwimp_process_key: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + } + } + + free(key); +} + void ro_gui_keypress(wimp_key *key) { if (key->c == wimp_KEY_ESCAPE && @@ -1292,8 +1308,17 @@ void ro_gui_keypress(wimp_key *key) (easier than finding somewhere safe to abort the drag) */ ro_gui_drag_box_cancel(); gui_current_drag_type = GUI_DRAG_NONE; - } - else if (!ro_gui_wimp_event_keypress(key)) { + } else if (key->c == 22 /* Ctrl-V */) { + wimp_key *copy; + + /* Must copy the keypress as it's on the stack */ + copy = malloc(sizeof(wimp_key)); + if (copy == NULL) + return; + memcpy(copy, key, sizeof(wimp_key)); + + ro_gui_selection_prepare_paste(key->w, ro_gui_keypress_cb, copy); + } else if (ro_gui_wimp_event_keypress(key) == false) { os_error *error = xwimp_process_key(key->c); if (error) { LOG(("xwimp_process_key: 0x%x: %s", @@ -1320,9 +1345,10 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message) if (event == wimp_USER_MESSAGE_ACKNOWLEDGE) { if (ro_print_current_window) ro_print_dataload_bounce(message); - } - else + } else if (ro_gui_selection_prepare_paste_dataload( + (wimp_full_message_data_xfer *) message) == false) { ro_msg_dataload(message); + } break; case message_DATA_LOAD_ACK: @@ -1772,6 +1798,9 @@ void ro_msg_datasave(wimp_message *message) ro_msg_terminate_filename(dataxfer); + if (ro_gui_selection_prepare_paste_datasave(dataxfer)) + return; + switch (dataxfer->file_type) { case FILETYPE_ACORN_URI: case FILETYPE_ANT_URL: -- cgit v1.2.3