src/menu.c
author ali@juiblex.co.uk
Mon Jan 29 20:22:01 2007 +0000 (2007-01-29)
changeset 0 acc07f1f4b1e
permissions -rw-r--r--
Initial check-in. Mostly sort of works. Ish.
ali@0
     1
/*
ali@0
     2
 * $Id: menu.c,v 1.5 2004/12/30 09:07:47 ali Exp $
ali@0
     3
 * Copyright (C) 2007 J. Ali Harlow
ali@0
     4
 * Min Hack may be freely redistributed.  See license for details. 
ali@0
     5
 */
ali@0
     6
ali@0
     7
#include <stdlib.h>
ali@0
     8
#include <stdio.h>
ali@0
     9
#include <string.h>
ali@0
    10
#include "minhack.h"
ali@0
    11
ali@0
    12
void minhack_free_menu(int window)
ali@0
    13
{
ali@0
    14
    struct minhack_menu *menu=windows[window].menu;
ali@0
    15
    struct minhack_mitem *item,*next;
ali@0
    16
    if (menu)
ali@0
    17
    {
ali@0
    18
	if (menu->menu)
ali@0
    19
	{
ali@0
    20
#if 0
ali@0
    21
	    delwin(menu_win(menu->menu));
ali@0
    22
	    delwin(menu_sub(menu->menu));
ali@0
    23
#endif
ali@0
    24
	    free_menu(menu->menu);
ali@0
    25
	}
ali@0
    26
	for(item=menu->mitems;item;item=next)
ali@0
    27
	{
ali@0
    28
	    next=item->next;
ali@0
    29
	    free_item(item->item);
ali@0
    30
	    free(item->str);
ali@0
    31
	    free(item);
ali@0
    32
	}
ali@0
    33
	free(menu->items);
ali@0
    34
    }
ali@0
    35
    windows[window].menu=NULL;
ali@0
    36
}
ali@0
    37
ali@0
    38
void minhack_start_menu(int window)
ali@0
    39
{
ali@0
    40
    minhack_free_menu(window);
ali@0
    41
    windows[window].menu=
ali@0
    42
      (struct minhack_menu *)calloc(1,sizeof(struct minhack_menu));
ali@0
    43
}
ali@0
    44
ali@0
    45
void minhack_add_menu(int window, int glyph, int identifier, char accelerator,
ali@0
    46
  char groupacc, int attr, const char *str, nhproxy_bool_t preselected)
ali@0
    47
{
ali@0
    48
    struct minhack_mitem *item;
ali@0
    49
    item=(struct minhack_mitem *)malloc(sizeof(*item));
ali@0
    50
    item->next=windows[window].menu->mitems;
ali@0
    51
    item->identifier=identifier;
ali@0
    52
    if (accelerator)
ali@0
    53
	item->accelerator=accelerator;
ali@0
    54
    else if (!item->next)
ali@0
    55
	item->accelerator='a';
ali@0
    56
    else if (!identifier)
ali@0
    57
	item->accelerator=item->next->accelerator;
ali@0
    58
    else if (item->next->accelerator=='z')
ali@0
    59
	item->accelerator='A';
ali@0
    60
    else
ali@0
    61
	item->accelerator=item->next->accelerator+1;
ali@0
    62
    item->groupacc=groupacc;
ali@0
    63
    if (identifier)
ali@0
    64
    {
ali@0
    65
	item->str=malloc(strlen(str)+5);
ali@0
    66
	sprintf(item->str,"%c - %s",item->accelerator,str);
ali@0
    67
    }
ali@0
    68
    else if (*str)
ali@0
    69
	item->str=strdup(str);
ali@0
    70
    else
ali@0
    71
	item->str=strdup(" ");
ali@0
    72
    item->selected=preselected;
ali@0
    73
    item->item=new_item(item->str,item->str);
ali@0
    74
    if (!identifier)
ali@0
    75
	item_opts_off(item->item,O_SELECTABLE);
ali@0
    76
    windows[window].menu->mitems=item;
ali@0
    77
}
ali@0
    78
ali@0
    79
static struct minhack_mitem *reverse(struct minhack_mitem *curr)
ali@0
    80
{
ali@0
    81
    struct minhack_mitem *next,*head=0;
ali@0
    82
    while (curr)
ali@0
    83
    {
ali@0
    84
	next=curr->next;
ali@0
    85
	curr->next=head;
ali@0
    86
	head=curr;
ali@0
    87
	curr=next;
ali@0
    88
    }
ali@0
    89
    return head;
ali@0
    90
}
ali@0
    91
ali@0
    92
void minhack_end_menu(int window, const char *prompt)
ali@0
    93
{
ali@0
    94
    int i,rows,cols;
ali@0
    95
    struct minhack_mitem *item;
ali@0
    96
    WINDOW *win;
ali@0
    97
    windows[window].menu->mitems=reverse(windows[window].menu->mitems);
ali@0
    98
    if (*prompt)
ali@0
    99
    {
ali@0
   100
	minhack_add_menu(window,-1,0,0,0,0,"",FALSE);
ali@0
   101
	minhack_add_menu(window,-1,0,0,0,0,prompt,FALSE);
ali@0
   102
    }
ali@0
   103
    for(i=0,item=windows[window].menu->mitems;item;i++,item=item->next)
ali@0
   104
	;
ali@0
   105
    windows[window].menu->items=malloc((i+1)*sizeof(ITEM *));
ali@0
   106
    for(i=0,item=windows[window].menu->mitems;item;i++,item=item->next)
ali@0
   107
	windows[window].menu->items[i]=item->item;
ali@0
   108
    windows[window].menu->items[i]=NULL;
ali@0
   109
    windows[window].menu->menu=new_menu(windows[window].menu->items);
ali@0
   110
    scale_menu(windows[window].menu->menu,&rows,&cols);
ali@0
   111
    {
ali@0
   112
	char buf[100];
ali@0
   113
	sprintf(buf,"(%dx%d)",rows,cols);
ali@0
   114
	minhack_putstr(message_win,0,buf);
ali@0
   115
    }
ali@0
   116
#if 0
ali@0
   117
    win=newwin(rows,cols,0,0);
ali@0
   118
    set_menu_win(windows[window].menu->menu,win);
ali@0
   119
#endif
ali@0
   120
    win=newwin(rows,cols,0,0);
ali@0
   121
    set_menu_sub(windows[window].menu->menu,win);
ali@0
   122
    set_menu_win(windows[window].menu->menu,windows[map_win].win);
ali@0
   123
}
ali@0
   124
ali@0
   125
int minhack_select_menu(int window, int how, struct nhproxy_mi **selected)
ali@0
   126
{
ali@0
   127
    int i,j,ch;
ali@0
   128
    struct minhack_mitem *item;
ali@0
   129
    if (how==MINHACK_PICK_ANY)
ali@0
   130
	menu_opts_off(windows[window].menu->menu,O_ONEVALUE);
ali@0
   131
    menu_opts_off(windows[window].menu->menu,O_IGNORECASE);
ali@0
   132
    menu_opts_off(windows[window].menu->menu,O_SHOWDESC);
ali@0
   133
    i=post_menu(windows[window].menu->menu);
ali@0
   134
    for(;;)
ali@0
   135
    {
ali@0
   136
	wrefresh(menu_win(windows[window].menu->menu));
ali@0
   137
#if 1
ali@0
   138
	wrefresh(menu_sub(windows[window].menu->menu));
ali@0
   139
#endif
ali@0
   140
	ch=getch();
ali@0
   141
	if (ch=='\033')
ali@0
   142
	{
ali@0
   143
	    i=how==MINHACK_PICK_NONE?0:-1;
ali@0
   144
	    break;
ali@0
   145
	}
ali@0
   146
	else if (ch>=' ' && ch<='~')
ali@0
   147
	    if (menu_driver(windows[window].menu->menu,ch)==E_OK)
ali@0
   148
	    {
ali@0
   149
		for(i=0,item=windows[window].menu->mitems;item;item=item->next)
ali@0
   150
		    if (item_value(item->item))
ali@0
   151
			i++;
ali@0
   152
		*selected=(struct nhproxy_mi *)calloc(i,
ali@0
   153
		  sizeof(struct nhproxy_mi));
ali@0
   154
		for(i=0,item=windows[window].menu->mitems;item;item=item->next)
ali@0
   155
		    if (item_value(item->item))
ali@0
   156
		    {
ali@0
   157
			(*selected)[i].item=item->identifier;
ali@0
   158
			(*selected)[i].count=-1;	/* FIXME */
ali@0
   159
		    }
ali@0
   160
		break;
ali@0
   161
	    }
ali@0
   162
    }
ali@0
   163
    unpost_menu(windows[window].menu->menu);
ali@0
   164
    redrawwin(menu_win(windows[window].menu->menu));
ali@0
   165
#if 0
ali@0
   166
    for(j=0;j<no_windows;j++)
ali@0
   167
	if (windows[j].win)
ali@0
   168
	    redrawwin(windows[j].win);
ali@0
   169
#endif
ali@0
   170
    return i;
ali@0
   171
}
ali@0
   172
ali@0
   173
int minhack_message_menu(int let, int how, const char *mesg)
ali@0
   174
{
ali@0
   175
    return -1;
ali@0
   176
}