rofi  1.6.1
listview.c
Go to the documentation of this file.
1 /*
2  * rofi
3  *
4  * MIT/X11 License
5  * Copyright © 2013-2020 Qball Cow <qball@gmpclient.org>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining
8  * a copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sublicense, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be
16  * included in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  */
27 
28 #include <config.h>
29 #include <glib.h>
30 #include <widgets/widget.h>
31 #include <widgets/textbox.h>
32 #include <widgets/scrollbar.h>
33 #include <widgets/icon.h>
34 #include <widgets/box.h>
35 #include <widgets/listview.h>
36 
37 #include "settings.h"
38 #include "theme.h"
39 
40 #include "timings.h"
41 
43 #define DEFAULT_SPACING 2
44 
49 #define LISTVIEW ROFI_ORIENTATION_VERTICAL
50 
51 #define BARVIEW ROFI_ORIENTATION_HORIZONTAL
52 
56 typedef enum
57 {
59  RIGHT_TO_LEFT = 1
61 
62 typedef struct
63 {
64  box *box;
69 
70 struct _listview
71 {
73 
75 
76  // RChanged
77  // Text needs to be repainted.
78  unsigned int rchanged;
79  // Administration
80 
81  unsigned int cur_page;
82  unsigned int last_offset;
83  unsigned int selected;
84 
85  unsigned int element_height;
86  unsigned int max_rows;
87  unsigned int max_elements;
88 
89  //
90  gboolean fixed_columns;
91  unsigned int cur_columns;
92  unsigned int req_elements;
93  unsigned int cur_elements;
94 
96  unsigned int menu_lines;
97  unsigned int max_displayed_lines;
98  unsigned int menu_columns;
99  unsigned int fixed_num_lines;
100  unsigned int dynamic;
101  unsigned int eh;
102  unsigned int reverse;
103  gboolean cycle;
104  gboolean multi_select;
105 
107 
110 
112  void *udata;
113 
115 
116  xcb_timestamp_t last_click;
119 
121 
122  PangoEllipsizeMode emode;
124  struct
125  {
127  unsigned int cur_visible;
129 };
135 const char *const listview_theme_prop_names[][3] = {
137  { "normal.normal", "selected.normal", "alternate.normal" },
139  { "normal.urgent", "selected.urgent", "alternate.urgent" },
141  { "normal.active", "selected.active", "alternate.active" },
142 };
143 
145 {
146  widget *w = WIDGET ( r.box );
147  TextBoxFontType t = tbft & STATE_MASK;
148  if ( w == NULL ) {
149  return;
150  }
151  // ACTIVE has priority over URGENT if both set.
152  if ( t == ( URGENT | ACTIVE ) ) {
153  t = ACTIVE;
154  }
155  switch ( ( tbft & FMOD_MASK ) )
156  {
157  case HIGHLIGHT:
159  break;
160  case ALT:
162  break;
163  default:
165  break;
166  }
167 }
168 static void listview_add_widget ( listview *lv, _listview_row *row, widget *wid, const char *label )
169 {
171  if ( strcasecmp ( label, "element-icon" ) == 0 ) {
172  if ( config.show_icons ) {
173  row->icon = icon_create ( WIDGET ( wid ), "element-icon" );
174  box_add ( (box *) wid, WIDGET ( row->icon ), FALSE );
175  }
176  }
177  else if ( strcasecmp ( label, "element-text" ) == 0 ) {
178  row->textbox = textbox_create ( WIDGET ( wid ), WIDGET_TYPE_TEXTBOX_TEXT, "element-text", TB_AUTOHEIGHT | flags, NORMAL, "DDD", 0, 0 );
179  box_add ( (box *) wid, WIDGET ( row->textbox ), TRUE );
180  }
181  else if ( strcasecmp ( label, "element-index" ) == 0 ) {
182  row->index = textbox_create ( WIDGET ( wid ), WIDGET_TYPE_TEXTBOX_TEXT, "element-text", TB_AUTOHEIGHT, NORMAL, " ", 0, 0 );
183  box_add ( (box *) wid, WIDGET ( row->index ), FALSE );
184  }
185  else {
186  widget *wid2 = (widget *) box_create ( wid, label, ROFI_ORIENTATION_VERTICAL );
187  box_add ( (box *) wid, WIDGET ( wid2 ), TRUE );
188  GList *list = rofi_theme_get_list ( WIDGET ( wid2 ), "children", "" );
189  for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) {
190  listview_add_widget ( lv, row, wid2, (const char *) iter->data );
191  }
192  }
193 }
194 
195 static void listview_create_row ( listview *lv, _listview_row *row )
196 {
197  row->box = box_create ( WIDGET ( lv ), "element", ROFI_ORIENTATION_HORIZONTAL );
199  GList *list = rofi_theme_get_list ( WIDGET ( row->box ), "children", "element-icon,element-text" );
200 
201  row->textbox = NULL;
202  row->icon = NULL;
203  row->index = NULL;
204 
205  for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) {
206  listview_add_widget ( lv, row, WIDGET ( row->box ), (const char *) iter->data );
207  }
208  g_list_free_full ( list, g_free );
209 }
210 
211 static int listview_get_desired_height ( widget *wid );
212 
213 static void listview_free ( widget *wid )
214 {
215  listview *lv = (listview *) wid;
216  for ( unsigned int i = 0; i < lv->cur_elements; i++ ) {
217  widget_free ( WIDGET ( lv->boxes [i].box ) );
218  }
219  g_free ( lv->boxes );
220 
221  g_free ( lv->listview_name );
222  widget_free ( WIDGET ( lv->scrollbar ) );
223  g_free ( lv );
224 }
225 static unsigned int scroll_per_page_barview ( listview *lv )
226 {
227  unsigned int offset = lv->last_offset;
228 
229  // selected row is always visible.
230  // If selected is visible do not scroll.
231  if ( lv->selected < lv->last_offset ) {
232  offset = lv->selected;
233  lv->rchanged = TRUE;
234  }
235  else if ( lv->selected >= ( lv->last_offset + lv->barview.cur_visible ) ) {
236  offset = lv->selected;
237  lv->rchanged = TRUE;
238  }
239  return offset;
240 }
241 static unsigned int scroll_per_page ( listview * lv )
242 {
243  int offset = 0;
244 
245  // selected row is always visible.
246  // If selected is visible do not scroll.
247  if ( ( ( lv->selected - ( lv->last_offset ) ) < ( lv->max_elements ) ) && ( lv->selected >= ( lv->last_offset ) ) ) {
248  offset = lv->last_offset;
249  }
250  else{
251  // Do paginating
252  unsigned int page = ( lv->max_elements > 0 ) ? ( lv->selected / lv->max_elements ) : 0;
253  offset = page * lv->max_elements;
254  if ( page != lv->cur_page ) {
255  lv->cur_page = page;
256  lv->rchanged = TRUE;
257  }
258  // Set the position
259  //scrollbar_set_handle ( lv->scrollbar, page * lv->max_elements );
260  }
261  return offset;
262 }
263 
264 static unsigned int scroll_continious ( listview *lv )
265 {
266  unsigned int middle = ( lv->max_rows - ( ( lv->max_rows & 1 ) == 0 ) ) / 2;
267  unsigned int offset = 0;
268  if ( lv->selected > middle ) {
269  if ( lv->selected < ( lv->req_elements - ( lv->max_rows - middle ) ) ) {
270  offset = lv->selected - middle;
271  }
272  // Don't go below zero.
273  else if ( lv->req_elements > lv->max_rows ) {
274  offset = lv->req_elements - lv->max_rows;
275  }
276  }
277  if ( offset != lv->cur_page ) {
278  //scrollbar_set_handle ( lv->scrollbar, offset );
279  lv->cur_page = offset;
280  lv->rchanged = TRUE;
281  }
282  return offset;
283 }
284 
285 static void update_element ( listview *lv, unsigned int tb, unsigned int index, gboolean full )
286 {
287  // Select drawing mode
288  TextBoxFontType type = ( index & 1 ) == 0 ? NORMAL : ALT;
289  type = ( index ) == lv->selected ? HIGHLIGHT : type;
290 
291  if ( lv->boxes[tb].index ) {
292  if ( index < 10 ) {
293  char str[2] = {
294  ( ( index + 1 ) % 10 ) + '0',
295  '\0'
296  };
297  textbox_text ( lv->boxes[tb].index, str );
298  }
299  else {
300  textbox_text ( lv->boxes[tb].index, " " );
301  }
302  }
303  if ( lv->callback ) {
304  lv->callback ( lv->boxes[tb].textbox, lv->boxes[tb].icon, index, lv->udata, &type, full );
305  listview_set_state ( lv->boxes[tb], type );
306  }
307 }
308 
309 static void barview_draw ( widget *wid, cairo_t *draw )
310 {
311  unsigned int offset = 0;
312  listview *lv = (listview *) wid;
313  offset = scroll_per_page_barview ( lv );
314  lv->last_offset = offset;
315  int spacing_hori = distance_get_pixel ( lv->spacing, ROFI_ORIENTATION_HORIZONTAL );
316 
317  int left_offset = widget_padding_get_left ( wid );
318  int right_offset = lv->widget.w - widget_padding_get_right ( wid );
319  int top_offset = widget_padding_get_top ( wid );
320  if ( lv->cur_elements > 0 ) {
321  // Set new x/y position.
322  unsigned int max = MIN ( lv->cur_elements, lv->req_elements - offset );
323  if ( lv->rchanged ) {
324  int first = TRUE;
325  int width = lv->widget.w;
326  lv->barview.cur_visible = 0;
327  width -= widget_padding_get_padding_width ( wid );
328  if ( lv->barview.direction == LEFT_TO_RIGHT ) {
329  for ( unsigned int i = 0; i < max && width > 0; i++ ) {
330  update_element ( lv, i, i + offset, TRUE );
331  int twidth = widget_get_desired_width ( WIDGET ( lv->boxes[i].box ) );
332  if ( twidth >= width ) {
333  if ( !first ) {
334  break;
335  }
336  twidth = width;
337  }
338  widget_move ( WIDGET ( lv->boxes[i].box ), left_offset, top_offset );
339  widget_resize ( WIDGET ( lv->boxes[i].box ), twidth, lv->element_height );
340 
341  widget_draw ( WIDGET ( lv->boxes[i].box ), draw );
342  width -= twidth + spacing_hori;
343  left_offset += twidth + spacing_hori;
344  first = FALSE;
345  lv->barview.cur_visible++;
346  }
347  }
348  else {
349  for ( unsigned int i = 0; i < lv->cur_elements && width > 0 && i <= offset; i++ ) {
350  update_element ( lv, i, offset - i, TRUE );
351  int twidth = widget_get_desired_width ( WIDGET ( lv->boxes[i].box ) );
352  if ( twidth >= width ) {
353  if ( !first ) {
354  break;
355  }
356  twidth = width;
357  }
358  right_offset -= twidth;
359  widget_move ( WIDGET ( lv->boxes[i].box ), right_offset, top_offset );
360  widget_resize ( WIDGET ( lv->boxes[i].box ), twidth, lv->element_height );
361 
362  widget_draw ( WIDGET ( lv->boxes[i].box ), draw );
363  width -= twidth + spacing_hori;
364  right_offset -= spacing_hori;
365  first = FALSE;
366  lv->barview.cur_visible++;
367  }
368  offset -= lv->barview.cur_visible - 1;
369  lv->last_offset = offset;
370  for ( unsigned int i = 0; i < ( lv->barview.cur_visible / 2 ); i++ ) {
371  _listview_row temp = lv->boxes[i];
372  int sw = lv->barview.cur_visible - i - 1;
373  lv->boxes[i] = lv->boxes[sw];
374  lv->boxes[sw] = temp;
375  }
376  }
377  lv->rchanged = FALSE;
378  }
379  else {
380  for ( unsigned int i = 0; i < lv->barview.cur_visible; i++ ) {
381  update_element ( lv, i, i + offset, TRUE );
382  widget_draw ( WIDGET ( lv->boxes[i].box ), draw );
383  }
384  }
385  }
386 }
387 
388 static void listview_draw ( widget *wid, cairo_t *draw )
389 {
390  unsigned int offset = 0;
391  listview *lv = (listview *) wid;
393  offset = scroll_continious ( lv );
394  }
395  else {
396  offset = scroll_per_page ( lv );
397  }
398  // Set these all together to make sure they update consistently.
401  if ( lv->reverse ) {
402  scrollbar_set_handle ( lv->scrollbar, lv->req_elements - lv->selected - 1 );
403  }
404  else {
406  }
407  lv->last_offset = offset;
408  int spacing_vert = distance_get_pixel ( lv->spacing, ROFI_ORIENTATION_VERTICAL );
409  int spacing_hori = distance_get_pixel ( lv->spacing, ROFI_ORIENTATION_HORIZONTAL );
410 
411  int left_offset = widget_padding_get_left ( wid );
412  int top_offset = widget_padding_get_top ( wid );
413  /*
414  if ( lv->scrollbar->widget.index == 0 ) {
415  left_offset += spacing_hori + lv->scrollbar->widget.w;
416  }
417  */
418  if ( lv->cur_elements > 0 && lv->max_rows > 0 ) {
419  // Set new x/y position.
420  unsigned int max = MIN ( lv->cur_elements, lv->req_elements - offset );
421  if ( lv->rchanged ) {
422  unsigned int width = lv->widget.w;
423  width -= widget_padding_get_padding_width ( wid );
424  if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) ) {
425  width -= spacing_hori;
426  width -= widget_get_width ( WIDGET ( lv->scrollbar ) );
427  }
428  unsigned int element_width = ( width - spacing_hori * ( lv->cur_columns - 1 ) ) / lv->cur_columns;
429 
430  int d = width - ( element_width + spacing_hori ) * ( lv->cur_columns - 1 ) - element_width;
431  if ( lv->cur_columns > 1 ) {
432  int diff = d / ( lv->cur_columns - 1 );
433  if ( diff >= 1 ) {
434  spacing_hori += 1;
435  d -= lv->cur_columns - 1;
436  }
437  }
438  for ( unsigned int i = 0; i < max; i++ ) {
439  unsigned int ex = left_offset + ( ( i ) / lv->max_rows ) * ( element_width + spacing_hori );
440 
441  if ( ( i ) / lv->max_rows == ( lv->cur_columns - 1 ) ) {
442  ex += d;
443  }
444  if ( lv->reverse ) {
445  unsigned int ey = wid->h - ( widget_padding_get_bottom ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert ) ) - lv->element_height;
446  widget_move ( WIDGET ( lv->boxes[i].box ), ex, ey );
447  widget_resize ( WIDGET ( lv->boxes[i].box ), element_width, lv->element_height );
448  }
449  else {
450  unsigned int ey = top_offset + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert );
451  widget_move ( WIDGET ( lv->boxes[i].box ), ex, ey );
452  widget_resize ( WIDGET ( lv->boxes[i].box ), element_width, lv->element_height );
453  }
454 
455  update_element ( lv, i, i + offset, TRUE );
456  widget_draw ( WIDGET ( lv->boxes[i].box ), draw );
457  }
458  lv->rchanged = FALSE;
459  }
460  else {
461  for ( unsigned int i = 0; i < max; i++ ) {
462  update_element ( lv, i, i + offset, TRUE );
463  widget_draw ( WIDGET ( lv->boxes[i].box ), draw );
464  }
465  }
466  }
467  widget_draw ( WIDGET ( lv->scrollbar ), draw );
468 }
470 
471 static void _listview_draw ( widget *wid, cairo_t *draw )
472 {
473  listview *lv = (listview *) wid;
474  if ( lv->type == LISTVIEW ) {
475  listview_draw ( wid, draw );
476  }
477  else {
478  barview_draw ( wid, draw );
479  }
480 }
485 {
486  unsigned int newne = 0;
487  if ( lv->max_rows == 0 ) {
488  return;
489  }
490  if ( !( lv->fixed_columns ) && lv->req_elements < lv->max_elements ) {
491  newne = lv->req_elements;
492  lv->cur_columns = ( lv->req_elements + ( lv->max_rows - 1 ) ) / lv->max_rows;
493  }
494  else {
495  newne = MIN ( lv->req_elements, lv->max_elements );
496  lv->cur_columns = lv->menu_columns;
497  }
498  for ( unsigned int i = newne; i < lv->cur_elements; i++ ) {
499  widget_free ( WIDGET ( lv->boxes[i].box ) );
500  }
501  lv->boxes = g_realloc ( lv->boxes, newne * sizeof ( _listview_row ) );
502  if ( newne > 0 ) {
503  for ( unsigned int i = lv->cur_elements; i < newne; i++ ) {
504  listview_create_row ( lv, &( lv->boxes[i] ) );
506  listview_set_state ( lv->boxes[i], NORMAL );
507  }
508  }
509  lv->rchanged = TRUE;
510  lv->cur_elements = newne;
511 }
512 
513 void listview_set_num_elements ( listview *lv, unsigned int rows )
514 {
515  if ( lv == NULL ) {
516  return;
517  }
518  TICK_N ( __FUNCTION__ );
519  lv->req_elements = rows;
520  listview_set_selected ( lv, lv->selected );
521  TICK_N ( "Set selected" );
523  TICK_N ( "recompute elements" );
524  widget_queue_redraw ( WIDGET ( lv ) );
525  TICK_N ( "queue redraw" );
526 }
527 
528 unsigned int listview_get_selected ( listview *lv )
529 {
530  if ( lv != NULL ) {
531  return lv->selected;
532  }
533  return 0;
534 }
535 
536 void listview_set_selected ( listview *lv, unsigned int selected )
537 {
538  if ( lv && lv->req_elements > 0 ) {
539  lv->selected = MIN ( selected, lv->req_elements - 1 );
541  widget_queue_redraw ( WIDGET ( lv ) );
542  }
543 }
544 
545 static void listview_resize ( widget *wid, short w, short h )
546 {
547  listview *lv = (listview *) wid;
548  lv->widget.w = MAX ( 0, w );
549  lv->widget.h = MAX ( 0, h );
550  int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET ( lv ) );
551  int spacing_vert = distance_get_pixel ( lv->spacing, ROFI_ORIENTATION_VERTICAL );
552  lv->max_rows = ( spacing_vert + height ) / ( lv->element_height + spacing_vert );
553  lv->max_elements = lv->max_rows * lv->menu_columns;
554 
555  widget_move ( WIDGET ( lv->scrollbar ),
557  widget_padding_get_top ( WIDGET ( lv ) ) );
558 
559  widget_resize ( WIDGET ( lv->scrollbar ), widget_get_width ( WIDGET ( lv->scrollbar ) ), height );
560 
561  if ( lv->type == BARVIEW ) {
562  lv->max_elements = lv->menu_lines;
563  }
564 
566  widget_queue_redraw ( wid );
567 }
568 
569 static widget *listview_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y )
570 {
571  widget *target = NULL;
572  gint rx, ry;
573  listview *lv = (listview *) wid;
574  if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) && widget_intersect ( WIDGET ( lv->scrollbar ), x, y ) ) {
575  rx = x - widget_get_x_pos ( WIDGET ( lv->scrollbar ) );
576  ry = y - widget_get_y_pos ( WIDGET ( lv->scrollbar ) );
577  target = widget_find_mouse_target ( WIDGET ( lv->scrollbar ), type, rx, ry );
578  }
579 
580  unsigned int max = MIN ( lv->cur_elements, lv->req_elements - lv->last_offset );
581  unsigned int i;
582  for ( i = 0; i < max && target == NULL; i++ ) {
583  widget *w = WIDGET ( lv->boxes[i].box );
584  if ( widget_intersect ( w, x, y ) ) {
585  rx = x - widget_get_x_pos ( w );
586  ry = y - widget_get_y_pos ( w );
587  target = widget_find_mouse_target ( w, type, rx, ry );
588  }
589  }
590 
591  return target;
592 }
593 
594 static WidgetTriggerActionResult listview_trigger_action ( widget *wid, MouseBindingListviewAction action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data )
595 {
596  listview *lv = (listview *) wid;
597  switch ( action )
598  {
599  case SCROLL_LEFT:
600  listview_nav_left ( lv );
601  break;
602  case SCROLL_RIGHT:
603  listview_nav_right ( lv );
604  break;
605  case SCROLL_DOWN:
606  listview_nav_down ( lv );
607  break;
608  case SCROLL_UP:
609  listview_nav_up ( lv );
610  break;
611  }
613 }
614 
615 static WidgetTriggerActionResult listview_element_trigger_action ( widget *wid, MouseBindingListviewElementAction action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, void *user_data )
616 {
617  listview *lv = (listview *) user_data;
618  unsigned int max = MIN ( lv->cur_elements, lv->req_elements - lv->last_offset );
619  unsigned int i;
620  for ( i = 0; i < max && WIDGET ( lv->boxes[i].box ) != wid; i++ ) {
621  }
622  if ( i == max ) {
624  }
625 
626  gboolean custom = FALSE;
627  switch ( action )
628  {
630  listview_set_selected ( lv, lv->last_offset + i );
631  break;
633  custom = TRUE;
634  /* FALLTHRU */
636  listview_set_selected ( lv, lv->last_offset + i );
637  lv->mouse_activated ( lv, custom, lv->mouse_activated_data );
638  break;
639  }
641 }
642 
643 listview *listview_create ( widget *parent, const char *name, listview_update_callback cb, void *udata, unsigned int eh, gboolean reverse )
644 {
645  listview *lv = g_malloc0 ( sizeof ( listview ) );
646  widget_init ( WIDGET ( lv ), parent, WIDGET_TYPE_LISTVIEW, name );
647  lv->listview_name = g_strdup ( name );
648  lv->widget.free = listview_free;
650  lv->widget.draw = _listview_draw;
654  lv->eh = eh;
655 
656  lv->emode = PANGO_ELLIPSIZE_END;
657  lv->scrollbar = scrollbar_create ( WIDGET ( lv ), "scrollbar" );
658  // Calculate height of an element.
659  //
660  _listview_row row;
661  listview_create_row ( lv, &row );
662  // FIXME: hack to scale hight correctly.
663  if ( lv->eh > 1 && row.textbox ) {
664  char buff[lv->eh * 2 + 1];
665  memset ( buff, '\0', lv->eh * 2 + 1 );
666  for ( unsigned int i = 0; i < ( lv->eh - 1 ); i++ ) {
667  buff[i * 2] = 'a'; buff[i * 2 + 1] = '\n';
668  }
669  ;
670  textbox_text ( row.textbox, buff );
671  }
673  widget_free ( WIDGET ( row.box ) );
674 
675  lv->callback = cb;
676  lv->udata = udata;
677 
678  // Some settings.
679  lv->spacing = rofi_theme_get_distance ( WIDGET ( lv ), "spacing", DEFAULT_SPACING );
680  lv->menu_columns = rofi_theme_get_integer ( WIDGET ( lv ), "columns", config.menu_columns );
681  lv->fixed_num_lines = rofi_theme_get_boolean ( WIDGET ( lv ), "fixed-height", config.fixed_num_lines );
682  lv->dynamic = rofi_theme_get_boolean ( WIDGET ( lv ), "dynamic", TRUE );
683  lv->reverse = rofi_theme_get_boolean ( WIDGET ( lv ), "reverse", reverse );
684  lv->cycle = rofi_theme_get_boolean ( WIDGET ( lv ), "cycle", config.cycle );
685  lv->fixed_columns = rofi_theme_get_boolean ( WIDGET ( lv ), "fixed-columns", FALSE );
686 
688  if ( lv->type == LISTVIEW ) {
689  listview_set_show_scrollbar ( lv, rofi_theme_get_boolean ( WIDGET ( lv ), "scrollbar", FALSE ) );
690  }
691  else {
692  listview_set_show_scrollbar ( lv, FALSE );
693  }
694  return lv;
695 }
696 
701 static void listview_nav_up_int ( listview *lv )
702 {
703  if ( lv == NULL ) {
704  return;
705  }
706  if ( lv->req_elements == 0 || ( lv->selected == 0 && !lv->cycle ) ) {
707  return;
708  }
709  if ( lv->selected == 0 ) {
710  lv->selected = lv->req_elements;
711  }
712  lv->selected--;
714  widget_queue_redraw ( WIDGET ( lv ) );
715 }
716 static void listview_nav_down_int ( listview *lv )
717 {
718  if ( lv == NULL ) {
719  return;
720  }
721  if ( lv->req_elements == 0 || ( lv->selected == ( lv->req_elements - 1 ) && !lv->cycle ) ) {
722  return;
723  }
724  lv->selected = lv->selected < lv->req_elements - 1 ? MIN ( lv->req_elements - 1, lv->selected + 1 ) : 0;
726  widget_queue_redraw ( WIDGET ( lv ) );
727 }
728 
730 {
731  if ( lv == NULL ) {
732  return;
733  }
734  if ( lv->reverse ) {
735  listview_nav_down_int ( lv );
736  }
737  else {
738  listview_nav_up_int ( lv );
739  }
740 }
742 {
743  if ( lv == NULL ) {
744  return;
745  }
746  if ( lv->reverse ) {
747  listview_nav_up_int ( lv );
748  }
749  else {
750  listview_nav_down_int ( lv );
751  }
752 }
753 
755 {
756  if ( lv == NULL ) {
757  return;
758  }
759  if ( lv->type == BARVIEW ) {
760  listview_nav_up_int ( lv );
761  return;
762  }
763  if ( lv->selected >= lv->max_rows ) {
764  lv->selected -= lv->max_rows;
765  widget_queue_redraw ( WIDGET ( lv ) );
766  }
767 }
769 {
770  if ( lv == NULL ) {
771  return;
772  }
773  if ( lv->type == BARVIEW ) {
774  listview_nav_down_int ( lv );
775  return;
776  }
777  if ( ( lv->selected + lv->max_rows ) < lv->req_elements ) {
778  lv->selected += lv->max_rows;
779  widget_queue_redraw ( WIDGET ( lv ) );
780  }
781  else if ( lv->selected < ( lv->req_elements - 1 ) ) {
782  // We do not want to move to last item, UNLESS the last column is only
783  // partially filled, then we still want to move column and select last entry.
784  // First check the column we are currently in.
785  int col = lv->selected / lv->max_rows;
786  // Check total number of columns.
787  int ncol = lv->req_elements / lv->max_rows;
788  // If there is an extra column, move.
789  if ( col != ncol ) {
790  lv->selected = lv->req_elements - 1;
791  widget_queue_redraw ( WIDGET ( lv ) );
792  }
793  }
794 }
795 
797 {
798  if ( lv == NULL ) {
799  return;
800  }
801  if ( lv->type == BARVIEW ) {
802  if ( lv->last_offset == 0 ) {
803  lv->selected = 0;
804  }
805  else {
806  lv->selected = lv->last_offset - 1;
807  }
809  widget_queue_redraw ( WIDGET ( lv ) );
810  return;
811  }
812 
813  if ( lv->selected < lv->max_elements ) {
814  lv->selected = 0;
815  }
816  else{
817  lv->selected -= ( lv->max_elements );
818  }
819  widget_queue_redraw ( WIDGET ( lv ) );
820 }
822 {
823  if ( lv == NULL ) {
824  return;
825  }
826  if ( lv->req_elements == 0 ) {
827  return;
828  }
829  if ( lv->type == BARVIEW ) {
830  unsigned int new = lv->last_offset + lv->barview.cur_visible;
831  lv->selected = MIN ( new, lv->req_elements - 1 );
833 
834  widget_queue_redraw ( WIDGET ( lv ) );
835  return;
836  }
837  lv->selected += ( lv->max_elements );
838  if ( lv->selected >= lv->req_elements ) {
839  lv->selected = lv->req_elements - 1;
840  }
841  widget_queue_redraw ( WIDGET ( lv ) );
842 }
843 
845 {
846  if ( lv == NULL ) {
847  return;
848  }
849  if ( lv->reverse ) {
851  }
852  else {
854  }
855 }
857 {
858  if ( lv == NULL ) {
859  return;
860  }
861  if ( lv->reverse ) {
863  }
864  else {
866  }
867 }
868 
870 {
871  listview *lv = (listview *) wid;
872  if ( lv == NULL || lv->widget.enabled == FALSE ) {
873  return 0;
874  }
876  int h = lv->menu_lines;
877  if ( !( lv->fixed_num_lines ) ) {
878  if ( lv->dynamic ) {
879  h = MIN ( lv->menu_lines, lv->req_elements );
880  }
881  else {
882  h = MIN ( lv->menu_lines, lv->max_displayed_lines );
883  }
884  }
885  if ( lv->type == BARVIEW ) {
886  h = MIN ( h, 1 );
887  }
888  if ( h == 0 ) {
889  if ( lv->dynamic && !lv->fixed_num_lines ) {
890  // Hide widget fully.
891  return 0;
892  }
893  return widget_padding_get_padding_height ( WIDGET ( lv ) );
894  }
895  int height = widget_padding_get_padding_height ( WIDGET ( lv ) );
896  height += h * ( lv->element_height + spacing ) - spacing;
897  return height;
898 }
899 
900 void listview_set_show_scrollbar ( listview *lv, gboolean enabled )
901 {
902  if ( lv ) {
903  if ( enabled ) {
904  widget_enable ( WIDGET ( lv->scrollbar ) );
905  }
906  else {
907  widget_disable ( WIDGET ( lv->scrollbar ) );
908  }
910  }
911 }
912 
914 {
915  if ( lv ) {
916  lv->scroll_type = type;
917  }
918 }
919 
921 {
922  if ( lv ) {
923  lv->mouse_activated = cb;
924  lv->mouse_activated_data = udata;
925  }
926 }
927 void listview_set_multi_select ( listview *lv, gboolean enable )
928 {
929  if ( lv ) {
930  lv->multi_select = enable;
931  }
932 }
933 void listview_set_num_lines ( listview *lv, unsigned int num_lines )
934 {
935  if ( lv ) {
936  lv->menu_lines = num_lines;
937  }
938 }
939 
940 unsigned int listview_get_num_lines ( listview *lv )
941 {
942  if ( lv ) {
943  return lv->menu_lines;
944  }
945  return 0;
946 }
947 void listview_set_max_lines ( listview *lv, unsigned int max_lines )
948 {
949  if ( lv ) {
950  lv->max_displayed_lines = max_lines;
951  }
952 }
953 
955 {
956  if ( lv ) {
957  return lv->fixed_num_lines;
958  }
959  return FALSE;
960 }
962 {
963  if ( lv ) {
964  lv->fixed_num_lines = TRUE;
965  }
966 }
967 
969 {
970  if ( lv ) {
971  lv->emode = PANGO_ELLIPSIZE_START;
972  for ( unsigned int i = 0; i < lv->cur_elements; i++ ) {
973  textbox_set_ellipsize ( lv->boxes[i].textbox, lv->emode );
974  }
975  }
976 }
977 
979 {
980  if ( lv ) {
981  PangoEllipsizeMode mode = lv->emode;
982  if ( mode == PANGO_ELLIPSIZE_START ) {
983  mode = PANGO_ELLIPSIZE_MIDDLE;
984  }
985  else if ( mode == PANGO_ELLIPSIZE_MIDDLE ) {
986  mode = PANGO_ELLIPSIZE_END;
987  }
988  else if ( mode == PANGO_ELLIPSIZE_END ) {
989  mode = PANGO_ELLIPSIZE_START;
990  }
991  lv->emode = mode;
992  for ( unsigned int i = 0; i < lv->cur_elements; i++ ) {
993  textbox_set_ellipsize ( lv->boxes[i].textbox, mode );
994  }
995  }
996 }
_scrollbar
Definition: scrollbar.h:44
listview_nav_up_int
static void listview_nav_up_int(listview *lv)
Definition: listview.c:701
WIDGET
#define WIDGET(a)
Definition: widget.h:115
listview_update_callback
void(* listview_update_callback)(textbox *tb, icon *ico, unsigned int entry, void *udata, TextBoxFontType *type, gboolean full)
Definition: listview.h:64
listview_toggle_ellipsizing
void listview_toggle_ellipsizing(listview *lv)
Definition: listview.c:978
WidgetType
WidgetType
Definition: widget.h:57
_listview::fixed_columns
gboolean fixed_columns
Definition: listview.c:90
WIDGET_TYPE_LISTVIEW
@ WIDGET_TYPE_LISTVIEW
Definition: widget.h:61
_listview::type
RofiOrientation type
Definition: listview.c:74
widget_set_trigger_action_handler
void widget_set_trigger_action_handler(widget *wid, widget_trigger_action_cb cb, void *cb_data)
Definition: widget.c:462
_listview::listview_name
char * listview_name
Definition: listview.c:120
_listview::cur_elements
unsigned int cur_elements
Definition: listview.c:93
_widget::enabled
gboolean enabled
Definition: widget-internal.h:58
ACTIVE
@ ACTIVE
Definition: textbox.h:110
DEFAULT_SPACING
#define DEFAULT_SPACING
Definition: listview.c:43
listview_nav_up
void listview_nav_up(listview *lv)
Definition: listview.c:729
LISTVIEW_SCROLL_CONTINIOUS
@ LISTVIEW_SCROLL_CONTINIOUS
Definition: listview.h:52
_listview::dynamic
unsigned int dynamic
Definition: listview.c:100
listview_nav_page_prev
void listview_nav_page_prev(listview *lv)
Definition: listview.c:844
settings.h
listview_set_num_elements
void listview_set_num_elements(listview *lv, unsigned int rows)
Definition: listview.c:513
listview_nav_down_int
static void listview_nav_down_int(listview *lv)
Definition: listview.c:716
_listview::emode
PangoEllipsizeMode emode
Definition: listview.c:122
scroll_continious
static unsigned int scroll_continious(listview *lv)
Definition: listview.c:264
_listview::max_rows
unsigned int max_rows
Definition: listview.c:86
listview_create
listview * listview_create(widget *parent, const char *name, listview_update_callback cb, void *udata, unsigned int eh, gboolean reverse)
Definition: listview.c:643
_listview::callback
listview_update_callback callback
Definition: listview.c:111
_listview::rchanged
unsigned int rchanged
Definition: listview.c:78
ROFI_ORIENTATION_VERTICAL
@ ROFI_ORIENTATION_VERTICAL
Definition: rofi-types.h:139
_listview::cur_visible
unsigned int cur_visible
Definition: listview.c:127
listview_trigger_action
static WidgetTriggerActionResult listview_trigger_action(widget *wid, MouseBindingListviewAction action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data)
Definition: listview.c:594
_listview::boxes
_listview_row * boxes
Definition: listview.c:108
textbox_text
void textbox_text(textbox *tb, const char *text)
Definition: textbox.c:312
listview_set_scroll_type
void listview_set_scroll_type(listview *lv, ScrollType type)
Definition: listview.c:913
listview_find_mouse_target
static widget * listview_find_mouse_target(widget *wid, WidgetType type, gint x, gint y)
Definition: listview.c:569
NORMAL
@ NORMAL
Definition: textbox.h:106
_listview::barview
struct _listview::@2 barview
distance_get_pixel
int distance_get_pixel(RofiDistance d, RofiOrientation ori)
Definition: theme.c:1026
listview_get_num_lines
unsigned int listview_get_num_lines(listview *lv)
Definition: listview.c:940
box_create
box * box_create(widget *parent, const char *name, RofiOrientation type)
Definition: box.c:343
_widget::get_desired_height
int(* get_desired_height)(struct _widget *)
Definition: widget-internal.h:81
rofi_theme_get_distance
RofiDistance rofi_theme_get_distance(const widget *widget, const char *property, int def)
Definition: theme.c:763
update_element
static void update_element(listview *lv, unsigned int tb, unsigned int index, gboolean full)
Definition: listview.c:285
rofi_theme_get_boolean
int rofi_theme_get_boolean(const widget *widget, const char *property, int def)
Definition: theme.c:785
_listview::max_elements
unsigned int max_elements
Definition: listview.c:87
widget_disable
static void widget_disable(widget *widget)
Definition: widget.h:175
HIGHLIGHT
@ HIGHLIGHT
Definition: textbox.h:119
widget_get_width
int widget_get_width(widget *widget)
Definition: widget.c:362
listview_theme_prop_names
const char *const listview_theme_prop_names[][3]
Definition: listview.c:135
TB_AUTOHEIGHT
@ TB_AUTOHEIGHT
Definition: textbox.h:92
_listview::direction
MoveDirection direction
Definition: listview.c:126
_listview::eh
unsigned int eh
Definition: listview.c:101
widget_enable
static void widget_enable(widget *widget)
Definition: widget.h:185
_icon
Definition: icon.c:41
_listview::selected
unsigned int selected
Definition: listview.c:83
RIGHT_TO_LEFT
@ RIGHT_TO_LEFT
Definition: listview.c:59
widget_padding_get_bottom
int widget_padding_get_bottom(const widget *wid)
Definition: widget.c:512
rofi_theme_get_integer
int rofi_theme_get_integer(const widget *widget, const char *property, int def)
Definition: theme.c:747
scrollbar_create
scrollbar * scrollbar_create(widget *parent, const char *name)
Definition: scrollbar.c:103
widget_find_mouse_target
widget * widget_find_mouse_target(widget *wid, WidgetType type, gint x, gint y)
Definition: widget.c:433
listview_set_show_scrollbar
void listview_set_show_scrollbar(listview *lv, gboolean enabled)
Definition: listview.c:900
box_add
void box_add(box *box, widget *child, gboolean expand)
Definition: box.c:283
_listview::cur_page
unsigned int cur_page
Definition: listview.c:81
widget_set_state
void widget_set_state(widget *widget, const char *state)
Definition: widget.c:93
widget_padding_get_right
int widget_padding_get_right(const widget *wid)
Definition: widget.c:492
listview_nav_page_prev_int
static void listview_nav_page_prev_int(listview *lv)
Definition: listview.c:796
listview_recompute_elements
static void listview_recompute_elements(listview *lv)
Definition: listview.c:484
listview.h
listview_set_mouse_activated_cb
void listview_set_mouse_activated_cb(listview *lv, listview_mouse_activated_cb cb, void *udata)
Definition: listview.c:920
_widget::draw
void(* draw)(struct _widget *widget, cairo_t *draw)
Definition: widget-internal.h:72
_listview::scrollbar
scrollbar * scrollbar
Definition: listview.c:109
rofi_theme_get_orientation
RofiOrientation rofi_theme_get_orientation(const widget *widget, const char *property, RofiOrientation def)
Definition: theme.c:801
_listview::last_click
xcb_timestamp_t last_click
Definition: listview.c:116
listview_nav_page_next_int
static void listview_nav_page_next_int(listview *lv)
Definition: listview.c:821
timings.h
ScrollType
ScrollType
Definition: listview.h:48
theme.h
flags
MenuFlags flags
Definition: view.c:108
box.h
listview_nav_right
void listview_nav_right(listview *lv)
Definition: listview.c:768
widget_free
void widget_free(widget *wid)
Definition: widget.c:339
widget_set_type
void widget_set_type(widget *widget, WidgetType type)
Definition: widget.c:148
listview_set_num_lines
void listview_set_num_lines(listview *lv, unsigned int num_lines)
Definition: listview.c:933
RofiDistance
Definition: rofi-types.h:127
_widget::free
void(* free)(struct _widget *widget)
Definition: widget-internal.h:94
rofi_theme_get_list
GList * rofi_theme_get_list(const widget *widget, const char *property, const char *defaults)
Definition: theme.c:906
_widget::trigger_action
widget_trigger_action_cb trigger_action
Definition: widget-internal.h:89
widget_get_desired_width
int widget_get_desired_width(widget *wid)
Definition: widget.c:562
_listview_draw
static void _listview_draw(widget *wid, cairo_t *draw)
Definition: listview.c:471
_listview::reverse
unsigned int reverse
Definition: listview.c:102
scrollbar_set_handle_length
void scrollbar_set_handle_length(scrollbar *sb, unsigned int pos_length)
Definition: scrollbar.c:147
listview_set_ellipsize_start
void listview_set_ellipsize_start(listview *lv)
Definition: listview.c:968
listview_get_selected
unsigned int listview_get_selected(listview *lv)
Definition: listview.c:528
widget_queue_redraw
void widget_queue_redraw(widget *wid)
Definition: widget.c:408
barview_draw
static void barview_draw(widget *wid, cairo_t *draw)
Definition: listview.c:309
SELECT_HOVERED_ENTRY
@ SELECT_HOVERED_ENTRY
Definition: keyb.h:159
scroll_per_page_barview
static unsigned int scroll_per_page_barview(listview *lv)
Definition: listview.c:225
TICK_N
#define TICK_N(a)
Definition: timings.h:69
icon_create
icon * icon_create(widget *parent, const char *name)
Definition: icon.c:139
widget.h
listview_get_desired_height
static int listview_get_desired_height(widget *wid)
Definition: listview.c:869
BARVIEW
#define BARVIEW
Definition: listview.c:51
SCROLL_UP
@ SCROLL_UP
Definition: keyb.h:151
listview_set_state
static void listview_set_state(_listview_row r, TextBoxFontType tbft)
Definition: listview.c:144
ACCEPT_HOVERED_CUSTOM
@ ACCEPT_HOVERED_CUSTOM
Definition: keyb.h:161
widget_padding_get_top
int widget_padding_get_top(const widget *wid)
Definition: widget.c:502
Settings::fixed_num_lines
unsigned int fixed_num_lines
Definition: settings.h:111
STATE_MASK
@ STATE_MASK
Definition: textbox.h:123
_listview::element_height
unsigned int element_height
Definition: listview.c:85
URGENT
@ URGENT
Definition: textbox.h:108
listview_mouse_activated_cb
void(* listview_mouse_activated_cb)(listview *, gboolean, void *)
Definition: listview.h:69
Settings::cycle
unsigned int cycle
Definition: settings.h:137
widget_intersect
int widget_intersect(const widget *widget, int x, int y)
Definition: widget.c:110
icon.h
_listview::req_elements
unsigned int req_elements
Definition: listview.c:92
_listview_row::icon
icon * icon
Definition: listview.c:67
widget_get_x_pos
int widget_get_x_pos(widget *widget)
Definition: widget.c:372
listview_add_widget
static void listview_add_widget(listview *lv, _listview_row *row, widget *wid, const char *label)
Definition: listview.c:168
listview_resize
static void listview_resize(widget *wid, short w, short h)
Definition: listview.c:545
FMOD_MASK
@ FMOD_MASK
Definition: textbox.h:121
_listview::udata
void * udata
Definition: listview.c:112
TextboxFlags
TextboxFlags
Definition: textbox.h:91
MoveDirection
MoveDirection
Definition: listview.c:57
listview_free
static void listview_free(widget *wid)
Definition: listview.c:213
SCROLL_RIGHT
@ SCROLL_RIGHT
Definition: keyb.h:149
listview_create_row
static void listview_create_row(listview *lv, _listview_row *row)
Definition: listview.c:195
_listview
Definition: listview.c:71
textbox_set_ellipsize
void textbox_set_ellipsize(textbox *tb, PangoEllipsizeMode mode)
Definition: textbox.c:945
_listview::mouse_activated
listview_mouse_activated_cb mouse_activated
Definition: listview.c:117
_listview::scroll_type
ScrollType scroll_type
Definition: listview.c:106
_box
Definition: box.c:42
listview_set_multi_select
void listview_set_multi_select(listview *lv, gboolean enable)
Definition: listview.c:927
widget_move
void widget_move(widget *widget, short x, short y)
Definition: widget.c:140
WIDGET_TYPE_LISTVIEW_ELEMENT
@ WIDGET_TYPE_LISTVIEW_ELEMENT
Definition: widget.h:63
scrollbar_set_max_value
void scrollbar_set_max_value(scrollbar *sb, unsigned int max)
Definition: scrollbar.c:133
listview_nav_page_next
void listview_nav_page_next(listview *lv)
Definition: listview.c:856
MouseBindingListviewElementAction
MouseBindingListviewElementAction
Definition: keyb.h:158
scrollbar_set_handle
void scrollbar_set_handle(scrollbar *sb, unsigned int pos)
Definition: scrollbar.c:140
SCROLL_DOWN
@ SCROLL_DOWN
Definition: keyb.h:150
_widget::h
short h
Definition: widget-internal.h:46
_listview_row::textbox
textbox * textbox
Definition: listview.c:65
widget_get_y_pos
int widget_get_y_pos(widget *widget)
Definition: widget.c:379
_listview_row
Definition: listview.c:63
listview_set_fixed_num_lines
void listview_set_fixed_num_lines(listview *lv)
Definition: listview.c:961
Settings::menu_columns
unsigned int menu_columns
Definition: settings.h:70
widget_init
void widget_init(widget *wid, widget *parent, WidgetType type, const char *name)
Definition: widget.c:74
_widget::w
short w
Definition: widget-internal.h:44
TB_INDICATOR
@ TB_INDICATOR
Definition: textbox.h:98
TextBoxFontType
TextBoxFontType
Definition: textbox.h:104
listview_set_max_lines
void listview_set_max_lines(listview *lv, unsigned int max_lines)
Definition: listview.c:947
widget_draw
void widget_draw(widget *widget, cairo_t *d)
Definition: widget.c:185
scroll_per_page
static unsigned int scroll_per_page(listview *lv)
Definition: listview.c:241
_listview_row::box
box * box
Definition: listview.c:64
_listview::mouse_activated_data
void * mouse_activated_data
Definition: listview.c:118
SCROLL_LEFT
@ SCROLL_LEFT
Definition: keyb.h:148
listview_draw
static void listview_draw(widget *wid, cairo_t *draw)
Definition: listview.c:388
listview_get_fixed_num_lines
gboolean listview_get_fixed_num_lines(listview *lv)
Definition: listview.c:954
_listview::multi_select
gboolean multi_select
Definition: listview.c:104
_listview::cur_columns
unsigned int cur_columns
Definition: listview.c:91
ALT
@ ALT
Definition: textbox.h:117
LISTVIEW
#define LISTVIEW
Definition: listview.c:49
listview_nav_left
void listview_nav_left(listview *lv)
Definition: listview.c:754
textbox
Definition: textbox.h:62
textbox.h
_listview_row::index
textbox * index
Definition: listview.c:66
_widget::find_mouse_target
widget_find_mouse_target_cb find_mouse_target
Definition: widget-internal.h:87
LEFT_TO_RIGHT
@ LEFT_TO_RIGHT
Definition: listview.c:58
_listview::spacing
RofiDistance spacing
Definition: listview.c:95
widget_padding_get_left
int widget_padding_get_left(const widget *wid)
Definition: widget.c:482
_widget::resize
void(* resize)(struct _widget *, short, short)
Definition: widget-internal.h:74
widget_get_desired_height
int widget_get_desired_height(widget *wid)
Definition: widget.c:552
Settings::show_icons
gboolean show_icons
Definition: settings.h:81
_listview::max_displayed_lines
unsigned int max_displayed_lines
Definition: listview.c:97
_listview::widget
widget widget
Definition: listview.c:72
_listview::menu_columns
unsigned int menu_columns
Definition: listview.c:98
widget_resize
void widget_resize(widget *widget, short w, short h)
Definition: widget.c:123
WIDGET_TRIGGER_ACTION_RESULT_HANDLED
@ WIDGET_TRIGGER_ACTION_RESULT_HANDLED
Definition: widget.h:82
config
Settings config
_listview::last_offset
unsigned int last_offset
Definition: listview.c:82
WIDGET_TRIGGER_ACTION_RESULT_IGNORED
@ WIDGET_TRIGGER_ACTION_RESULT_IGNORED
Definition: widget.h:80
ROFI_ORIENTATION_HORIZONTAL
@ ROFI_ORIENTATION_HORIZONTAL
Definition: rofi-types.h:140
listview_set_selected
void listview_set_selected(listview *lv, unsigned int selected)
Definition: listview.c:536
ACCEPT_HOVERED_ENTRY
@ ACCEPT_HOVERED_ENTRY
Definition: keyb.h:160
RofiOrientation
RofiOrientation
Definition: rofi-types.h:138
widget_enabled
gboolean widget_enabled(widget *widget)
Definition: widget.c:164
_listview::cycle
gboolean cycle
Definition: listview.c:103
_listview::menu_lines
unsigned int menu_lines
Definition: listview.c:96
listview_nav_down
void listview_nav_down(listview *lv)
Definition: listview.c:741
widget_padding_get_padding_width
int widget_padding_get_padding_width(const widget *wid)
Definition: widget.c:544
widget_padding_get_padding_height
int widget_padding_get_padding_height(const widget *wid)
Definition: widget.c:537
_widget
Definition: widget-internal.h:36
WidgetTriggerActionResult
WidgetTriggerActionResult
Definition: widget.h:78
listview_element_trigger_action
static WidgetTriggerActionResult listview_element_trigger_action(widget *wid, MouseBindingListviewElementAction action, gint x, gint y, void *user_data)
_listview::fixed_num_lines
unsigned int fixed_num_lines
Definition: listview.c:99
MouseBindingListviewAction
MouseBindingListviewAction
Definition: keyb.h:147
scrollbar.h
_listview::scrollbar_scroll
gboolean scrollbar_scroll
Definition: listview.c:114
WIDGET_TYPE_TEXTBOX_TEXT
@ WIDGET_TYPE_TEXTBOX_TEXT
Definition: widget.h:71
textbox_create
textbox * textbox_create(widget *parent, WidgetType type, const char *name, TextboxFlags flags, TextBoxFontType tbft, const char *text, double xalign, double yalign)
Definition: textbox.c:162