X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Flist_window.h;h=cf938f8ce1a793a312bfbb7875d5af61217941a4;hb=3a0114cd65186bbbcb6e0ff3c7eeb9c05fac0ab3;hp=9e91703824205e6854ce213074337a6d1f6c812f;hpb=f55a67b3f882641abe5a9b14b045d7ce71964af7;p=ncmpc.git diff --git a/src/list_window.h b/src/list_window.h index 9e91703..cf938f8 100644 --- a/src/list_window.h +++ b/src/list_window.h @@ -1,67 +1,181 @@ -#ifndef LIST_WINDOW_H -#define LIST_WINDOW_H +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2009 The Music Player Daemon Project + * Project homepage: http://musicpd.org + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. -#define LW_ROW(lw) (lw ? lw->selected-lw->start : 0) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. -typedef char * (*list_window_callback_fn_t) (int index, - int *highlight, - void *data); + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef LIST_WINDOW_H +#define LIST_WINDOW_H -typedef struct -{ - WINDOW *w; - int rows, cols; +#include "config.h" +#include "command.h" +#include "colors.h" - int start; - int selected; - int clear; - int repaint; +#include +#include -} list_window_t; +#ifdef HAVE_NCURSESW_NCURSES_H +#include +#else +#include +#endif +typedef const char * +(*list_window_callback_fn_t)(unsigned i, void *data); + +typedef void +(*list_window_paint_callback_t)(WINDOW *w, unsigned i, + unsigned y, unsigned width, + bool selected, + void *data); + +struct list_window { + WINDOW *w; + unsigned rows, cols; + + /** + * Number of items in this list. + */ + unsigned length; + + unsigned start; + unsigned selected; + unsigned range_base; /* represents the base item. */ + bool range_selection; /* range selection activated */ + + bool hide_cursor; +}; + +/** + * The bounds of a range selection, see list_window_get_range(). + */ +struct list_window_range { + /** + * The index of the first selected item. + */ + unsigned start; + + /** + * The index after the last selected item. The selection is + * empty when this is the same as "start". + */ + unsigned end; +}; /* create a new list window */ -list_window_t *list_window_init(WINDOW *w, int width, int height); +struct list_window *list_window_init(WINDOW *w, + unsigned width, unsigned height); /* destroy a list window (returns NULL) */ -list_window_t *list_window_free(list_window_t *lw); +void list_window_free(struct list_window *lw); + +/* reset a list window (selected=0, start=0) */ +void list_window_reset(struct list_window *lw); + +void +list_window_resize(struct list_window *lw, unsigned width, unsigned height); -/* reset a list window (selected=0, start=0, clear=1) */ -void list_window_reset(list_window_t *lw); +void +list_window_set_length(struct list_window *lw, unsigned length); /* paint a list window */ -void list_window_paint(list_window_t *lw, +void list_window_paint(const struct list_window *lw, list_window_callback_fn_t callback, void *callback_data); -/* perform basic list window commands (movement) */ -int list_window_cmd(list_window_t *lw, int rows, command_t cmd); +void +list_window_paint2(const struct list_window *lw, + list_window_paint_callback_t paint_callback, + void *callback_data); +/* perform basic list window commands (movement) */ +bool +list_window_cmd(struct list_window *lw, command_t cmd); + +/** + * Scroll the window. Returns non-zero if the command has been + * consumed. + */ +bool +list_window_scroll_cmd(struct list_window *lw, command_t cmd); + +#ifdef HAVE_GETMOUSE +/** + * The mouse was clicked. Check if the list should be scrolled + * Returns non-zero if the mouse event has been handled. + */ +bool +list_window_mouse(struct list_window *lw, unsigned long bstate, int y); +#endif -/* select functions */ -void list_window_set_selected(list_window_t *lw, int n); -void list_window_previous(list_window_t *lw); -void list_window_next(list_window_t *lw, int length); -void list_window_first(list_window_t *lw); -void list_window_last(list_window_t *lw, int length); -void list_window_previous_page(list_window_t *lw); -void list_window_next_page(list_window_t *lw, int length); -void list_window_check_selected(list_window_t *lw, int length); +void +list_window_center(struct list_window *lw, unsigned n); + +/** + * Sets the position of the cursor. Disables range selection. + */ +void +list_window_set_cursor(struct list_window *lw, unsigned i); + +/** + * Moves the cursor. Modifies the range if range selection is + * enabled. + */ +void +list_window_move_cursor(struct list_window *lw, unsigned n); + +/** + * Ensures that the cursor is visible on the screen, i.e. it is not + * outside the current scrolling range. + */ +void +list_window_fetch_cursor(struct list_window *lw); + +/** + * Determines the lower and upper bound of the range selection. If + * range selection is disabled, it returns the cursor position (range + * length is 1). + */ +void +list_window_get_range(const struct list_window *lw, + struct list_window_range *range); /* find a string in a list window */ -int list_window_find(list_window_t *lw, - list_window_callback_fn_t callback, - void *callback_data, - char *str, - int wrap); +bool +list_window_find(struct list_window *lw, + list_window_callback_fn_t callback, + void *callback_data, + const char *str, + bool wrap, + bool bell_on_wrap); /* find a string in a list window (reversed) */ -int -list_window_rfind(list_window_t *lw, +bool +list_window_rfind(struct list_window *lw, list_window_callback_fn_t callback, void *callback_data, - char *str, - int wrap, - int rows); + const char *str, + bool wrap, + bool bell_on_wrap); + +/* find a string in a list window which begins with the given characters in *str */ +bool +list_window_jump(struct list_window *lw, + list_window_callback_fn_t callback, + void *callback_data, + const char *str); #endif