libxputty 0.1
Loading...
Searching...
No Matches
xlistview_private.c
Go to the documentation of this file.
1/*
2 * 0BSD
3 *
4 * BSD Zero Clause License
5 *
6 * Copyright (c) 2019 Hermann Meyer
7 *
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted.
10
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 *
19 */
20
21
22#include "xlistview_private.h"
23#include "xtooltip.h"
24#include <sys/stat.h>
25
26
27void _draw_listview(void *w_, void* user_data) {
28 Widget_t *w = (Widget_t*)w_;
29 if (!w) return;
31 cairo_paint (w->cr);
32}
33
34void _draw_list(void *w_, void* user_data) {
35 Widget_t *w = (Widget_t*)w_;
36 Metrics_t metrics;
37 os_get_window_metrics(w, &metrics);
38 int width = metrics.width;
39 int height = metrics.height;
40 if (!metrics.visible) return;
41 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
42
44 cairo_rectangle(w->crb, 0, 0, width, height);
45 cairo_fill (w->crb);
46 cairo_set_font_size (w->crb, min(w->app->big_font ,w->app->normal_font/w->scale.ascale));
47 cairo_text_extents_t extents;
48 cairo_text_extents(w->crb,"Ay", &extents);
49 double h = extents.height;
50
51 int i = (int)max(0,adj_get_value(w->adj));
52 int a = 0;
53 int j = filelist->list_size<filelist->show_items+i+1 ?
54 filelist->list_size : filelist->show_items+i+1;
55 for(;i<j;i++) {
56 if(i == filelist->prelight_item && i == filelist->active_item)
58 else if(i == filelist->prelight_item)
60 else if (i == filelist->active_item)
62 else
64 cairo_rectangle(w->crb, 0, a*25, width, 25);
65 cairo_fill_preserve(w->crb);
66 cairo_set_line_width(w->crb, 1.0);
68 cairo_stroke(w->crb);
69
71 if(i == filelist->prelight_item && i == filelist->active_item)
73 else if(i == filelist->prelight_item)
75 else if (i == filelist->active_item)
77 else
79
80 if (filelist->check_dir) {
81 if (os_is_directory(filelist->list_names[i])) {
82 cairo_scale(w->crb,0.08, 0.08);
83 cairo_set_source_surface (w->crb, filelist->folder,1.0*12.5,((double)a+0.1)*25.0*12.5);
84 cairo_paint (w->crb);
85 cairo_scale(w->crb,12.5, 12.5);
87 } else {
88 cairo_scale(w->crb,0.08, 0.08);
89 cairo_set_source_surface (w->crb, filelist->file,1.0*12.5,((double)a+0.1)*25.0*12.5);
90 cairo_paint (w->crb);
91 cairo_scale(w->crb,12.5, 12.5);
93 }
94 }
95 cairo_text_extents(w->crb,filelist->list_names[i] , &extents);
96
97 cairo_move_to (w->crb, 20, (25.0*((double)a+1.0))+3.0 - (h*max(0.71,w->scale.ascale)));
98 cairo_show_text(w->crb, filelist->list_names[i]);
99 cairo_new_path (w->crb);
100 if (i == filelist->prelight_item && extents.width > (float)width-20) {
101 tooltip_set_text(w,filelist->list_names[i]);
102 w->flags |= HAS_TOOLTIP;
103 show_tooltip(w);
104 } else if (i == filelist->prelight_item && extents.width < (float)width-20){
105 w->flags &= ~HAS_TOOLTIP;
106 hide_tooltip(w);
107 }
108 a++;
109 }
110}
111
112void _update_list_view(void *w_) {
113 Widget_t *w = (Widget_t*)w_;
114 Metrics_t metrics;
115 os_get_window_metrics(w, &metrics);
116 int width = metrics.width;
117 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
118
119 cairo_push_group (w->crb);
121 cairo_set_font_size (w->crb, min(w->app->big_font ,w->app->normal_font/w->scale.ascale));
122 cairo_text_extents_t extents;
123 cairo_text_extents(w->crb,"Ay", &extents);
124 double h = extents.height;
125
126 int i = (int)max(0,adj_get_value(w->adj));
127 int a = 0;
128 int j = filelist->list_size<filelist->show_items+i+1 ?
129 filelist->list_size : filelist->show_items+i+1;
130 for(;i<j;i++) {
131 if (i != filelist->prelight_item && i != filelist->prev_prelight_item) {
132 if (i<j-1) {
133 a++;
134 }
135 continue;
136 }
137 if(i == filelist->prelight_item && i == filelist->active_item)
139 else if(i == filelist->prelight_item)
141 else if (i == filelist->active_item)
143 else
145 cairo_rectangle(w->crb, 0, a*25, width, 25);
146 cairo_fill_preserve(w->crb);
147 cairo_set_line_width(w->crb, 1.0);
149 cairo_stroke(w->crb);
150
152 if(i == filelist->prelight_item && i == filelist->active_item)
154 else if(i == filelist->prelight_item)
156 else if (i == filelist->active_item)
158 else
160
161 if (filelist->check_dir) {
162 struct stat sb;
163 if (stat(filelist->list_names[i], &sb) == 0 && S_ISDIR(sb.st_mode)) {
164 cairo_scale(w->crb,0.08, 0.08);
165 cairo_set_source_surface (w->crb, filelist->folder,1.0*12.5,((double)a+0.1)*25.0*12.5);
166 cairo_paint (w->crb);
167 cairo_scale(w->crb,12.5, 12.5);
169 } else {
170 cairo_scale(w->crb,0.08, 0.08);
171 cairo_set_source_surface (w->crb, filelist->file,1.0*12.5,((double)a+0.1)*25.0*12.5);
172 cairo_paint (w->crb);
173 cairo_scale(w->crb,12.5, 12.5);
175 }
176 }
177 cairo_text_extents(w->crb,filelist->list_names[i] , &extents);
178
179 cairo_move_to (w->crb, 20, (25.0*((double)a+1.0))+3.0 - (h*max(0.71,w->scale.ascale)));
180 cairo_show_text(w->crb, filelist->list_names[i]);
181 cairo_new_path (w->crb);
182 if (i == filelist->prelight_item && extents.width > (float)width-20) {
183 tooltip_set_text(w,filelist->list_names[i]);
184 w->flags |= HAS_TOOLTIP;
185 show_tooltip(w);
186 } else if (i == filelist->prelight_item && extents.width < (float)width-20){
187 w->flags &= ~HAS_TOOLTIP;
188 hide_tooltip(w);
189 }
190 a++;
191 }
192 cairo_pop_group_to_source (w->crb);
193 cairo_paint (w->crb);
194 cairo_push_group (w->cr);
195 cairo_set_source_surface (w->cr, w->buffer,0,0);
196 cairo_paint (w->cr);
197
198 cairo_pop_group_to_source (w->cr);
199 cairo_paint (w->cr);
200}
201
202void _list_motion(void *w_, void* xmotion_, void* user_data) {
203 Widget_t *w = (Widget_t*)w_;
204 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
205 XMotionEvent *xmotion = (XMotionEvent*)xmotion_;
206 Metrics_t metrics;
207 os_get_window_metrics(w, &metrics);
208 int height = metrics.height;
209 int _items = height/(height/25);
210 int prelight_item = (xmotion->y/_items) + (int)max(0,adj_get_value(w->adj));
211 if(prelight_item != filelist->prelight_item) {
212 filelist->prev_prelight_item = filelist->prelight_item;
213 filelist->prelight_item = prelight_item;
214 hide_tooltip(w);
216 }
217}
218
219void _list_key_pressed(void *w_, void* xkey_, void* user_data) {
220 Widget_t *w = (Widget_t*)w_;
221 Widget_t* listview = (Widget_t*) w->parent;
222 XKeyEvent *xkey = (XKeyEvent*)xkey_;
223 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
224 Metrics_t metrics;
225 os_get_window_metrics(w, &metrics);
226 int height = metrics.height;
227 int _items = height/(height/25);
228 filelist->prelight_item = xkey->y/_items + (int)max(0,adj_get_value(w->adj));
229 int nk = key_mapping(w->app->dpy, xkey);
230 if (nk) {
231 switch (nk) {
232 case 3:
233 case 4:
234 case 5:
235 case 6: filelist->prelight_item = xkey->y/_items + (int)max(0,adj_get_value(w->adj));
236 break;
237 default:
238 break;
239 }
240 }
241 listview->func.key_press_callback(listview, xkey_, user_data);
242}
243
244void _list_entry_released(void *w_, void* button_, void* user_data) {
245 Widget_t *w = (Widget_t*)w_;
246 if (w->flags & HAS_POINTER) {
247 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
248 XButtonEvent *xbutton = (XButtonEvent*)button_;
249 Metrics_t metrics;
250 os_get_window_metrics(w, &metrics);
251 int height = metrics.height;
252 int _items = height/(height/25);
253 int prelight_item = xbutton->y/_items + (int)max(0,adj_get_value(w->adj));
254 if (prelight_item > filelist->list_size-1) return;
255 if(xbutton->button == Button4) {
256 if(prelight_item != filelist->prelight_item) {
257 filelist->prelight_item = prelight_item;
258 }
259 } else if (xbutton->button == Button5) {
260 if(prelight_item != filelist->prelight_item) {
261 filelist->prelight_item = prelight_item;
262 }
263 } else if(xbutton->button == Button1) {
264 Widget_t* listview = (Widget_t*) w->parent;
265 filelist->active_item = filelist->prelight_item;
266 adj_set_value(listview->adj,filelist->active_item);
267 listview->func.button_release_callback(listview,xbutton,user_data);
268 }
269 }
270}
271
272void _list_entry_double_clicked(void *w_, void* button_, void* user_data) {
273 Widget_t *w = (Widget_t*)w_;
274 Widget_t* listview = (Widget_t*) w->parent;
275 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
276 XButtonEvent *xbutton = (XButtonEvent*)button_;
277 Metrics_t metrics;
278 os_get_window_metrics(w, &metrics);
279 int height = metrics.height;
280 int _items = height/(height/25);
281 int prelight_item = xbutton->y/_items + (int)max(0,adj_get_value(w->adj));
282 if (prelight_item > filelist->list_size-1) return;
283 listview->func.double_click_callback(listview,button_,NULL);
284}
285
286void _leave_list(void *w_, void* user_data) {
287 Widget_t *w = (Widget_t*)w_;
288 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
289 filelist->prelight_item = -1;
290 expose_widget(w);
291}
292
293void _reconfigure_listview_viewport(void *w_, void* user_data) {
294 Widget_t *w = (Widget_t*)w_;
295 float st = adj_get_state(w->adj);
296 Widget_t* listview = (Widget_t*) w->parent;
297 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
298 Metrics_t metrics;
299 os_get_window_metrics(listview, &metrics);
300 int height = metrics.height;
301 filelist->show_items = height/25;
302 w->adj->max_value = filelist->list_size-filelist->show_items;
303 adj_set_state(w->adj,st);
304}
305
306void _configure_listview(void *w_, void* user_data) {
307 Widget_t *w = (Widget_t*)w_;
308 Widget_t* listview = (Widget_t*) w->parent;
309 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
310 Metrics_t metrics;
311 os_get_window_metrics(listview, &metrics);
312 int height = metrics.height;
313 int width = metrics.width;
314 filelist->show_items = height/25;
315 filelist->slider->adj->step = max(0.0,1.0/(filelist->list_size-filelist->show_items));
316 adj_set_scale(filelist->slider->adj, ((float)filelist->list_size/(float)filelist->show_items)/25.0);
317 os_resize_window (w->app->dpy, w, width, height);
318}
319
320void _set_listview_viewpoint(void *w_, void* user_data) {
321 Widget_t *w = (Widget_t*)w_;
322 ViewList_t *filelist = (ViewList_t*)w->parent_struct;
323 adj_set_state(filelist->slider->adj,adj_get_state(w->adj));
324 expose_widget(w);
325}
326
327void _draw_listviewslider(void *w_, void* user_data) {
328 Widget_t *w = (Widget_t*)w_;
329 Widget_t* view_port = (Widget_t*)w->parent_struct;
330 ViewList_t *filelist = (ViewList_t*)view_port->parent_struct;
331 int v = (int)w->adj->max_value;
332 if (!v) return;
333 Metrics_t metrics;
334 os_get_window_metrics(w, &metrics);
335 int width = metrics.width;
336 int height = metrics.height;
337 if (!metrics.visible) return;
338 int show_items = height/25;
339 float slidersize = 1.0;
340 if (filelist->list_size > show_items)
341 slidersize = (float)((float)show_items/(float)filelist->list_size);
342 float sliderstate = adj_get_state(w->adj);
344 cairo_rectangle(w->crb, 0,0,width,height);
345 cairo_fill_preserve(w->crb);
347 cairo_fill(w->crb);
349 cairo_rectangle(w->crb, 0,((float)height-
350 ((float)height*slidersize))*sliderstate,width,((float)height*slidersize));
351 cairo_fill(w->crb);
352}
353
354void _set_listviewport(void *w_, void* user_data) {
355 Widget_t *w = (Widget_t*)w_;
356 Widget_t *viewport = (Widget_t*)w->parent_struct;
357 adj_set_state(viewport->adj, adj_get_state(w->adj));
358 expose_widget(w);
359}
float max_value
Definition xadjustment.h:92
evfunc button_release_callback
Definition xwidget.h:101
evfunc key_press_callback
Definition xwidget.h:104
evfunc double_click_callback
Definition xwidget.h:102
Metrics_t - struct to receive window size, position & visibility Pass this struct to os_get_window_...
float ascale
Definition xwidget.h:369
ViewList_t - struct to hold information for the listview.
Definition xlistview.h:42
int active_item
Definition xlistview.h:48
char ** list_names
Definition xlistview.h:43
int prev_prelight_item
Definition xlistview.h:49
int prelight_item
Definition xlistview.h:47
int list_size
Definition xlistview.h:52
int check_dir
Definition xlistview.h:53
Widget_t * slider
Definition xlistview.h:44
int show_items
Definition xlistview.h:51
cairo_surface_t * file
Definition xlistview.h:46
cairo_surface_t * folder
Definition xlistview.h:45
Widget_t - struct to hold the basic Widget_t info.
Definition xwidget.h:457
Resize_t scale
Definition xwidget.h:525
XColor_t * color_scheme
Definition xwidget.h:467
Adjustment_t * adj
Definition xwidget.h:497
void * parent
Definition xwidget.h:471
cairo_surface_t * buffer
Definition xwidget.h:487
cairo_t * crb
Definition xwidget.h:489
long long flags
Definition xwidget.h:461
cairo_t * cr
Definition xwidget.h:485
void * parent_struct
Definition xwidget.h:473
Func_t func
Definition xwidget.h:481
Xputty * app
Definition xwidget.h:465
Colors normal
Definition xcolor.h:106
Colors active
Definition xcolor.h:109
int button
int big_font
Definition xputty.h:250
int normal_font
Definition xputty.h:248
Display * dpy
Definition xputty.h:232
void adj_set_state(Adjustment_t *adj, float state)
adj_set_state - set the current state of the Adjustment_t
void adj_set_value(Adjustment_t *adj, float value)
adj_set_value - set the current value to the Adjustment_t
float adj_get_value(Adjustment_t *adj)
adj_get_value - get the current value of the Adjustment_t
float adj_get_state(Adjustment_t *adj)
adj_get_state - get the current state of the Adjustment_t
void adj_set_scale(Adjustment_t *adj, float value)
adj_set_scale - internal use to scale the pointer movement (0.1 -1.0)
void use_frame_color_scheme(Widget_t *w, Color_state st)
use_frame_color_scheme - use frame Colors to paint on Widget_t
Definition xcolor.c:280
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_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
@ BACKGROUND_
Definition xcolor.h:65
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 set_pattern(Widget_t *w, Colors *from, Colors *to, Color_mod mod)
set_pattern - set pattern for the selected Colors
Definition xcolor.c:308
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
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
void _leave_list(void *w_, void *user_data)
_leave_list - draw list on pointer leave
void _update_list_view(void *w_)
void _list_key_pressed(void *w_, void *xkey_, void *user_data)
_list_key_pressed - move listview or set active entry
void _draw_listviewslider(void *w_, void *user_data)
_draw_listviewslider - draw a slider on the viewport to indicate the view point
void _reconfigure_listview_viewport(void *w_, void *user_data)
_reconfigure_listview_viewport - reconfigure the viewport adjustment on size changes
void _list_entry_double_clicked(void *w_, void *button_, void *user_data)
_list_entry_double_clicke - forward double click from list entry to list view
void _configure_listview(void *w_, void *user_data)
_configure_listview - configure the viewport on mapping
void _list_motion(void *w_, void *xmotion_, void *user_data)
_list_motion - follow mouse pointer to set prelight item
void _draw_list(void *w_, void *user_data)
_draw_list - draw list on expose call
void _set_listviewport(void *w_, void *user_data)
_set_listviewport - move the view_port to position by listviewslider state
void _set_listview_viewpoint(void *w_, void *user_data)
_set_listview_viewpoint - move the view_port to position
void _list_entry_released(void *w_, void *button_, void *user_data)
_list_entry_released - move listview or set active entry
void _draw_listview(void *w_, void *user_data)
_draw_listview - draw listview on expose call
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
void os_resize_window(Display *dpy, Widget_t *w, int x, int y)
os_resize_window - Resize a Widget_t
bool os_is_directory(const char *filename)
os_is directory - check if a given path is a directory or a file
int key_mapping(Display *dpy, XKeyEvent *xkey)
_key_mapping - modifier key's mapped to a integer value
Definition xwidget.c:37
void expose_widget(Widget_t *w)
expose_widgets - send a expose event (EXPOSE) to a Widget_t
Definition xwidget.c:445
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_POINTER
Definition xwidget.h:402
@ 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