forked from RepoMirrors/bemenu
Make filter to pointer.
This commit is contained in:
parent
5599e1aa8e
commit
f03e03cdd9
@ -182,7 +182,7 @@ static void _bmDrawCursesRender(const bmMenu *menu)
|
|||||||
curses.erase();
|
curses.erase();
|
||||||
|
|
||||||
int titleLen = (menu->title ? strlen(menu->title) + 1 : 0);
|
int titleLen = (menu->title ? strlen(menu->title) + 1 : 0);
|
||||||
_bmDrawCursesDrawLine(0, 0, "%*s%s", titleLen, "", menu->filter);
|
_bmDrawCursesDrawLine(0, 0, "%*s%s", titleLen, "", (menu->filter ? menu->filter : ""));
|
||||||
|
|
||||||
if (menu->title) {
|
if (menu->title) {
|
||||||
curses.attron(COLOR_PAIR(1));
|
curses.attron(COLOR_PAIR(1));
|
||||||
|
@ -103,15 +103,19 @@ struct _bmMenu {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Text used to filter matches.
|
* Text used to filter matches.
|
||||||
* XXX: Change this to a pointer?
|
|
||||||
*/
|
*/
|
||||||
char filter[1024];
|
char *filter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used as optimization.
|
* Used as optimization.
|
||||||
*/
|
*/
|
||||||
char *oldFilter;
|
char *oldFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size of filter buffer
|
||||||
|
*/
|
||||||
|
size_t filterSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current byte offset on filter text.
|
* Current byte offset on filter text.
|
||||||
*/
|
*/
|
||||||
@ -173,7 +177,7 @@ size_t _bmUtf8RuneNext(const char *string, size_t start);
|
|||||||
size_t _bmUtf8RunePrev(const char *string, size_t start);
|
size_t _bmUtf8RunePrev(const char *string, size_t start);
|
||||||
size_t _bmUtf8RuneWidth(const char *rune, unsigned int u8len);
|
size_t _bmUtf8RuneWidth(const char *rune, unsigned int u8len);
|
||||||
size_t _bmUtf8RuneRemove(char *string, size_t start, size_t *outRuneWidth);
|
size_t _bmUtf8RuneRemove(char *string, size_t start, size_t *outRuneWidth);
|
||||||
size_t _bmUtf8RuneInsert(char *string, size_t bufSize, size_t start, const char *rune, unsigned int u8len, size_t *outRuneWidth);
|
size_t _bmUtf8RuneInsert(char **string, size_t *bufSize, size_t start, const char *rune, unsigned int u8len, size_t *outRuneWidth);
|
||||||
size_t _bmUnicodeInsert(char *string, size_t bufSize, size_t start, unsigned int unicode, size_t *outRuneWidth);
|
size_t _bmUnicodeInsert(char **string, size_t *bufSize, size_t start, unsigned int unicode, size_t *outRuneWidth);
|
||||||
|
|
||||||
/* vim: set ts=8 sw=4 tw=0 :*/
|
/* vim: set ts=8 sw=4 tw=0 :*/
|
||||||
|
40
lib/menu.c
40
lib/menu.c
@ -71,6 +71,9 @@ void bmMenuFree(bmMenu *menu)
|
|||||||
if (menu->title)
|
if (menu->title)
|
||||||
free(menu->title);
|
free(menu->title);
|
||||||
|
|
||||||
|
if (menu->filter)
|
||||||
|
free(menu->filter);
|
||||||
|
|
||||||
if (menu->oldFilter)
|
if (menu->oldFilter)
|
||||||
free(menu->oldFilter);
|
free(menu->oldFilter);
|
||||||
|
|
||||||
@ -126,12 +129,11 @@ void bmMenuSetFilter(bmMenu *menu, const char *filter)
|
|||||||
{
|
{
|
||||||
assert(menu);
|
assert(menu);
|
||||||
|
|
||||||
if (!filter) {
|
if (menu->filter)
|
||||||
memset(menu->filter, 0, sizeof(menu->filter));
|
free(menu->filter);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(menu->filter, filter, sizeof(menu->filter));
|
menu->filter = (filter ? _bmStrdup(filter) : NULL);
|
||||||
|
menu->filterSize = (filter ? strlen(filter) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -426,7 +428,7 @@ bmItem** bmMenuGetFilteredItems(const bmMenu *menu, unsigned int *outNmemb)
|
|||||||
{
|
{
|
||||||
assert(menu);
|
assert(menu);
|
||||||
|
|
||||||
if (strlen(menu->filter))
|
if (menu->filter && strlen(menu->filter))
|
||||||
return _bmItemListGetItems(&menu->filtered, outNmemb);
|
return _bmItemListGetItems(&menu->filtered, outNmemb);
|
||||||
|
|
||||||
return _bmItemListGetItems(&menu->items, outNmemb);
|
return _bmItemListGetItems(&menu->items, outNmemb);
|
||||||
@ -459,7 +461,7 @@ void bmMenuFilter(bmMenu *menu)
|
|||||||
assert(menu);
|
assert(menu);
|
||||||
|
|
||||||
char addition = 0;
|
char addition = 0;
|
||||||
size_t len = strlen(menu->filter);
|
size_t len = (menu->filter ? strlen(menu->filter) : 0);
|
||||||
|
|
||||||
if (!len || !menu->items.list || menu->items.count <= 0) {
|
if (!len || !menu->items.list || menu->items.count <= 0) {
|
||||||
_bmItemListFreeList(&menu->filtered);
|
_bmItemListFreeList(&menu->filtered);
|
||||||
@ -561,7 +563,7 @@ bmRunResult bmMenuRunWithKey(bmMenu *menu, bmKey key, unsigned int unicode)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_KEY_END:
|
case BM_KEY_END:
|
||||||
menu->cursor = strlen(menu->filter);
|
menu->cursor = (menu->filter ? strlen(menu->filter) : 0);
|
||||||
menu->cursesCursor = _bmUtf8StringScreenWidth(menu->filter);
|
menu->cursesCursor = _bmUtf8StringScreenWidth(menu->filter);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -619,17 +621,17 @@ bmRunResult bmMenuRunWithKey(bmMenu *menu, bmKey key, unsigned int unicode)
|
|||||||
|
|
||||||
case BM_KEY_WORD_DELETE:
|
case BM_KEY_WORD_DELETE:
|
||||||
{
|
{
|
||||||
while (menu->cursor < strlen(menu->filter) && !isspace(menu->filter[menu->cursor])) {
|
while (menu->cursor < (menu->filter ? strlen(menu->filter) : 0) && !isspace(menu->filter[menu->cursor])) {
|
||||||
unsigned int oldCursor = menu->cursor;
|
unsigned int oldCursor = menu->cursor;
|
||||||
menu->cursor += _bmUtf8RuneNext(menu->filter, menu->cursor);
|
menu->cursor += _bmUtf8RuneNext(menu->filter, menu->cursor);
|
||||||
menu->cursesCursor += _bmUtf8RuneWidth(menu->filter + oldCursor, menu->cursor - oldCursor);
|
menu->cursesCursor += _bmUtf8RuneWidth(menu->filter + oldCursor, menu->cursor - oldCursor);
|
||||||
}
|
}
|
||||||
while (menu->cursor > 0 && isspace(menu->filter[menu->cursor - 1])) {
|
while (menu->cursor > 0 && menu->filter && isspace(menu->filter[menu->cursor - 1])) {
|
||||||
unsigned int oldCursor = menu->cursor;
|
unsigned int oldCursor = menu->cursor;
|
||||||
menu->cursor -= _bmUtf8RunePrev(menu->filter, menu->cursor);
|
menu->cursor -= _bmUtf8RunePrev(menu->filter, menu->cursor);
|
||||||
menu->cursesCursor -= _bmUtf8RuneWidth(menu->filter + menu->cursor, oldCursor - menu->cursor);
|
menu->cursesCursor -= _bmUtf8RuneWidth(menu->filter + menu->cursor, oldCursor - menu->cursor);
|
||||||
}
|
}
|
||||||
while (menu->cursor > 0 && !isspace(menu->filter[menu->cursor - 1])) {
|
while (menu->cursor > 0 && menu->filter && !isspace(menu->filter[menu->cursor - 1])) {
|
||||||
size_t width;
|
size_t width;
|
||||||
menu->cursor -= _bmUtf8RuneRemove(menu->filter, menu->cursor, &width);
|
menu->cursor -= _bmUtf8RuneRemove(menu->filter, menu->cursor, &width);
|
||||||
menu->cursesCursor -= width;
|
menu->cursesCursor -= width;
|
||||||
@ -640,24 +642,18 @@ bmRunResult bmMenuRunWithKey(bmMenu *menu, bmKey key, unsigned int unicode)
|
|||||||
case BM_KEY_UNICODE:
|
case BM_KEY_UNICODE:
|
||||||
{
|
{
|
||||||
size_t width;
|
size_t width;
|
||||||
menu->cursor += _bmUnicodeInsert(menu->filter, sizeof(menu->filter) - 1, menu->cursor, unicode, &width);
|
menu->cursor += _bmUnicodeInsert(&menu->filter, &menu->filterSize, menu->cursor, unicode, &width);
|
||||||
menu->cursesCursor += width;
|
menu->cursesCursor += width;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_KEY_TAB:
|
case BM_KEY_TAB:
|
||||||
{
|
{
|
||||||
|
const char *text;
|
||||||
bmItem *highlighted = bmMenuGetHighlightedItem(menu);
|
bmItem *highlighted = bmMenuGetHighlightedItem(menu);
|
||||||
if (highlighted && bmItemGetText(highlighted)) {
|
if (highlighted && (text = bmItemGetText(highlighted))) {
|
||||||
const char *text = bmItemGetText(highlighted);
|
bmMenuSetFilter(menu, text);
|
||||||
size_t len = strlen(text);
|
menu->cursor = (menu->filter ? strlen(menu->filter) : 0);
|
||||||
|
|
||||||
if (len > sizeof(menu->filter) - 1)
|
|
||||||
len = sizeof(menu->filter) - 1;
|
|
||||||
|
|
||||||
memset(menu->filter, 0, strlen(menu->filter));
|
|
||||||
memcpy(menu->filter, text, len);
|
|
||||||
menu->cursor = strlen(menu->filter);
|
|
||||||
menu->cursesCursor = _bmUtf8StringScreenWidth(menu->filter);
|
menu->cursesCursor = _bmUtf8StringScreenWidth(menu->filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
lib/util.c
41
lib/util.c
@ -228,29 +228,45 @@ size_t _bmUtf8RuneRemove(char *string, size_t start, size_t *outRuneWidth)
|
|||||||
/**
|
/**
|
||||||
* Insert UTF8 rune to buffer.
|
* Insert UTF8 rune to buffer.
|
||||||
*
|
*
|
||||||
* @param string Null terminated C "string".
|
* @param inOutString Reference to buffer.
|
||||||
* @param bufSize Size of the buffer.
|
* @param inOutBufSize Reference to size of the buffer.
|
||||||
* @param start Start offset where to insert to. (cursor)
|
* @param start Start offset where to insert to. (cursor)
|
||||||
* @param rune Buffer to insert to string.
|
* @param rune Buffer to insert to string.
|
||||||
* @param u8len Byte length of the rune.
|
* @param u8len Byte length of the rune.
|
||||||
* @param outRuneWidth Reference to size_t, return number of columns for inserted rune, or -1 on failure.
|
* @param outRuneWidth Reference to size_t, return number of columns for inserted rune, or -1 on failure.
|
||||||
* @return Number of bytes inserted to buffer.
|
* @return Number of bytes inserted to buffer.
|
||||||
*/
|
*/
|
||||||
size_t _bmUtf8RuneInsert(char *string, size_t bufSize, size_t start, const char *rune, unsigned int u8len, size_t *outRuneWidth)
|
size_t _bmUtf8RuneInsert(char **inOutString, size_t *inOutBufSize, size_t start, const char *rune, unsigned int u8len, size_t *outRuneWidth)
|
||||||
{
|
{
|
||||||
assert(string);
|
assert(inOutString);
|
||||||
|
assert(inOutBufSize);
|
||||||
|
|
||||||
if (outRuneWidth)
|
if (outRuneWidth)
|
||||||
*outRuneWidth = 0;
|
*outRuneWidth = 0;
|
||||||
|
|
||||||
size_t len = strlen(string);
|
size_t len = (*inOutString ? strlen(*inOutString) : 0);
|
||||||
if (len + u8len >= bufSize)
|
if (!*inOutString && !(*inOutString = calloc(1, (*inOutBufSize = u8len + 1))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (len + u8len >= *inOutBufSize) {
|
||||||
|
void *tmp;
|
||||||
|
if (!(tmp = realloc(*inOutString, (*inOutBufSize * 2)))) {
|
||||||
|
if (!(tmp = malloc((*inOutBufSize * 2))))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy(tmp, *inOutString, *inOutBufSize);
|
||||||
|
free(*inOutString);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(tmp + *inOutBufSize, 0, *inOutBufSize);
|
||||||
|
*inOutString = tmp;
|
||||||
|
*inOutBufSize *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (u8len == 1 && !isprint(*rune))
|
if (u8len == 1 && !isprint(*rune))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
char *str = string + start;
|
char *str = *inOutString + start;
|
||||||
memmove(str + u8len, str, len - start);
|
memmove(str + u8len, str, len - start);
|
||||||
memcpy(str, rune, u8len);
|
memcpy(str, rune, u8len);
|
||||||
|
|
||||||
@ -262,16 +278,17 @@ size_t _bmUtf8RuneInsert(char *string, size_t bufSize, size_t start, const char
|
|||||||
/**
|
/**
|
||||||
* Insert unicode character to UTF8 buffer.
|
* Insert unicode character to UTF8 buffer.
|
||||||
*
|
*
|
||||||
* @param string Null terminated C "string".
|
* @param inOutString Reference to buffer.
|
||||||
* @param bufSize Size of the buffer.
|
* @param inOutBufSize Reference to size of the buffer.
|
||||||
* @param start Start offset where to insert to. (cursor)
|
* @param start Start offset where to insert to. (cursor)
|
||||||
* @param unicode Unicode character to insert.
|
* @param unicode Unicode character to insert.
|
||||||
* @param outRuneWidth Reference to size_t, return number of columns for inserted rune, or -1 on failure.
|
* @param outRuneWidth Reference to size_t, return number of columns for inserted rune, or -1 on failure.
|
||||||
* @return Number of bytes inserted to buffer.
|
* @return Number of bytes inserted to buffer.
|
||||||
*/
|
*/
|
||||||
size_t _bmUnicodeInsert(char *string, size_t bufSize, size_t start, unsigned int unicode, size_t *outRuneWidth)
|
size_t _bmUnicodeInsert(char **inOutString, size_t *inOutBufSize, size_t start, unsigned int unicode, size_t *outRuneWidth)
|
||||||
{
|
{
|
||||||
assert(string);
|
assert(inOutString);
|
||||||
|
assert(inOutBufSize);
|
||||||
|
|
||||||
char u8len = ((unicode < 0x80) ? 1 : ((unicode < 0x800) ? 2 : ((unicode < 0x10000) ? 3 : 4)));
|
char u8len = ((unicode < 0x80) ? 1 : ((unicode < 0x800) ? 2 : ((unicode < 0x10000) ? 3 : 4)));
|
||||||
char mb[5] = { 0, 0, 0, 0 };
|
char mb[5] = { 0, 0, 0, 0 };
|
||||||
@ -285,7 +302,7 @@ size_t _bmUnicodeInsert(char *string, size_t bufSize, size_t start, unsigned int
|
|||||||
mb[0] |= (unicode >> (i * 6 - 6));
|
mb[0] |= (unicode >> (i * 6 - 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
return _bmUtf8RuneInsert(string, bufSize, start, mb, u8len, outRuneWidth);
|
return _bmUtf8RuneInsert(inOutString, inOutBufSize, start, mb, u8len, outRuneWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sw=4 tw=0 :*/
|
/* vim: set ts=8 sw=4 tw=0 :*/
|
||||||
|
Loading…
Reference in New Issue
Block a user