void ro_gui_save_datasave_ack(wimp_message *message) { char *path = message->data.data_xfer.file_name; os_error *error; if (!ro_gui_save(path)) return; ro_gui_set_icon_string(dialog_saveas, ICON_SAVE_PATH, reset_filename); /* Close the save window */ ro_gui_dialog_close(dialog_saveas); /* Ack successful save with message_DATA_LOAD */ message->action = message_DATA_LOAD; message->your_ref = message->my_ref; error = xwimp_send_message_to_window(wimp_USER_MESSAGE, message, message->data.data_xfer.w, message->data.data_xfer.i, 0); if (error) { LOG(("xwimp_send_message_to_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); } if (close_menu) { error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); if (error) { LOG(("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess)); warn_user("MenuError", error->errmess); } } close_menu = true; }
void ro_gui_download_send_dataload(struct gui_download_window *dw) { /* Ack successful save with message_DATA_LOAD */ wimp_message *message = &dw->save_message; os_error *error; assert(dw->send_dataload); dw->send_dataload = false; message->action = message_DATA_LOAD; message->your_ref = message->my_ref; error = xwimp_send_message_to_window(wimp_USER_MESSAGE, message, message->data.data_xfer.w, message->data.data_xfer.i, 0); /* The window we just attempted to send a message to may * have been closed before the message was sent. As we've * no clean way of detecting this, we'll just detect the * error return from the message send attempt and judiciously * ignore it. * * Ideally, we would have registered to receive Message_WindowClosed * and then cleared dw->send_dataload flag for the appropriate * window. Unfortunately, however, a long-standing bug in the * Pinboard module prevents this from being a viable solution. * * See http://groups.google.co.uk/group/comp.sys.acorn.tech/msg/e3fbf70d8393e6cf?dmode=source&hl=en * for the rather depressing details. */ if (error && error->errnum != error_WIMP_BAD_HANDLE) { LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); } riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw); }
void ro_gui_download_drag_end(wimp_dragged *drag) { wimp_pointer pointer; wimp_message message; struct gui_download_window *dw = download_window_current; const char *leaf; os_error *error; if (dw->saved || dw->error) return; error = xwimp_get_pointer_info(&pointer); if (error) { LOG(("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } /* ignore drags to the download window itself */ if (pointer.w == dw->window) return; leaf = strrchr(dw->path, '.'); if (leaf) leaf++; else leaf = dw->path; ro_gui_convert_save_path(message.data.data_xfer.file_name, 212, leaf); message.your_ref = 0; message.action = message_DATA_SAVE; message.data.data_xfer.w = pointer.w; message.data.data_xfer.i = pointer.i; message.data.data_xfer.pos.x = pointer.pos.x; message.data.data_xfer.pos.y = pointer.pos.y; message.data.data_xfer.est_size = dw->total_size ? dw->total_size : dw->received; message.data.data_xfer.file_type = dw->file_type; message.size = 44 + ((strlen(message.data.data_xfer.file_name) + 4) & (~3u)); error = xwimp_send_message_to_window(wimp_USER_MESSAGE, &message, pointer.w, pointer.i, 0); if (error) { LOG(("xwimp_send_message_to_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } }
/** * Sends a message and registers a return route for a bounce. * * \param event the message event type * \param message the message to register a route back for * \param to_w the window to send the message to * \param to_i the icon * \param callback the code to call on a bounce * \param to_t receives the task handle of the window's creator * \return true on success, false otherwise */ bool ro_message_send_message_to_window(wimp_event_no event, wimp_message *message, wimp_w to_w, wimp_i to_i, void (*callback)(wimp_message *message), wimp_t *to_t) { os_error *error; assert(message); /* send a message */ error = xwimp_send_message_to_window(event, message, to_w, to_i, to_t); if (error) { LOG("xwimp_send_message_to_window: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); return false; } /* register the default bounce handler */ if (callback) { assert(event == wimp_USER_MESSAGE_RECORDED); return ro_message_register_handler(message, message->action, callback); } return true; }
/** * Handle key presses in a text area * * \param key Key pressed state block * \param true if press handled, false otherwise */ bool ro_textarea_key_press(wimp_key *key) { uint32_t c = (uint32_t) key->c; wimp_key keypress; struct text_area *ta; char utf8[7]; size_t utf8_len; bool redraw = false; unsigned int c_pos; os_error *error; ta = (struct text_area *)ro_gui_wimp_event_get_user_data(key->w); if (ta->flags & TEXTAREA_READONLY) return true; if (!(c & IS_WIMP_KEY || (c <= 0x001f || (0x007f <= c && c <= 0x009f)))) { /* normal character - insert */ utf8_len = utf8_from_ucs4(c, utf8); utf8[utf8_len] = '\0'; c_pos = ro_textarea_get_caret((uintptr_t)ta); ro_textarea_insert_text((uintptr_t)ta, c_pos, utf8); ro_textarea_set_caret((uintptr_t)ta, ++c_pos); redraw = true; } else { /** \todo handle command keys */ switch (c & ~IS_WIMP_KEY) { case 8: /* Backspace */ c_pos = ro_textarea_get_caret((uintptr_t)ta); if (c_pos > 0) { ro_textarea_replace_text((uintptr_t)ta, c_pos - 1, c_pos, ""); ro_textarea_set_caret((uintptr_t)ta, c_pos - 1); redraw = true; } break; case 21: /* Ctrl + U */ ro_textarea_set_text((uintptr_t)ta, ""); ro_textarea_set_caret((uintptr_t)ta, 0); redraw = true; break; case wimp_KEY_DELETE: c_pos = ro_textarea_get_caret((uintptr_t)ta); if (os_version < RISCOS5 && c_pos > 0) { ro_textarea_replace_text((uintptr_t)ta, c_pos - 1, c_pos, ""); ro_textarea_set_caret((uintptr_t)ta, c_pos - 1); } else { ro_textarea_replace_text((uintptr_t)ta, c_pos, c_pos + 1, ""); } redraw = true; break; case wimp_KEY_LEFT: c_pos = ro_textarea_get_caret((uintptr_t)ta); if (c_pos > 0) ro_textarea_set_caret((uintptr_t)ta, c_pos - 1); break; case wimp_KEY_RIGHT: c_pos = ro_textarea_get_caret((uintptr_t)ta); ro_textarea_set_caret((uintptr_t)ta, c_pos + 1); break; case wimp_KEY_UP: /** \todo Move caret up a line */ break; case wimp_KEY_DOWN: /** \todo Move caret down a line */ break; case wimp_KEY_HOME: case wimp_KEY_CONTROL | wimp_KEY_LEFT: /** \todo line start */ break; case wimp_KEY_CONTROL | wimp_KEY_RIGHT: /** \todo line end */ break; case wimp_KEY_CONTROL | wimp_KEY_UP: ro_textarea_set_caret((uintptr_t)ta, 0); break; case wimp_KEY_CONTROL | wimp_KEY_DOWN: ro_textarea_set_caret((uintptr_t)ta, utf8_length(ta->text)); break; case wimp_KEY_COPY: if (os_version < RISCOS5) { c_pos = ro_textarea_get_caret((uintptr_t)ta); ro_textarea_replace_text((uintptr_t)ta, c_pos, c_pos + 1, ""); } else { /** \todo line end */ } break; /** pass on RETURN and ESCAPE to the parent icon */ case wimp_KEY_RETURN: if (ta->flags & TEXTAREA_MULTILINE) { /* Insert newline */ c_pos = ro_textarea_get_caret((uintptr_t)ta); ro_textarea_insert_text((uintptr_t)ta, c_pos, "\n"); ro_textarea_set_caret((uintptr_t)ta, ++c_pos); redraw = true; break; } /* fall through */ case wimp_KEY_ESCAPE: keypress = *key; keypress.w = ta->parent; keypress.i = ta->icon; keypress.index = 0; /* undefined if not in an icon */ error = xwimp_send_message_to_window(wimp_KEY_PRESSED, (wimp_message*)&keypress, ta->parent, ta->icon, 0); if (error) { LOG(("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess)); } break; } } if (redraw) { wimp_draw update; update.w = ta->window; update.box.x0 = 0; update.box.y1 = 0; update.box.x1 = ta->vis_width; update.box.y0 = -ta->line_height * (ta->line_count + 1); ro_textarea_redraw_internal(&update, true); } return true; }