libxputty 0.1
Loading...
Searching...
No Matches
Functions
xmultilistview_private.h File Reference

Go to the source code of this file.

Functions

void _draw_multi_listview (void *w_, void *user_data)
 _draw_multi_listview - draw listview on expose call
 
void _draw_multi_list (void *w_, void *user_data)
 _draw_multi_list - draw list on expose call
 
void _multi_list_motion (void *w_, void *xmotion_, void *user_data)
 _multi_list_motion - follow mouse pointer to set prelight item
 
void _multi_list_key_pressed (void *w_, void *xkey_, void *user_data)
 _multi_list_key_pressed - move listview or set active entry
 
void _multi_list_entry_released (void *w_, void *button_, void *user_data)
 _multi_list_entry_released - move listview or set active entry
 
void _multi_list_entry_double_clicked (void *w_, void *button_, void *user_data)
 _multi_list_entry_double_clicke - forward double click from list entry to list view
 
void _leave_multi_list (void *w_, void *user_data)
 _leave_multi_list - draw list on pointer leave
 
void _reconfigure_multi_listview_viewport (void *w_, void *user_data)
 _reconfigure_multi_listview_viewport - reconfigure the viewport adjustment on size changes
 
void _draw_multi_listviewslider (void *w_, void *user_data)
 _draw_multi_listviewslider - draw a slider on the viewport to indicate the view point
 
void _set_multi_listview_viewpoint (void *w_, void *user_data)
 _set_multi_listview_viewpoint - move the view_port to position
 
void _set_multi_listviewport (void *w_, void *user_data)
 _set_multi_listviewport - move the view_port to position by listviewslider state
 

Function Documentation

◆ _draw_multi_list()

void _draw_multi_list ( void *  w_,
void *  user_data 
)

_draw_multi_list - draw list on expose call

Parameters
*w_- the Widget_t to draw
*user_data- attached user_data

show label

Definition at line 51 of file xmultilistview_private.c.

51 {
52 Widget_t *w = (Widget_t*)w_;
53 Metrics_t metrics;
54 os_get_window_metrics(w, &metrics);
55 int width = metrics.width;
56 int height = metrics.height;
57 if (!metrics.visible) return;
59 if (!filelist->folder_scaled) return;
60
62 cairo_rectangle(w->crb, 0, 0, width, height);
63 cairo_fill (w->crb);
64 cairo_set_font_size (w->crb, w->app->normal_font * (0.5 +((filelist->scale_down/0.2)/2.0)));
65 cairo_text_extents_t extents;
66 cairo_text_extents_t fextents;
67 cairo_text_extents(w->crb,"Ay", &extents);
68 double h = extents.height/2.0;
69
70 int i = (int)max(0,adj_get_value(w->adj)*filelist->column);
71 int a = 0;
72 int j = filelist->list_size<filelist->show_items+i+filelist->column ?
73 filelist->list_size : filelist->show_items+i+filelist->column;
74 for(;i<j;i++) {
75 int k = 0;
76 for(;k<filelist->column;k++) {
77 if (filelist->check_dir) {
78 if (os_is_directory(filelist->list_names[i])) {
79 cairo_set_source_surface (w->crb, filelist->folder_scaled,
80 (filelist->icon_pos+(k*filelist->item_width)),
81 ((double)a+0.1)*filelist->item_height);
82 cairo_paint (w->crb);
83 } else {
84 cairo_set_source_surface (w->crb, filelist->file_scaled,
85 (filelist->icon_pos+(k*filelist->item_width)),
86 ((double)a+0.1)*filelist->item_height);
87 cairo_paint (w->crb);
88 }
89 }
90 int pos_y = (filelist->item_height*((double)a+1.0))+3.0 - h;
91 if (pos_y-h < height) {
93 if(i == filelist->prelight_item && i == filelist->active_item)
95 else if(i == filelist->prelight_item)
97 else if (i == filelist->active_item)
99 else
101
102 char label[124];
103 memset(label, '\0', sizeof(char)*124);
104 const char *ulabel = utf8_from_locale(basename(filelist->list_names[i]));
105 cairo_text_extents(w->crb, ulabel, &extents);
106 if (extents.width > filelist->item_width-10) {
107 int slen = strlen(ulabel);
108 int len = ((filelist->item_width-5)/(extents.width/slen));
109 _utf8cpy(label,ulabel, min(slen-4,len-3));
110 strcat(label,"...");
111 } else {
112 strcpy(label, ulabel);
113 }
114 free((void*)ulabel);
115 cairo_text_extents(w->crb, label, &fextents);
116 int pos_x = (k*filelist->item_width) + (filelist->item_width/2) - (fextents.width*0.5);
117 cairo_move_to (w->crb, pos_x, pos_y);
118 cairo_show_text(w->crb, label);
119 cairo_new_path (w->crb);
120 if (i == filelist->prelight_item && extents.width > (float)filelist->item_width-10) {
121 free(filelist->tooltip_text);
122 filelist->tooltip_text = NULL;
123 filelist->tooltip_text = utf8_from_locale(filelist->list_names[i]);
124 tooltip_set_text(w, filelist->tooltip_text);
125 w->flags |= HAS_TOOLTIP;
126 show_tooltip(w);
127 } else if (i == filelist->prelight_item && extents.width < (float)filelist->item_width-10){
128 w->flags &= ~HAS_TOOLTIP;
129 hide_tooltip(w);
130 }
131 }
132 if (k<filelist->column-1 && i<j-1) i++;
133 else break;
134 }
135 a++;
136 }
137}
Metrics_t - struct to receive window size, position & visibility Pass this struct to os_get_window_...
ViewMultiList_t - struct to hold information for the listview.
Widget_t - struct to hold the basic Widget_t info.
Definition xwidget.h:457
Adjustment_t * adj
Definition xwidget.h:497
cairo_t * crb
Definition xwidget.h:489
long long flags
Definition xwidget.h:461
void * parent_struct
Definition xwidget.h:473
Xputty * app
Definition xwidget.h:465
int normal_font
Definition xputty.h:248
float adj_get_value(Adjustment_t *adj)
adj_get_value - get the current value of the Adjustment_t
void use_text_color_scheme(Widget_t *w, Color_state st)
use_text_color_scheme - use text Colors to paint on Widget_t
Definition xcolor.c:266
void use_base_color_scheme(Widget_t *w, Color_state st)
use_base_color_scheme - use base Colors to paint on Widget_t
Definition xcolor.c:259
@ NORMAL_
Definition xcolor.h:44
@ INSENSITIVE_
Definition xcolor.h:48
@ SELECTED_
Definition xcolor.h:46
@ PRELIGHT_
Definition xcolor.h:45
@ ACTIVE_
Definition xcolor.h:47
char * _utf8cpy(char *dst, const char *src, size_t sizeDest)
void tooltip_set_text(Widget_t *w, const char *label)
tooltip_set_text - set a (new) text to a tooltip for Widget_t
Definition xtooltip.c:25
void os_get_window_metrics(Widget_t *w, Metrics_t *metrics)
os_get_window_metrics - Get the Merics_t struct related to a Widget_t
char * utf8_from_locale(char *localestr)
utf8_from_locale - convert active codepage to utf8 must be freed by the caller
bool os_is_directory(const char *filename)
os_is directory - check if a given path is a directory or a file
void show_tooltip(Widget_t *wid)
show_tooltip - check if a Widget_t have a tooltip, and show it, if a tooltip is available.
Definition xwidget.c:419
@ HAS_TOOLTIP
Definition xwidget.h:404
void hide_tooltip(Widget_t *wid)
hide_tooltip - check if a Widget_t have a tooltip, and hide it, if a tooltip is mapped.
Definition xwidget.c:430

References _utf8cpy(), ACTIVE_, ViewMultiList_t::active_item, Widget_t::adj, adj_get_value(), Widget_t::app, ViewMultiList_t::check_dir, ViewMultiList_t::column, Widget_t::crb, ViewMultiList_t::file_scaled, Widget_t::flags, ViewMultiList_t::folder_scaled, HAS_TOOLTIP, Metrics_t::height, hide_tooltip(), ViewMultiList_t::icon_pos, INSENSITIVE_, ViewMultiList_t::item_height, ViewMultiList_t::item_width, ViewMultiList_t::list_names, ViewMultiList_t::list_size, NORMAL_, Xputty::normal_font, os_get_window_metrics(), os_is_directory(), Widget_t::parent_struct, PRELIGHT_, ViewMultiList_t::prelight_item, ViewMultiList_t::scale_down, SELECTED_, ViewMultiList_t::show_items, show_tooltip(), tooltip_set_text(), ViewMultiList_t::tooltip_text, use_base_color_scheme(), use_text_color_scheme(), utf8_from_locale(), Metrics_t::visible, and Metrics_t::width.

Referenced by create_multi_listview_viewport().

◆ _draw_multi_listview()

void _draw_multi_listview ( void *  w_,
void *  user_data 
)

_draw_multi_listview - draw listview on expose call

Parameters
*w_- the listview to draw
*user_data- attached user_data

Definition at line 44 of file xmultilistview_private.c.

44 {
45 Widget_t *w = (Widget_t*)w_;
46 if (!w) return;
48 cairo_paint (w->cr);
49}
XColor_t * color_scheme
Definition xwidget.h:467
cairo_t * cr
Definition xwidget.h:485
Colors normal
Definition xcolor.h:106
Colors active
Definition xcolor.h:109
@ BACKGROUND_
Definition xcolor.h:65
void set_pattern(Widget_t *w, Colors *from, Colors *to, Color_mod mod)
set_pattern - set pattern for the selected Colors
Definition xcolor.c:308

References XColor_t::active, BACKGROUND_, Widget_t::color_scheme, Widget_t::cr, XColor_t::normal, and set_pattern().

Referenced by add_multi_listview().

◆ _draw_multi_listviewslider()

void _draw_multi_listviewslider ( void *  w_,
void *  user_data 
)

_draw_multi_listviewslider - draw a slider on the viewport to indicate the view point

Parameters
*w_- void pointer to view_port
*user_data- attached user_data

Definition at line 370 of file xmultilistview_private.c.

370 {
371 Widget_t *w = (Widget_t*)w_;
372 Widget_t* view_port = (Widget_t*)w->parent_struct;
373 ViewMultiList_t *filelist = (ViewMultiList_t*)view_port->parent_struct;
374 int v = (int)w->adj->max_value;
375 if (!v) return;
376 Metrics_t metrics;
377 os_get_window_metrics(w, &metrics);
378 int width = metrics.width;
379 int height = metrics.height;
380 if (!metrics.visible) return;
381 float slidersize = 1.0;
382 if (filelist->list_size > filelist->show_items)
383 slidersize = (float)((float)filelist->show_items/(float)filelist->list_size);
384 float sliderstate = adj_get_state(w->adj);
386 cairo_rectangle(w->crb, 0,0,width,height);
387 cairo_fill_preserve(w->crb);
389 cairo_fill(w->crb);
391 cairo_rectangle(w->crb, 0,((float)height-
392 ((float)height*slidersize))*sliderstate,width,((float)height*slidersize));
393 cairo_fill(w->crb);
394}
float adj_get_state(Adjustment_t *adj)
adj_get_state - get the current state of the Adjustment_t
Color_state get_color_state(Widget_t *wid)
get_color_state - get the Color_state to use in relation to the Widget_t state
Definition xcolor.c:222
void use_bg_color_scheme(Widget_t *w, Color_state st)
use_bg_color_scheme - use background Colors to paint on Widget_t
Definition xcolor.c:252
void use_shadow_color_scheme(Widget_t *w, Color_state st)
use_shadow_color_scheme - use shadow Colors to paint on Widget_t
Definition xcolor.c:273

References Widget_t::adj, adj_get_state(), Widget_t::crb, get_color_state(), Metrics_t::height, ViewMultiList_t::list_size, Adjustment_t::max_value, NORMAL_, os_get_window_metrics(), Widget_t::parent_struct, ViewMultiList_t::show_items, use_bg_color_scheme(), use_shadow_color_scheme(), Metrics_t::visible, and Metrics_t::width.

Referenced by add_multi_listview().

◆ _leave_multi_list()

void _leave_multi_list ( void *  w_,
void *  user_data 
)

_leave_multi_list - draw list on pointer leave

Parameters
*w_- the Widget_t to draw
*user_data- attached user_data

Definition at line 338 of file xmultilistview_private.c.

338 {
339 Widget_t *w = (Widget_t*)w_;
341 filelist->prelight_item = -1;
342 expose_widget(w);
343}
void expose_widget(Widget_t *w)
expose_widgets - send a expose event (EXPOSE) to a Widget_t
Definition xwidget.c:445

References expose_widget(), Widget_t::parent_struct, and ViewMultiList_t::prelight_item.

Referenced by create_multi_listview_viewport().

◆ _multi_list_entry_double_clicked()

void _multi_list_entry_double_clicked ( void *  w_,
void *  button_,
void *  user_data 
)

_multi_list_entry_double_clicke - forward double click from list entry to list view

Parameters
*w_- void pointer to the Widget_t listview
*button_- void pointer to the XButtonEvent
*user_data- void pointer to attached user_data

Definition at line 321 of file xmultilistview_private.c.

321 {
322 Widget_t *w = (Widget_t*)w_;
323 Widget_t* listview = (Widget_t*) w->parent;
324 ViewMultiList_t *filelist = (ViewMultiList_t*)w->parent_struct;
325 XButtonEvent *xbutton = (XButtonEvent*)button_;
326 Metrics_t metrics;
327 os_get_window_metrics(w, &metrics);
328 int width = metrics.width;
329 int height = metrics.height;
330 int h = floor(max(1,(height/filelist->item_height))) * filelist->item_height;
331 int x_items = max(1,width/filelist->column);
332 int _items = h/max(1,(height/filelist->item_height));
333 int prelight_item = ((xbutton->y/_items)*filelist->column) + (xbutton->x/x_items) + (int)max(0,adj_get_value(w->adj)*filelist->column);
334 if (prelight_item > filelist->list_size-1) return;
335 listview->func.double_click_callback(listview,button_,NULL);
336}
void * parent
Definition xwidget.h:471

References Widget_t::adj, adj_get_value(), ViewMultiList_t::column, Func_t::double_click_callback, Widget_t::func, Metrics_t::height, ViewMultiList_t::item_height, ViewMultiList_t::list_size, os_get_window_metrics(), Widget_t::parent, Widget_t::parent_struct, Metrics_t::width, XEvent::x, and XEvent::y.

Referenced by create_multi_listview_viewport().

◆ _multi_list_entry_released()

void _multi_list_entry_released ( void *  w_,
void *  button_,
void *  user_data 
)

_multi_list_entry_released - move listview or set active entry

Parameters
*w_- void pointer to the Widget_t listview
*button_- void pointer to the XButtonEvent
*user_data- void pointer to attached user_data

Definition at line 290 of file xmultilistview_private.c.

290 {
291 Widget_t *w = (Widget_t*)w_;
292 if (w->flags & HAS_POINTER) {
294 XButtonEvent *xbutton = (XButtonEvent*)button_;
295 Metrics_t metrics;
296 os_get_window_metrics(w, &metrics);
297 int height = metrics.height;
298 int _items = height/(height/filelist->item_height);
299 int prelight_item = xbutton->y/_items + (int)max(0,adj_get_value(w->adj));
300 if (prelight_item > filelist->list_size-1) return;
301 if(xbutton->button == Button4) {
302 if(prelight_item != filelist->prelight_item) {
303 filelist->prelight_item = prelight_item;
304 }
305 } else if (xbutton->button == Button5) {
306 if(prelight_item != filelist->prelight_item) {
307 filelist->prelight_item = prelight_item;
308 }
309 } else if(xbutton->button == Button1) {
310 Widget_t* listview = (Widget_t*) w->parent;
311 filelist->active_item = filelist->prelight_item;
312 adj_set_value(listview->adj,filelist->active_item);
313 listview->func.button_release_callback(listview,xbutton,user_data);
314 } else if(xbutton->button == Button3) {
315 Widget_t* listview = (Widget_t*) w->parent;
316 listview->func.button_release_callback(listview,xbutton,user_data);
317 }
318 }
319}
int button
void adj_set_value(Adjustment_t *adj, float value)
adj_set_value - set the current value to the Adjustment_t
@ HAS_POINTER
Definition xwidget.h:402

References ViewMultiList_t::active_item, Widget_t::adj, adj_get_value(), adj_set_value(), XEvent::button, Func_t::button_release_callback, Widget_t::flags, Widget_t::func, HAS_POINTER, Metrics_t::height, ViewMultiList_t::item_height, ViewMultiList_t::list_size, os_get_window_metrics(), Widget_t::parent, Widget_t::parent_struct, ViewMultiList_t::prelight_item, and XEvent::y.

Referenced by create_multi_listview_viewport().

◆ _multi_list_key_pressed()

void _multi_list_key_pressed ( void *  w_,
void *  xkey_,
void *  user_data 
)

_multi_list_key_pressed - move listview or set active entry

Parameters
*w_- void pointer to the Widget_t listview
*xkey_- void pointer to the XKeyEvent
*user_data- void pointer to attached user_data

Definition at line 265 of file xmultilistview_private.c.

265 {
266 Widget_t *w = (Widget_t*)w_;
267 Widget_t* listview = (Widget_t*) w->parent;
268 XKeyEvent *xkey = (XKeyEvent*)xkey_;
269 ViewMultiList_t *filelist = (ViewMultiList_t*)w->parent_struct;
270 Metrics_t metrics;
271 os_get_window_metrics(w, &metrics);
272 int height = metrics.height;
273 int _items = height/(height/filelist->item_height);
274 filelist->prelight_item = xkey->y/_items + (int)max(0,adj_get_value(w->adj));
275 int nk = key_mapping(w->app->dpy, xkey);
276 if (nk) {
277 switch (nk) {
278 case 3:
279 case 4:
280 case 5:
281 case 6: filelist->prelight_item = xkey->y/_items + (int)max(0,adj_get_value(w->adj));
282 break;
283 default:
284 break;
285 }
286 }
287 listview->func.key_press_callback(listview, xkey_, user_data);
288}
int key_mapping(Display *dpy, XKeyEvent *xkey)
_key_mapping - modifier key's mapped to a integer value
Definition xwidget.c:37

References Widget_t::adj, adj_get_value(), Widget_t::app, Xputty::dpy, Widget_t::func, Metrics_t::height, ViewMultiList_t::item_height, key_mapping(), Func_t::key_press_callback, os_get_window_metrics(), Widget_t::parent, Widget_t::parent_struct, ViewMultiList_t::prelight_item, and XEvent::y.

Referenced by create_multi_listview_viewport().

◆ _multi_list_motion()

void _multi_list_motion ( void *  w_,
void *  xmotion_,
void *  user_data 
)

_multi_list_motion - follow mouse pointer to set prelight item

Parameters
*w_- void pointer to the Widget_t listview
*xmotion_- void pointer to the XMotionEvent
*user_data- void pointer to attached user_data

Definition at line 248 of file xmultilistview_private.c.

248 {
249 Widget_t *w = (Widget_t*)w_;
251 XMotionEvent *xmotion = (XMotionEvent*)xmotion_;
252 int prelight_item = ((xmotion->y/filelist->item_height)*filelist->column) +
253 (xmotion->x/filelist->item_width) + (int)max(0,adj_get_value(w->adj)*filelist->column);
254 if (xmotion->x > (filelist->column*filelist->item_width)-1) {
255 prelight_item = -1;
256 }
257 if(prelight_item != filelist->prelight_item) {
258 filelist->prev_prelight_item = filelist->prelight_item;
259 filelist->prelight_item = prelight_item;
260 hide_tooltip(w);
261 _update_view(w);
262 }
263}
void _update_view(void *w_)

References _update_view(), Widget_t::adj, adj_get_value(), ViewMultiList_t::column, hide_tooltip(), ViewMultiList_t::item_height, ViewMultiList_t::item_width, Widget_t::parent_struct, ViewMultiList_t::prelight_item, ViewMultiList_t::prev_prelight_item, XEvent::x, and XEvent::y.

Referenced by create_multi_listview_viewport().

◆ _reconfigure_multi_listview_viewport()

void _reconfigure_multi_listview_viewport ( void *  w_,
void *  user_data 
)

_reconfigure_multi_listview_viewport - reconfigure the viewport adjustment on size changes

Parameters
*w_- void pointer to view_port
*user_data- attached user_data

Definition at line 345 of file xmultilistview_private.c.

345 {
346 Widget_t *w = (Widget_t*)w_;
347 Widget_t* listview = (Widget_t*) w->parent;
348 ViewMultiList_t *filelist = (ViewMultiList_t*)w->parent_struct;
349 Metrics_t metrics;
350 os_get_window_metrics(listview, &metrics);
351 int width = metrics.width;
352 int height = metrics.height;
353 float st = adj_get_value(filelist->slider->adj);
354 filelist->column = max(1,width/filelist->item_width);
355 filelist->show_items = (height/filelist->item_height) * filelist->column;
356 filelist->icon_pos = (filelist->item_width/2) - 120/filelist->scale_up;
357 w->adj->max_value = ((filelist->list_size-filelist->show_items)/filelist->column)+1.0;
358 filelist->slider->adj->max_value = ((filelist->list_size-filelist->show_items)/filelist->column)+1.0;
359 adj_set_scale(filelist->slider->adj, ((float)filelist->list_size/(float)filelist->show_items)/filelist->item_height);
360 adj_set_value(filelist->slider->adj,st);
361}
float max_value
Definition xadjustment.h:92
Widget_t * slider
void adj_set_scale(Adjustment_t *adj, float value)
adj_set_scale - internal use to scale the pointer movement (0.1 -1.0)

References Widget_t::adj, adj_get_value(), adj_set_scale(), adj_set_value(), ViewMultiList_t::column, Metrics_t::height, ViewMultiList_t::icon_pos, ViewMultiList_t::item_height, ViewMultiList_t::item_width, ViewMultiList_t::list_size, Adjustment_t::max_value, os_get_window_metrics(), Widget_t::parent, Widget_t::parent_struct, ViewMultiList_t::scale_up, ViewMultiList_t::show_items, ViewMultiList_t::slider, and Metrics_t::width.

Referenced by create_multi_listview_viewport(), and multi_listview_set_item_size().

◆ _set_multi_listview_viewpoint()

void _set_multi_listview_viewpoint ( void *  w_,
void *  user_data 
)

_set_multi_listview_viewpoint - move the view_port to position

Parameters
*w_- void pointer to view_port
*user_data- attached user_data

Definition at line 363 of file xmultilistview_private.c.

363 {
364 Widget_t *w = (Widget_t*)w_;
366 adj_set_state(filelist->slider->adj,adj_get_state(w->adj));
367 expose_widget(w);
368}
void adj_set_state(Adjustment_t *adj, float state)
adj_set_state - set the current state of the Adjustment_t

References Widget_t::adj, adj_get_state(), adj_set_state(), expose_widget(), Widget_t::parent_struct, and ViewMultiList_t::slider.

Referenced by create_multi_listview_viewport().

◆ _set_multi_listviewport()

void _set_multi_listviewport ( void *  w_,
void *  user_data 
)

_set_multi_listviewport - move the view_port to position by listviewslider state

Parameters
*w_- void pointer to view_port
*user_data- attached user_data

Definition at line 396 of file xmultilistview_private.c.

396 {
397 Widget_t *w = (Widget_t*)w_;
398 Widget_t *viewport = (Widget_t*)w->parent_struct;
399 adj_set_state(viewport->adj, adj_get_state(w->adj));
400 expose_widget(w);
401}

References Widget_t::adj, adj_get_state(), adj_set_state(), expose_widget(), and Widget_t::parent_struct.

Referenced by add_multi_listview().