#include "filter.h"
#include "xmalloc.h"
#include "color.h"
+#include <sys/time.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
static bool should_resize = FALSE;
static bool can_resize = FALSE;
+static struct timeval last_click_time;
+static int double_click_interval = 200; /* maximum time in milliseconds */
static WINDOW *top = NULL, *bottom = NULL;
noecho();
nonl();
intrflush(stdscr, FALSE);
+ if(opt_get_bool(BOOL_USE_MOUSE)) {
+ mouseinterval(0);
+ timerclear(&last_click_time);
+ ui_enable_mouse(TRUE);
+ }
keypad(stdscr, TRUE);
- if(opt_get_bool(BOOL_USE_COLORS)) {
+ if(opt_get_bool(BOOL_USE_COLORS) && has_colors()) {
start_color();
use_default_colors();
ui_init_color_pairs_user();
}
}
+void
+ui_enable_mouse(bool enabled)
+{
+ mmask_t mask;
+ if(enabled) {
+ mask = BUTTON1_CLICKED | BUTTON4_PRESSED;
+#if NCURSES_MOUSE_VERSION == 2
+ mask |= BUTTON5_PRESSED;
+#endif
+ } else {
+ mask = 0;
+ }
+ mousemask(mask, NULL);
+}
+
+/** Check the time elapsed since last click and tell if it should be
+ * interpreted as a double click
+ */
+static bool
+was_double_click() {
+ struct timeval click_time, click_diff, maxdiff;
+ maxdiff.tv_sec = double_click_interval / 1000;
+ maxdiff.tv_usec = (double_click_interval % 1000)*1000;
+ gettimeofday(&click_time, NULL);
+
+ timersub(&click_time, &last_click_time, &click_diff);
+ last_click_time = click_time;
+ return !timercmp(&click_diff, &maxdiff, >);
+}
#define CHECK_COLOR_NAME(value, name, DEFNAME) \
if(!strcmp((name), (value))){ \
if(!opt_get_bool(BOOL_SHOW_CURSOR))
show_cursor();
can_resize = FALSE; /* it's not safe to resize anymore */
+ if(ch == KEY_MOUSE) {
+ MEVENT event;
+ bool double_clicked = was_double_click();
+ if(getmouse(&event) == OK) {
+ if(event.bstate & BUTTON1_CLICKED
+ || event.bstate & BUTTON1_DOUBLE_CLICKED) {
+ if(event.y == 0) {
+ return;
+ }
+ list_set_curitem(event.y + list_get_firstitem() - LIST_TOP);
+ if(double_clicked) {
+ edit_item(-1);
+ } else {
+ refresh_list();
+ }
+ } else if(event.bstate & BUTTON4_PRESSED) {
+ scroll_up();
+ } else if(event.bstate & BUTTON5_PRESSED) {
+ scroll_down();
+ }
+ }
+ }
switch(ch) {
case 'q': return;
case 'Q': quit_abook(QUIT_DONTSAVE); break;
case KEY_DC:
case 'd':
case 'r': ui_remove_items(); break;
+ case 'M': ui_merge_items(); break;
case 'D': duplicate_item(); break;
+ case 'U': ui_remove_duplicates(); break;
case 12: refresh_screen(); break;
case 'k':
case 'F': sort_by_field(NULL); break;
case '/': ui_find(0); break;
+ case 'n':
case '\\': ui_find(1); break;
case ' ': if(list_get_curitem() >= 0) {
refresh_list();
}
+void
+ui_merge_items()
+{
+ if(statusline_ask_boolean(_("Merge selected items"), TRUE))
+ merge_selected_items();
+
+ clear_statusline();
+ refresh_list();
+}
+
+void ui_remove_duplicates()
+{
+ if(statusline_ask_boolean(_("Remove duplicates"), TRUE))
+ remove_duplicates();
+
+ clear_statusline();
+ refresh_list();
+}
+
void
ui_clear_database()
{