1558 lines
40 KiB
C
1558 lines
40 KiB
C
/* $Id: menu.c,v 1.8 2001/11/30 10:10:24 ukai Exp $ */
|
|
/*
|
|
* w3m menu.c
|
|
*/
|
|
#include <stdio.h>
|
|
|
|
#include "fm.h"
|
|
#include "menu.h"
|
|
#include "func.h"
|
|
#include "myctype.h"
|
|
#include "regex.h"
|
|
|
|
#ifdef USE_MOUSE
|
|
#ifdef USE_GPM
|
|
#include <gpm.h>
|
|
static int gpm_process_menu_mouse(Gpm_Event * event, void *data);
|
|
extern int gpm_process_mouse(Gpm_Event *, void *);
|
|
#endif /* USE_GPM */
|
|
#ifdef USE_SYSMOUSE
|
|
extern int (*sysm_handler) (int x, int y, int nbs, int obs);
|
|
static int sysm_process_menu_mouse(int, int, int, int);
|
|
extern int sysm_process_mouse(int, int, int, int);
|
|
#endif /* USE_SYSMOUSE */
|
|
#if defined(USE_GPM) || defined(USE_SYSMOUSE)
|
|
#define X_MOUSE_SELECTED (char)0xff
|
|
static int X_Mouse_Selection;
|
|
extern int do_getch();
|
|
#define getch() do_getch()
|
|
#endif /* defined(USE_GPM) || defined(USE_SYSMOUSE) */
|
|
#endif /* USE_MOUSE */
|
|
|
|
#ifdef USE_MENU
|
|
|
|
#ifdef KANJI_SYMBOLS
|
|
static char *FRAME[] = {
|
|
#ifdef MENU_THIN_FRAME
|
|
"見", "芋", "角",
|
|
"芍", " ", "芍",
|
|
"谷", "芋", "言",
|
|
#else /* not MENU_THIN_FRAME */
|
|
"車", "足", "辛",
|
|
"身", " ", "身",
|
|
"迂", "足", "辰",
|
|
#endif /* not MENU_THIN_FRAME */
|
|
"“", "“"
|
|
};
|
|
#define FRAME_WIDTH 2
|
|
|
|
#define G_start
|
|
/**/
|
|
#define G_end /**/
|
|
#else /* not KANJI_SYMBOLS */
|
|
static char *N_FRAME[] = {
|
|
"+", "-", "+",
|
|
"|", " ", "|",
|
|
"+", "-", "+",
|
|
":", ":"
|
|
};
|
|
#define FRAME_WIDTH 1
|
|
|
|
static char *G_FRAME[] = {
|
|
"l", "q", "k",
|
|
"x", " ", "x",
|
|
"m", "q", "j",
|
|
":", ":"
|
|
};
|
|
|
|
static char **FRAME = NULL;
|
|
static int graph_mode = FALSE;
|
|
|
|
#define G_start {if (graph_mode) graphstart();}
|
|
#define G_end {if (graph_mode) graphend();}
|
|
#endif /* not KANJI_SYMBOLS */
|
|
|
|
static int mEsc(char c);
|
|
static int mEscB(char c);
|
|
static int mEscD(char c);
|
|
static int mNull(char c);
|
|
static int mSelect(char c);
|
|
static int mDown(char c);
|
|
static int mUp(char c);
|
|
static int mLast(char c);
|
|
static int mTop(char c);
|
|
static int mNext(char c);
|
|
static int mPrev(char c);
|
|
static int mFore(char c);
|
|
static int mBack(char c);
|
|
static int mOk(char c);
|
|
static int mCancel(char c);
|
|
static int mClose(char c);
|
|
static int mSusp(char c);
|
|
static int mMouse(char c);
|
|
static int mSrchF(char c);
|
|
static int mSrchB(char c);
|
|
static int mSrchN(char c);
|
|
static int mSrchP(char c);
|
|
#ifdef __EMX__
|
|
static int mPc(char c);
|
|
#endif
|
|
|
|
/* *INDENT-OFF* */
|
|
static int (*MenuKeymap[128]) (char c) = {
|
|
/* C-@ C-a C-b C-c C-d C-e C-f C-g */
|
|
#ifdef __EMX__
|
|
mPc, mTop, mPrev, mClose, mNull, mLast, mNext, mNull,
|
|
#else
|
|
mNull, mTop, mPrev, mClose, mNull, mLast, mNext, mNull,
|
|
#endif
|
|
/* C-h C-i C-j C-k C-l C-m C-n C-o */
|
|
mCancel,mNull, mOk, mNull, mNull, mOk, mDown, mNull,
|
|
/* C-p C-q C-r C-s C-t C-u C-v C-w */
|
|
mUp, mNull, mNull, mNull, mNull, mNull, mNext, mNull,
|
|
/* C-x C-y C-z C-[ C-\ C-] C-^ C-_ */
|
|
mNull, mNull, mSusp, mEsc, mNull, mNull, mNull, mNull,
|
|
/* SPC ! " # $ % & ' */
|
|
mOk, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* ( ) * + , - . / */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mSrchF,
|
|
/* 0 1 2 3 4 5 6 7 */
|
|
mNull, mNull, mNull, mNull, mNull, mNull , mNull, mNull,
|
|
/* 8 9 : ; < = > ? */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mSrchB,
|
|
/* @ A B C D E F G */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* H I J K L M N O */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mSrchP, mNull,
|
|
/* P Q R S T U V W */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* X Y Z [ \ ] ^ _ */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* ` a b c d e f g */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* h i j k l m n o */
|
|
mCancel,mNull, mDown, mUp, mOk, mNull, mSrchN, mNull,
|
|
/* p q r s t u v w */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* x y z { | } ~ DEL */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mCancel,
|
|
};
|
|
static int (*MenuEscKeymap[128]) (char c) = {
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* O */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mEscB,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* [ */
|
|
mNull, mNull, mNull, mEscB, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* v */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mPrev, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
};
|
|
static int (*MenuEscBKeymap[128]) (char c) = {
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* A B C D E */
|
|
mNull, mUp, mDown, mOk, mCancel,mClose, mNull, mNull,
|
|
/* L M */
|
|
mNull, mNull, mNull, mNull, mClose, mMouse, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
};
|
|
static int (*MenuEscDKeymap[128]) (char c) = {
|
|
/* 0 1 INS 3 4 PgUp, PgDn 7 */
|
|
mNull, mNull, mClose, mNull, mNull, mBack, mFore, mNull,
|
|
/* 8 9 10 F1 F2 F3 F4 F5 */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* 16 F6 F7 F8 F9 F10 22 23 */
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
/* 24 25 26 27 HELP 29 30 31 */
|
|
mNull, mNull, mNull, mNull, mClose, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
};
|
|
|
|
#ifdef __EMX__
|
|
static int (*MenuPcKeymap[256])(char c)={
|
|
// Null
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// S-Tab
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-q A-w A-E A-r A-t A-y A-u A-i
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-o A-p A-[ A-] A-a A-s
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-d A-f A-g A-h A-j A-k A-l A-;
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-' A-' A-\ A-x A-c A-v
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mPrev,
|
|
// A-b A-n A-m A-, A-. A-/ A-+
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// F1 F2 F3 F4 F5
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// F6 F7 F8 F9 F10 Home
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mTop,
|
|
// Up PgUp A-/ Left 5 Right C-* End
|
|
mUp, mUp, mNull, mCancel,mNull, mOk, mNull, mLast,
|
|
// Down PgDn Ins Del S-F1 S-F2 S-F3 S-F4
|
|
mDown, mDown, mClose, mCancel,mNull, mNull, mNull, mNull,
|
|
// S-F5 S-F6 S-F7 S-F8 S-F9 S-F10 C-F1 C-F2
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// C-F3 C-F4 C-F5 C-F6 C-F7 C-F8 C-F9 C-F10
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-F1 A-F2 A-F3 A-F4 A-F5 A-F6 A-F7 A-F8
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-F9 A-F10 PrtSc C-Left C-Right C-End C-PgDn C-Home
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-1 A-2 A-3 A-4 A-5 A-6 A-7/8 A-9
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A-0 A - A-= C-PgUp F11 F12 S-F11
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// S-F12 C-F11 C-F12 A-F11 A-F12 C-Up C-/ C-5
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// S-* C-Down C-Ins C-Del C-Tab C - C-+
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
|
|
// A - A-Tab A-Enter
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 160
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 168
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 176
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 184
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 192
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 200
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 208
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 216
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 224
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 232
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull, // 240
|
|
mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull // 248
|
|
};
|
|
#endif
|
|
/* *INDENT-ON* */
|
|
/* --- SelectMenu --- */
|
|
|
|
static Menu SelectMenu;
|
|
static int SelectV = 0;
|
|
static void initSelectMenu(void);
|
|
static void smChBuf(void);
|
|
static int smDelBuf(char c);
|
|
|
|
/* --- SelectMenu (END) --- */
|
|
|
|
/* --- MainMenu --- */
|
|
|
|
static Menu MainMenu;
|
|
#if LANG == JA
|
|
static MenuItem MainMenuItem[] = {
|
|
/* type label variabel value func popup keys data */
|
|
{MENU_FUNC, "枑月 (b)", NULL, 0, backBf, NULL, "b", NULL},
|
|
{MENU_POPUP, "田永白央薊鎗 (s)", NULL, 0, NULL, &SelectMenu, "s", NULL},
|
|
{MENU_FUNC, "末□旦毛刓憎 (v)", NULL, 0, vwSrc, NULL, "vV", NULL},
|
|
{MENU_FUNC, "末□旦毛彸螂 (e)", NULL, 0, editBf, NULL, "eE", NULL},
|
|
{MENU_FUNC, "末□旦毛忡繡 (S)", NULL, 0, svSrc, NULL, "S", NULL},
|
|
{MENU_FUNC, "瘋厶心慇心 (r)", NULL, 0, reload, NULL, "rR", NULL},
|
|
{MENU_NOP, "芋芋芋芋芋芋芋芋", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, "伉件弁毛刓憎 (a)", NULL, 0, followA, NULL, "a", NULL},
|
|
{MENU_FUNC, "伉件弁毛忡繡 (A)", NULL, 0, svA, NULL, "A", NULL},
|
|
{MENU_FUNC, "脰颶毛刓憎 (i)", NULL, 0, followI, NULL, "i", NULL},
|
|
{MENU_FUNC, "脰颶毛忡繡 (I)", NULL, 0, svI, NULL, "I", NULL},
|
|
{MENU_FUNC, "白伊□丞刓憎 (f)", NULL, 0, rFrame, NULL, "fF", NULL},
|
|
{MENU_NOP, "芋芋芋芋芋芋芋芋", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, "皮永弁穴□弁 (B)", NULL, 0, ldBmark, NULL, "B", NULL},
|
|
{MENU_FUNC, "目伙皿 (h)", NULL, 0, ldhelp, NULL, "hH", NULL},
|
|
{MENU_FUNC, "左皿扑亦件 (o)", NULL, 0, ldOpt, NULL, "oO", NULL},
|
|
{MENU_NOP, "芋芋芋芋芋芋芋芋", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, "蔽弇 (q)", NULL, 0, qquitfm, NULL, "qQ", NULL},
|
|
{MENU_END, "", NULL, 0, nulcmd, NULL, "", NULL},
|
|
};
|
|
#else /* LANG != JA */
|
|
static MenuItem MainMenuItem[] = {
|
|
/* type label variable value func popup keys data */
|
|
{MENU_FUNC, " Back (b) ", NULL, 0, backBf, NULL, "b", NULL},
|
|
{MENU_POPUP, " Select Buffer(s) ", NULL, 0, NULL, &SelectMenu, "s", NULL},
|
|
{MENU_FUNC, " View Source (v) ", NULL, 0, vwSrc, NULL, "vV", NULL},
|
|
{MENU_FUNC, " Edit Source (e) ", NULL, 0, editBf, NULL, "eE", NULL},
|
|
{MENU_FUNC, " Save Source (S) ", NULL, 0, svSrc, NULL, "S", NULL},
|
|
{MENU_FUNC, " Reload (r) ", NULL, 0, reload, NULL, "rR", NULL},
|
|
{MENU_NOP, " ---------------- ", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, " Go Link (a) ", NULL, 0, followA, NULL, "a", NULL},
|
|
{MENU_FUNC, " Save Link (A) ", NULL, 0, svA, NULL, "A", NULL},
|
|
{MENU_FUNC, " View Image (i) ", NULL, 0, followI, NULL, "i", NULL},
|
|
{MENU_FUNC, " Save Image (I) ", NULL, 0, svI, NULL, "I", NULL},
|
|
{MENU_FUNC, " View Frame (f) ", NULL, 0, rFrame, NULL, "fF", NULL},
|
|
{MENU_NOP, " ---------------- ", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, " Bookmark (B) ", NULL, 0, ldBmark, NULL, "B", NULL},
|
|
{MENU_FUNC, " Help (h) ", NULL, 0, ldhelp, NULL, "hH", NULL},
|
|
{MENU_FUNC, " Option (o) ", NULL, 0, ldOpt, NULL, "oO", NULL},
|
|
{MENU_NOP, " ---------------- ", NULL, 0, nulcmd, NULL, "", NULL},
|
|
{MENU_FUNC, " Quit (q) ", NULL, 0, qquitfm, NULL, "qQ", NULL},
|
|
{MENU_END, "", NULL, 0, nulcmd, NULL, "", NULL},
|
|
};
|
|
#endif /* LANG != JA */
|
|
|
|
/* --- MainMenu (END) --- */
|
|
|
|
extern int w3mNFuncList;
|
|
extern FuncList w3mFuncList[];
|
|
static MenuList *w3mMenuList;
|
|
|
|
static Menu *CurrentMenu = NULL;
|
|
|
|
#define mvaddch(y, x, c) (move(y, x), addch(c))
|
|
#define mvaddstr(y, x, str) (move(y, x), addstr(str))
|
|
#define mvaddnstr(y, x, str, n) (move(y, x), addnstr_sup(str, n))
|
|
|
|
void
|
|
new_menu(Menu *menu, MenuItem *item)
|
|
{
|
|
int i, l;
|
|
char *p;
|
|
|
|
menu->cursorX = 0;
|
|
menu->cursorY = 0;
|
|
menu->x = 0;
|
|
menu->y = 0;
|
|
menu->nitem = 0;
|
|
menu->item = item;
|
|
menu->initial = 0;
|
|
menu->select = 0;
|
|
menu->offset = 0;
|
|
menu->active = 0;
|
|
|
|
if (item == NULL)
|
|
return;
|
|
|
|
for (i = 0; item[i].type != MENU_END; i++) ;
|
|
menu->nitem = i;
|
|
menu->height = menu->nitem;
|
|
for (i = 0; i < 128; i++)
|
|
menu->keymap[i] = MenuKeymap[i];
|
|
menu->width = 0;
|
|
for (i = 0; i < menu->nitem; i++) {
|
|
if ((p = item[i].keys) != NULL) {
|
|
while (*p) {
|
|
if (IS_ASCII(*p)) {
|
|
menu->keymap[(int)*p] = mSelect;
|
|
menu->keyselect[(int)*p] = i;
|
|
}
|
|
p++;
|
|
}
|
|
}
|
|
l = strlen(item[i].label);
|
|
if (l > menu->width)
|
|
menu->width = l;
|
|
}
|
|
}
|
|
|
|
void
|
|
geom_menu(Menu *menu, int x, int y, int mselect)
|
|
{
|
|
int win_x, win_y, win_w, win_h;
|
|
|
|
menu->select = mselect;
|
|
|
|
if (menu->width % FRAME_WIDTH)
|
|
menu->width = (menu->width / FRAME_WIDTH + 1) * FRAME_WIDTH;
|
|
win_x = menu->x - FRAME_WIDTH;
|
|
win_w = menu->width + 2 * FRAME_WIDTH;
|
|
if (win_x + win_w > COLS)
|
|
win_x = COLS - win_w;
|
|
if (win_x < 0) {
|
|
win_x = 0;
|
|
if (win_w > COLS) {
|
|
menu->width = COLS - 2 * FRAME_WIDTH;
|
|
menu->width -= menu->width % FRAME_WIDTH;
|
|
win_w = menu->width + 2 * FRAME_WIDTH;
|
|
}
|
|
}
|
|
menu->x = win_x + FRAME_WIDTH;
|
|
|
|
win_y = menu->y - mselect - 1;
|
|
win_h = menu->height + 2;
|
|
if (win_y + win_h > LASTLINE)
|
|
win_y = LASTLINE - win_h;
|
|
if (win_y < 0) {
|
|
win_y = 0;
|
|
if (win_y + win_h > LASTLINE) {
|
|
win_h = LASTLINE - win_y;
|
|
menu->height = win_h - 2;
|
|
if (menu->height <= mselect)
|
|
menu->offset = mselect - menu->height + 1;
|
|
}
|
|
}
|
|
menu->y = win_y + 1;
|
|
}
|
|
|
|
void
|
|
draw_all_menu(Menu *menu)
|
|
{
|
|
if (menu->parent != NULL)
|
|
draw_all_menu(menu->parent);
|
|
draw_menu(menu);
|
|
}
|
|
|
|
void
|
|
draw_menu(Menu *menu)
|
|
{
|
|
int x, y, w;
|
|
int i, j;
|
|
|
|
x = menu->x - FRAME_WIDTH;
|
|
w = menu->width + 2 * FRAME_WIDTH;
|
|
y = menu->y - 1;
|
|
|
|
#ifndef KANJI_SYMBOLS
|
|
if (FRAME == NULL) {
|
|
if (graph_ok()) {
|
|
graph_mode = TRUE;
|
|
FRAME = G_FRAME;
|
|
}
|
|
else {
|
|
FRAME = N_FRAME;
|
|
}
|
|
}
|
|
#endif /* not KANJI_SYMBOLS */
|
|
|
|
if (menu->offset == 0) {
|
|
G_start;
|
|
mvaddstr(y, x, FRAME[0]);
|
|
for (i = FRAME_WIDTH; i < w - FRAME_WIDTH; i += FRAME_WIDTH)
|
|
mvaddstr(y, x + i, FRAME[1]);
|
|
mvaddstr(y, x + i, FRAME[2]);
|
|
G_end;
|
|
}
|
|
else {
|
|
G_start;
|
|
mvaddstr(y, x, FRAME[3]);
|
|
G_end;
|
|
for (i = FRAME_WIDTH; i < w - FRAME_WIDTH; i += FRAME_WIDTH)
|
|
mvaddstr(y, x + i, FRAME[4]);
|
|
G_start;
|
|
mvaddstr(y, x + i, FRAME[5]);
|
|
G_end;
|
|
i = (w / 2 - 1) / FRAME_WIDTH * FRAME_WIDTH;
|
|
mvaddstr(y, x + i, FRAME[9]);
|
|
}
|
|
|
|
for (j = 0; j < menu->height; j++) {
|
|
y++;
|
|
G_start;
|
|
mvaddstr(y, x, FRAME[3]);
|
|
G_end;
|
|
draw_menu_item(menu, menu->offset + j);
|
|
G_start;
|
|
mvaddstr(y, x + w - FRAME_WIDTH, FRAME[5]);
|
|
G_end;
|
|
}
|
|
y++;
|
|
if (menu->offset + menu->height == menu->nitem) {
|
|
G_start;
|
|
mvaddstr(y, x, FRAME[6]);
|
|
for (i = FRAME_WIDTH; i < w - FRAME_WIDTH; i += FRAME_WIDTH)
|
|
mvaddstr(y, x + i, FRAME[7]);
|
|
mvaddstr(y, x + i, FRAME[8]);
|
|
G_end;
|
|
}
|
|
else {
|
|
G_start;
|
|
mvaddstr(y, x, FRAME[3]);
|
|
G_end;
|
|
for (i = FRAME_WIDTH; i < w - FRAME_WIDTH; i += FRAME_WIDTH)
|
|
mvaddstr(y, x + i, FRAME[4]);
|
|
G_start;
|
|
mvaddstr(y, x + i, FRAME[5]);
|
|
G_end;
|
|
i = (w / 2 - 1) / FRAME_WIDTH * FRAME_WIDTH;
|
|
mvaddstr(y, x + i, FRAME[10]);
|
|
}
|
|
}
|
|
|
|
void
|
|
draw_menu_item(Menu *menu, int mselect)
|
|
{
|
|
mvaddnstr(menu->y + mselect - menu->offset, menu->x,
|
|
menu->item[mselect].label, menu->width);
|
|
}
|
|
|
|
int
|
|
select_menu(Menu *menu, int mselect)
|
|
{
|
|
if (mselect < 0 || mselect >= menu->nitem)
|
|
return (MENU_NOTHING);
|
|
if (mselect < menu->offset)
|
|
up_menu(menu, menu->offset - mselect);
|
|
else if (mselect >= menu->offset + menu->height)
|
|
down_menu(menu, mselect - menu->offset - menu->height + 1);
|
|
|
|
if (menu->select >= menu->offset &&
|
|
menu->select < menu->offset + menu->height)
|
|
draw_menu_item(menu, menu->select);
|
|
menu->select = mselect;
|
|
standout();
|
|
draw_menu_item(menu, menu->select);
|
|
standend();
|
|
/*
|
|
* move(menu->cursorY, menu->cursorX); */
|
|
move(menu->y + mselect - menu->offset, menu->x);
|
|
toggle_stand();
|
|
refresh();
|
|
|
|
return (menu->select);
|
|
}
|
|
|
|
void
|
|
goto_menu(Menu *menu, int mselect, int down)
|
|
{
|
|
int select_in;
|
|
if (mselect >= menu->nitem)
|
|
mselect = menu->nitem - 1;
|
|
else if (mselect < 0)
|
|
mselect = 0;
|
|
select_in = mselect;
|
|
while (menu->item[mselect].type == MENU_NOP) {
|
|
if (down > 0) {
|
|
if (++mselect >= menu->nitem) {
|
|
down_menu(menu, select_in - menu->select);
|
|
mselect = menu->select;
|
|
break;
|
|
}
|
|
}
|
|
else if (down < 0) {
|
|
if (--mselect < 0) {
|
|
up_menu(menu, menu->select - select_in);
|
|
mselect = menu->select;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
select_menu(menu, mselect);
|
|
}
|
|
|
|
void
|
|
up_menu(Menu *menu, int n)
|
|
{
|
|
if (n < 0 || menu->offset == 0)
|
|
return;
|
|
menu->offset -= n;
|
|
if (menu->offset < 0)
|
|
menu->offset = 0;
|
|
|
|
draw_menu(menu);
|
|
}
|
|
|
|
void
|
|
down_menu(Menu *menu, int n)
|
|
{
|
|
if (n < 0 || menu->offset + menu->height == menu->nitem)
|
|
return;
|
|
menu->offset += n;
|
|
if (menu->offset + menu->height > menu->nitem)
|
|
menu->offset = menu->nitem - menu->height;
|
|
|
|
draw_menu(menu);
|
|
}
|
|
|
|
int
|
|
action_menu(Menu *menu)
|
|
{
|
|
char c;
|
|
int mselect;
|
|
MenuItem item;
|
|
|
|
if (menu->active == 0) {
|
|
if (menu->parent != NULL)
|
|
menu->parent->active = 0;
|
|
return (0);
|
|
}
|
|
draw_all_menu(menu);
|
|
select_menu(menu, menu->select);
|
|
|
|
while (1) {
|
|
#ifdef USE_MOUSE
|
|
if (use_mouse)
|
|
mouse_active();
|
|
#endif /* USE_MOUSE */
|
|
c = getch();
|
|
#ifdef USE_MOUSE
|
|
if (use_mouse)
|
|
mouse_inactive();
|
|
#if defined(USE_GPM) || defined(USE_SYSMOUSE)
|
|
if (c == X_MOUSE_SELECTED) {
|
|
mselect = X_Mouse_Selection;
|
|
if (mselect != MENU_NOTHING)
|
|
break;
|
|
}
|
|
#endif /* defined(USE_GPM) || defined(USE_SYSMOUSE) */
|
|
#endif /* USE_MOUSE */
|
|
if (IS_ASCII(c)) { /* Ascii */
|
|
mselect = (*menu->keymap[(int)c]) (c);
|
|
if (mselect != MENU_NOTHING)
|
|
break;
|
|
}
|
|
}
|
|
if (mselect >= 0 && mselect < menu->nitem) {
|
|
item = menu->item[mselect];
|
|
if (item.type & MENU_POPUP) {
|
|
popup_menu(menu, item.popup);
|
|
return (1);
|
|
}
|
|
if (menu->parent != NULL)
|
|
menu->parent->active = 0;
|
|
if (item.type & MENU_VALUE)
|
|
*item.variable = item.value;
|
|
if (item.type & MENU_FUNC) {
|
|
CurrentKey = -1;
|
|
CurrentKeyData = NULL;
|
|
CurrentMenuData = item.data;
|
|
(*item.func) ();
|
|
CurrentMenuData = NULL;
|
|
}
|
|
}
|
|
else if (mselect == MENU_CLOSE) {
|
|
if (menu->parent != NULL)
|
|
menu->parent->active = 0;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
void
|
|
popup_menu(Menu *parent, Menu *menu)
|
|
{
|
|
int active = 1;
|
|
|
|
if (menu->item == NULL || menu->nitem == 0)
|
|
return;
|
|
if (menu->active)
|
|
return;
|
|
|
|
#ifdef USE_MOUSE
|
|
#ifdef USE_GPM
|
|
gpm_handler = gpm_process_menu_mouse;
|
|
#endif /* USE_GPM */
|
|
#ifdef USE_SYSMOUSE
|
|
sysm_handler = sysm_process_menu_mouse;
|
|
#endif /* USE_SYSMOUSE */
|
|
#endif /* USE_MOUSE */
|
|
menu->parent = parent;
|
|
menu->select = menu->initial;
|
|
menu->offset = 0;
|
|
menu->active = 1;
|
|
if (parent != NULL) {
|
|
menu->cursorX = parent->cursorX;
|
|
menu->cursorY = parent->cursorY;
|
|
guess_menu_xy(parent, menu->width, &menu->x, &menu->y);
|
|
}
|
|
geom_menu(menu, menu->x, menu->y, menu->select);
|
|
|
|
CurrentMenu = menu;
|
|
while (active) {
|
|
active = action_menu(CurrentMenu);
|
|
displayBuffer(Currentbuf, B_FORCE_REDRAW);
|
|
}
|
|
menu->active = 0;
|
|
CurrentMenu = parent;
|
|
#ifdef USE_MOUSE
|
|
#ifdef USE_GPM
|
|
if (CurrentMenu == NULL)
|
|
gpm_handler = gpm_process_mouse;
|
|
#endif /* USE_GPM */
|
|
#ifdef USE_SYSMOUSE
|
|
if (CurrentMenu == NULL)
|
|
sysm_handler = sysm_process_mouse;
|
|
#endif /* USE_SYSMOUSE */
|
|
#endif /* USE_MOUSE */
|
|
}
|
|
|
|
void
|
|
guess_menu_xy(Menu *parent, int width, int *x, int *y)
|
|
{
|
|
*x = parent->x + parent->width + FRAME_WIDTH - 1;
|
|
if (*x + width + FRAME_WIDTH > COLS) {
|
|
*x = COLS - width - FRAME_WIDTH;
|
|
if ((parent->x + parent->width / 2 > *x) &&
|
|
(parent->x + parent->width / 2 > COLS / 2))
|
|
*x = parent->x - width - FRAME_WIDTH + 1;
|
|
}
|
|
*y = parent->y + parent->select - parent->offset;
|
|
}
|
|
|
|
void
|
|
new_option_menu(Menu *menu, char **label, int *variable, void (*func) ())
|
|
{
|
|
int i, nitem;
|
|
char **p;
|
|
MenuItem *item;
|
|
|
|
if (label == NULL || *label == NULL)
|
|
return;
|
|
|
|
for (i = 0, p = label; *p != NULL; i++, p++) ;
|
|
nitem = i;
|
|
|
|
item = New_N(MenuItem, nitem + 1);
|
|
|
|
for (i = 0, p = label; i < nitem; i++, p++) {
|
|
if (func != NULL)
|
|
item[i].type = MENU_VALUE | MENU_FUNC;
|
|
else
|
|
item[i].type = MENU_VALUE;
|
|
item[i].label = *p;
|
|
item[i].variable = variable;
|
|
item[i].value = i;
|
|
item[i].func = func;
|
|
item[i].popup = NULL;
|
|
item[i].keys = "";
|
|
}
|
|
item[nitem].type = MENU_END;
|
|
|
|
new_menu(menu, item);
|
|
}
|
|
|
|
/* --- MenuFunctions --- */
|
|
|
|
#ifdef __EMX__
|
|
static int
|
|
mPc(char c)
|
|
{
|
|
c = getch();
|
|
return (MenuPcKeymap[(int)c] (c));
|
|
}
|
|
#endif
|
|
|
|
static int
|
|
mEsc(char c)
|
|
{
|
|
c = getch();
|
|
return (MenuEscKeymap[(int)c] (c));
|
|
}
|
|
|
|
static int
|
|
mEscB(char c)
|
|
{
|
|
c = getch();
|
|
if (IS_DIGIT(c))
|
|
return (mEscD(c));
|
|
else
|
|
return (MenuEscBKeymap[(int)c] (c));
|
|
}
|
|
|
|
static int
|
|
mEscD(char c)
|
|
{
|
|
int d;
|
|
|
|
d = (int)c - (int)'0';
|
|
c = getch();
|
|
if (IS_DIGIT(c)) {
|
|
d = d * 10 + (int)c - (int)'0';
|
|
c = getch();
|
|
}
|
|
if (c == '~')
|
|
return (MenuEscDKeymap[d] (c));
|
|
else
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mNull(char c)
|
|
{
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mSelect(char c)
|
|
{
|
|
if (IS_ASCII(c))
|
|
return (select_menu(CurrentMenu, CurrentMenu->keyselect[(int)c]));
|
|
else
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mDown(char c)
|
|
{
|
|
if (CurrentMenu->select >= CurrentMenu->nitem - 1)
|
|
return (MENU_NOTHING);
|
|
goto_menu(CurrentMenu, CurrentMenu->select + 1, 1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mUp(char c)
|
|
{
|
|
if (CurrentMenu->select <= 0)
|
|
return (MENU_NOTHING);
|
|
goto_menu(CurrentMenu, CurrentMenu->select - 1, -1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mLast(char c)
|
|
{
|
|
goto_menu(CurrentMenu, CurrentMenu->nitem - 1, -1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mTop(char c)
|
|
{
|
|
goto_menu(CurrentMenu, 0, 1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mNext(char c)
|
|
{
|
|
int mselect = CurrentMenu->select + CurrentMenu->height;
|
|
|
|
if (mselect >= CurrentMenu->nitem)
|
|
return mLast(c);
|
|
down_menu(CurrentMenu, CurrentMenu->height);
|
|
goto_menu(CurrentMenu, mselect, -1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mPrev(char c)
|
|
{
|
|
int mselect = CurrentMenu->select - CurrentMenu->height;
|
|
|
|
if (mselect < 0)
|
|
return mTop(c);
|
|
up_menu(CurrentMenu, CurrentMenu->height);
|
|
goto_menu(CurrentMenu, mselect, 1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mFore(char c)
|
|
{
|
|
if (CurrentMenu->select >= CurrentMenu->nitem - 1)
|
|
return (MENU_NOTHING);
|
|
goto_menu(CurrentMenu, (CurrentMenu->select + CurrentMenu->height - 1),
|
|
(CurrentMenu->height + 1));
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mBack(char c)
|
|
{
|
|
if (CurrentMenu->select <= 0)
|
|
return (MENU_NOTHING);
|
|
goto_menu(CurrentMenu, (CurrentMenu->select - CurrentMenu->height + 1),
|
|
(-1 - CurrentMenu->height));
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mOk(char c)
|
|
{
|
|
int mselect = CurrentMenu->select;
|
|
|
|
if (CurrentMenu->item[mselect].type == MENU_NOP)
|
|
return (MENU_NOTHING);
|
|
return (mselect);
|
|
}
|
|
|
|
static int
|
|
mCancel(char c)
|
|
{
|
|
return (MENU_CANCEL);
|
|
}
|
|
|
|
static int
|
|
mClose(char c)
|
|
{
|
|
return (MENU_CLOSE);
|
|
}
|
|
|
|
static int
|
|
mSusp(char c)
|
|
{
|
|
susp();
|
|
draw_all_menu(CurrentMenu);
|
|
select_menu(CurrentMenu, CurrentMenu->select);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static char *SearchString = NULL;
|
|
|
|
int (*menuSearchRoutine) (Menu *, char *, int);
|
|
|
|
static int
|
|
menuForwardSearch(Menu *menu, char *str, int from)
|
|
{
|
|
int i;
|
|
char *p;
|
|
if ((p = regexCompile(str, IgnoreCase)) != NULL) {
|
|
message(p, 0, 0);
|
|
return -1;
|
|
}
|
|
if (from < 0)
|
|
from = 0;
|
|
for (i = from; i < menu->nitem; i++)
|
|
if (menu->item[i].type != MENU_NOP &&
|
|
regexMatch(menu->item[i].label, 0, 1) == 1)
|
|
return i;
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
menu_search_forward(Menu *menu, int from)
|
|
{
|
|
char *str;
|
|
int found;
|
|
str = inputStrHist("Forward: ", NULL, TextHist);
|
|
if (str != NULL && *str == '\0')
|
|
str = SearchString;
|
|
if (str == NULL || *str == '\0')
|
|
return -1;
|
|
SearchString = str;
|
|
menuSearchRoutine = menuForwardSearch;
|
|
found = menuForwardSearch(menu, SearchString, from + 1);
|
|
if (WrapSearch && found == -1)
|
|
found = menuForwardSearch(menu, SearchString, 0);
|
|
if (found >= 0)
|
|
return found;
|
|
disp_message("Not found", TRUE);
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
mSrchF(char c)
|
|
{
|
|
int mselect;
|
|
mselect = menu_search_forward(CurrentMenu, CurrentMenu->select);
|
|
if (mselect >= 0)
|
|
goto_menu(CurrentMenu, mselect, 1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
menuBackwardSearch(Menu *menu, char *str, int from)
|
|
{
|
|
int i;
|
|
char *p;
|
|
if ((p = regexCompile(str, IgnoreCase)) != NULL) {
|
|
message(p, 0, 0);
|
|
return -1;
|
|
}
|
|
if (from >= menu->nitem)
|
|
from = menu->nitem - 1;
|
|
for (i = from; i >= 0; i--)
|
|
if (menu->item[i].type != MENU_NOP &&
|
|
regexMatch(menu->item[i].label, 0, 1) == 1)
|
|
return i;
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
menu_search_backward(Menu *menu, int from)
|
|
{
|
|
char *str;
|
|
int found;
|
|
str = inputStrHist("Backward: ", NULL, TextHist);
|
|
if (str != NULL && *str == '\0')
|
|
str = SearchString;
|
|
if (str == NULL || *str == '\0')
|
|
return (MENU_NOTHING);
|
|
SearchString = str;
|
|
menuSearchRoutine = menuBackwardSearch;
|
|
found = menuBackwardSearch(menu, SearchString, from - 1);
|
|
if (WrapSearch && found == -1)
|
|
found = menuBackwardSearch(menu, SearchString, menu->nitem);
|
|
if (found >= 0)
|
|
return found;
|
|
disp_message("Not found", TRUE);
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
mSrchB(char c)
|
|
{
|
|
int mselect;
|
|
mselect = menu_search_backward(CurrentMenu, CurrentMenu->select);
|
|
if (mselect >= 0)
|
|
goto_menu(CurrentMenu, mselect, -1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
menu_search_next_previous(Menu *menu, int from, int reverse)
|
|
{
|
|
int found;
|
|
static int (*routine[2]) (Menu *, char *, int) = {
|
|
menuForwardSearch, menuBackwardSearch};
|
|
|
|
if (menuSearchRoutine == NULL) {
|
|
disp_message("No previous regular expression", TRUE);
|
|
return -1;
|
|
}
|
|
if (reverse != 0)
|
|
reverse = 1;
|
|
if (menuSearchRoutine == menuBackwardSearch)
|
|
reverse ^= 1;
|
|
from += reverse ? -1 : 1;
|
|
found = (*routine[reverse]) (menu, SearchString, from);
|
|
if (WrapSearch && found == -1)
|
|
found =
|
|
(*routine[reverse]) (menu, SearchString, reverse * menu->nitem);
|
|
if (found >= 0)
|
|
return found;
|
|
disp_message("Not found", TRUE);
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
mSrchN(char c)
|
|
{
|
|
int mselect;
|
|
mselect = menu_search_next_previous(CurrentMenu, CurrentMenu->select, 0);
|
|
if (mselect >= 0)
|
|
goto_menu(CurrentMenu, mselect, 1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mSrchP(char c)
|
|
{
|
|
int mselect;
|
|
mselect = menu_search_next_previous(CurrentMenu, CurrentMenu->select, 1);
|
|
if (mselect >= 0)
|
|
goto_menu(CurrentMenu, mselect, -1);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
#ifdef USE_MOUSE
|
|
#define MOUSE_BTN1_DOWN 0
|
|
#define MOUSE_BTN2_DOWN 1
|
|
#define MOUSE_BTN3_DOWN 2
|
|
#define MOUSE_BTN4_DOWN_RXVT 3
|
|
#define MOUSE_BTN5_DOWN_RXVT 4
|
|
#define MOUSE_BTN4_DOWN_XTERM 64
|
|
#define MOUSE_BTN5_DOWN_XTERM 65
|
|
#define MOUSE_BTN_UP 3
|
|
#define MOUSE_BTN_RESET -1
|
|
#define MOUSE_SCROLL_LINE 5
|
|
|
|
static int
|
|
process_mMouse(int btn, int x, int y)
|
|
{
|
|
Menu *menu;
|
|
int mselect;
|
|
static int press_btn = MOUSE_BTN_RESET, press_x, press_y;
|
|
char c = ' ';
|
|
|
|
menu = CurrentMenu;
|
|
|
|
if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
|
|
return (MENU_NOTHING);
|
|
|
|
if (btn == MOUSE_BTN_UP) {
|
|
if (press_btn == MOUSE_BTN1_DOWN || press_btn == MOUSE_BTN3_DOWN) {
|
|
if (x < menu->x - FRAME_WIDTH ||
|
|
x >= menu->x + menu->width + FRAME_WIDTH ||
|
|
y < menu->y - 1 || y >= menu->y + menu->height + 1) {
|
|
return (MENU_CANCEL);
|
|
}
|
|
else if ((x >= menu->x - FRAME_WIDTH &&
|
|
x < menu->x) ||
|
|
(x >= menu->x + menu->width &&
|
|
x < menu->x + menu->width + FRAME_WIDTH)) {
|
|
return (MENU_NOTHING);
|
|
}
|
|
else if (y == menu->y - 1) {
|
|
mPrev(c);
|
|
return (MENU_NOTHING);
|
|
}
|
|
else if (y == menu->y + menu->height) {
|
|
mNext(c);
|
|
return (MENU_NOTHING);
|
|
}
|
|
else {
|
|
mselect = y - menu->y + menu->offset;
|
|
if (menu->item[mselect].type == MENU_NOP)
|
|
return (MENU_NOTHING);
|
|
return (select_menu(menu, mselect));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
press_btn = btn;
|
|
press_x = x;
|
|
press_y = y;
|
|
}
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
static int
|
|
mMouse(char c)
|
|
{
|
|
int btn, x, y;
|
|
|
|
btn = (unsigned char)getch() - 32;
|
|
x = (unsigned char)getch() - 33;
|
|
if (x < 0)
|
|
x += 0x100;
|
|
y = (unsigned char)getch() - 33;
|
|
if (y < 0)
|
|
y += 0x100;
|
|
|
|
/*
|
|
* if (x < 0 || x >= COLS || y < 0 || y > LASTLINE) return; */
|
|
return process_mMouse(btn, x, y);
|
|
}
|
|
|
|
#ifdef USE_GPM
|
|
static int
|
|
gpm_process_menu_mouse(Gpm_Event * event, void *data)
|
|
{
|
|
int btn = MOUSE_BTN_RESET, x, y;
|
|
if (event->type & GPM_UP)
|
|
btn = MOUSE_BTN_UP;
|
|
else if (event->type & GPM_DOWN) {
|
|
switch (event->buttons) {
|
|
case GPM_B_LEFT:
|
|
btn = MOUSE_BTN1_DOWN;
|
|
break;
|
|
case GPM_B_MIDDLE:
|
|
btn = MOUSE_BTN2_DOWN;
|
|
break;
|
|
case GPM_B_RIGHT:
|
|
btn = MOUSE_BTN3_DOWN;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
GPM_DRAWPOINTER(event);
|
|
return 0;
|
|
}
|
|
x = event->x;
|
|
y = event->y;
|
|
X_Mouse_Selection = process_mMouse(btn, x - 1, y - 1);
|
|
return X_MOUSE_SELECTED;
|
|
}
|
|
#endif /* USE_GPM */
|
|
|
|
#ifdef USE_SYSMOUSE
|
|
static int
|
|
sysm_process_menu_mouse(int x, int y, int nbs, int obs)
|
|
{
|
|
int btn;
|
|
int bits;
|
|
|
|
if (obs & ~nbs)
|
|
btn = MOUSE_BTN_UP;
|
|
else if (nbs & ~obs) {
|
|
bits = nbs & ~obs;
|
|
btn = bits & 0x1 ? MOUSE_BTN1_DOWN :
|
|
(bits & 0x2 ? MOUSE_BTN2_DOWN :
|
|
(bits & 0x4 ? MOUSE_BTN3_DOWN : 0));
|
|
}
|
|
else /* nbs == obs */
|
|
return 0;
|
|
X_Mouse_Selection = process_mMouse(btn, x, y);
|
|
return X_MOUSE_SELECTED;
|
|
}
|
|
#endif /* USE_SYSMOUSE */
|
|
#else /* not USE_MOUSE */
|
|
static int
|
|
mMouse(char c)
|
|
{
|
|
return (MENU_NOTHING);
|
|
}
|
|
#endif /* not USE_MOUSE */
|
|
|
|
/* --- MenuFunctions (END) --- */
|
|
|
|
/* --- MainMenu --- */
|
|
|
|
void
|
|
popupMenu(int x, int y, Menu *menu)
|
|
{
|
|
initSelectMenu();
|
|
|
|
menu->cursorX = Currentbuf->cursorX + Currentbuf->rootX;
|
|
menu->cursorY = Currentbuf->cursorY;
|
|
menu->x = x + FRAME_WIDTH + 1;
|
|
menu->y = y + 2;
|
|
|
|
popup_menu(NULL, menu);
|
|
}
|
|
|
|
void
|
|
mainMenu(int x, int y)
|
|
{
|
|
popupMenu(x, y, &MainMenu);
|
|
}
|
|
|
|
void
|
|
mainMn(void)
|
|
{
|
|
Menu *menu = &MainMenu;
|
|
char *data;
|
|
int n;
|
|
|
|
data = searchKeyData();
|
|
if (data != NULL) {
|
|
n = getMenuN(w3mMenuList, data);
|
|
if (n < 0)
|
|
return;
|
|
menu = w3mMenuList[n].menu;
|
|
}
|
|
popupMenu(Currentbuf->cursorX + Currentbuf->rootX, Currentbuf->cursorY,
|
|
menu);
|
|
}
|
|
|
|
/* --- MainMenu (END) --- */
|
|
|
|
/* --- SelectMenu --- */
|
|
|
|
void
|
|
selMn(void)
|
|
{
|
|
popupMenu(Currentbuf->cursorX, Currentbuf->cursorY, &SelectMenu);
|
|
}
|
|
|
|
static void
|
|
initSelectMenu(void)
|
|
{
|
|
int i, nitem, len = 0, l;
|
|
Buffer *buf;
|
|
Str str;
|
|
char **label;
|
|
static char *comment = " SPC for select / D for delete buffer ";
|
|
|
|
SelectV = -1;
|
|
for (i = 0, buf = Firstbuf; buf != NULL; i++, buf = buf->nextBuffer) {
|
|
if (buf == Currentbuf)
|
|
SelectV = i;
|
|
}
|
|
nitem = i;
|
|
|
|
label = New_N(char *, nitem + 2);
|
|
for (i = 0, buf = Firstbuf; i < nitem; i++, buf = buf->nextBuffer) {
|
|
str = Sprintf("<%s>", buf->buffername);
|
|
if (buf->filename != NULL) {
|
|
switch (buf->currentURL.scheme) {
|
|
case SCM_LOCAL:
|
|
case SCM_LOCAL_CGI:
|
|
if (strcmp(buf->currentURL.file, "-")) {
|
|
Strcat_char(str, ' ');
|
|
Strcat_charp(str,
|
|
conv_from_system(buf->currentURL.real_file));
|
|
}
|
|
break;
|
|
case SCM_UNKNOWN:
|
|
case SCM_MISSING:
|
|
break;
|
|
default:
|
|
Strcat_char(str, ' ');
|
|
Strcat(str, parsedURL2Str(&buf->currentURL));
|
|
break;
|
|
}
|
|
}
|
|
label[i] = str->ptr;
|
|
if (len < str->length)
|
|
len = str->length;
|
|
}
|
|
l = strlen(comment);
|
|
if (len < l + 4)
|
|
len = l + 4;
|
|
if (len > COLS - 2 * FRAME_WIDTH)
|
|
len = COLS - 2 * FRAME_WIDTH;
|
|
len = (len > 1) ? ((len - l + 1) / 2) : 0;
|
|
str = Strnew();
|
|
for (i = 0; i < len; i++)
|
|
Strcat_char(str, '-');
|
|
Strcat_charp(str, comment);
|
|
for (i = 0; i < len; i++)
|
|
Strcat_char(str, '-');
|
|
label[nitem] = str->ptr;
|
|
label[nitem + 1] = NULL;
|
|
|
|
new_option_menu(&SelectMenu, label, &SelectV, smChBuf);
|
|
SelectMenu.initial = SelectV;
|
|
SelectMenu.cursorX = Currentbuf->cursorX + Currentbuf->rootX;
|
|
SelectMenu.cursorY = Currentbuf->cursorY;
|
|
SelectMenu.keymap['D'] = smDelBuf;
|
|
SelectMenu.item[nitem].type = MENU_NOP;
|
|
}
|
|
|
|
static void
|
|
smChBuf(void)
|
|
{
|
|
int i;
|
|
Buffer *buf;
|
|
|
|
if (SelectV < 0 || SelectV >= SelectMenu.nitem)
|
|
return;
|
|
for (i = 0, buf = Firstbuf; i < SelectV; i++, buf = buf->nextBuffer) ;
|
|
Currentbuf = buf;
|
|
if (clear_buffer) {
|
|
for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer)
|
|
tmpClearBuffer(buf);
|
|
}
|
|
}
|
|
|
|
static int
|
|
smDelBuf(char c)
|
|
{
|
|
int i, x, y, mselect;
|
|
Buffer *buf;
|
|
|
|
if (CurrentMenu->select < 0 || CurrentMenu->select >= SelectMenu.nitem)
|
|
return (MENU_NOTHING);
|
|
for (i = 0, buf = Firstbuf; i < CurrentMenu->select;
|
|
i++, buf = buf->nextBuffer) ;
|
|
if (Currentbuf == buf)
|
|
Currentbuf = buf->nextBuffer;
|
|
Firstbuf = deleteBuffer(Firstbuf, buf);
|
|
if (!Currentbuf)
|
|
Currentbuf = nthBuffer(Firstbuf, i - 1);;
|
|
if (Firstbuf == NULL) {
|
|
Firstbuf = nullBuffer();
|
|
Currentbuf = Firstbuf;
|
|
}
|
|
|
|
x = CurrentMenu->x;
|
|
y = CurrentMenu->y;
|
|
mselect = CurrentMenu->select;
|
|
|
|
initSelectMenu();
|
|
|
|
CurrentMenu->x = x;
|
|
CurrentMenu->y = y;
|
|
|
|
geom_menu(CurrentMenu, x, y, 0);
|
|
|
|
CurrentMenu->select = (mselect <= CurrentMenu->nitem - 2) ? mselect
|
|
: (CurrentMenu->nitem - 2);
|
|
|
|
displayBuffer(Currentbuf, B_FORCE_REDRAW);
|
|
draw_all_menu(CurrentMenu);
|
|
select_menu(CurrentMenu, CurrentMenu->select);
|
|
return (MENU_NOTHING);
|
|
}
|
|
|
|
/* --- SelectMenu (END) --- */
|
|
|
|
/* --- OptionMenu --- */
|
|
|
|
void
|
|
optionMenu(int x, int y, char **label, int *variable, int initial,
|
|
void (*func) ())
|
|
{
|
|
Menu menu;
|
|
|
|
new_option_menu(&menu, label, variable, func);
|
|
menu.cursorX = COLS - 1;
|
|
menu.cursorY = LASTLINE;
|
|
menu.x = x;
|
|
menu.y = y;
|
|
menu.initial = initial;
|
|
|
|
popup_menu(NULL, &menu);
|
|
}
|
|
|
|
/* --- OptionMenu (END) --- */
|
|
|
|
/* --- InitMenu --- */
|
|
|
|
void
|
|
initMenu(void)
|
|
{
|
|
FILE *mf;
|
|
Str line;
|
|
char *p, *s;
|
|
int in_menu, nmenu = 0, nitem = 0, type;
|
|
MenuItem *item = NULL;
|
|
MenuList *list;
|
|
|
|
w3mMenuList = New_N(MenuList, 3);
|
|
w3mMenuList[0].id = "Main";
|
|
w3mMenuList[0].menu = &MainMenu;
|
|
w3mMenuList[0].item = MainMenuItem;
|
|
w3mMenuList[1].id = "Select";
|
|
w3mMenuList[1].menu = &SelectMenu;
|
|
w3mMenuList[1].item = NULL;
|
|
w3mMenuList[2].id = NULL;
|
|
|
|
if ((mf = fopen(rcFile(MENU_FILE), "rt")) == NULL)
|
|
goto create_menu;
|
|
|
|
if (!w3mNFuncList)
|
|
w3mNFuncList = countFuncList(w3mFuncList);
|
|
|
|
in_menu = 0;
|
|
while (!feof(mf)) {
|
|
line = Strfgets(mf);
|
|
Strchop(line);
|
|
Strremovefirstspaces(line);
|
|
if (line->length == 0)
|
|
continue;
|
|
p = line->ptr;
|
|
s = getWord(&p);
|
|
if (*s == '#') /* comment */
|
|
continue;
|
|
if (in_menu) {
|
|
type = setMenuItem(&item[nitem], s, p);
|
|
if (type == -1)
|
|
continue; /* error */
|
|
if (type == MENU_END)
|
|
in_menu = 0;
|
|
else {
|
|
nitem++;
|
|
item = New_Reuse(MenuItem, item, (nitem + 1));
|
|
w3mMenuList[nmenu].item = item;
|
|
item[nitem].type = MENU_END;
|
|
}
|
|
}
|
|
else {
|
|
if (strcmp(s, "menu")) /* error */
|
|
continue;
|
|
s = getQWord(&p);
|
|
if (*s == '\0') /* error */
|
|
continue;
|
|
in_menu = 1;
|
|
if ((nmenu = getMenuN(w3mMenuList, s)) != -1)
|
|
w3mMenuList[nmenu].item = New(MenuItem);
|
|
else
|
|
nmenu = addMenuList(&w3mMenuList, s);
|
|
item = w3mMenuList[nmenu].item;
|
|
nitem = 0;
|
|
item[nitem].type = MENU_END;
|
|
}
|
|
}
|
|
fclose(mf);
|
|
|
|
create_menu:
|
|
for (list = w3mMenuList; list->id != NULL; list++) {
|
|
if (list->item == NULL)
|
|
continue;
|
|
new_menu(list->menu, list->item);
|
|
}
|
|
}
|
|
|
|
int
|
|
setMenuItem(MenuItem *item, char *type, char *line)
|
|
{
|
|
char *label, *func, *popup, *keys, *data;
|
|
int f;
|
|
int n;
|
|
|
|
if (type == NULL || *type == '\0') /* error */
|
|
return -1;
|
|
if (strcmp(type, "end") == 0) {
|
|
item->type = MENU_END;
|
|
return MENU_END;
|
|
}
|
|
else if (strcmp(type, "nop") == 0) {
|
|
item->type = MENU_NOP;
|
|
item->label = getQWord(&line);
|
|
return MENU_NOP;
|
|
}
|
|
else if (strcmp(type, "func") == 0) {
|
|
label = getQWord(&line);
|
|
func = getWord(&line);
|
|
keys = getQWord(&line);
|
|
data = getQWord(&line);
|
|
if (*func == '\0') /* error */
|
|
return -1;
|
|
item->type = MENU_FUNC;
|
|
item->label = label;
|
|
f = getFuncList(func, w3mFuncList, w3mNFuncList);
|
|
item->func = w3mFuncList[(f >= 0) ? f : FUNCNAME_nulcmd].func;
|
|
item->keys = keys;
|
|
item->data = data;
|
|
return MENU_FUNC;
|
|
}
|
|
else if (strcmp(type, "popup") == 0) {
|
|
label = getQWord(&line);
|
|
popup = getQWord(&line);
|
|
keys = getQWord(&line);
|
|
if (*popup == '\0') /* error */
|
|
return -1;
|
|
item->type = MENU_POPUP;
|
|
item->label = label;
|
|
if ((n = getMenuN(w3mMenuList, popup)) == -1)
|
|
n = addMenuList(&w3mMenuList, popup);
|
|
item->popup = w3mMenuList[n].menu;
|
|
item->keys = keys;
|
|
return MENU_POPUP;
|
|
}
|
|
return -1; /* error */
|
|
}
|
|
|
|
int
|
|
addMenuList(MenuList **mlist, char *id)
|
|
{
|
|
int n;
|
|
MenuList *list = *mlist;
|
|
|
|
for (n = 0; list->id != NULL; list++, n++) ;
|
|
*mlist = New_Reuse(MenuList, *mlist, (n + 2));
|
|
list = *mlist + n;
|
|
list->id = id;
|
|
list->menu = New(Menu);
|
|
list->item = New(MenuItem);
|
|
(list + 1)->id = NULL;
|
|
return n;
|
|
}
|
|
|
|
int
|
|
getMenuN(MenuList *list, char *id)
|
|
{
|
|
int n;
|
|
|
|
for (n = 0; list->id != NULL; list++, n++) {
|
|
if (strcmp(id, list->id) == 0)
|
|
return n;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/* --- InitMenu (END) --- */
|
|
|
|
#endif /* USE_MENU */
|