static gboolean listview_clicked ( widget *wid, xcb_button_press_event_t *xce, G_GNUC_UNUSED void *udata ) { listview *lv = (listview *) wid; lv->scrollbar_scroll = FALSE; if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) && widget_intersect ( WIDGET ( lv->scrollbar ), xce->event_x, xce->event_y ) ) { // Forward to handler of scrollbar. xcb_button_press_event_t xce2 = *xce; xce->event_x -= widget_get_x_pos ( WIDGET ( lv->scrollbar ) ); xce->event_y -= widget_get_y_pos ( WIDGET ( lv->scrollbar ) ); lv->scrollbar_scroll = TRUE; return widget_clicked ( WIDGET ( lv->scrollbar ), &xce2 ); } // Handle the boxes. unsigned int max = MIN ( lv->cur_elements, lv->req_elements - lv->last_offset ); for ( unsigned int i = 0; i < max; i++ ) { widget *w = WIDGET ( lv->boxes[i] ); if ( widget_intersect ( w, xce->event_x, xce->event_y ) ) { if ( ( lv->last_offset + i ) == lv->selected ) { if ( ( xce->time - lv->last_click ) < 200 ) { // Somehow signal we accepted item. lv->mouse_activated ( lv, xce, lv->mouse_activated_data ); } } else { listview_set_selected ( lv, lv->last_offset + i ); } lv->last_click = xce->time; return TRUE; } } return FALSE; }
void listview_set_num_elements ( listview *lv, unsigned int rows ) { lv->req_elements = rows; listview_set_selected ( lv, lv->selected ); listview_recompute_elements ( lv ); widget_queue_redraw ( WIDGET ( lv ) ); }
static gboolean listview_scrollbar_clicked ( widget *sb, xcb_button_press_event_t * xce, void *udata ) { listview *lv = (listview *) udata; unsigned int sel = scrollbar_clicked ( (scrollbar *) sb, xce->event_y ); listview_set_selected ( lv, sel ); return TRUE; }
static void scrollbar_scroll ( scrollbar *sb, int y ) { listview_set_selected ( (listview *) sb->widget.parent, scrollbar_scroll_get_line ( sb, y ) ); }