libxputty 0.1
Loading...
Searching...
No Matches
xdirectory-dialog.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/*
23#ifndef _GNU_SOURCE
24#define _GNU_SOURCE 1
25#endif
26*/
27
28#include <dirent.h>
29#include <stdio.h>
30#include <stdlib.h>
31#include <stdarg.h>
32#include <string.h>
33#include <unistd.h>
34
35#include <libgen.h>
36
37#include "xfile-dialog.h"
38#include "xmessage-dialog.h"
39
40static void file_released_callback(void *w_, void *button, void* user_data);
41static void combo_response(void *w_, void* user_data);
42static void set_selected_file(FileDialog *file_dialog);
43
44static void draw_window(void *w_, void* user_data) {
45 Widget_t *w = (Widget_t*)w_;
46 Metrics_t metrics;
47 os_get_window_metrics(w, &metrics);
48 int width = metrics.width;
49 int height = metrics.height;
50 if (!metrics.visible) return;
51
52 cairo_rectangle(w->crb,0,0,width,height);
54 cairo_fill (w->crb);
55
56 //widget_set_scale(w);
58 cairo_set_font_size (w->crb, 12.0);
59 cairo_move_to (w->crb, 20, 35);
60 cairo_show_text(w->crb, _("Directory"));
61 cairo_move_to (w->crb, 20, 85);
62 cairo_show_text(w->crb, _("Directories"));
63 cairo_move_to (w->crb, 20, 340-w->scale.scale_y);
64 cairo_show_text(w->crb, _("Select: "));
65 cairo_move_to (w->crb, 45, 380-w->scale.scale_y);
66 cairo_show_text(w->crb, _("Show hidden Directories"));
67 cairo_move_to (w->crb, 70, 340-w->scale.scale_y);
68 cairo_show_text(w->crb, w->label);
69 //widget_reset_scale(w);
70}
71
72static void button_quit_callback(void *w_, void* user_data) {
73 Widget_t *w = (Widget_t*)w_;
74 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
75
76 if (w->flags & HAS_POINTER && !adj_get_value(w->adj)){
77 file_dialog->parent->func.dialog_callback(file_dialog->parent,NULL);
78 file_dialog->send_clear_func = false;
79 destroy_widget(file_dialog->w,file_dialog->w->app);
80 }
81}
82
83static void forward_key_press(void *w_, void *key_, void *user_data) {
84 Widget_t *w = (Widget_t*)w_;
85 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
86 if (file_dialog->text_entry)
87 file_dialog->text_entry->func.key_press_callback(file_dialog->text_entry, key_, user_data);
88}
89
90static void forward_listview_key_press(void *w_, void *key_, void *user_data) {
91 Widget_t *w = (Widget_t*)w_;
92 Widget_t *parent = (Widget_t*)w->parent;
93 FileDialog *file_dialog = (FileDialog *)parent->parent_struct;
94 if (file_dialog->text_entry)
95 file_dialog->text_entry->func.key_press_callback(file_dialog->text_entry, key_, user_data);
96}
97
98static inline int set_files(FileDialog *file_dialog) {
99 listview_set_list(file_dialog->ft,file_dialog->fp->file_names , (int)file_dialog->fp->file_counter);
100 int ret = 0;
101 int i = 0;
102 for (; i<(int)file_dialog->fp->file_counter; i++) {
103 if(file_dialog->fp->selected_file && strcmp(file_dialog->fp->file_names[i],
104 basename(file_dialog->fp->selected_file))==0 ) ret = i;
105 }
106 return ret;
107}
108
109static void set_dirs(FileDialog *file_dialog) {
110 int i = 0;
111 for (; i<(int)file_dialog->fp->dir_counter; i++) {
112 combobox_add_entry(file_dialog->ct,file_dialog->fp->dir_names[i]);
113 }
114}
115
116static void file_released_b_callback(void *w_, void *button, void* user_data) {
117 Widget_t *w = (Widget_t*)w_;
118 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
119 set_selected_file(file_dialog);
120 if(file_dialog->fp->selected_file) {
121 file_dialog->w->label = file_dialog->fp->selected_file;
122 expose_widget(file_dialog->w);
123 }
124}
125
126static void dummy(void *w_, void* user_data) {
127
128}
129
130static void reload_from_dir(FileDialog *file_dialog) {
131 file_dialog->ft->func.value_changed_callback = dummy;
132 assert(file_dialog->fp->path != NULL);
133 listview_remove_list(file_dialog->ft);
134 combobox_delete_entrys(file_dialog->ct);
135 int ds = fp_get_files(file_dialog->fp,file_dialog->fp->path, 1, 0);
136 file_dialog->ft->func.button_release_callback = file_released_b_callback;
137 int set_f = set_files(file_dialog);
138 set_dirs(file_dialog);
139 combobox_set_active_entry(file_dialog->ct, ds);
140 listview_set_active_entry(file_dialog->ft, set_f);
141 expose_widget(file_dialog->ft);
142 expose_widget(file_dialog->ct);
143}
144
145static void set_selected_file(FileDialog *file_dialog) {
146 if(adj_get_value(file_dialog->ft->adj)<0 ||
147 adj_get_value(file_dialog->ft->adj) > file_dialog->fp->file_counter) return;
148
149 if (os_is_directory(file_dialog->fp->file_names[(int)adj_get_value(file_dialog->ft->adj)])) {
150 asprintf(&file_dialog->fp->path, "%s",file_dialog->fp->file_names[(int)adj_get_value(file_dialog->ft->adj)]);
151 reload_from_dir(file_dialog);
152 }
153
154 Widget_t* menu = file_dialog->ct->childlist->childs[1];
155 Widget_t* view_port = menu->childlist->childs[0];
156 ComboBox_t *comboboxlist = (ComboBox_t*)view_port->parent_struct;
157 if ((int)adj_get_value(file_dialog->ct->adj) < 0) return;
158 free(file_dialog->fp->selected_file);
159 file_dialog->fp->selected_file = NULL;
160 asprintf(&file_dialog->fp->selected_file, "%s/",comboboxlist->list_names[(int)adj_get_value(file_dialog->ct->adj)]);
161 assert(file_dialog->fp->selected_file != NULL);
162}
163
164static void file_released_callback(void *w_, void *button, void* user_data) {
165 Widget_t *w = (Widget_t*)w_;
166 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
167 set_selected_file(file_dialog);
168 if(file_dialog->fp->selected_file) {
169 file_dialog->w->label = file_dialog->fp->selected_file;
170 expose_widget(file_dialog->w);
171 }
172}
173
174static void set_selected_dir(FileDialog *file_dialog) {
175 Widget_t* menu = file_dialog->ct->childlist->childs[1];
176 Widget_t* view_port = menu->childlist->childs[0];
177 ComboBox_t *comboboxlist = (ComboBox_t*)view_port->parent_struct;
178 if ((int)adj_get_value(file_dialog->ct->adj) < 0) return;
179 free(file_dialog->fp->selected_file);
180 file_dialog->fp->selected_file = NULL;
181 asprintf(&file_dialog->fp->selected_file, "%s%s",
182 comboboxlist->list_names[(int)adj_get_value(file_dialog->ct->adj)], PATH_SEPARATOR);
183 assert(file_dialog->fp->selected_file != NULL);
184}
185
186static void combo_response(void *w_, void* user_data) {
187 Widget_t *w = (Widget_t*)w_;
188 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
189 Widget_t* menu = w->childlist->childs[1];
190 Widget_t* view_port = menu->childlist->childs[0];
191 ComboBox_t *comboboxlist = (ComboBox_t*)view_port->parent_struct;
192 if ((int)adj_get_value(file_dialog->ct->adj) < 0) return;
193 free(file_dialog->fp->path);
194 file_dialog->fp->path = NULL;
195 asprintf(&file_dialog->fp->path, "%s",comboboxlist->list_names[(int)adj_get_value(w->adj)]);
196 assert(file_dialog->fp->path != NULL);
197 reload_from_dir(file_dialog);
198 file_dialog->w->label = file_dialog->fp->path;
199 expose_widget(file_dialog->w);
200}
201
202static void button_ok_callback(void *w_, void* user_data) {
203 Widget_t *w = (Widget_t*)w_;
204 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
205 if (w->flags & HAS_POINTER && !*(int*)user_data){
206 if(!file_dialog->fp->selected_file) {
207 set_selected_dir(file_dialog);
208 }
209 if(file_dialog->fp->selected_file) {
210 file_dialog->parent->func.dialog_callback(file_dialog->parent,&file_dialog->fp->selected_file);
211 file_dialog->send_clear_func = false;
212 } else {
213 open_message_dialog(w, INFO_BOX, _("INFO"),
214 _("Please select a file"),NULL);
215 return;
216 }
217 destroy_widget(file_dialog->w,file_dialog->w->app);
218 }
219}
220
221static void reload_all(FileDialog *file_dialog) {
222 file_dialog->ft->func.value_changed_callback = dummy;
223 Widget_t* menu = file_dialog->ct->childlist->childs[1];
224 Widget_t* view_port = menu->childlist->childs[0];
225 ComboBox_t *comboboxlist = (ComboBox_t*)view_port->parent_struct;
226 if ((int)adj_get_value(file_dialog->ct->adj) < 0) return;
227 free(file_dialog->fp->path);
228 file_dialog->fp->path = NULL;
229 asprintf(&file_dialog->fp->path, "%s",comboboxlist->list_names[(int)adj_get_value(file_dialog->ct->adj)]);
230 assert(file_dialog->fp->path != NULL);
231 listview_remove_list(file_dialog->ft);
232 combobox_delete_entrys(file_dialog->ct);
233 int ds = fp_get_files(file_dialog->fp,file_dialog->fp->path, 1, 0);
234 file_dialog->ft->func.button_release_callback = file_released_callback;
235 int set_f = set_files(file_dialog);
236 set_dirs(file_dialog);
237 combobox_set_active_entry(file_dialog->ct, ds);
238 listview_set_active_entry(file_dialog->ft, set_f);
239 expose_widget(file_dialog->ft);
240}
241
242static void button_hidden_callback(void *w_, void* user_data) {
243 Widget_t *w = (Widget_t*)w_;
244 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
245 if (w->flags & HAS_POINTER) {
246 file_dialog->fp->show_hidden = adj_get_value(w->adj) ? true : false;
247 reload_all(file_dialog);
248 }
249}
250
251static void get_entry(Widget_t *w) {
252 Widget_t *p = (Widget_t*)w->parent;
253 FileDialog *file_dialog = (FileDialog *)p->parent_struct;
254 if (strlen( file_dialog->text_entry->input_label))
255 file_dialog->text_entry->input_label[strlen( file_dialog->text_entry->input_label)-1] = 0;
256 file_dialog->text_entry->label = file_dialog->text_entry->input_label;
257}
258
259static void save_on_enter(void *w_) {
260 Widget_t *w = (Widget_t*)w_;
261 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
262 Widget_t* menu = file_dialog->ct->childlist->childs[1];
263 Widget_t* view_port = menu->childlist->childs[0];
264 ComboBox_t *comboboxlist = (ComboBox_t*)view_port->parent_struct;
265 if (strlen( file_dialog->text_entry->input_label)) {
266 asprintf(&file_dialog->fp->selected_file, "%s%s%s",comboboxlist->list_names[(int)adj_get_value(file_dialog->ct->adj)],
267 PATH_SEPARATOR,
268 file_dialog->text_entry->label);
269 asprintf(&file_dialog->fp->path, "%s",file_dialog->fp->selected_file);
270
271#ifdef __linux__
272 struct stat st = {0};
273 int result = mkdir(file_dialog->fp->selected_file, 0755);
274 if (result == 0 || (stat(file_dialog->fp->selected_file, &st) != -1))
275 reload_from_dir(file_dialog);
276#else
277 int result = mkdir(file_dialog->fp->selected_file);
278 if (result == 0) {
279 DWORD attr = GetFileAttributes(file_dialog->fp->selected_file);
280 if (attr&FILE_ATTRIBUTE_DIRECTORY) {
281 reload_from_dir(file_dialog);
282 }
283 }
284#endif
285 }
286 destroy_widget(file_dialog->text_entry, file_dialog->w->app);
287 file_dialog->w->label = file_dialog->fp->path;
288 expose_widget(file_dialog->w);
289}
290
291static void draw_entry(void *w_, void* user_data) {
292 Widget_t *w = (Widget_t*)w_;
293 if (!w) return;
294 Metrics_t metrics;
295 os_get_window_metrics(w, &metrics);
296 int width = metrics.width;
297 int height = metrics.height;
298 if (!metrics.visible) return;
299
301 cairo_rectangle(w->cr,0,0,width,height);
302 cairo_fill_preserve (w->cr);
304 cairo_set_line_width(w->cr, 2.0);
305 cairo_stroke(w->cr);
306
307 cairo_set_font_size (w->cr, 9.0);
308
309 cairo_move_to (w->cr, 2, 9);
310 cairo_show_text(w->cr, " ");
311}
312
313static void entry_add_text(void *w_, void *label_) {
314 Widget_t *w = (Widget_t*)w_;
315 if (!w) return;
316 char *label = (char*)label_;
317 if (!label) {
318 label = (char*)"";
319 }
320 draw_entry(w,NULL);
321 cairo_text_extents_t extents;
323 cairo_set_font_size (w->cr, 11.0);
324 if (strlen( w->input_label))
325 w->input_label[strlen( w->input_label)-1] = 0;
326 if (strlen( w->input_label)<30) {
327 if (strlen(label))
328 strcat( w->input_label, label);
329 }
330 w->label = w->input_label;
331 strcat( w->input_label, "|");
332 cairo_set_font_size (w->cr, 12.0);
333 cairo_text_extents(w->cr, w->input_label , &extents);
334
335 cairo_move_to (w->cr, 2, 12.0+extents.height);
336 cairo_show_text(w->cr, w->input_label);
337
338}
339
340static void entry_clip(Widget_t *w) {
341 draw_entry(w,NULL);
342 cairo_text_extents_t extents;
344 cairo_set_font_size (w->cr, 11.0);
345
346 // check for UTF 8 char
347 if (strlen( w->input_label)>=2) {
348 int i = strlen( w->input_label)-1;
349 int j = 0;
350 int u = 0;
351 for(;i>0;i--) {
352 if(IS_UTF8(w->input_label[i])) {
353 u++;
354 }
355 j++;
356 if (u == 1) break;
357 if (j>2) break;
358 }
359 if (!u) j =2;
360
361 memset(&w->input_label[strlen( w->input_label)-(sizeof(char)*(j))],0,sizeof(char)*(j));
362 strcat( w->input_label, "|");
363 }
364 cairo_set_font_size (w->cr, 12.0);
365 cairo_text_extents(w->cr, w->input_label , &extents);
366
367 cairo_move_to (w->cr, 2, 12.0+extents.height);
368 cairo_show_text(w->cr, w->input_label);
369
370}
371
372static void entry_get_text(void *w_, void *key_, void *user_data) {
373 Widget_t *w = (Widget_t*)w_;
374 if (!w) return;
375 XKeyEvent *key = (XKeyEvent*)key_;
376 if (!key) return;
377 int nk = key_mapping(w->app->dpy, key);
378 if (nk == 11) {
379 entry_clip(w);
380 } else {
381 char buf[32];
382 bool status = os_get_keyboard_input(w, key, buf, sizeof(buf) - 1);
383 if (key_mapping(w->app->dpy, key) == 10) {
384 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
385 get_entry(file_dialog->text_entry);
386 save_on_enter(file_dialog->w_okay);
387 return;
388 }
389 if(status){
390 entry_add_text(w, buf);
391 }
392 }
393}
394
395static void add_dir_callback(void *w_, void* user_data) {
396 Widget_t *w = (Widget_t*)w_;
397 if (w->flags & HAS_POINTER && !*(int*)user_data){
398 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
399 file_dialog->text_entry = create_widget(file_dialog->w->app, file_dialog->w, 230, 360, 200, 30);
400 memset(file_dialog->text_entry->input_label, 0, 32 * (sizeof file_dialog->text_entry->input_label[0]) );
401 file_dialog->text_entry->func.expose_callback = entry_add_text;
402 file_dialog->text_entry->func.key_press_callback = entry_get_text;
403 file_dialog->text_entry->flags &= ~USE_TRANSPARENCY;
404 file_dialog->text_entry->scale.gravity = CENTER;
405 file_dialog->text_entry->parent_struct = file_dialog;
406 widget_show_all(file_dialog->w);
407 }
408}
409
410static void fd_mem_free(void *w_, void* user_data) {
411 Widget_t *w = (Widget_t*)w_;
412 FileDialog *file_dialog = (FileDialog *)w->parent_struct;
413 if(file_dialog->send_clear_func)
414 file_dialog->parent->func.dialog_callback(file_dialog->parent,NULL);
415 fp_free(file_dialog->fp);
416 free(file_dialog->fp);
417 free(file_dialog);
418}
419
421 FileDialog *file_dialog = (FileDialog*)malloc(sizeof(FileDialog));
422
423 file_dialog->fp = (FilePicker*)malloc(sizeof(FilePicker));
424 fp_init(file_dialog->fp, (path) ? path : "/");
425 file_dialog->parent = w;
426 file_dialog->send_clear_func = true;
427
428 file_dialog->w = create_window(w->app, os_get_root_window(w->app, IS_WINDOW), 0, 0, 660, 420);
429#ifdef __linux__
430 XSizeHints* win_size_hints;
431 win_size_hints = XAllocSizeHints();
432 win_size_hints->flags = PMinSize|PBaseSize|PMaxSize|PWinGravity;
433 win_size_hints->min_width = 660;
434 win_size_hints->min_height = 420;
435 win_size_hints->base_width = 660;
436 win_size_hints->base_height = 420;
437 win_size_hints->max_width = 660;
438 win_size_hints->max_height = 840;
439 win_size_hints->win_gravity = CenterGravity;
440 XSetWMNormalHints(file_dialog->w->app->dpy, file_dialog->w->widget, win_size_hints);
441 XFree(win_size_hints);
442#endif
443 file_dialog->text_entry = NULL;
444
445 file_dialog->w->flags |= HAS_MEM;
446 file_dialog->w->parent_struct = file_dialog;
447 widget_set_title(file_dialog->w, _("Directory Selector"));
448 file_dialog->w->func.expose_callback = draw_window;
449 file_dialog->w->func.key_press_callback = forward_key_press;
450 file_dialog->w->func.mem_free_callback = fd_mem_free;
451 widget_set_icon_from_png(file_dialog->w, LDVAR(directory_png));
452
453 file_dialog->ct = add_combobox(file_dialog->w, "", 20, 40, 550, 30);
454 file_dialog->ct->parent_struct = file_dialog;
455 file_dialog->ct->scale.gravity = NORTHEAST;
456 file_dialog->ct->func.key_press_callback = forward_key_press;
457 file_dialog->ct->func.value_changed_callback = combo_response;
458
459 file_dialog->sel_dir = add_button(file_dialog->w, _("Add"), 580, 40, 60, 30);
460 file_dialog->sel_dir->parent_struct = file_dialog;
461 file_dialog->sel_dir->scale.gravity = WESTNORTH;
462 add_tooltip(file_dialog->sel_dir,_("Add new Directory"));
463 file_dialog->sel_dir->func.key_press_callback = forward_key_press;
464 file_dialog->sel_dir->func.value_changed_callback = add_dir_callback;
465
466 file_dialog->ft = add_listview(file_dialog->w, "", 20, 90, 620, 225);
467 file_dialog->ft->parent_struct = file_dialog;
468 file_dialog->ft->scale.gravity = NORTHWEST;
469 //file_dialog->ft->func.value_changed_callback = file_released_callback;
470 file_dialog->ft->func.key_press_callback = forward_key_press;
471 file_dialog->ft->func.button_release_callback = file_released_callback;
472 Widget_t* view_port = file_dialog->ft->childlist->childs[0];
473 view_port->func.key_press_callback = forward_listview_key_press;
474
475 int ds = fp_get_files(file_dialog->fp,file_dialog->fp->path, 1, 0);
476 int set_f = set_files(file_dialog);
477 set_dirs(file_dialog);
478 combobox_set_active_entry(file_dialog->ct, ds);
479 listview_set_active_entry(file_dialog->ft, set_f);
480
481 file_dialog->w_quit = add_button(file_dialog->w, _("Cancel"), 580, 350, 60, 60);
482 file_dialog->w_quit->parent_struct = file_dialog;
483 file_dialog->w_quit->scale.gravity = SOUTHWEST;
484 add_tooltip(file_dialog->w_quit,_("Exit Directory selector"));
485 file_dialog->w_quit->func.key_press_callback = forward_key_press;
486 file_dialog->w_quit->func.value_changed_callback = button_quit_callback;
487
488 file_dialog->w_okay = add_button(file_dialog->w, _("Select"), 510, 350, 60, 60);
489 file_dialog->w_okay->parent_struct = file_dialog;
490 file_dialog->w_okay->scale.gravity = SOUTHWEST;
491 add_tooltip(file_dialog->w_okay,_("Selected Directory"));
492 file_dialog->w_okay->func.key_press_callback = forward_key_press;
493 file_dialog->w_okay->func.value_changed_callback = button_ok_callback;
494
495 file_dialog->w_hidden = add_check_button(file_dialog->w, "", 20, 365, 20, 20);
496 file_dialog->w_hidden->parent_struct = file_dialog;
497 file_dialog->w_hidden->scale.gravity = EASTWEST;
498 add_tooltip(file_dialog->w_hidden,_("Show hidden Directories"));
499 file_dialog->w_hidden->func.key_press_callback = forward_key_press;
500 file_dialog->w_hidden->func.value_changed_callback = button_hidden_callback;
501
502 widget_show_all(file_dialog->w);
503 return file_dialog->w;
504}
505
506/*---------------------------------------------------------------------
507-----------------------------------------------------------------------
508 add_file_button
509-----------------------------------------------------------------------
510----------------------------------------------------------------------*/
511
512static void ddialog_response(void *w_, void* user_data) {
513 Widget_t *w = (Widget_t*)w_;
514 FileButton *filebutton = (FileButton *)w->parent_struct;
515 if(user_data !=NULL) {
516 char *tmp = strdup(*(const char**)user_data);
517 free(filebutton->last_path);
518 filebutton->last_path = NULL;
519 filebutton->last_path = strdup(dirname(tmp));
520 filebutton->path = filebutton->last_path;
521 free(tmp);
522 }
523 w->func.user_callback(w,user_data);
524 filebutton->is_active = false;
525 adj_set_value(w->adj,0.0);
526}
527
528static void dbutton_callback(void *w_, void* user_data) {
529 Widget_t *w = (Widget_t*)w_;
530 FileButton *filebutton = (FileButton *)w->parent_struct;
531 if (w->flags & HAS_POINTER && adj_get_value(w->adj)){
532 filebutton->w = open_directory_dialog(w,filebutton->path);
533 filebutton->is_active = true;
534 } else if (w->flags & HAS_POINTER && !adj_get_value(w->adj)){
535 if(filebutton->is_active)
536 destroy_widget(filebutton->w,w->app);
537 }
538}
539
540static void dbutton_mem_free(void *w_, void* user_data) {
541 Widget_t *w = (Widget_t*)w_;
542 FileButton *filebutton = (FileButton *)w->parent_struct;
543 free(filebutton->last_path);
544 filebutton->last_path = NULL;
545 free(filebutton);
546 filebutton = NULL;
547}
548
549Widget_t *add_directory_button(Widget_t *parent, int x, int y, int width, int height,
550 const char *path, const char *filter) {
551 FileButton *filebutton = (FileButton*)malloc(sizeof(FileButton));
552 filebutton->path = path;
553 filebutton->filter = filter;
554 filebutton->last_path = NULL;
555 filebutton->w = NULL;
556 filebutton->is_active = false;
557 Widget_t *fbutton = add_image_toggle_button(parent, "", x, y, width, height);
558 fbutton->parent_struct = filebutton;
559 fbutton->flags |= HAS_MEM;
560 widget_get_png(fbutton, LDVAR(directory_open_png));
561 fbutton->scale.gravity = CENTER;
562 fbutton->func.mem_free_callback = dbutton_mem_free;
563 fbutton->func.value_changed_callback = dbutton_callback;
564 fbutton->func.dialog_callback = ddialog_response;
565 return fbutton;
566}
Widget_t ** childs
Definition xchildlist.h:51
ComboBox_t - struct to hold information for the combobox.
Definition xcombobox.h:45
const char * path
Widget_t * w
char * last_path
const char * filter
Widget_t * ft
Widget_t * w_quit
FilePicker * fp
bool send_clear_func
Widget_t * sel_dir
Widget_t * ct
Widget_t * w
Widget_t * w_okay
Widget_t * text_entry
Widget_t * w_hidden
Widget_t * parent
unsigned int file_counter
Definition xfilepicker.h:69
bool show_hidden
Definition xfilepicker.h:72
char * selected_file
Definition xfilepicker.h:66
char * path
Definition xfilepicker.h:65
unsigned int dir_counter
Definition xfilepicker.h:70
char ** dir_names
Definition xfilepicker.h:68
char ** file_names
Definition xfilepicker.h:67
evfunc button_release_callback
Definition xwidget.h:101
xevfunc expose_callback
Definition xwidget.h:85
evfunc key_press_callback
Definition xwidget.h:104
xevfunc value_changed_callback
Definition xwidget.h:90
xevfunc user_callback
Definition xwidget.h:91
xevfunc mem_free_callback
Definition xwidget.h:92
xevfunc dialog_callback
Definition xwidget.h:96
Metrics_t - struct to receive window size, position & visibility Pass this struct to os_get_window_...
float scale_y
Definition xwidget.h:359
Gravity gravity
Definition xwidget.h:347
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
Window widget
Definition xwidget.h:469
cairo_t * crb
Definition xwidget.h:489
Childlist_t * childlist
Definition xwidget.h:499
long long flags
Definition xwidget.h:461
char input_label[32]
Definition xwidget.h:459
const char * label
Definition xwidget.h:463
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 selected
Definition xcolor.h:108
Display * dpy
Definition xputty.h:232
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
int asprintf(char *strp[], const char *fmt,...)
Definition xasprintf.c:36
Widget_t * add_check_button(Widget_t *parent, const char *label, int x, int y, int width, int height)
add_check_button - add a button to a Widget_t connect to func.value_changed_callback to implement you...
Definition xbutton.c:121
Widget_t * add_button(Widget_t *parent, const char *label, int x, int y, int width, int height)
add_button - add a button to a Widget_t connect to func.value_changed_callback to implement your acti...
Definition xbutton.c:26
Widget_t * add_image_toggle_button(Widget_t *parent, const char *label, int x, int y, int width, int height)
add_image_toggle_button - add a button to a Widget_t connect to func.value_changed_callback to implem...
Definition xbutton.c:89
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_fg_color_scheme(Widget_t *w, Color_state st)
use_fg_color_scheme - use forground Colors to paint on Widget_t
Definition xcolor.c:245
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_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
void combobox_set_active_entry(Widget_t *w, int active)
combobox_set_active_entry - set the active combobox entry
Definition xcombobox.c:27
void combobox_delete_entrys(Widget_t *combobox)
combobox_delete_entrys - free the list hold the combobox entrys
Definition xcombobox.c:67
void combobox_add_entry(Widget_t *wid, const char *label)
combobox_add_entry - add a entry to the combobox
Definition xcombobox.c:175
Widget_t * add_combobox(Widget_t *parent, const char *label, int x, int y, int width, int height)
add_combobox - add a combobox
Definition xcombobox.c:152
Widget_t * open_directory_dialog(Widget_t *w, const char *path)
Widget_t * add_directory_button(Widget_t *parent, int x, int y, int width, int height, const char *path, const char *filter)
void fp_init(FilePicker *filepicker, const char *path)
fp_init - set default values used by the filepicker
int fp_get_files(FilePicker *filepicker, char *path, int get_dirs, int get_files)
fp_get_files - fill file_names and dir_names with the results from readdir path
void fp_free(FilePicker *filepicker)
fp_free - release all memory used by the filepicker
void listview_remove_list(Widget_t *listview)
listview_remove_list - remove the list from a listview Widget_t
Definition xlistview.c:109
Widget_t * add_listview(Widget_t *parent, const char *label, int x, int y, int width, int height)
add_label - add a listview to a Widget_t
Definition xlistview.c:72
void listview_set_active_entry(Widget_t *w, int active)
listview_set_active_entry - set the active listview entry
Definition xlistview.c:28
void listview_set_list(Widget_t *listview, char **list, int list_size)
listview_set_list - set a list to a listview Widget_t
Definition xlistview.c:123
Widget_t * open_message_dialog(Widget_t *w, int style, const char *title, const char *message, const char *choices)
open_message_dialog - open a non blocking dialog window, lines in message chould be separated by the ...
@ INFO_BOX
void widget_get_png(Widget_t *w, const unsigned char *name)
widget_get_png - read png into Widget_t xlib surface
Definition xpngloader.c:75
void widget_set_icon_from_png(Widget_t *w, const unsigned char *name)
widget_set_icon_from_png - set icon image from png binary to Widget_t those icon will be used in the ...
Definition xpngloader.c:159
void add_tooltip(Widget_t *w, const char *label)
add_tooltip - add a tooltip to Widget_t
Definition xtooltip.c:41
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
Window os_get_root_window(Xputty *main, int flag)
os_get_root_window - get a pointer to the root window (desktop)
bool os_is_directory(const char *filename)
os_is directory - check if a given path is a directory or a file
bool os_get_keyboard_input(Widget_t *w, XKeyEvent *key, char *buf, size_t bufsize)
os_ get_keyboard_input - Get the Keyboard input and convert it to utf8
void widget_set_title(Widget_t *w, const char *title)
widget_set_title - set window title for a Widget_t
Definition xwidget.c:359
Widget_t * create_widget(Xputty *app, Widget_t *win, int x, int y, int width, int height)
*create_widget - create a widget A Widget_t could only be created as child of a other Widget_t To...
Definition xwidget.c:265
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
Widget_t * create_window(Xputty *app, Window win, int x, int y, int width, int height)
*create_window - create a Window You need to create as least minimun one Window to get started....
Definition xwidget.c:163
@ CENTER
Definition xwidget.h:320
@ EASTWEST
Definition xwidget.h:310
@ SOUTHWEST
Definition xwidget.h:304
@ NORTHEAST
Definition xwidget.h:302
@ NORTHWEST
Definition xwidget.h:300
@ WESTNORTH
Definition xwidget.h:316
@ HAS_POINTER
Definition xwidget.h:402
@ HAS_MEM
Definition xwidget.h:406
@ IS_WINDOW
Definition xwidget.h:390
void widget_show_all(Widget_t *w)
widget_show_all - map/show Widget_t with all childs
Definition xwidget.c:386
void destroy_widget(Widget_t *w, Xputty *main)
destroy_widget - destroy a widget When a Widget_t receive a destroy_widget() call,...
Definition xwidget.c:86