commit 8048fa9ed089e9b571379585a17f71c7c0790beb
parent 946e4a0194fc20a54ce4420aa3823669e8b468a1
Author: ukai <ukai>
Date: Fri, 22 Nov 2002 15:43:13 +0000
[w3m-dev 03458] Re: mouse menu
* display.c (displayBuffer): nTab2 -> nTab, mouse_menu
* fm.h (nTab2): deleted
(MouseMenuMap): added
(MouseMenu): added
(LIMIT_MOUSE_MENU): added
* func.c (initMouseMenu): delete mouse_menu_map initialization
conv_from_system
mouse_menu->width
* main.c (main): mouse_menu->in_action = FALSE
(posTab): check mouse_menu
(mouse_menu_action): add y arg
mouse_menu_width check
(process_mouse): nTab2 -> nTab, mouse_menu
(nTabLine): deleted
(calcTabPos): check mouse_menu
* menu.c (mainMn): x, y
(selMn): mouse_menu check
(tabMn): mosue_menu check
* proto.h (nTabLine): deleted
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
Diffstat:
M | ChangeLog | | | 23 | +++++++++++++++++++++++ |
M | display.c | | | 16 | ++++++++-------- |
M | fm.h | | | 18 | ++++++++++++++---- |
M | func.c | | | 38 | +++++++++++++++++++++++--------------- |
M | main.c | | | 58 | ++++++++++++++++++++++++++++++++-------------------------- |
M | menu.c | | | 35 | +++++++++++++++++++++++++++++------ |
M | proto.h | | | 1 | - |
7 files changed, 129 insertions(+), 60 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,26 @@
+2002-11-23 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
+
+ * [w3m-dev 03458] Re: mouse menu
+ * display.c (displayBuffer): nTab2 -> nTab, mouse_menu
+ * fm.h (nTab2): deleted
+ (MouseMenuMap): added
+ (MouseMenu): added
+ (LIMIT_MOUSE_MENU): added
+ * func.c (initMouseMenu): delete mouse_menu_map initialization
+ conv_from_system
+ mouse_menu->width
+ * main.c (main): mouse_menu->in_action = FALSE
+ (posTab): check mouse_menu
+ (mouse_menu_action): add y arg
+ mouse_menu_width check
+ (process_mouse): nTab2 -> nTab, mouse_menu
+ (nTabLine): deleted
+ (calcTabPos): check mouse_menu
+ * menu.c (mainMn): x, y
+ (selMn): mouse_menu check
+ (tabMn): mosue_menu check
+ * proto.h (nTabLine): deleted
+
2002-11-22 Fumitoshi UKAI <ukai@debian.or.jp>
* NEWS: options: -N
diff --git a/display.c b/display.c
@@ -254,7 +254,7 @@ displayBuffer(Buffer *buf, int mode)
else
buf->rootX = 0;
buf->COLS = COLS - buf->rootX;
- if (nTab2 > 1) {
+ if (nTab > 1 || mouse_menu) {
ny = LastTab->y + 2;
if (ny > LASTLINE)
ny = LASTLINE;
@@ -445,17 +445,15 @@ redrawNLine(Buffer *buf, int n)
#endif /* USE_BG_COLOR */
}
#endif /* USE_COLOR */
- if (nTab2 > 1) {
+ if (nTab > 1 || mouse_menu) {
TabBuffer *t;
int l;
- i = 0;
move(0, 0);
- if (mouse_menu) {
- addstr(mouse_menu);
- clrtoeolx();
- i++;
- }
+#ifdef USE_MOUSE
+ if (mouse_menu && mouse_menu->str)
+ addstr(mouse_menu->str);
+#endif
clrtoeolx();
for (t = FirstTab; t; t = t->nextTab) {
move(t->y, t->x1);
@@ -477,8 +475,10 @@ redrawNLine(Buffer *buf, int n)
boldend();
clrtoeolx();
}
+#if 0
move(0, COLS - 2);
addstr(" x");
+#endif
move(LastTab->y + 1, 0);
for (i = 0; i < COLS; i++)
addch('~');
diff --git a/fm.h b/fm.h
@@ -808,7 +808,6 @@ global int open_tab_blank init(FALSE);
global int open_tab_dl_list init(FALSE);
global int close_tab_back init(FALSE);
global int nTab;
-#define nTab2 (mouse_menu ? (nTab + 1) : nTab)
global int TabCols init(10);
#define NO_TABBUFFER ((TabBuffer *)1)
#define Currentbuf (CurrentTab->currentBuffer)
@@ -994,12 +993,23 @@ global int reverse_mouse init(FALSE);
global int relative_wheel_scroll init(FALSE);
global int fixed_wheel_scroll_count init(5);
global int relative_wheel_scroll_ratio init(30);
-struct _MouseMenu {
+typedef struct _MouseMenuMap {
void (*func) ();
char *data;
-} mouse_menu_map[3][10];
+} MouseMenuMap;
+typedef struct _MouseMenu {
+ char *str;
+ int width;
+ int in_action;
+ int cursorX;
+ int cursorY;
+ MouseMenuMap *map[3];
+} MouseMenu;
+global MouseMenu *mouse_menu init(NULL);
+#define LIMIT_MOUSE_MENU 100
+#else
+#define mouse_menu NULL
#endif /* USE_MOUSE */
-global char *mouse_menu init(NULL);
#ifdef USE_COOKIE
global int default_use_cookie init(TRUE);
diff --git a/func.c b/func.c
@@ -331,12 +331,6 @@ initMouseMenu(void)
int f, b, x, x2;
mouse_menu = NULL;
- for (b = 1; b <= 3; b++) {
- for (x = 0; x < 10; x++) {
- mouse_menu_map[b - 1][x].func = NULL;
- mouse_menu_map[b - 1][x].data = NULL;
- }
- }
if ((mf = fopen(rcFile(MOUSE_FILE), "rt")) == NULL)
return;
@@ -346,17 +340,31 @@ initMouseMenu(void)
Strremovefirstspaces(line);
if (line->length == 0)
continue;
- p = line->ptr;
+ p = conv_from_system(line->ptr);
s = getWord(&p);
if (*s == '#') /* comment */
continue;
if (!strcmp(s, "menu")) {
s = getQWord(&p);
- if (*s)
- mouse_menu = Strnew_charp(s)->ptr;
- continue;
+ if (!*s)
+ continue; /* error */
+ mouse_menu = New(MouseMenu);
+ mouse_menu->str = s;
+ mouse_menu->width = strlen(s);
+ mouse_menu->in_action = FALSE;
+ if (mouse_menu->width >= LIMIT_MOUSE_MENU)
+ mouse_menu->width = LIMIT_MOUSE_MENU;
+ for (b = 0; b < 3; b++) {
+ mouse_menu->map[b] = New_N(MouseMenuMap, mouse_menu->width);
+ for (x = 0; x < mouse_menu->width; x++) {
+ mouse_menu->map[b][x].func = NULL;
+ mouse_menu->map[b][x].data = NULL;
+ }
+ }
}
- if (strcmp(s, "button"))
+ if (!mouse_menu)
+ continue; /* "menu" is not set */
+ if (strcmp(s, "button"))
continue; /* error */
s = getWord(&p);
b = atoi(s);
@@ -364,11 +372,11 @@ initMouseMenu(void)
continue; /* error */
s = getWord(&p);
x = atoi(s);
- if (!(IS_DIGIT(*s) && x >= 0 && x <= 9))
+ if (!(IS_DIGIT(*s) && x >= 0 && x < mouse_menu->width))
continue; /* error */
s = getWord(&p);
x2 = atoi(s);
- if (!(IS_DIGIT(*s) && x2 >= 0 && x2 <= 9))
+ if (!(IS_DIGIT(*s) && x2 >= 0 && x2 < mouse_menu->width))
continue; /* error */
s = getWord(&p);
f = getFuncList(s);
@@ -378,8 +386,8 @@ initMouseMenu(void)
if (!*s)
s = NULL;
for (; x <= x2; x++) {
- mouse_menu_map[b - 1][x].func = w3mFuncList[f].func;
- mouse_menu_map[b - 1][x].data = s;
+ mouse_menu->map[b - 1][x].func = w3mFuncList[f].func;
+ mouse_menu->map[b - 1][x].data = s;
}
}
fclose(mf);
diff --git a/main.c b/main.c
@@ -1017,6 +1017,8 @@ main(int argc, char **argv, char **envp)
CurrentKeyData = NULL;
/* get keypress event */
#ifdef USE_MOUSE
+ if (mouse_menu)
+ mouse_menu->in_action = FALSE;
if (use_mouse)
mouse_active();
#endif /* USE_MOUSE */
@@ -4804,6 +4806,8 @@ posTab(int x, int y)
{
TabBuffer *tab;
+ if (mouse_menu && x < mouse_menu->width && y == 0)
+ return NO_TABBUFFER;
for (tab = FirstTab; tab; tab = tab->nextTab) {
if (tab->x1 <= x && x <= tab->x2 && tab->y == y)
return tab;
@@ -4812,8 +4816,10 @@ posTab(int x, int y)
}
static void
-mouse_menu_action(int btn, int x)
+mouse_menu_action(int btn, int x, int y)
{
+ if (!mouse_menu)
+ return;
switch (btn) {
case MOUSE_BTN1_DOWN:
btn = 0;
@@ -4827,11 +4833,14 @@ mouse_menu_action(int btn, int x)
default:
return;
}
- if (x >= 0 && x <= 9 && mouse_menu_map[btn][x].func) {
+ if (x >= 0 && x < mouse_menu->width && mouse_menu->map[btn][x].func) {
+ mouse_menu->in_action = TRUE;
+ mouse_menu->cursorX = x;
+ mouse_menu->cursorY = y;
CurrentKey = -1;
CurrentKeyData = NULL;
- CurrentCmdData = mouse_menu_map[btn][x].data;
- (*mouse_menu_map[btn][x].func) ();
+ CurrentCmdData = mouse_menu->map[btn][x].data;
+ (*mouse_menu->map[btn][x].func) ();
CurrentCmdData = NULL;
}
}
@@ -4844,23 +4853,25 @@ process_mouse(int btn, int x, int y)
TabBuffer *t;
int ny = 0;
- if (nTab2 > 1)
+ if (nTab > 1 || mouse_menu)
ny = LastTab->y + 1;
if (btn == MOUSE_BTN_UP) {
switch (press_btn) {
case MOUSE_BTN1_DOWN:
if (ny && y < ny) {
if (press_y == y && press_x == x) {
+#if 0
if (y == 0 && x >= COLS - 2) {
deleteTab(CurrentTab);
displayBuffer(Currentbuf, B_FORCE_REDRAW);
return;
}
+#endif
t = posTab(x, y);
if (t == NULL)
return;
if (t == NO_TABBUFFER) {
- mouse_menu_action(press_btn, x);
+ mouse_menu_action(press_btn, x, y);
return;
}
CurrentTab = t;
@@ -4970,25 +4981,25 @@ process_mouse(int btn, int x, int y)
if (ny && y < ny) {
if (press_y == y && press_x == x) {
t = posTab(x, y);
+ if (t == NULL)
+ return;
if (t == NO_TABBUFFER) {
- mouse_menu_action(press_btn, x);
+ mouse_menu_action(press_btn, x, y);
return;
}
- if (t) {
- deleteTab(t);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- }
+ deleteTab(t);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
}
return;
}
backBf();
break;
case MOUSE_BTN3_DOWN:
- if (nTab2 > 1 && y < ny) {
+ if (ny && y < ny) {
if (press_y == y && press_x == x) {
t = posTab(x, y);
if (t == NO_TABBUFFER) {
- mouse_menu_action(press_btn, x);
+ mouse_menu_action(press_btn, x, y);
return;
}
}
@@ -5635,19 +5646,6 @@ newT(void)
displayBuffer(Currentbuf, B_REDRAW_IMAGE);
}
-int
-nTabLine(void)
-{
- int n = nTab2;
-
- if (COLS - 2 > TabCols * n)
- return n;
- n = (n - 1) / ((n * TabCols - 1) / (COLS - 2) + 1) + 1;
- if (n > (COLS - 2) / TabCols)
- n = (COLS - 2) / TabCols;
- return n ? n : 1;
-}
-
TabBuffer *
numTab(int n)
{
@@ -5668,9 +5666,17 @@ static void
calcTabPos(void)
{
TabBuffer *tab;
+#if 0
int lcol = 0, rcol = 2, col;
+#else
+ int lcol = 0, rcol = 0, col;
+#endif
int n1, n2, na, nx, ny, ix, iy;
+#ifdef USE_MOUSE
+ lcol = mouse_menu ? mouse_menu->width : 0;
+#endif
+
if (nTab <= 0)
return;
n1 = (COLS - rcol - lcol) / TabCols;
diff --git a/menu.c b/menu.c
@@ -1252,6 +1252,8 @@ mainMn(void)
Menu *menu = &MainMenu;
char *data;
int n;
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
data = searchKeyData();
if (data != NULL) {
@@ -1260,8 +1262,13 @@ mainMn(void)
return;
menu = w3mMenuList[n].menu;
}
- popupMenu(Currentbuf->cursorX + Currentbuf->rootX,
- Currentbuf->cursorY + Currentbuf->rootY, menu);
+#ifdef USE_MOUSE
+ if (mouse_menu && mouse_menu->in_action) {
+ x = mouse_menu->cursorX - FRAME_WIDTH - 1;
+ y = mouse_menu->cursorY;
+ }
+#endif
+ popupMenu(x, y, menu);
}
/* --- MainMenu (END) --- */
@@ -1271,8 +1278,16 @@ mainMn(void)
void
selMn(void)
{
- popupMenu(Currentbuf->cursorX + Currentbuf->rootX,
- Currentbuf->cursorY + Currentbuf->rootY, &SelectMenu);
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+
+#ifdef USE_MOUSE
+ if (mouse_menu && mouse_menu->in_action) {
+ x = mouse_menu->cursorX - FRAME_WIDTH - 1;
+ y = mouse_menu->cursorY;
+ }
+#endif
+ popupMenu(x, y, &SelectMenu);
}
static void
@@ -1408,8 +1423,16 @@ smDelBuf(char c)
void
tabMn(void)
{
- popupMenu(Currentbuf->cursorX + Currentbuf->rootX,
- Currentbuf->cursorY + Currentbuf->rootY, &SelTabMenu);
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+
+#ifdef USE_MOUSE
+ if (mouse_menu && mouse_menu->in_action) {
+ x = mouse_menu->cursorX - FRAME_WIDTH - 1;
+ y = mouse_menu->cursorY;
+ }
+#endif
+ popupMenu(x, y, &SelTabMenu);
}
static void
diff --git a/proto.h b/proto.h
@@ -225,7 +225,6 @@ extern char *inputAnswer(char *prompt);
extern int matchattr(char *p, char *attr, int len, Str *value);
extern void readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu);
extern char *checkHeader(Buffer *buf, char *field);
-extern int nTabLine(void);
extern TabBuffer *newTab(void);
extern TabBuffer *deleteTab(TabBuffer *tab);
extern void addDownloadList(pid_t pid, char *url, char *save, char *lock,