summaryrefslogtreecommitdiff
path: root/amiga/arexx.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2010-08-28 22:44:35 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2010-08-28 22:44:35 +0000
commit890e7b2b466451528f7cfd64b88a16275ae5c2d0 (patch)
tree63efa83b7374e21b23906dc2abb48abf36d8e96e /amiga/arexx.c
parentfe750bd0082d455d0be688793e2d5dbdb3b37a42 (diff)
downloadnetsurf-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-xamiga/arexx.c91
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);
+}