diff options
-rw-r--r-- | desktop/browser.c | 16 | ||||
-rw-r--r-- | desktop/gui.h | 5 | ||||
-rw-r--r-- | desktop/selection.c | 3 | ||||
-rw-r--r-- | riscos/save.c | 81 |
4 files changed, 62 insertions, 43 deletions
diff --git a/desktop/browser.c b/desktop/browser.c index b1f4eca0e..0a7775838 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -694,9 +694,9 @@ void browser_window_mouse_click(struct browser_window *bw, default: if (mouse & BROWSER_MOUSE_MOD_2) { if (mouse & BROWSER_MOUSE_DRAG_2) - gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, c); + gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, c, bw->window); else if (mouse & BROWSER_MOUSE_DRAG_1) - gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, c); + gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, c, bw->window); } else if (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2)) { browser_window_page_drag_start(bw, x, y); @@ -893,9 +893,9 @@ void browser_window_mouse_action_html(struct browser_window *bw, } else if (object && (mouse & BROWSER_MOUSE_MOD_2)) { if (mouse & BROWSER_MOUSE_DRAG_2) - gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, object); + gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, object, bw->window); else if (mouse & BROWSER_MOUSE_DRAG_1) - gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, object); + gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, object, bw->window); /* \todo should have a drag-saving object msg */ status = c->status_message; @@ -954,7 +954,7 @@ void browser_window_mouse_action_html(struct browser_window *bw, if (mouse & BROWSER_MOUSE_DRAG_1) { if (mouse & BROWSER_MOUSE_MOD_2) { - gui_drag_save_object(GUI_SAVE_COMPLETE, c); + gui_drag_save_object(GUI_SAVE_COMPLETE, c, bw->window); } else { browser_window_page_drag_start(bw, x, y); @@ -963,7 +963,7 @@ void browser_window_mouse_action_html(struct browser_window *bw, } else if (mouse & BROWSER_MOUSE_DRAG_2) { if (mouse & BROWSER_MOUSE_MOD_2) { - gui_drag_save_object(GUI_SAVE_SOURCE, c); + gui_drag_save_object(GUI_SAVE_SOURCE, c, bw->window); } else { browser_window_page_drag_start(bw, x, y); @@ -997,8 +997,8 @@ void browser_window_mouse_track(struct browser_window *bw, struct content *c = bw->current_content; if (!c) return; - /* detect end of drag operation in case the platform specific - code doesn't call browser_mouse_drag_end() */ + /* detect end of drag operation in case the platform-specific code + doesn't call browser_mouse_drag_end() (RISC OS code does) */ if (bw->drag_type != DRAGGING_NONE && !mouse) { browser_window_mouse_drag_end(bw, mouse, x, y); diff --git a/desktop/gui.h b/desktop/gui.h index df4fe24f0..bcc39e21b 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -80,8 +80,9 @@ void gui_download_window_error(struct gui_download_window *dw, const char *error_msg); void gui_download_window_done(struct gui_download_window *dw); -void gui_drag_save_object(gui_save_type type, struct content *c); -void gui_drag_save_selection(struct selection *s); +void gui_drag_save_object(gui_save_type type, struct content *c, + struct gui_window *g); +void gui_drag_save_selection(struct selection *s, struct gui_window *g); void gui_start_selection(struct gui_window *g); bool gui_copy_to_clipboard(struct selection *s); diff --git a/desktop/selection.c b/desktop/selection.c index fc906f692..2942b895b 100644 --- a/desktop/selection.c +++ b/desktop/selection.c @@ -226,7 +226,8 @@ bool selection_click(struct selection *s, struct box *box, if (!pos && (mouse & BROWSER_MOUSE_MOD_2) && (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2))) { /* drag-saving selection */ - gui_drag_save_selection(s); + assert(s->bw); + gui_drag_save_selection(s, s->bw->window); } else if (!modkeys) { if (mouse & BROWSER_MOUSE_DRAG_1) { diff --git a/riscos/save.c b/riscos/save.c index aeb677bca..d4841bb56 100644 --- a/riscos/save.c +++ b/riscos/save.c @@ -42,7 +42,8 @@ static struct selection *gui_save_selection = NULL; static int gui_save_filetype; static bool using_dragasprite = true; -static wimp_w gui_save_dialogw = (wimp_w)-1; +static bool saving_from_dialog = true; +static wimp_w gui_save_sourcew = (wimp_w)-1; typedef enum { LINK_ACORN, LINK_ANT, LINK_TEXT } link_format; @@ -124,6 +125,8 @@ void ro_gui_save_prepare(gui_save_type save_type, struct content *c) /** * Handle clicks in the save dialog. + * + * \param pointer mouse position info from Wimp */ void ro_gui_save_click(wimp_pointer *pointer) @@ -134,17 +137,18 @@ void ro_gui_save_click(wimp_pointer *pointer) break; case ICON_SAVE_CANCEL: if (pointer->buttons == wimp_CLICK_SELECT) { - xwimp_create_menu((wimp_menu *)-1, 0, 0); + xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); ro_gui_dialog_close(pointer->w); } else if (pointer->buttons == wimp_CLICK_ADJUST) { -/* ro_gui_menu_prepare_save(gui_save_content); */ - } - break; + ro_gui_save_prepare(gui_save_current_type, gui_save_content); + } + break; case ICON_SAVE_ICON: if (pointer->buttons == wimp_DRAG_SELECT) { const char *sprite = ro_gui_get_icon_string(pointer->w, pointer->i); gui_current_drag_type = GUI_DRAG_SAVE; - gui_save_dialogw = pointer->w; + gui_save_sourcew = pointer->w; + saving_from_dialog = true; ro_gui_drag_icon(pointer->pos.x, pointer->pos.y, sprite); } break; @@ -154,6 +158,8 @@ void ro_gui_save_click(wimp_pointer *pointer) /** * Handle OK click/keypress in the save dialog. + * + * \param w window handle of save dialog */ void ro_gui_save_ok(wimp_w w) @@ -164,9 +170,10 @@ void ro_gui_save_ok(wimp_w w) warn_user("NoPathError", NULL); return; } - gui_save_dialogw = w; + gui_save_sourcew = w; + saving_from_dialog = true; if (ro_gui_save_content(gui_save_content, name)) { - xwimp_create_menu((wimp_menu *)-1, 0, 0); + xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); ro_gui_dialog_close(w); } } @@ -177,9 +184,11 @@ void ro_gui_save_ok(wimp_w w) * * \param save_type type of save * \param c content to save + * \param g gui window */ -void gui_drag_save_object(gui_save_type save_type, struct content *c) +void gui_drag_save_object(gui_save_type save_type, struct content *c, + struct gui_window *g) { wimp_pointer pointer; char icon_buf[20]; @@ -188,10 +197,11 @@ void gui_drag_save_object(gui_save_type save_type, struct content *c) /* Close the save window because otherwise we need two contexts */ - if (gui_save_dialogw != (wimp_w)-1) - ro_gui_dialog_close(gui_save_dialogw); + xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); + ro_gui_dialog_close(dialog_saveas); - gui_save_dialogw = (wimp_w)-1; + gui_save_sourcew = g->window; + saving_from_dialog = false; error = xwimp_get_pointer_info(&pointer); if (error) { @@ -218,7 +228,14 @@ void gui_drag_save_object(gui_save_type save_type, struct content *c) } -void gui_drag_save_selection(struct selection *s) +/** + * Initiates drag saving of a selection from a browser window + * + * \param s selection object + * \param g gui window + */ + +void gui_drag_save_selection(struct selection *s, struct gui_window *g) { wimp_pointer pointer; char icon_buf[20]; @@ -227,10 +244,11 @@ void gui_drag_save_selection(struct selection *s) /* Close the save window because otherwise we need two contexts */ - if (gui_save_dialogw != (wimp_w)-1) - ro_gui_dialog_close(gui_save_dialogw); + xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); + ro_gui_dialog_close(dialog_saveas); - gui_save_dialogw = (wimp_w)-1; + gui_save_sourcew = g->window; + saving_from_dialog = false; error = xwimp_get_pointer_info(&pointer); if (error) { @@ -323,10 +341,15 @@ void ro_gui_save_drag_end(wimp_dragged *drag) return; } - if (gui_save_dialogw == (wimp_w)-1) { + /* ignore drags that remain within the source window */ + if (gui_save_sourcew != (wimp_w)-1 && pointer.w == gui_save_sourcew) + return; + + if (!saving_from_dialog) { /* saving directly from browser window, choose a name based upon the URL */ struct content *c = gui_save_content; const char *nice; + name = gui_save_table[gui_save_current_type].name; if (c) { url_func_result res; @@ -337,11 +360,8 @@ void ro_gui_save_drag_end(wimp_dragged *drag) else { char *dot; - /* ignore drags to the saveas window itself */ - if (pointer.w == gui_save_dialogw) return; - /* saving from dialog, grab leafname from icon */ - name = ro_gui_get_icon_string(gui_save_dialogw, ICON_SAVE_PATH); + name = ro_gui_get_icon_string(gui_save_sourcew, ICON_SAVE_PATH); dot = strrchr(name, '.'); if (dot) name = dot + 1; @@ -387,8 +407,8 @@ void ro_gui_send_datasave(gui_save_type save_type, const wimp_full_message_data_ /* Close the save window because otherwise we need two contexts */ - if (gui_save_dialogw != (wimp_w)-1) - ro_gui_dialog_close(gui_save_dialogw); + xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); + ro_gui_dialog_close(dialog_saveas); error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)message, to); if (error) { @@ -397,7 +417,8 @@ void ro_gui_send_datasave(gui_save_type save_type, const wimp_full_message_data_ } else { gui_save_current_type = save_type; - gui_save_dialogw = (wimp_w)-1; + gui_save_sourcew = (wimp_w)-1; + saving_from_dialog = false; gui_current_drag_type = GUI_DRAG_SAVE; } } @@ -427,18 +448,12 @@ void ro_gui_save_datasave_ack(wimp_message *message) break; } - if (gui_save_dialogw != (wimp_w)-1) - ro_gui_set_icon_string(gui_save_dialogw, ICON_SAVE_PATH, path); + if (saving_from_dialog) + ro_gui_set_icon_string(gui_save_sourcew, ICON_SAVE_PATH, path); if (ro_gui_save_content(c, path)) { os_error *error; - if (gui_save_dialogw != (wimp_w)-1) { - /* Close the save window - */ - ro_gui_dialog_close(gui_save_dialogw); - } - /* Ack successful save with message_DATA_LOAD */ message->action = message_DATA_LOAD; message->your_ref = message->my_ref; @@ -450,6 +465,8 @@ void ro_gui_save_datasave_ack(wimp_message *message) warn_user("SaveError", error->errmess); } + /* Close the save window */ + ro_gui_dialog_close(dialog_saveas); error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); if (error) { LOG(("xwimp_create_menu: 0x%x: %s", |