diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2010-08-28 22:44:35 +0000 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2010-08-28 22:44:35 +0000 |
commit | 890e7b2b466451528f7cfd64b88a16275ae5c2d0 (patch) | |
tree | 63efa83b7374e21b23906dc2abb48abf36d8e96e /amiga/arexx.c | |
parent | fe750bd0082d455d0be688793e2d5dbdb3b37a42 (diff) | |
download | netsurf-890e7b2b466451528f7cfd64b88a16275ae5c2d0.tar.gz netsurf-890e7b2b466451528f7cfd64b88a16275ae5c2d0.tar.bz2 |
Add ARexx commands CLOSE (close window/tab) and ACTIVE (current window/tab number to
pass to other ARexx commands)
Add CloseTabs.nsrx script to close all tabs in the current window except the active
one
svn path=/trunk/netsurf/; revision=10718
Diffstat (limited to 'amiga/arexx.c')
-rwxr-xr-x | amiga/arexx.c | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/amiga/arexx.c b/amiga/arexx.c index 59e9b1035..296178317 100755 --- a/amiga/arexx.c +++ b/amiga/arexx.c @@ -52,7 +52,9 @@ enum RX_FORWARD, RX_HOME, RX_RELOAD, - RX_WINDOWS + RX_WINDOWS, + RX_ACTIVE, + RX_CLOSE }; STATIC char result[100]; @@ -70,6 +72,8 @@ STATIC VOID rx_forward(struct ARexxCmd *, struct RexxMsg *); STATIC VOID rx_home(struct ARexxCmd *, struct RexxMsg *); STATIC VOID rx_reload(struct ARexxCmd *, struct RexxMsg *); STATIC VOID rx_windows(struct ARexxCmd *, struct RexxMsg *); +STATIC VOID rx_active(struct ARexxCmd *, struct RexxMsg *); +STATIC VOID rx_close(struct ARexxCmd *, struct RexxMsg *); STATIC struct ARexxCmd Commands[] = { @@ -86,6 +90,8 @@ STATIC struct ARexxCmd Commands[] = {"HOME", RX_HOME, rx_home, "WINDOW/K/N,TAB/K/N", 0, NULL, 0, 0, NULL }, {"RELOAD", RX_RELOAD, rx_reload, "FORCE/S,WINDOW/K/N,TAB/K/N", 0, NULL, 0, 0, NULL }, {"WINDOWS", RX_WINDOWS, rx_windows, "WINDOW/K/N", 0, NULL, 0, 0, NULL }, + {"ACTIVE", RX_ACTIVE, rx_active, "TAB/S", 0, NULL, 0, 0, NULL }, + {"CLOSE", RX_CLOSE, rx_close, "WINDOW/K/N,TAB/K/N", 0, NULL, 0, 0, NULL }, { NULL, 0, NULL, NULL, 0, NULL, 0, 0, NULL } }; @@ -156,6 +162,30 @@ struct browser_window *ami_find_tab_gwin(struct gui_window_2 *gwin, int tab) return NULL; } +int ami_find_tab_bw(struct gui_window_2 *gwin, struct browser_window *bw) +{ + int tabs = 0; + struct Node *ctab; + struct Node *ntab; + struct browser_window *tbw = NULL; + + if((bw == NULL) || (gwin->tabs == 0)) return 1; + + ctab = GetHead(&gwin->tab_list); + + do + { + tabs++; + ntab=GetSucc(ctab); + GetClickTabNodeAttrs(ctab, + TNA_UserData, &tbw, + TAG_DONE); + if(tbw == bw) return tabs; + } while(ctab=ntab); + + return NULL; +} + struct browser_window *ami_find_tab(int window, int tab) { int windows = 0, tabs = 0; @@ -490,3 +520,62 @@ STATIC VOID rx_windows(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__(( else sprintf(result, "%ld", windows); cmd->ac_Result = result; } + +STATIC VOID rx_active(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unused))) +{ + int windows = 0, tabs = 0; + int window = 0, tab = 0; + struct browser_window *bw = curbw; + struct nsObject *node, *nnode; + struct gui_window_2 *gwin; + + cmd->ac_RC = 0; + + if(!IsMinListEmpty(window_list)) + { + node = (struct nsObject *)GetHead((struct List *)window_list); + + do + { + nnode=(struct nsObject *)GetSucc((struct Node *)node); + + gwin = node->objstruct; + + if(node->Type == AMINS_WINDOW) + { + windows++; + if(gwin->bw == bw) + { + window = windows; + break; + } + } + } while(node = nnode); + } + + if(cmd->ac_ArgList[0]) + { + tab = ami_find_tab_bw(gwin, bw); + } + + if(cmd->ac_ArgList[0]) sprintf(result, "%ld", tab); + else sprintf(result, "%ld", window); + cmd->ac_Result = result; +} + +STATIC VOID rx_close(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unused))) +{ + struct browser_window *bw = curbw; + + cmd->ac_RC = 0; + + if((cmd->ac_ArgList[0]) && (cmd->ac_ArgList[1])) + bw = ami_find_tab(*(ULONG *)cmd->ac_ArgList[0], *(ULONG *)cmd->ac_ArgList[1]); + else if(cmd->ac_ArgList[0]) + { + ami_close_all_tabs(bw->window->shared); + return; + } + + if(bw) browser_window_destroy(bw); +} |