summaryrefslogtreecommitdiff
path: root/src/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/menu.c')
-rw-r--r--src/menu.c3648
1 files changed, 1637 insertions, 2011 deletions
diff --git a/src/menu.c b/src/menu.c
index d1d9b1b..b55329f 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -41,2100 +41,1726 @@ feh_menu *menu_bg = NULL;
static feh_menu_list *menus = NULL;
static int common_menus = 0;
-static void feh_menu_cb_about(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_close(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_exit(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_reload(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_remove(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_delete(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_reset(feh_menu * m,
- feh_menu_item * i,
- void *data);
-
-static void feh_menu_cb_remove_thumb(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_delete_thumb(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_tiled(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_scaled(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_seamless(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_centered(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_tiled_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_scaled_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_background_set_centered_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data);
-
-static void feh_menu_cb_sort_filename(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_sort_imagename(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_sort_filesize(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_sort_randomize(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_jump_to(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static feh_menu *feh_menu_func_gen_jump(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static feh_menu *feh_menu_func_gen_info(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_func_free_info(feh_menu * m,
- void *data);
-static void feh_menu_cb_save_image(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_save_filelist(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_fit(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_opt_draw_filename(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_opt_keep_http(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_opt_freeze_window(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_opt_fullscreen(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_func_free_options(feh_menu * m,
- void *data);
-static feh_menu *feh_menu_func_gen_options(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_edit_rotate(feh_menu * m,
- feh_menu_item * i,
- void *data);
-static void feh_menu_cb_opt_auto_zoom(feh_menu * m,
- feh_menu_item * i,
- void *data);
+static void feh_menu_cb_about(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_close(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_exit(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_reload(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_remove(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_delete(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_reset(feh_menu * m, feh_menu_item * i, void *data);
+
+static void feh_menu_cb_remove_thumb(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_delete_thumb(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_tiled(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_scaled(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_seamless(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_centered(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_tiled_no_file(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_scaled_no_file(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_background_set_centered_no_file(feh_menu * m, feh_menu_item * i, void *data);
+
+static void feh_menu_cb_sort_filename(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_sort_imagename(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_sort_filesize(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_sort_randomize(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_jump_to(feh_menu * m, feh_menu_item * i, void *data);
+static feh_menu *feh_menu_func_gen_jump(feh_menu * m, feh_menu_item * i, void *data);
+static feh_menu *feh_menu_func_gen_info(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_func_free_info(feh_menu * m, void *data);
+static void feh_menu_cb_save_image(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_save_filelist(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_fit(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_opt_draw_filename(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_opt_keep_http(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_opt_freeze_window(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_opt_fullscreen(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_func_free_options(feh_menu * m, void *data);
+static feh_menu *feh_menu_func_gen_options(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_edit_rotate(feh_menu * m, feh_menu_item * i, void *data);
+static void feh_menu_cb_opt_auto_zoom(feh_menu * m, feh_menu_item * i, void *data);
#ifdef HAVE_LIBXINERAMA
-static void feh_menu_cb_opt_xinerama(feh_menu * m,
- feh_menu_item * i,
- void *data);
-#endif /* HAVE_LIBXINERAMA */
-
-
-feh_menu *
-feh_menu_new(void)
-{
- feh_menu *m;
- XSetWindowAttributes attr;
- feh_menu_list *l;
- static Imlib_Image bg = NULL;
- static Imlib_Border border;
-
- D_ENTER(4);
-
- m = (feh_menu *) emalloc(sizeof(feh_menu));
-
- attr.backing_store = NotUseful;
- attr.override_redirect = True;
- attr.colormap = cm;
- attr.border_pixel = 0;
- attr.background_pixmap = None;
- attr.save_under = False;
- attr.do_not_propagate_mask = True;
-
- m->win =
- XCreateWindow(disp, root, 1, 1, 1, 1, 0, depth, InputOutput, vis,
- CWOverrideRedirect | CWSaveUnder | CWBackingStore |
- CWColormap | CWBackPixmap | CWBorderPixel | CWDontPropagate,
- &attr);
- XSelectInput(disp, m->win,
- ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
- LeaveWindowMask | PointerMotionMask | ButtonMotionMask);
-
- m->name = NULL;
- m->fehwin = NULL;
- m->pmap = 0;
- m->x = 0;
- m->y = 0;
- m->w = 0;
- m->h = 0;
- m->visible = 0;
- m->items = NULL;
- m->next = NULL;
- m->prev = NULL;
- m->updates = NULL;
- m->needs_redraw = 1;
- m->func_free = NULL;
- m->data = NULL;
- m->calc = 0;
- m->bg = NULL;
-
- l = emalloc(sizeof(feh_menu_list));
- l->menu = m;
- l->next = menus;
- menus = l;
-
- if (!bg) {
- feh_load_image_char(&bg, opt.menu_bg);
- if (bg) {
- border.left = opt.menu_border;
- border.right = opt.menu_border;
- border.top = opt.menu_border;
- border.bottom = opt.menu_border;
- imlib_context_set_image(bg);
- imlib_image_set_border(&border);
- }
- }
-
- if (bg)
- m->bg = gib_imlib_clone_image(bg);
-
- D_RETURN(4, m);
-}
-
-void
-feh_menu_free(feh_menu * m)
-{
- feh_menu_item *i;
- feh_menu_list *l, *pl = NULL;
-
- D_ENTER(4);
-
- if (m->name)
- free(m->name);
- XDestroyWindow(disp, m->win);
- if (m->pmap)
- XFreePixmap(disp, m->pmap);
- if (m->updates)
- imlib_updates_free(m->updates);
- for (i = m->items; i;) {
- feh_menu_item *ii;
-
- ii = i;
- i = i->next;
- if (ii->func_free)
- (ii->func_free) (ii->data);
- if (ii->text)
- free(ii->text);
- if (ii->submenu)
- free(ii->submenu);
- free(ii);
- }
-
- for (l = menus; l; l = l->next) {
- if (l->menu == m) {
- if (pl)
- pl->next = l->next;
- else
- menus = l->next;
- free(l);
- break;
- }
- pl = l;
- }
- free(m);
-
- D_RETURN_(4);
-}
-
-feh_menu_item *
-feh_menu_find_selected(feh_menu * m)
-{
- feh_menu_item *i;
-
- D_ENTER(4);
-
- D(5, ("menu %p\n", m));
-
- for (i = m->items; i; i = i->next) {
- if (MENU_ITEM_IS_SELECTED(i))
- D_RETURN(4, i);
- }
- D_RETURN(4, NULL);
-}
-
-feh_menu_item *
-feh_menu_find_selected_r(feh_menu * m, feh_menu **parent)
-{
- feh_menu_item *i, *ii;
- feh_menu *mm;
-
- D_ENTER(4);
-
- D(5, ("menu %p\n", m));
-
- for (i = m->items; i; i = i->next) {
- if (MENU_ITEM_IS_SELECTED(i)) {
- if (parent)
- *parent = m;
- D_RETURN(4, i);
- } else if (i->submenu) {
- mm = feh_menu_find(i->submenu);
- if (mm) {
- ii = feh_menu_find_selected_r(mm, parent);
- if (ii)
- D_RETURN(4, ii);
- }
- }
- }
- if (parent)
- *parent = m;
- D_RETURN(4, NULL);
-}
-
-void
-feh_menu_select_next(feh_menu *selected_menu, feh_menu_item *selected_item) {
- feh_menu_item *i;
- if (!selected_item) {
- /* jump to first item, select it */
- feh_menu_select(selected_menu, selected_menu->items);
- } else {
- i = selected_item;
- while (1) {
- i = i->next;
- if (!i)
- i = selected_menu->items;
- if (i->func || i->submenu || i->func_gen_sub || i->text) {
- break;
- }
- }
- feh_menu_deselect_selected(selected_menu);
- feh_menu_select(selected_menu, i);
- }
-}
-
-void
-feh_menu_select_prev(feh_menu *selected_menu, feh_menu_item *selected_item) {
- feh_menu_item *i, *ii;
- if (!selected_item) {
- /* jump to last item, select it */
- for (i = selected_menu->items; i->next; i = i->next);
- feh_menu_select(selected_menu, i);
- } else {
- i = selected_item;
- while (1) {
- i = i->prev;
- if (!i) {
- i = selected_menu->items;
- for (ii = selected_menu->items; ii->next; ii = ii->next);
- i = ii;
- }
- if (i->func || i->submenu || i->func_gen_sub || i->text) {
- break;
- }
- }
- feh_menu_deselect_selected(selected_menu);
- feh_menu_select(selected_menu, i);
- }
-}
-
-void
-feh_menu_select_parent(feh_menu *selected_menu, feh_menu_item *selected_item) {
- feh_menu *m;
- feh_menu_item *i;
- /* find the parent menu's item which refers to this menu's name */
- if (selected_menu->prev) {
- m = selected_menu->prev;
- for (i = m->items; i; i = i->next) {
- if(i->submenu && !strcmp(i->submenu, selected_menu->name))
- break;
- }
- /* shouldn't ever happen */
- if (i == NULL)
- i = m->items;
- feh_menu_deselect_selected(selected_menu);
- feh_menu_select(m, i);
- }
-}
-
-void
-feh_menu_select_submenu(feh_menu *selected_menu, feh_menu_item *selected_item) {
- if (selected_menu->next) {
- feh_menu_deselect_selected(selected_menu);
- feh_menu_select(selected_menu->next, selected_menu->next->items);
- }
-}
-
-void feh_menu_item_activate(feh_menu *m,
- feh_menu_item *i) {
- /* watch out for this. I put it this way around so the menu
- goes away *before* we perform the action, if we start
- freeing menus on hiding, it will break ;-) */
- if ((i) && (i->func)) {
- feh_menu_hide(menu_root, False);
- feh_main_iteration(0);
- (i->func) (m, i, i->data);
- if(m->func_free)
- m->func_free(m, m->data);
- }
-}
-
-feh_menu_item *
-feh_menu_find_at_xy(feh_menu * m,
- int x,
- int y)
-{
- feh_menu_item *i;
-
- D_ENTER(4);
- D(4, ("looking for menu item at %d,%d\n", x, y));
- for (i = m->items; i; i = i->next) {
- if (XY_IN_RECT(x, y, i->x, i->y, i->w, i->h)) {
- D(4, ("Found an item\n"));
- D_RETURN(4, i);
- }
- }
- D(4, ("didn't find an item\n"));
- D_RETURN(4, NULL);
-}
-
-void
-feh_menu_deselect_selected(feh_menu * m)
-{
- feh_menu_item *i;
-
- D_ENTER(4);
-
- if (!m)
- D_RETURN_(4);
-
- i = feh_menu_find_selected(m);
- if (i) {
- D(4, ("found a selected menu, deselecting it\n"));
- MENU_ITEM_SET_NORMAL(i);
- m->updates = imlib_update_append_rect(m->updates, i->x, i->y, i->w, i->h);
- m->needs_redraw = 1;
- }
- D_RETURN_(4);
-}
-
-void
-feh_menu_select(feh_menu * m,
- feh_menu_item * i)
-{
- D_ENTER(4);
- MENU_ITEM_SET_SELECTED(i);
- m->updates = imlib_update_append_rect(m->updates, i->x, i->y, i->w, i->h);
- m->needs_redraw = 1;
- if (m->next) {
- m->next->prev = NULL;
- feh_menu_hide(m->next, TRUE);
- m->next = NULL;
- }
- if (i->submenu) {
- feh_menu *mm;
-
- mm = feh_menu_find(i->submenu);
- if (mm)
- feh_menu_show_at_submenu(mm, m, i);
- else if (i->func_gen_sub)
- feh_menu_show_at_submenu(i->func_gen_sub(m, i, i->data), m, i);
- }
- D_RETURN_(4);
-}
-
-void
-feh_menu_show_at(feh_menu * m, int x, int y)
-{
- D_ENTER(4);
-
- if (m->calc)
- feh_menu_calc_size(m);
- if (!menu_cover) {
- XSetWindowAttributes attr;
-
- D(4, ("creating menu cover window\n"));
- attr.override_redirect = True;
- attr.do_not_propagate_mask = True;
- menu_cover =
- XCreateWindow(disp, root, 0, 0, scr->width, scr->height, 0, 0,
- InputOnly, vis, CWOverrideRedirect | CWDontPropagate,
- &attr);
- XSelectInput(disp, menu_cover,
- KeyPressMask | ButtonPressMask | ButtonReleaseMask |
- EnterWindowMask | LeaveWindowMask | PointerMotionMask |
- ButtonMotionMask);
-
- XRaiseWindow(disp, menu_cover);
- XMapWindow(disp, menu_cover);
- menu_root = m;
- XUngrabPointer(disp, CurrentTime);
- XSetInputFocus(disp, menu_cover, RevertToPointerRoot, CurrentTime);
- }
- m->visible = 1;
- XMoveWindow(disp, m->win, x, y);
- m->x = x;
- m->y = y;
- XRaiseWindow(disp, m->win);
- feh_menu_redraw(m);
- XMapWindow(disp, m->win);
- D_RETURN_(4);
-}
-
-void
-feh_menu_show_at_xy(feh_menu * m,
- winwidget winwid,
- int x,
- int y)
-{
- D_ENTER(4);
-
- if (!m)
- D_RETURN_(4);
-
- if (m->calc)
- feh_menu_calc_size(m);
- m->fehwin = winwid;
- if ((x + m->w) > scr->width)
- x = scr->width - m->w;
- if ((y + m->h) > scr->height)
- y = scr->height - m->h;
-
-#if 0
+static void feh_menu_cb_opt_xinerama(feh_menu * m, feh_menu_item * i, void *data);
+#endif /* HAVE_LIBXINERAMA */
+
+feh_menu *feh_menu_new(void)
+{
+ feh_menu *m;
+ XSetWindowAttributes attr;
+ feh_menu_list *l;
+ static Imlib_Image bg = NULL;
+ static Imlib_Border border;
+
+ D_ENTER(4);
+
+ m = (feh_menu *) emalloc(sizeof(feh_menu));
+
+ attr.backing_store = NotUseful;
+ attr.override_redirect = True;
+ attr.colormap = cm;
+ attr.border_pixel = 0;
+ attr.background_pixmap = None;
+ attr.save_under = False;
+ attr.do_not_propagate_mask = True;
+
+ m->win = XCreateWindow(
+ disp, root, 1, 1, 1, 1, 0, depth, InputOutput, vis,
+ CWOverrideRedirect | CWSaveUnder | CWBackingStore
+ | CWColormap | CWBackPixmap | CWBorderPixel | CWDontPropagate, &attr);
+ XSelectInput(disp, m->win,
+ ButtonPressMask | ButtonReleaseMask | EnterWindowMask
+ | LeaveWindowMask | PointerMotionMask | ButtonMotionMask);
+
+ m->name = NULL;
+ m->fehwin = NULL;
+ m->pmap = 0;
+ m->x = 0;
+ m->y = 0;
+ m->w = 0;
+ m->h = 0;
+ m->visible = 0;
+ m->items = NULL;
+ m->next = NULL;
+ m->prev = NULL;
+ m->updates = NULL;
+ m->needs_redraw = 1;
+ m->func_free = NULL;
+ m->data = NULL;
+ m->calc = 0;
+ m->bg = NULL;
+
+ l = emalloc(sizeof(feh_menu_list));
+ l->menu = m;
+ l->next = menus;
+ menus = l;
+
+ if (!bg) {
+ feh_load_image_char(&bg, opt.menu_bg);
+ if (bg) {
+ border.left = opt.menu_border;
+ border.right = opt.menu_border;
+ border.top = opt.menu_border;
+ border.bottom = opt.menu_border;
+ imlib_context_set_image(bg);
+ imlib_image_set_border(&border);
+ }
+ }
+
+ if (bg)
+ m->bg = gib_imlib_clone_image(bg);
+
+ D_RETURN(4, m);
+}
+
+void feh_menu_free(feh_menu * m)
+{
+ feh_menu_item *i;
+ feh_menu_list *l, *pl = NULL;
+
+ D_ENTER(4);
+
+ if (m->name)
+ free(m->name);
+ XDestroyWindow(disp, m->win);
+ if (m->pmap)
+ XFreePixmap(disp, m->pmap);
+ if (m->updates)
+ imlib_updates_free(m->updates);
+ for (i = m->items; i;) {
+ feh_menu_item *ii;
+
+ ii = i;
+ i = i->next;
+ if (ii->func_free)
+ (ii->func_free) (ii->data);
+ if (ii->text)
+ free(ii->text);
+ if (ii->submenu)
+ free(ii->submenu);
+ free(ii);
+ }
+
+ for (l = menus; l; l = l->next) {
+ if (l->menu == m) {
+ if (pl)
+ pl->next = l->next;
+ else
+ menus = l->next;
+ free(l);
+ break;
+ }
+ pl = l;
+ }
+ free(m);
+
+ D_RETURN_(4);
+}
+
+feh_menu_item *feh_menu_find_selected(feh_menu * m)
+{
+ feh_menu_item *i;
+
+ D_ENTER(4);
+
+ D(5, ("menu %p\n", m));
+
+ for (i = m->items; i; i = i->next) {
+ if (MENU_ITEM_IS_SELECTED(i))
+ D_RETURN(4, i);
+ }
+ D_RETURN(4, NULL);
+}
+
+feh_menu_item *feh_menu_find_selected_r(feh_menu * m, feh_menu ** parent)
+{
+ feh_menu_item *i, *ii;
+ feh_menu *mm;
+
+ D_ENTER(4);
+
+ D(5, ("menu %p\n", m));
+
+ for (i = m->items; i; i = i->next) {
+ if (MENU_ITEM_IS_SELECTED(i)) {
+ if (parent)
+ *parent = m;
+ D_RETURN(4, i);
+ } else if (i->submenu) {
+ mm = feh_menu_find(i->submenu);
+ if (mm) {
+ ii = feh_menu_find_selected_r(mm, parent);
+ if (ii)
+ D_RETURN(4, ii);
+ }
+ }
+ }
+ if (parent)
+ *parent = m;
+ D_RETURN(4, NULL);
+}
+
+void feh_menu_select_next(feh_menu * selected_menu, feh_menu_item * selected_item)
+{
+ feh_menu_item *i;
+ if (!selected_item) {
+ /* jump to first item, select it */
+ feh_menu_select(selected_menu, selected_menu->items);
+ } else {
+ i = selected_item;
+ while (1) {
+ i = i->next;
+ if (!i)
+ i = selected_menu->items;
+ if (i->func || i->submenu || i->func_gen_sub || i->text) {
+ break;
+ }
+ }
+ feh_menu_deselect_selected(selected_menu);
+ feh_menu_select(selected_menu, i);
+ }
+}
+
+void feh_menu_select_prev(feh_menu * selected_menu, feh_menu_item * selected_item)
+{
+ feh_menu_item *i, *ii;
+ if (!selected_item) {
+ /* jump to last item, select it */
+ for (i = selected_menu->items; i->next; i = i->next);
+ feh_menu_select(selected_menu, i);
+ } else {
+ i = selected_item;
+ while (1) {
+ i = i->prev;
+ if (!i) {
+ i = selected_menu->items;
+ for (ii = selected_menu->items; ii->next; ii = ii->next);
+ i = ii;
+ }
+ if (i->func || i->submenu || i->func_gen_sub || i->text) {
+ break;
+ }
+ }
+ feh_menu_deselect_selected(selected_menu);
+ feh_menu_select(selected_menu, i);
+ }
+}
+
+void feh_menu_select_parent(feh_menu * selected_menu, feh_menu_item * selected_item)
+{
+ feh_menu *m;
+ feh_menu_item *i;
+ /* find the parent menu's item which refers to this menu's name */
+ if (selected_menu->prev) {
+ m = selected_menu->prev;
+ for (i = m->items; i; i = i->next) {
+ if (i->submenu && !strcmp(i->submenu, selected_menu->name))
+ break;
+ }
+ /* shouldn't ever happen */
+ if (i == NULL)
+ i = m->items;
+ feh_menu_deselect_selected(selected_menu);
+ feh_menu_select(m, i);
+ }
+}
+
+void feh_menu_select_submenu(feh_menu * selected_menu, feh_menu_item * selected_item)
+{
+ if (selected_menu->next) {
+ feh_menu_deselect_selected(selected_menu);
+ feh_menu_select(selected_menu->next, selected_menu->next->items);
+ }
+}
+
+void feh_menu_item_activate(feh_menu * m, feh_menu_item * i)
+{
+ /* watch out for this. I put it this way around so the menu
+ goes away *before* we perform the action, if we start
+ freeing menus on hiding, it will break ;-) */
+ if ((i) && (i->func)) {
+ feh_menu_hide(menu_root, False);
+ feh_main_iteration(0);
+ (i->func) (m, i, i->data);
+ if (m->func_free)
+ m->func_free(m, m->data);
+ }
+}
+
+feh_menu_item *feh_menu_find_at_xy(feh_menu * m, int x, int y)
+{
+ feh_menu_item *i;
+
+ D_ENTER(4);
+ D(4, ("looking for menu item at %d,%d\n", x, y));
+ for (i = m->items; i; i = i->next) {
+ if (XY_IN_RECT(x, y, i->x, i->y, i->w, i->h)) {
+ D(4, ("Found an item\n"));
+ D_RETURN(4, i);
+ }
+ }
+ D(4, ("didn't find an item\n"));
+ D_RETURN(4, NULL);
+}
+
+void feh_menu_deselect_selected(feh_menu * m)
+{
+ feh_menu_item *i;
+
+ D_ENTER(4);
+
+ if (!m)
+ D_RETURN_(4);
+
+ i = feh_menu_find_selected(m);
+ if (i) {
+ D(4, ("found a selected menu, deselecting it\n"));
+ MENU_ITEM_SET_NORMAL(i);
+ m->updates = imlib_update_append_rect(m->updates, i->x, i->y, i->w, i->h);
+ m->needs_redraw = 1;
+ }
+ D_RETURN_(4);
+}
+
+void feh_menu_select(feh_menu * m, feh_menu_item * i)
+{
+ D_ENTER(4);
+ MENU_ITEM_SET_SELECTED(i);
+ m->updates = imlib_update_append_rect(m->updates, i->x, i->y, i->w, i->h);
+ m->needs_redraw = 1;
+ if (m->next) {
+ m->next->prev = NULL;
+ feh_menu_hide(m->next, TRUE);
+ m->next = NULL;
+ }
+ if (i->submenu) {
+ feh_menu *mm;
+
+ mm = feh_menu_find(i->submenu);
+ if (mm)
+ feh_menu_show_at_submenu(mm, m, i);
+ else if (i->func_gen_sub)
+ feh_menu_show_at_submenu(i->func_gen_sub(m, i, i->data), m, i);
+ }
+ D_RETURN_(4);
+}
+
+void feh_menu_show_at(feh_menu * m, int x, int y)
+{
+ D_ENTER(4);
+
+ if (m->calc)
+ feh_menu_calc_size(m);
+ if (!menu_cover) {
+ XSetWindowAttributes attr;
+
+ D(4, ("creating menu cover window\n"));
+ attr.override_redirect = True;
+ attr.do_not_propagate_mask = True;
+ menu_cover = XCreateWindow(
+ disp, root, 0, 0, scr->width,
+ scr->height, 0, 0, InputOnly, vis,
+ CWOverrideRedirect | CWDontPropagate, &attr);
+ XSelectInput(disp, menu_cover,
+ KeyPressMask | ButtonPressMask |
+ ButtonReleaseMask | EnterWindowMask |
+ LeaveWindowMask | PointerMotionMask | ButtonMotionMask);
+
+ XRaiseWindow(disp, menu_cover);
+ XMapWindow(disp, menu_cover);
+ menu_root = m;
+ XUngrabPointer(disp, CurrentTime);
+ XSetInputFocus(disp, menu_cover, RevertToPointerRoot, CurrentTime);
+ }
+ m->visible = 1;
+ XMoveWindow(disp, m->win, x, y);
+ m->x = x;
+ m->y = y;
+ XRaiseWindow(disp, m->win);
+ feh_menu_redraw(m);
+ XMapWindow(disp, m->win);
+ D_RETURN_(4);
+}
+
+void feh_menu_show_at_xy(feh_menu * m, winwidget winwid, int x, int y)
+{
+ D_ENTER(4);
+
+ if (!m)
+ D_RETURN_(4);
+
+ if (m->calc)
+ feh_menu_calc_size(m);
+ m->fehwin = winwid;
+ if ((x + m->w) > scr->width)
+ x = scr->width - m->w;
+ if ((y + m->h) > scr->height)
+ y = scr->height - m->h;
+
+#if 0
/* #ifdef HAVE_LIBXINERAMA */
/* this doesn't work correctly :( -- pabs */
- if (opt.xinerama && xinerama_screens) {
- if ((x + m->w) > xinerama_screens[xinerama_screen].width)
- x = xinerama_screens[xinerama_screen].width - m->w;
- if ((y + m->h) > xinerama_screens[xinerama_screen].height)
- y = xinerama_screens[xinerama_screen].height - m->h;
-
- }
-#endif /* HAVE_LIBXINERAMA */
-
- if (x < 0)
- x = 0;
- if (y < 0)
- y = 0;
- feh_menu_move(m, x, y);
- feh_menu_show(m);
- D_RETURN_(4);
-}
-
-void
-feh_menu_show_at_submenu(feh_menu * m,
- feh_menu * parent_m,
- feh_menu_item * i)
-{
- int mx, my;
-
- D_ENTER(4);
-
- if (!m)
- D_RETURN_(4);
-
- if (m->calc)
- feh_menu_calc_size(m);
- mx = parent_m->x + parent_m->w;
- my = parent_m->y + i->y - FEH_MENU_PAD_TOP;
- m->fehwin = parent_m->fehwin;
- parent_m->next = m;
- m->prev = parent_m;
- feh_menu_move(m, mx, my);
- feh_menu_show(m);
- D_RETURN_(4);
-}
-
-void
-feh_menu_move(feh_menu * m,
- int x,
- int y)
-{
- int dx, dy;
-
- D_ENTER(4);
-
- if (!m)
- D_RETURN_(4);
- dx = x - m->x;
- dy = y - m->y;
- if (m->visible)
- XMoveWindow(disp, m->win, x, y);
- m->x = x;
- m->y = y;
- D_RETURN_(4);
-}
-
-void
-feh_menu_slide_all_menus_relative(int dx,
- int dy)
-{
- int i;
- feh_menu_list *m;
- double vector_len = 0;
- int stepx = 0;
- int stepy = 0;
-
- D_ENTER(4);
- vector_len = sqrt(dx * dx + dy * dy);
- if (vector_len) {
- if (dx)
- stepx = rint(dx / vector_len);
-
- if (dy)
- stepy = rint(dy / vector_len);
-
- }
- for (i = 0; i < vector_len; i++) {
- for (m = menus; m; m = m->next) {
- if (m->menu->visible)
- feh_menu_move(m->menu, m->menu->x + stepx, m->menu->y + stepy);
-
- }
- XWarpPointer(disp, None, None, 0, 0, 0, 0, stepx, stepy);
- }
- D_RETURN_(4);
-}
-
-void
-feh_menu_hide(feh_menu * m,
- int func_free)
-{
- D_ENTER(4);
-
- if (!m->visible)
- D_RETURN_(4);
- if (m->next) {
- m->next->prev = NULL;
- feh_menu_hide(m->next, func_free);
- m->next = NULL;
- }
- if (m == menu_root) {
- if (menu_cover) {
- D(4, ("DESTROYING menu cover\n"));
- XDestroyWindow(disp, menu_cover);
- menu_cover = 0;
- }
- menu_root = NULL;
- }
- m->visible = 0;
- XUnmapWindow(disp, m->win);
- if (func_free && m->func_free)
- m->func_free(m, m->data);
- else
- feh_menu_deselect_selected(m);
- D_RETURN_(4);
-}
-
-void
-feh_menu_show(feh_menu * m)
-{
- D_ENTER(4);
- if (!m)
- D_RETURN_(4);
- feh_menu_show_at(m, m->x, m->y);
- D_RETURN_(4);
-}
-
-feh_menu_item *
-feh_menu_add_toggle_entry(feh_menu * m,
- char *text,
- Imlib_Image icon,
- char *submenu,
- menu_func func,
- void *data,
- void (*func_free) (void *data),
- int setting)
-{
- feh_menu_item *mi;
-
- D_ENTER(4);
- mi = feh_menu_add_entry(m, text, icon, submenu, func, data, func_free);
- mi->is_toggle = TRUE;
- MENU_ITEM_TOGGLE_SET(mi, setting);
- D_RETURN(4, mi);
-}
-
-feh_menu_item *
-feh_menu_add_entry(feh_menu * m,
- char *text,
- Imlib_Image icon,
- char *submenu,
- menu_func func,
- void *data,
- void (*func_free) (void *data))
-{
- feh_menu_item *mi, *ptr;
-
- D_ENTER(4);
-
- mi = (feh_menu_item *) emalloc(sizeof(feh_menu_item));
- mi->state = MENU_ITEM_STATE_NORMAL;
- mi->icon = icon;
- mi->is_toggle = FALSE;
- if (text)
- mi->text = estrdup(text);
- else
- mi->text = NULL;
- if (submenu)
- mi->submenu = estrdup(submenu);
- else
- mi->submenu = NULL;
- mi->func = func;
- mi->func_free = func_free;
- mi->data = data;
- mi->func_gen_sub = NULL;
- mi->next = NULL;
- mi->prev = NULL;
-
- if (!m->items)
- m->items = mi;
- else {
- for (ptr = m->items; ptr; ptr = ptr->next) {
- if (!ptr->next) {
- ptr->next = mi;
- mi->prev = ptr;
- break;
- }
- }
- }
- m->calc = 1;
- D_RETURN(4, mi);
-}
-
-
-void
-feh_menu_entry_get_size(feh_menu * m,
- feh_menu_item * i,
- int *w,
- int *h)
-{
- int tw, th;
-
- D_ENTER(4);
-
- if (i->text) {
- gib_imlib_get_text_size(opt.menu_fn, i->text, opt.menu_style_l, &tw, &th,
- IMLIB_TEXT_TO_RIGHT);
- *w =
- tw + FEH_MENUITEM_PAD_LEFT + FEH_MENUITEM_PAD_RIGHT;
- *h =
- th + FEH_MENUITEM_PAD_TOP + FEH_MENUITEM_PAD_BOTTOM;
- } else {
- *w = FEH_MENUITEM_PAD_LEFT + FEH_MENUITEM_PAD_RIGHT;
- *h = FEH_MENUITEM_PAD_TOP + FEH_MENUITEM_PAD_BOTTOM;
- }
-
- D_RETURN_(4);
- m = NULL;
-}
-
-void
-feh_menu_calc_size(feh_menu * m)
-{
- int prev_w, prev_h;
- feh_menu_item *i;
- int j = 0, count = 0, max_w = 0, max_h = 0, icon_w = 0, next_w = 0;
- int toggle_w = 0;
-
- D_ENTER(4);
-
- prev_w = m->w;
- prev_h = m->h;
- m->calc = 0;
-
- for (i = m->items; i; i = i->next) {
- int w, h;
-
- feh_menu_entry_get_size(m, i, &w, &h);
- if (w > max_w)
- max_w = w;
- if (h > max_h)
- max_h = h;
- if (i->submenu) {
- next_w = FEH_MENU_SUBMENU_W;
- if (FEH_MENU_SUBMENU_H > max_h)
- max_h = FEH_MENU_SUBMENU_H;
- }
- if (i->is_toggle) {
- toggle_w = FEH_MENU_TOGGLE_W + FEH_MENU_TOGGLE_PAD;
- if (FEH_MENU_TOGGLE_H > max_h)
- max_h = FEH_MENU_TOGGLE_H;
- }
- count++;
- }
-
- for (i = m->items; i; i = i->next) {
- if (i->icon) {
- Imlib_Image im;
-
- im = i->icon;
- if (im) {
- int iw, ih, ow, oh;
-
- iw = gib_imlib_image_get_width(im);
- ih = gib_imlib_image_get_height(im);
- if (ih <= max_h) {
- ow = iw;
- oh = ih;
- } else {
- ow = (iw * max_h) / ih;
- oh = max_h;
- }
- if (ow > icon_w)
- icon_w = ow;
- }
- }
- }
- m->h = FEH_MENU_PAD_TOP;
- for (i = m->items; i; i = i->next) {
- i->x = FEH_MENU_PAD_LEFT;
- i->y = m->h;
- i->w = max_w + icon_w + toggle_w + next_w;
- i->icon_x = FEH_MENUITEM_PAD_LEFT;
- i->toggle_x = i->icon_x + icon_w;
- i->text_x = i->toggle_x + toggle_w;
- i->sub_x = i->text_x + max_w;
- if (i->text)
- i->h = max_h;
- else
- i->h = FEH_MENU_SEP_MAX_H;
- m->h += i->h;
- j++;
- }
- m->h += FEH_MENU_PAD_BOTTOM;
- m->w =
- next_w + toggle_w + icon_w + max_w + FEH_MENU_PAD_LEFT +
- FEH_MENU_PAD_RIGHT;
-
- if ((prev_w != m->w) || (prev_h != m->h)) {
- if (m->pmap)
- XFreePixmap(disp, m->pmap);
- m->pmap = 0;
- m->needs_redraw = 1;
- XResizeWindow(disp, m->win, m->w, m->h);
- m->updates = imlib_update_append_rect(m->updates, 0, 0, m->w, m->h);
- }
- D(4, ("menu size calculated. w=%d h=%d\n", m->w, m->h));
-
- /* Make sure bg is same size */
- if (m->bg) {
- int bg_w, bg_h;
-
- bg_w = gib_imlib_image_get_width(m->bg);
- bg_h = gib_imlib_image_get_height(m->bg);
-
- if (m->w != bg_w || m->h != bg_h) {
- Imlib_Image newim = imlib_create_image(m->w, m->h);
-
- D(3, ("resizing bg to %dx%d\n", m->w, m->h));
-
- gib_imlib_blend_image_onto_image(newim, m->bg, 0, 0, 0, bg_w, bg_h, 0,
- 0, m->w, m->h, 0, 0, 1);
- gib_imlib_free_image_and_decache(m->bg);
- m->bg = newim;
- }
- }
-
- D_RETURN_(4);
-}
-
-void
-feh_menu_draw_item(feh_menu * m,
- feh_menu_item * i,
- Imlib_Image im,
- int ox,
- int oy)
-{
- D_ENTER(5);
-
- D(5,
- ("drawing item %p (text %s) on menu %p (name %s)\n", i, i->text, m,
- m->name));
-
- if (i->text) {
- D(5, ("text item\n"));
- if (MENU_ITEM_IS_SELECTED(i)) {
- D(5, ("selected item\n"));
- /* draw selected image */
- feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 1);
- } else {
- D(5, ("unselected item\n"));
- /* draw unselected image */
- feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 0);
- }
-
- /* draw text */
- gib_imlib_text_draw(im, opt.menu_fn, opt.menu_style_l,
- i->x - ox + i->text_x,
- i->y - oy + FEH_MENUITEM_PAD_TOP, i->text,
- IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255);
- if (i->icon) {
- Imlib_Image im2;
-
- D(5, ("icon item\n"));
-
- im2 = i->icon;
- if (im2) {
- int iw, ih, ow, oh;
-
- iw = gib_imlib_image_get_width(im2);
- ih = gib_imlib_image_get_height(im2);
- if (ih <= (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) {
- ow = iw;
- oh = ih;
- } else {
- ow =
- (iw * (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) /
- ih;
- oh = i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM;
- }
- gib_imlib_blend_image_onto_image(im, im2, 0, 0, 0, iw, ih,
- i->x + i->icon_x - ox,
- i->y + FEH_MENUITEM_PAD_TOP +
- (((i->h - FEH_MENUITEM_PAD_TOP -
- FEH_MENUITEM_PAD_BOTTOM) -
- oh) / 2) - oy, ow, oh, 1, 1, 1);
- gib_imlib_free_image(im2);
- }
- }
- if (i->submenu) {
- D(5, ("submenu item\n"));
- feh_menu_draw_submenu_at(i->x + i->sub_x,
- i->y + FEH_MENUITEM_PAD_TOP +
- ((i->h - FEH_MENUITEM_PAD_TOP -
- FEH_MENUITEM_PAD_BOTTOM -
- FEH_MENU_SUBMENU_H) / 2), FEH_MENU_SUBMENU_W,
- FEH_MENU_SUBMENU_H, im, ox, oy,
- MENU_ITEM_IS_SELECTED(i));
- }
- if (i->is_toggle) {
- D(5, ("toggleable item\n"));
- feh_menu_draw_toggle_at(i->x + i->toggle_x,
- i->y + FEH_MENUITEM_PAD_TOP +
- ((i->h - FEH_MENUITEM_PAD_TOP -
- FEH_MENUITEM_PAD_BOTTOM -
- FEH_MENU_TOGGLE_H) / 2), FEH_MENU_TOGGLE_W,
- FEH_MENU_TOGGLE_H, im, ox, oy,
- MENU_ITEM_IS_ON(i));
- }
- } else {
- D(5, ("separator item\n"));
- feh_menu_draw_separator_at(i->x, i->y, i->w, i->h, im, ox, oy);
- }
- D_RETURN_(5);
- m = NULL;
-}
-
-void
-feh_menu_redraw(feh_menu * m)
-{
- Imlib_Updates u, uu;
-
- D_ENTER(5);
-
- if ((!m->needs_redraw) || (!m->visible) || (!m->updates))
- D_RETURN_(5);
- m->needs_redraw = 0;
- if (!m->pmap)
- m->pmap = XCreatePixmap(disp, m->win, m->w, m->h, depth);
- XSetWindowBackgroundPixmap(disp, m->win, m->pmap);
-
- u = imlib_updates_merge_for_rendering(m->updates, m->w, m->h);
- m->updates = NULL;
- if (u) {
- D(5, ("I have updates to render\n"));
- for (uu = u; u; u = imlib_updates_get_next(u)) {
- int x, y, w, h;
- Imlib_Image im;
-
- imlib_updates_get_coordinates(u, &x, &y, &w, &h);
- D(5, ("update coords %d,%d %d*%d\n", x, y, w, h));
- im = imlib_create_image(w, h);
- gib_imlib_image_fill_rectangle(im, 0, 0, w, h, 0, 0, 0, 0);
- if (im) {
- feh_menu_draw_to_buf(m, im, x, y);
- gib_imlib_render_image_on_drawable(m->pmap, im, x, y, 1, 0, 0);
- gib_imlib_free_image(im);
- XClearArea(disp, m->win, x, y, w, h, False);
- }
- }
- imlib_updates_free(uu);
- }
- D_RETURN_(5);
-}
-
-feh_menu *
-feh_menu_find(char *name)
-{
- feh_menu_list *l;
-
- D_ENTER(4);
- for (l = menus; l; l = l->next) {
- if ((l->menu->name) && (!strcmp(l->menu->name, name)))
- D_RETURN(4, l->menu);
- }
- D_RETURN(4, NULL);
-}
-
-void
-feh_menu_draw_to_buf(feh_menu * m,
- Imlib_Image im,
- int ox,
- int oy)
-{
- feh_menu_item *i;
- int w, h;
-
- D_ENTER(5);
- w = gib_imlib_image_get_width(im);
- h = gib_imlib_image_get_height(im);
-
- feh_menu_draw_menu_bg(m, im, ox, oy);
-
- for (i = m->items; i; i = i->next) {
- if (RECTS_INTERSECT(i->x, i->y, i->w, i->h, ox, oy, w, h))
- feh_menu_draw_item(m, i, im, ox, oy);
- }
- D_RETURN_(5);
-}
-
-void
-feh_menu_draw_menu_bg(feh_menu * m,
- Imlib_Image im,
- int ox,
- int oy)
-{
- int w, h;
-
- D_ENTER(5);
-
- w = gib_imlib_image_get_width(im);
- h = gib_imlib_image_get_height(im);
-
- if (m->bg)
- gib_imlib_blend_image_onto_image(im, m->bg, 0, ox, oy, w, h, 0, 0, w, h,
- 0, 0, 0);
- else
- gib_imlib_image_fill_rectangle(im, 0, 0, w, h, 205, 203, 176, 255);
-
- D_RETURN_(5);
-}
-
-void
-feh_menu_draw_toggle_at(int x,
- int y,
- int w,
- int h,
- Imlib_Image dst,
- int ox,
- int oy,
- int on)
-{
- D_ENTER(5);
- x -= ox;
- y -= oy;
- if (on)
- gib_imlib_image_fill_rectangle(dst, x, y, w, h, 0, 0, 0, 255);
- else
- gib_imlib_image_draw_rectangle(dst, x, y, w, h, 0, 0, 0, 255);
- D_RETURN_(5);
-}
-
-void
-feh_menu_draw_submenu_at(int x,
- int y,
- int w,
- int h,
- Imlib_Image dst,
- int ox,
- int oy,
- int selected)
+ if (opt.xinerama && xinerama_screens) {
+ if ((x + m->w) > xinerama_screens[xinerama_screen].width)
+ x = xinerama_screens[xinerama_screen].width - m->w;
+ if ((y + m->h) > xinerama_screens[xinerama_screen].height)
+ y = xinerama_screens[xinerama_screen].height - m->h;
+
+ }
+#endif /* HAVE_LIBXINERAMA */
+
+ if (x < 0)
+ x = 0;
+ if (y < 0)
+ y = 0;
+ feh_menu_move(m, x, y);
+ feh_menu_show(m);
+ D_RETURN_(4);
+}
+
+void feh_menu_show_at_submenu(feh_menu * m, feh_menu * parent_m, feh_menu_item * i)
+{
+ int mx, my;
+
+ D_ENTER(4);
+
+ if (!m)
+ D_RETURN_(4);
+
+ if (m->calc)
+ feh_menu_calc_size(m);
+ mx = parent_m->x + parent_m->w;
+ my = parent_m->y + i->y - FEH_MENU_PAD_TOP;
+ m->fehwin = parent_m->fehwin;
+ parent_m->next = m;
+ m->prev = parent_m;
+ feh_menu_move(m, mx, my);
+ feh_menu_show(m);
+ D_RETURN_(4);
+}
+
+void feh_menu_move(feh_menu * m, int x, int y)
{
- ImlibPolygon poly;
+ int dx, dy;
+
+ D_ENTER(4);
+
+ if (!m)
+ D_RETURN_(4);
+ dx = x - m->x;
+ dy = y - m->y;
+ if (m->visible)
+ XMoveWindow(disp, m->win, x, y);
+ m->x = x;
+ m->y = y;
+ D_RETURN_(4);
+}
+
+void feh_menu_slide_all_menus_relative(int dx, int dy)
+{
+ int i;
+ feh_menu_list *m;
+ double vector_len = 0;
+ int stepx = 0;
+ int stepy = 0;
+
+ D_ENTER(4);
+ vector_len = sqrt(dx * dx + dy * dy);
+ if (vector_len) {
+ if (dx)
+ stepx = rint(dx / vector_len);
+
+ if (dy)
+ stepy = rint(dy / vector_len);
+
+ }
+ for (i = 0; i < vector_len; i++) {
+ for (m = menus; m; m = m->next) {
+ if (m->menu->visible)
+ feh_menu_move(m->menu, m->menu->x + stepx, m->menu->y + stepy);
+
+ }
+ XWarpPointer(disp, None, None, 0, 0, 0, 0, stepx, stepy);
+ }
+ D_RETURN_(4);
+}
+
+void feh_menu_hide(feh_menu * m, int func_free)
+{
+ D_ENTER(4);
+
+ if (!m->visible)
+ D_RETURN_(4);
+ if (m->next) {
+ m->next->prev = NULL;
+ feh_menu_hide(m->next, func_free);
+ m->next = NULL;
+ }
+ if (m == menu_root) {
+ if (menu_cover) {
+ D(4, ("DESTROYING menu cover\n"));
+ XDestroyWindow(disp, menu_cover);
+ menu_cover = 0;
+ }
+ menu_root = NULL;
+ }
+ m->visible = 0;
+ XUnmapWindow(disp, m->win);
+ if (func_free && m->func_free)
+ m->func_free(m, m->data);
+ else
+ feh_menu_deselect_selected(m);
+ D_RETURN_(4);
+}
+
+void feh_menu_show(feh_menu * m)
+{
+ D_ENTER(4);
+ if (!m)
+ D_RETURN_(4);
+ feh_menu_show_at(m, m->x, m->y);
+ D_RETURN_(4);
+}
+
+feh_menu_item *feh_menu_add_toggle_entry(feh_menu * m, char *text,
+ Imlib_Image icon, char *submenu, menu_func func,
+ void *data, void (*func_free) (void *data), int setting)
+{
+ feh_menu_item *mi;
+
+ D_ENTER(4);
+ mi = feh_menu_add_entry(m, text, icon, submenu, func, data, func_free);
+ mi->is_toggle = TRUE;
+ MENU_ITEM_TOGGLE_SET(mi, setting);
+ D_RETURN(4, mi);
+}
+
+feh_menu_item *feh_menu_add_entry(feh_menu * m, char *text, Imlib_Image icon,
+ char *submenu, menu_func func, void *data, void (*func_free) (void *data))
+{
+ feh_menu_item *mi, *ptr;
+
+ D_ENTER(4);
+
+ mi = (feh_menu_item *) emalloc(sizeof(feh_menu_item));
+ mi->state = MENU_ITEM_STATE_NORMAL;
+ mi->icon = icon;
+ mi->is_toggle = FALSE;
+ if (text)
+ mi->text = estrdup(text);
+ else
+ mi->text = NULL;
+ if (submenu)
+ mi->submenu = estrdup(submenu);
+ else
+ mi->submenu = NULL;
+ mi->func = func;
+ mi->func_free = func_free;
+ mi->data = data;
+ mi->func_gen_sub = NULL;
+ mi->next = NULL;
+ mi->prev = NULL;
+
+ if (!m->items)
+ m->items = mi;
+ else {
+ for (ptr = m->items; ptr; ptr = ptr->next) {
+ if (!ptr->next) {
+ ptr->next = mi;
+ mi->prev = ptr;
+ break;
+ }
+ }
+ }
+ m->calc = 1;
+ D_RETURN(4, mi);
+}
+
+void feh_menu_entry_get_size(feh_menu * m, feh_menu_item * i, int *w, int *h)
+{
+ int tw, th;
+
+ D_ENTER(4);
+
+ if (i->text) {
+ gib_imlib_get_text_size(opt.menu_fn, i->text, opt.menu_style_l, &tw, &th, IMLIB_TEXT_TO_RIGHT);
+ *w = tw + FEH_MENUITEM_PAD_LEFT + FEH_MENUITEM_PAD_RIGHT;
+ *h = th + FEH_MENUITEM_PAD_TOP + FEH_MENUITEM_PAD_BOTTOM;
+ } else {
+ *w = FEH_MENUITEM_PAD_LEFT + FEH_MENUITEM_PAD_RIGHT;
+ *h = FEH_MENUITEM_PAD_TOP + FEH_MENUITEM_PAD_BOTTOM;
+ }
+
+ D_RETURN_(4);
+ m = NULL;
+}
+
+void feh_menu_calc_size(feh_menu * m)
+{
+ int prev_w, prev_h;
+ feh_menu_item *i;
+ int j = 0, count = 0, max_w = 0, max_h = 0, icon_w = 0, next_w = 0;
+ int toggle_w = 0;
+
+ D_ENTER(4);
+
+ prev_w = m->w;
+ prev_h = m->h;
+ m->calc = 0;
+
+ for (i = m->items; i; i = i->next) {
+ int w, h;
+
+ feh_menu_entry_get_size(m, i, &w, &h);
+ if (w > max_w)
+ max_w = w;
+ if (h > max_h)
+ max_h = h;
+ if (i->submenu) {
+ next_w = FEH_MENU_SUBMENU_W;
+ if (FEH_MENU_SUBMENU_H > max_h)
+ max_h = FEH_MENU_SUBMENU_H;
+ }
+ if (i->is_toggle) {
+ toggle_w = FEH_MENU_TOGGLE_W + FEH_MENU_TOGGLE_PAD;
+ if (FEH_MENU_TOGGLE_H > max_h)
+ max_h = FEH_MENU_TOGGLE_H;
+ }
+ count++;
+ }
+
+ for (i = m->items; i; i = i->next) {
+ if (i->icon) {
+ Imlib_Image im;
+
+ im = i->icon;
+ if (im) {
+ int iw, ih, ow, oh;
+
+ iw = gib_imlib_image_get_width(im);
+ ih = gib_imlib_image_get_height(im);
+ if (ih <= max_h) {
+ ow = iw;
+ oh = ih;
+ } else {
+ ow = (iw * max_h) / ih;
+ oh = max_h;
+ }
+ if (ow > icon_w)
+ icon_w = ow;
+ }
+ }
+ }
+ m->h = FEH_MENU_PAD_TOP;
+ for (i = m->items; i; i = i->next) {
+ i->x = FEH_MENU_PAD_LEFT;
+ i->y = m->h;
+ i->w = max_w + icon_w + toggle_w + next_w;
+ i->icon_x = FEH_MENUITEM_PAD_LEFT;
+ i->toggle_x = i->icon_x + icon_w;
+ i->text_x = i->toggle_x + toggle_w;
+ i->sub_x = i->text_x + max_w;
+ if (i->text)
+ i->h = max_h;
+ else
+ i->h = FEH_MENU_SEP_MAX_H;
+ m->h += i->h;
+ j++;
+ }
+ m->h += FEH_MENU_PAD_BOTTOM;
+ m->w = next_w + toggle_w + icon_w + max_w + FEH_MENU_PAD_LEFT + FEH_MENU_PAD_RIGHT;
+
+ if ((prev_w != m->w) || (prev_h != m->h)) {
+ if (m->pmap)
+ XFreePixmap(disp, m->pmap);
+ m->pmap = 0;
+ m->needs_redraw = 1;
+ XResizeWindow(disp, m->win, m->w, m->h);
+ m->updates = imlib_update_append_rect(m->updates, 0, 0, m->w, m->h);
+ }
+ D(4, ("menu size calculated. w=%d h=%d\n", m->w, m->h));
+
+ /* Make sure bg is same size */
+ if (m->bg) {
+ int bg_w, bg_h;
+
+ bg_w = gib_imlib_image_get_width(m->bg);
+ bg_h = gib_imlib_image_get_height(m->bg);
+
+ if (m->w != bg_w || m->h != bg_h) {
+ Imlib_Image newim = imlib_create_image(m->w, m->h);
+
+ D(3, ("resizing bg to %dx%d\n", m->w, m->h));
+
+ gib_imlib_blend_image_onto_image(newim, m->bg, 0, 0, 0, bg_w, bg_h, 0, 0, m->w, m->h, 0, 0, 1);
+ gib_imlib_free_image_and_decache(m->bg);
+ m->bg = newim;
+ }
+ }
+
+ D_RETURN_(4);
+}
+
+void feh_menu_draw_item(feh_menu * m, feh_menu_item * i, Imlib_Image im, int ox, int oy)
+{
+ D_ENTER(5);
+
+ D(5, ("drawing item %p (text %s) on menu %p (name %s)\n", i, i->text, m, m->name));
+
+ if (i->text) {
+ D(5, ("text item\n"));
+ if (MENU_ITEM_IS_SELECTED(i)) {
+ D(5, ("selected item\n"));
+ /* draw selected image */
+ feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 1);
+ } else {
+ D(5, ("unselected item\n"));
+ /* draw unselected image */
+ feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 0);
+ }
+
+ /* draw text */
+ gib_imlib_text_draw(im, opt.menu_fn, opt.menu_style_l,
+ i->x - ox + i->text_x, i->y - oy + FEH_MENUITEM_PAD_TOP,
+ i->text, IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255);
+ if (i->icon) {
+ Imlib_Image im2;
+
+ D(5, ("icon item\n"));
+
+ im2 = i->icon;
+ if (im2) {
+ int iw, ih, ow, oh;
+
+ iw = gib_imlib_image_get_width(im2);
+ ih = gib_imlib_image_get_height(im2);
+ if (ih <= (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) {
+ ow = iw;
+ oh = ih;
+ } else {
+ ow = (iw * (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) / ih;
+ oh = i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM;
+ }
+ gib_imlib_blend_image_onto_image(im, im2,
+ 0, 0, 0,
+ iw, ih,
+ i->x +
+ i->icon_x -
+ ox,
+ i->y +
+ FEH_MENUITEM_PAD_TOP
+ +
+ (((i->h -
+ FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)
+ - oh) / 2) - oy, ow, oh, 1, 1, 1);
+ gib_imlib_free_image(im2);
+ }
+ }
+ if (i->submenu) {
+ D(5, ("submenu item\n"));
+ feh_menu_draw_submenu_at(i->x + i->sub_x,
+ i->y +
+ FEH_MENUITEM_PAD_TOP +
+ ((i->h -
+ FEH_MENUITEM_PAD_TOP -
+ FEH_MENUITEM_PAD_BOTTOM
+ -
+ FEH_MENU_SUBMENU_H) /
+ 2), FEH_MENU_SUBMENU_W,
+ FEH_MENU_SUBMENU_H, im, ox, oy, MENU_ITEM_IS_SELECTED(i));
+ }
+ if (i->is_toggle) {
+ D(5, ("toggleable item\n"));
+ feh_menu_draw_toggle_at(i->x + i->toggle_x,
+ i->y +
+ FEH_MENUITEM_PAD_TOP +
+ ((i->h -
+ FEH_MENUITEM_PAD_TOP -
+ FEH_MENUITEM_PAD_BOTTOM -
+ FEH_MENU_TOGGLE_H) / 2),
+ FEH_MENU_TOGGLE_W, FEH_MENU_TOGGLE_H, im, ox, oy, MENU_ITEM_IS_ON(i));
+ }
+ } else {
+ D(5, ("separator item\n"));
+ feh_menu_draw_separator_at(i->x, i->y, i->w, i->h, im, ox, oy);
+ }
+ D_RETURN_(5);
+ m = NULL;
+}
+
+void feh_menu_redraw(feh_menu * m)
+{
+ Imlib_Updates u, uu;
+
+ D_ENTER(5);
+
+ if ((!m->needs_redraw) || (!m->visible) || (!m->updates))
+ D_RETURN_(5);
+ m->needs_redraw = 0;
+ if (!m->pmap)
+ m->pmap = XCreatePixmap(disp, m->win, m->w, m->h, depth);
+ XSetWindowBackgroundPixmap(disp, m->win, m->pmap);
+
+ u = imlib_updates_merge_for_rendering(m->updates, m->w, m->h);
+ m->updates = NULL;
+ if (u) {
+ D(5, ("I have updates to render\n"));
+ for (uu = u; u; u = imlib_updates_get_next(u)) {
+ int x, y, w, h;
+ Imlib_Image im;
+
+ imlib_updates_get_coordinates(u, &x, &y, &w, &h);
+ D(5, ("update coords %d,%d %d*%d\n", x, y, w, h));
+ im = imlib_create_image(w, h);
+ gib_imlib_image_fill_rectangle(im, 0, 0, w, h, 0, 0, 0, 0);
+ if (im) {
+ feh_menu_draw_to_buf(m, im, x, y);
+ gib_imlib_render_image_on_drawable(m->pmap, im, x, y, 1, 0, 0);
+ gib_imlib_free_image(im);
+ XClearArea(disp, m->win, x, y, w, h, False);
+ }
+ }
+ imlib_updates_free(uu);
+ }
+ D_RETURN_(5);
+}
+
+feh_menu *feh_menu_find(char *name)
+{
+ feh_menu_list *l;
+
+ D_ENTER(4);
+ for (l = menus; l; l = l->next) {
+ if ((l->menu->name) && (!strcmp(l->menu->name, name)))
+ D_RETURN(4, l->menu);
+ }
+ D_RETURN(4, NULL);
+}
+
+void feh_menu_draw_to_buf(feh_menu * m, Imlib_Image im, int ox, int oy)
+{
+ feh_menu_item *i;
+ int w, h;
+
+ D_ENTER(5);
+ w = gib_imlib_image_get_width(im);
+ h = gib_imlib_image_get_height(im);
+
+ feh_menu_draw_menu_bg(m, im, ox, oy);
- D_ENTER(5);
+ for (i = m->items; i; i = i->next) {
+ if (RECTS_INTERSECT(i->x, i->y, i->w, i->h, ox, oy, w, h))
+ feh_menu_draw_item(m, i, im, ox, oy);
+ }
+ D_RETURN_(5);
+}
+
+void feh_menu_draw_menu_bg(feh_menu * m, Imlib_Image im, int ox, int oy)
+{
+ int w, h;
- x -= ox;
- y -= oy;
+ D_ENTER(5);
- imlib_context_set_image(dst);
- poly = imlib_polygon_new();
- imlib_polygon_add_point(poly, x + 2, y + 5);
- imlib_polygon_add_point(poly, x + 5, y + 7);
- imlib_polygon_add_point(poly, x + 2, y + 11);
- imlib_context_set_color(0, 0, 0, 60);
- imlib_image_fill_polygon(poly);
- imlib_polygon_free(poly);
+ w = gib_imlib_image_get_width(im);
+ h = gib_imlib_image_get_height(im);
- poly = imlib_polygon_new();
- imlib_polygon_add_point(poly, x, y + 3);
- imlib_polygon_add_point(poly, x + 3, y + 6);
- imlib_polygon_add_point(poly, x, y + 9);
- imlib_context_set_color(0, 0, 0, 255);
- imlib_image_fill_polygon(poly);
- imlib_polygon_free(poly);
+ if (m->bg)
+ gib_imlib_blend_image_onto_image(im, m->bg, 0, ox, oy, w, h, 0, 0, w, h, 0, 0, 0);
+ else
+ gib_imlib_image_fill_rectangle(im, 0, 0, w, h, 205, 203, 176, 255);
- D_RETURN_(5);
- selected = 0;
+ D_RETURN_(5);
}
+void feh_menu_draw_toggle_at(int x, int y, int w, int h, Imlib_Image dst, int ox, int oy, int on)
+{
+ D_ENTER(5);
+ x -= ox;
+ y -= oy;
+ if (on)
+ gib_imlib_image_fill_rectangle(dst, x, y, w, h, 0, 0, 0, 255);
+ else
+ gib_imlib_image_draw_rectangle(dst, x, y, w, h, 0, 0, 0, 255);
+ D_RETURN_(5);
+}
-void
-feh_menu_draw_separator_at(int x,
- int y,
- int w,
- int h,
- Imlib_Image dst,
- int ox,
- int oy)
+void feh_menu_draw_submenu_at(int x, int y, int w, int h, Imlib_Image dst, int ox, int oy, int selected)
{
- D_ENTER(5);
- gib_imlib_image_fill_rectangle(dst, x - ox + 2, y - oy + 2, w - 4, h - 4, 0,
- 0, 0, 255);
- D_RETURN_(5);
+ ImlibPolygon poly;
+
+ D_ENTER(5);
+
+ x -= ox;
+ y -= oy;
+
+ imlib_context_set_image(dst);
+ poly = imlib_polygon_new();
+ imlib_polygon_add_point(poly, x + 2, y + 5);
+ imlib_polygon_add_point(poly, x + 5, y + 7);
+ imlib_polygon_add_point(poly, x + 2, y + 11);
+ imlib_context_set_color(0, 0, 0, 60);
+ imlib_image_fill_polygon(poly);
+ imlib_polygon_free(poly);
+
+ poly = imlib_polygon_new();
+ imlib_polygon_add_point(poly, x, y + 3);
+ imlib_polygon_add_point(poly, x + 3, y + 6);
+ imlib_polygon_add_point(poly, x, y + 9);
+ imlib_context_set_color(0, 0, 0, 255);
+ imlib_image_fill_polygon(poly);
+ imlib_polygon_free(poly);
+
+ D_RETURN_(5);
+ selected = 0;
}
-void
-feh_menu_item_draw_at(int x,
- int y,
- int w,
- int h,
- Imlib_Image dst,
- int ox,
- int oy,
- int selected)
+void feh_menu_draw_separator_at(int x, int y, int w, int h, Imlib_Image dst, int ox, int oy)
{
- D_ENTER(5);
- imlib_context_set_image(dst);
- if (selected)
- gib_imlib_image_fill_rectangle(dst, x - ox, y - oy, w, h, 255, 255, 255,
- 178);
- D_RETURN_(5);
+ D_ENTER(5);
+ gib_imlib_image_fill_rectangle(dst, x - ox + 2, y - oy + 2, w - 4, h - 4, 0, 0, 0, 255);
+ D_RETURN_(5);
}
+void feh_menu_item_draw_at(int x, int y, int w, int h, Imlib_Image dst, int ox, int oy, int selected)
+{
+ D_ENTER(5);
+ imlib_context_set_image(dst);
+ if (selected)
+ gib_imlib_image_fill_rectangle(dst, x - ox, y - oy, w, h, 255, 255, 255, 178);
+ D_RETURN_(5);
+}
-void
-feh_raise_all_menus(void)
+void feh_raise_all_menus(void)
{
- feh_menu_list *l;
+ feh_menu_list *l;
- D_ENTER(5);
+ D_ENTER(5);
- for (l = menus; l; l = l->next) {
- if (l->menu->visible)
- XRaiseWindow(disp, l->menu->win);
- }
- D_RETURN_(5);
+ for (l = menus; l; l = l->next) {
+ if (l->menu->visible)
+ XRaiseWindow(disp, l->menu->win);
+ }
+ D_RETURN_(5);
}
-void
-feh_redraw_menus(void)
+void feh_redraw_menus(void)
{
- feh_menu_list *l;
+ feh_menu_list *l;
- D_ENTER(5);
+ D_ENTER(5);
- for (l = menus; l; l = l->next) {
- if (l->menu->needs_redraw)
- feh_menu_redraw(l->menu);
- }
+ for (l = menus; l; l = l->next) {
+ if (l->menu->needs_redraw)
+ feh_menu_redraw(l->menu);
+ }
- D_RETURN_(5);
+ D_RETURN_(5);
}
-feh_menu *
-feh_menu_get_from_window(Window win)
+feh_menu *feh_menu_get_from_window(Window win)
{
- feh_menu_list *l;
+ feh_menu_list *l;
- D_ENTER(5);
- for (l = menus; l; l = l->next)
- if (l->menu->win == win)
- D_RETURN(5, l->menu);
- D_RETURN(5, NULL);
+ D_ENTER(5);
+ for (l = menus; l; l = l->next)
+ if (l->menu->win == win)
+ D_RETURN(5, l->menu);
+ D_RETURN(5, NULL);
}
-void
-feh_menu_init_main(void)
+void feh_menu_init_main(void)
{
- feh_menu *m;
- feh_menu_item *mi;
+ feh_menu *m;
+ feh_menu_item *mi;
- D_ENTER(4);
- if (!common_menus)
- feh_menu_init_common();
+ D_ENTER(4);
+ if (!common_menus)
+ feh_menu_init_common();
- menu_main = feh_menu_new();
- menu_main->name = estrdup("MAIN");
+ menu_main = feh_menu_new();
+ menu_main->name = estrdup("MAIN");
- feh_menu_add_entry(menu_main, "File", NULL, "FILE", NULL, NULL, NULL);
- if (opt.slideshow || opt.multiwindow) {
+ feh_menu_add_entry(menu_main, "File", NULL, "FILE", NULL, NULL, NULL);
+ if (opt.slideshow || opt.multiwindow) {
#if 0
- feh_menu_item *mi;
+ feh_menu_item *mi;
- mi =
- feh_menu_add_entry(menu_main, "Jump to", NULL, "JUMP", NULL, NULL,
- NULL);
- mi->func_gen_sub = feh_menu_func_gen_jump;
+ mi = feh_menu_add_entry(menu_main, "Jump to", NULL, "JUMP", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_jump;
#endif
- feh_menu_add_entry(menu_main, "Sort List", NULL, "SORT", NULL, NULL,
- NULL);
- mi =
- feh_menu_add_entry(menu_main, "Image Info", NULL, "INFO", NULL, NULL,
- NULL);
- mi->func_gen_sub = feh_menu_func_gen_info;
- feh_menu_add_entry(menu_main, NULL, NULL, NULL, NULL, NULL, NULL);
- }
- mi =
- feh_menu_add_entry(menu_main, "Options", NULL, "OPTIONS", NULL, NULL,
- NULL);
- mi->func_gen_sub = feh_menu_func_gen_options;
-
- if (!opt.full_screen)
- feh_menu_add_entry(menu_main, "About " PACKAGE, NULL, NULL,
- feh_menu_cb_about, NULL, NULL);
- if (opt.multiwindow)
- feh_menu_add_entry(menu_main, "Close", NULL, NULL, feh_menu_cb_close,
- NULL, NULL);
- feh_menu_add_entry(menu_main, "Exit", NULL, NULL, feh_menu_cb_exit, NULL,
- NULL);
-
- m = feh_menu_new();
- m->name = estrdup("FILE");
- feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
- feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL,
- NULL);
- feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
- feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image,
- NULL, NULL);
- feh_menu_add_entry(m, "Save List", NULL, NULL,
- feh_menu_cb_save_filelist, NULL, NULL);
- feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
- feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
- feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
- feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove, NULL, NULL);
- feh_menu_add_entry(m, "Delete", NULL, "CONFIRM", NULL, NULL, NULL);
-
- D_RETURN_(4);
-}
-
-
-void
-feh_menu_init_common()
-{
- int num_desks, i;
- char buf[30];
- feh_menu *m;
-
- D_ENTER(4);
-
- if (!opt.menu_fn) {
- opt.menu_fn = gib_imlib_load_font(opt.menu_font);
- if (!opt.menu_fn)
- eprintf
- ("couldn't load menu font %s, did you make install?\nAre you specifying a nonexistant font?\nDid you tell feh where to find it with --fontpath?",
- opt.menu_font);
- }
- if (!opt.menu_style_l) {
- opt.menu_style_l = gib_style_new_from_ascii(opt.menu_style);
- if (!opt.menu_style_l) {
- weprintf
- ("couldn't load style file for menu fonts, (%s).\nDid you make install? Menus will look boring without the style file.",
- opt.menu_style);
- }
- }
-
- m = feh_menu_new();
- m->name = estrdup("SORT");
-
- feh_menu_add_entry(m, "By File Name", NULL, NULL, feh_menu_cb_sort_filename,
- NULL, NULL);
- feh_menu_add_entry(m, "By Image Name", NULL, NULL,
- feh_menu_cb_sort_imagename, NULL, NULL);
- if (opt.preload || (opt.sort > SORT_FILENAME))
- feh_menu_add_entry(m, "By File Size", NULL, NULL,
- feh_menu_cb_sort_filesize, NULL, NULL);
- feh_menu_add_entry(m, "Randomize", NULL, NULL, feh_menu_cb_sort_randomize,
- NULL, NULL);
-
- m = feh_menu_new();
- m->name = estrdup("CONFIRM");
- feh_menu_add_entry(m, "Confirm", NULL, NULL, feh_menu_cb_delete, NULL,
- NULL);
-
- m = feh_menu_new();
- m->name = estrdup("EDIT");
- feh_menu_add_entry(m, "Rotate 90 CW", NULL, NULL, feh_menu_cb_edit_rotate,
- (void *) 1, NULL);
- feh_menu_add_entry(m, "Rotate 180", NULL, NULL, feh_menu_cb_edit_rotate,
- (void *) 2, NULL);
- feh_menu_add_entry(m, "Rotate 90 CCW", NULL, NULL, feh_menu_cb_edit_rotate,
- (void *) 3, NULL);
-
- menu_bg = feh_menu_new();
- menu_bg->name = estrdup("BACKGROUND");
-
- num_desks = feh_wm_get_num_desks();
- if (num_desks > 1) {
- feh_menu_add_entry(menu_bg, "Set Tiled", NULL, "TILED", NULL, NULL, NULL);
- feh_menu_add_entry(menu_bg, "Set Seamless", NULL, "SEAMLESS", NULL, NULL,
- NULL);
- feh_menu_add_entry(menu_bg, "Set Scaled", NULL, "SCALED", NULL, NULL,
- NULL);
- feh_menu_add_entry(menu_bg, "Set Centered", NULL, "CENTERED", NULL, NULL,
- NULL);
-
- m = feh_menu_new();
- m->name = estrdup("TILED");
- for (i = 0; i < num_desks; i++) {
- snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
- if (opt.slideshow || opt.multiwindow)
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_tiled, (void *) i,
- NULL);
- else
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_tiled_no_file,
- (void *) i, NULL);
- }
-
- m = feh_menu_new();
- m->name = estrdup("SEAMLESS");
- for (i = 0; i < num_desks; i++) {
- snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_seamless, (void *) i,
- NULL);
- }
-
-
- m = feh_menu_new();
- m->name = estrdup("SCALED");
- for (i = 0; i < num_desks; i++) {
- snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
-
- if (opt.slideshow || opt.multiwindow)
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_scaled, (void *) i,
- NULL);
- else
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_scaled_no_file,
- (void *) i, NULL);
- }
-
- m = feh_menu_new();
- m->name = estrdup("CENTERED");
- for (i = 0; i < num_desks; i++) {
- snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
- if (opt.slideshow || opt.multiwindow)
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_centered, (void *) i,
- NULL);
- else
- feh_menu_add_entry(m, buf, NULL, NULL,
- feh_menu_cb_background_set_centered_no_file,
- (void *) i, NULL);
- }
- } else {
- if (opt.slideshow || opt.multiwindow) {
- feh_menu_add_entry(menu_bg, "Set Tiled", NULL, NULL,
- feh_menu_cb_background_set_tiled, NULL, NULL);
- feh_menu_add_entry(menu_bg, "Set Seamless", NULL, NULL,
- feh_menu_cb_background_set_seamless, NULL, NULL);
- feh_menu_add_entry(menu_bg, "Set Scaled", NULL, NULL,
- feh_menu_cb_background_set_scaled, NULL, NULL);
- feh_menu_add_entry(menu_bg, "Set Centered", NULL, NULL,
- feh_menu_cb_background_set_centered, NULL, NULL);
- } else {
- feh_menu_add_entry(menu_bg, "Set Tiled", NULL, NULL,
- feh_menu_cb_background_set_tiled_no_file, NULL,
- NULL);
- feh_menu_add_entry(menu_bg, "Set Seamless", NULL, NULL,
- feh_menu_cb_background_set_seamless, NULL, NULL);
- feh_menu_add_entry(menu_bg, "Set Scaled", NULL, NULL,
- feh_menu_cb_background_set_scaled_no_file, NULL,
- NULL);
- feh_menu_add_entry(menu_bg, "Set Centered", NULL, NULL,
- feh_menu_cb_background_set_centered_no_file, NULL,
- NULL);
- }
- }
- common_menus = 1;
-
- D_RETURN_(4);
-}
-
-void
-feh_menu_init_about_win(void)
-{
- D_ENTER(4);
-
- menu_about_win = feh_menu_new();
- menu_about_win->name = estrdup("ABOUTWIN");
-
- feh_menu_add_entry(menu_about_win, "Close", NULL, NULL, feh_menu_cb_close,
- NULL, NULL);
- feh_menu_add_entry(menu_about_win, "Exit", NULL, NULL, feh_menu_cb_exit,
- NULL, NULL);
-
- D_RETURN_(4);
-}
-
-void
-feh_menu_init_single_win(void)
-{
- feh_menu *m;
- feh_menu_item *mi;
-
- D_ENTER(4);
- if (!common_menus)
- feh_menu_init_common();
-
- menu_single_win = feh_menu_new();
- menu_single_win->name = estrdup("SINGLEWIN");
-
- feh_menu_add_entry(menu_single_win, "File", NULL, "SINGLEWIN_FILE", NULL,
- NULL, NULL);
- m = feh_menu_new();
- m->name = estrdup("SINGLEWIN_FILE");
- feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
- feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL,
- NULL);
- feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
- feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image,
- NULL, NULL);
- feh_menu_add_entry(m, "Save List", NULL, NULL,
- feh_menu_cb_save_filelist, NULL, NULL);
- feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
- feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
- if (opt.multiwindow || opt.slideshow) {
- feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
- feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove, NULL, NULL);
- feh_menu_add_entry(m, "Delete", NULL, "CONFIRM", NULL, NULL, NULL);
- }
-
- mi =
- feh_menu_add_entry(menu_single_win, "Image Info", NULL, "INFO", NULL,
- NULL, NULL);
- mi->func_gen_sub = feh_menu_func_gen_info;
- feh_menu_add_entry(menu_single_win, NULL, NULL, NULL, NULL, NULL, NULL);
- mi =
- feh_menu_add_entry(menu_single_win, "Options", NULL, "OPTIONS", NULL,
- NULL, NULL);
- mi->func_gen_sub = feh_menu_func_gen_options;
- feh_menu_add_entry(menu_single_win, "About " PACKAGE, NULL, NULL,
- feh_menu_cb_about, NULL, NULL);
- feh_menu_add_entry(menu_single_win, "Close", NULL, NULL, feh_menu_cb_close,
- NULL, NULL);
- feh_menu_add_entry(menu_single_win, "Exit", NULL, NULL, feh_menu_cb_exit,
- NULL, NULL);
-
- D_RETURN_(4);
-}
-
-void
-feh_menu_init_thumbnail_win(void)
-{
- feh_menu *m;
- feh_menu_item *mi;
-
- D_ENTER(4);
- if (!common_menus)
- feh_menu_init_common();
-
- menu_thumbnail_win = feh_menu_new();
- menu_thumbnail_win->name = estrdup("THUMBWIN");
-
- feh_menu_add_entry(menu_thumbnail_win, "File", NULL, "THUMBWIN_FILE", NULL,
- NULL, NULL);
- m = feh_menu_new();
- m->name = estrdup("THUMBWIN_FILE");
- feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
- feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL,
- NULL);
- feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image,
- NULL, NULL);
- feh_menu_add_entry(m, "Save List", NULL, NULL,
- feh_menu_cb_save_filelist, NULL, NULL);
- feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
- feh_menu_add_entry(menu_thumbnail_win, NULL, NULL, NULL, NULL, NULL, NULL);
- mi =
- feh_menu_add_entry(menu_thumbnail_win, "Options", NULL, "OPTIONS", NULL,
- NULL, NULL);
- mi->func_gen_sub = feh_menu_func_gen_options;
- feh_menu_add_entry(menu_thumbnail_win, "About " PACKAGE, NULL, NULL,
- feh_menu_cb_about, NULL, NULL);
- feh_menu_add_entry(menu_thumbnail_win, "Close", NULL, NULL,
- feh_menu_cb_close, NULL, NULL);
- feh_menu_add_entry(menu_thumbnail_win, "Exit", NULL, NULL, feh_menu_cb_exit,
- NULL, NULL);
- D_RETURN_(4);
-}
-
-
-void
-feh_menu_init_thumbnail_viewer(void)
-{
- feh_menu *m;
- feh_menu_item *mi;
-
- D_ENTER(4);
- if (!common_menus)
- feh_menu_init_common();
-
- menu_thumbnail_viewer = feh_menu_new();
- menu_thumbnail_viewer->name = estrdup("THUMBVIEW");
-
- feh_menu_add_entry(menu_thumbnail_viewer, "File", NULL, "THUMBVIEW_FILE",
- NULL, NULL, NULL);
- m = feh_menu_new();
- m->name = estrdup("THUMBVIEW_FILE");
- feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
- feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL,
- NULL);
- feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
- feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image,
- NULL, NULL);
- feh_menu_add_entry(m, "Save List", NULL, NULL,
- feh_menu_cb_save_filelist, NULL, NULL);
- feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
- feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
- feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
- feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove_thumb, NULL,
- NULL);
- feh_menu_add_entry(m, "Delete", NULL, "THUMBVIEW_CONFIRM", NULL, NULL,
- NULL);
- mi =
- feh_menu_add_entry(menu_thumbnail_viewer, "Image Info", NULL, "INFO",
- NULL, NULL, NULL);
- mi->func_gen_sub = feh_menu_func_gen_info;
- feh_menu_add_entry(menu_thumbnail_viewer, NULL, NULL, NULL, NULL, NULL,
- NULL);
- mi =
- feh_menu_add_entry(menu_thumbnail_viewer, "Options", NULL, "OPTIONS",
- NULL, NULL, NULL);
- mi->func_gen_sub = feh_menu_func_gen_options;
- feh_menu_add_entry(menu_thumbnail_viewer, "About " PACKAGE, NULL, NULL,
- feh_menu_cb_about, NULL, NULL);
- feh_menu_add_entry(menu_thumbnail_viewer, "Close", NULL, NULL,
- feh_menu_cb_close, NULL, NULL);
- feh_menu_add_entry(menu_thumbnail_viewer, "Exit", NULL, NULL,
- feh_menu_cb_exit, NULL, NULL);
- m = feh_menu_new();
- m->name = estrdup("THUMBVIEW_CONFIRM");
- feh_menu_add_entry(m, "Confirm", NULL, NULL, feh_menu_cb_delete_thumb, NULL,
- NULL);
- D_RETURN_(4);
-}
-
-static void
-feh_menu_cb_background_set_tiled(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- char *path;
-
- D_ENTER(4);
- path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
- feh_wm_set_bg(path, m->fehwin->im, 0, 0, (int) data, 1);
- free(path);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_seamless(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- Imlib_Image im;
-
- D_ENTER(4);
- im = gib_imlib_clone_image(m->fehwin->im);
- gib_imlib_image_tile(im);
- feh_wm_set_bg(NULL, im, 0, 0, (int) data, 1);
- gib_imlib_free_image_and_decache(im);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_scaled(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- char *path;
-
- D_ENTER(4);
- path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
- feh_wm_set_bg(path, m->fehwin->im, 0, 1, (int) data, 1);
- free(path);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_centered(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- char *path;
-
- D_ENTER(4);
- path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
- feh_wm_set_bg(path, m->fehwin->im, 1, 0, (int) data, 1);
- free(path);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_tiled_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_wm_set_bg(NULL, m->fehwin->im, 0, 0, (int) data, 1);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_scaled_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_wm_set_bg(NULL, m->fehwin->im, 0, 1, (int) data, 1);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_background_set_centered_no_file(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_wm_set_bg(NULL, m->fehwin->im, 1, 0, (int) data, 1);
- D_RETURN_(4);
- i = NULL;
-}
-
-static void
-feh_menu_cb_about(feh_menu * m,
- feh_menu_item * i,
- void *data)
+ feh_menu_add_entry(menu_main, "Sort List", NULL, "SORT", NULL, NULL, NULL);
+ mi = feh_menu_add_entry(menu_main, "Image Info", NULL, "INFO", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_info;
+ feh_menu_add_entry(menu_main, NULL, NULL, NULL, NULL, NULL, NULL);
+ }
+ mi = feh_menu_add_entry(menu_main, "Options", NULL, "OPTIONS", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_options;
+
+ if (!opt.full_screen)
+ feh_menu_add_entry(menu_main, "About " PACKAGE, NULL, NULL, feh_menu_cb_about, NULL, NULL);
+ if (opt.multiwindow)
+ feh_menu_add_entry(menu_main, "Close", NULL, NULL, feh_menu_cb_close, NULL, NULL);
+ feh_menu_add_entry(menu_main, "Exit", NULL, NULL, feh_menu_cb_exit, NULL, NULL);
+
+ m = feh_menu_new();
+ m->name = estrdup("FILE");
+ feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
+ feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL, NULL);
+ feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
+ feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image, NULL, NULL);
+ feh_menu_add_entry(m, "Save List", NULL, NULL, feh_menu_cb_save_filelist, NULL, NULL);
+ feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
+ feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove, NULL, NULL);
+ feh_menu_add_entry(m, "Delete", NULL, "CONFIRM", NULL, NULL, NULL);
+
+ D_RETURN_(4);
+}
+
+void feh_menu_init_common()
+{
+ int num_desks, i;
+ char buf[30];
+ feh_menu *m;
+
+ D_ENTER(4);
+
+ if (!opt.menu_fn) {
+ opt.menu_fn = gib_imlib_load_font(opt.menu_font);
+ if (!opt.menu_fn)
+ eprintf
+ ("couldn't load menu font %s, did you make install?\nAre you specifying a nonexistant font?\nDid you tell feh where to find it with --fontpath?",
+ opt.menu_font);
+ }
+ if (!opt.menu_style_l) {
+ opt.menu_style_l = gib_style_new_from_ascii(opt.menu_style);
+ if (!opt.menu_style_l) {
+ weprintf
+ ("couldn't load style file for menu fonts, (%s).\nDid you make install? Menus will look boring without the style file.",
+ opt.menu_style);
+ }
+ }
+
+ m = feh_menu_new();
+ m->name = estrdup("SORT");
+
+ feh_menu_add_entry(m, "By File Name", NULL, NULL, feh_menu_cb_sort_filename, NULL, NULL);
+ feh_menu_add_entry(m, "By Image Name", NULL, NULL, feh_menu_cb_sort_imagename, NULL, NULL);
+ if (opt.preload || (opt.sort > SORT_FILENAME))
+ feh_menu_add_entry(m, "By File Size", NULL, NULL, feh_menu_cb_sort_filesize, NULL, NULL);
+ feh_menu_add_entry(m, "Randomize", NULL, NULL, feh_menu_cb_sort_randomize, NULL, NULL);
+
+ m = feh_menu_new();
+ m->name = estrdup("CONFIRM");
+ feh_menu_add_entry(m, "Confirm", NULL, NULL, feh_menu_cb_delete, NULL, NULL);
+
+ m = feh_menu_new();
+ m->name = estrdup("EDIT");
+ feh_menu_add_entry(m, "Rotate 90 CW", NULL, NULL, feh_menu_cb_edit_rotate, (void *) 1, NULL);
+ feh_menu_add_entry(m, "Rotate 180", NULL, NULL, feh_menu_cb_edit_rotate, (void *) 2, NULL);
+ feh_menu_add_entry(m, "Rotate 90 CCW", NULL, NULL, feh_menu_cb_edit_rotate, (void *) 3, NULL);
+
+ menu_bg = feh_menu_new();
+ menu_bg->name = estrdup("BACKGROUND");
+
+ num_desks = feh_wm_get_num_desks();
+ if (num_desks > 1) {
+ feh_menu_add_entry(menu_bg, "Set Tiled", NULL, "TILED", NULL, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Seamless", NULL, "SEAMLESS", NULL, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Scaled", NULL, "SCALED", NULL, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Centered", NULL, "CENTERED", NULL, NULL, NULL);
+
+ m = feh_menu_new();
+ m->name = estrdup("TILED");
+ for (i = 0; i < num_desks; i++) {
+ snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
+ if (opt.slideshow || opt.multiwindow)
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_tiled, (void *) i, NULL);
+ else
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_tiled_no_file, (void *) i, NULL);
+ }
+
+ m = feh_menu_new();
+ m->name = estrdup("SEAMLESS");
+ for (i = 0; i < num_desks; i++) {
+ snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
+ feh_menu_add_entry(m, buf, NULL, NULL, feh_menu_cb_background_set_seamless, (void *) i, NULL);
+ }
+
+ m = feh_menu_new();
+ m->name = estrdup("SCALED");
+ for (i = 0; i < num_desks; i++) {
+ snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
+
+ if (opt.slideshow || opt.multiwindow)
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_scaled, (void *) i, NULL);
+ else
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_scaled_no_file, (void *) i, NULL);
+ }
+
+ m = feh_menu_new();
+ m->name = estrdup("CENTERED");
+ for (i = 0; i < num_desks; i++) {
+ snprintf(buf, sizeof(buf), "Desktop %d", i + 1);
+ if (opt.slideshow || opt.multiwindow)
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_centered, (void *) i, NULL);
+ else
+ feh_menu_add_entry(m, buf, NULL, NULL,
+ feh_menu_cb_background_set_centered_no_file, (void *) i, NULL);
+ }
+ } else {
+ if (opt.slideshow || opt.multiwindow) {
+ feh_menu_add_entry(menu_bg, "Set Tiled", NULL,
+ NULL, feh_menu_cb_background_set_tiled, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Seamless", NULL,
+ NULL, feh_menu_cb_background_set_seamless, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Scaled", NULL,
+ NULL, feh_menu_cb_background_set_scaled, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Centered", NULL,
+ NULL, feh_menu_cb_background_set_centered, NULL, NULL);
+ } else {
+ feh_menu_add_entry(menu_bg, "Set Tiled", NULL,
+ NULL, feh_menu_cb_background_set_tiled_no_file, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Seamless", NULL,
+ NULL, feh_menu_cb_background_set_seamless, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Scaled", NULL,
+ NULL, feh_menu_cb_background_set_scaled_no_file, NULL, NULL);
+ feh_menu_add_entry(menu_bg, "Set Centered", NULL,
+ NULL, feh_menu_cb_background_set_centered_no_file, NULL, NULL);
+ }
+ }
+ common_menus = 1;
+
+ D_RETURN_(4);
+}
+
+void feh_menu_init_about_win(void)
+{
+ D_ENTER(4);
+
+ menu_about_win = feh_menu_new();
+ menu_about_win->name = estrdup("ABOUTWIN");
+
+ feh_menu_add_entry(menu_about_win, "Close", NULL, NULL, feh_menu_cb_close, NULL, NULL);
+ feh_menu_add_entry(menu_about_win, "Exit", NULL, NULL, feh_menu_cb_exit, NULL, NULL);
+
+ D_RETURN_(4);
+}
+
+void feh_menu_init_single_win(void)
+{
+ feh_menu *m;
+ feh_menu_item *mi;
+
+ D_ENTER(4);
+ if (!common_menus)
+ feh_menu_init_common();
+
+ menu_single_win = feh_menu_new();
+ menu_single_win->name = estrdup("SINGLEWIN");
+
+ feh_menu_add_entry(menu_single_win, "File", NULL, "SINGLEWIN_FILE", NULL, NULL, NULL);
+ m = feh_menu_new();
+ m->name = estrdup("SINGLEWIN_FILE");
+ feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
+ feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL, NULL);
+ feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
+ feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image, NULL, NULL);
+ feh_menu_add_entry(m, "Save List", NULL, NULL, feh_menu_cb_save_filelist, NULL, NULL);
+ feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
+ if (opt.multiwindow || opt.slideshow) {
+ feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove, NULL, NULL);
+ feh_menu_add_entry(m, "Delete", NULL, "CONFIRM", NULL, NULL, NULL);
+ }
+
+ mi = feh_menu_add_entry(menu_single_win, "Image Info", NULL, "INFO", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_info;
+ feh_menu_add_entry(menu_single_win, NULL, NULL, NULL, NULL, NULL, NULL);
+ mi = feh_menu_add_entry(menu_single_win, "Options", NULL, "OPTIONS", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_options;
+ feh_menu_add_entry(menu_single_win, "About " PACKAGE, NULL, NULL, feh_menu_cb_about, NULL, NULL);
+ feh_menu_add_entry(menu_single_win, "Close", NULL, NULL, feh_menu_cb_close, NULL, NULL);
+ feh_menu_add_entry(menu_single_win, "Exit", NULL, NULL, feh_menu_cb_exit, NULL, NULL);
+
+ D_RETURN_(4);
+}
+
+void feh_menu_init_thumbnail_win(void)
+{
+ feh_menu *m;
+ feh_menu_item *mi;
+
+ D_ENTER(4);
+ if (!common_menus)
+ feh_menu_init_common();
+
+ menu_thumbnail_win = feh_menu_new();
+ menu_thumbnail_win->name = estrdup("THUMBWIN");
+
+ feh_menu_add_entry(menu_thumbnail_win, "File", NULL, "THUMBWIN_FILE", NULL, NULL, NULL);
+ m = feh_menu_new();
+ m->name = estrdup("THUMBWIN_FILE");
+ feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
+ feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL, NULL);
+ feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image, NULL, NULL);
+ feh_menu_add_entry(m, "Save List", NULL, NULL, feh_menu_cb_save_filelist, NULL, NULL);
+ feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
+ feh_menu_add_entry(menu_thumbnail_win, NULL, NULL, NULL, NULL, NULL, NULL);
+ mi = feh_menu_add_entry(menu_thumbnail_win, "Options", NULL, "OPTIONS", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_options;
+ feh_menu_add_entry(menu_thumbnail_win, "About " PACKAGE, NULL, NULL, feh_menu_cb_about, NULL, NULL);
+ feh_menu_add_entry(menu_thumbnail_win, "Close", NULL, NULL, feh_menu_cb_close, NULL, NULL);
+ feh_menu_add_entry(menu_thumbnail_win, "Exit", NULL, NULL, feh_menu_cb_exit, NULL, NULL);
+ D_RETURN_(4);
+}
+
+void feh_menu_init_thumbnail_viewer(void)
+{
+ feh_menu *m;
+ feh_menu_item *mi;
+
+ D_ENTER(4);
+ if (!common_menus)
+ feh_menu_init_common();
+
+ menu_thumbnail_viewer = feh_menu_new();
+ menu_thumbnail_viewer->name = estrdup("THUMBVIEW");
+
+ feh_menu_add_entry(menu_thumbnail_viewer, "File", NULL, "THUMBVIEW_FILE", NULL, NULL, NULL);
+ m = feh_menu_new();
+ m->name = estrdup("THUMBVIEW_FILE");
+ feh_menu_add_entry(m, "Reset", NULL, NULL, feh_menu_cb_reset, NULL, NULL);
+ feh_menu_add_entry(m, "Resize Window", NULL, NULL, feh_menu_cb_fit, NULL, NULL);
+ feh_menu_add_entry(m, "Reload", NULL, NULL, feh_menu_cb_reload, NULL, NULL);
+ feh_menu_add_entry(m, "Save Image", NULL, NULL, feh_menu_cb_save_image, NULL, NULL);
+ feh_menu_add_entry(m, "Save List", NULL, NULL, feh_menu_cb_save_filelist, NULL, NULL);
+ feh_menu_add_entry(m, "Edit in Place", NULL, "EDIT", NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Background", NULL, "BACKGROUND", NULL, NULL, NULL);
+ feh_menu_add_entry(m, NULL, NULL, NULL, NULL, NULL, NULL);
+ feh_menu_add_entry(m, "Hide", NULL, NULL, feh_menu_cb_remove_thumb, NULL, NULL);
+ feh_menu_add_entry(m, "Delete", NULL, "THUMBVIEW_CONFIRM", NULL, NULL, NULL);
+ mi = feh_menu_add_entry(menu_thumbnail_viewer, "Image Info", NULL, "INFO", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_info;
+ feh_menu_add_entry(menu_thumbnail_viewer, NULL, NULL, NULL, NULL, NULL, NULL);
+ mi = feh_menu_add_entry(menu_thumbnail_viewer, "Options", NULL, "OPTIONS", NULL, NULL, NULL);
+ mi->func_gen_sub = feh_menu_func_gen_options;
+ feh_menu_add_entry(menu_thumbnail_viewer, "About " PACKAGE, NULL, NULL, feh_menu_cb_about, NULL, NULL);
+ feh_menu_add_entry(menu_thumbnail_viewer, "Close", NULL, NULL, feh_menu_cb_close, NULL, NULL);
+ feh_menu_add_entry(menu_thumbnail_viewer, "Exit", NULL, NULL, feh_menu_cb_exit, NULL, NULL);
+ m = feh_menu_new();
+ m->name = estrdup("THUMBVIEW_CONFIRM");
+ feh_menu_add_entry(m, "Confirm", NULL, NULL, feh_menu_cb_delete_thumb, NULL, NULL);
+ D_RETURN_(4);
+}
+
+static void feh_menu_cb_background_set_tiled(feh_menu * m, feh_menu_item * i, void *data)
+{
+ char *path;
+
+ D_ENTER(4);
+ path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
+ feh_wm_set_bg(path, m->fehwin->im, 0, 0, (int) data, 1);
+ free(path);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_seamless(feh_menu * m, feh_menu_item * i, void *data)
+{
+ Imlib_Image im;
+
+ D_ENTER(4);
+ im = gib_imlib_clone_image(m->fehwin->im);
+ gib_imlib_image_tile(im);
+ feh_wm_set_bg(NULL, im, 0, 0, (int) data, 1);
+ gib_imlib_free_image_and_decache(im);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_scaled(feh_menu * m, feh_menu_item * i, void *data)
+{
+ char *path;
+
+ D_ENTER(4);
+ path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
+ feh_wm_set_bg(path, m->fehwin->im, 0, 1, (int) data, 1);
+ free(path);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_centered(feh_menu * m, feh_menu_item * i, void *data)
{
- Imlib_Image im;
- winwidget winwid;
-
- D_ENTER(4);
- if (feh_load_image_char(&im, PREFIX "/share/feh/images/about.png") != 0) {
- winwid =
- winwidget_create_from_image(im, "About " PACKAGE, WIN_TYPE_ABOUT);
- winwid->file =
- gib_list_add_front(NULL,
- feh_file_new(PREFIX "/share/feh/images/about.png"));
- winwidget_show(winwid);
- }
- D_RETURN_(4);
- m = NULL;
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_close(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- winwidget_destroy(m->fehwin);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
+ char *path;
-static void
-feh_menu_cb_exit(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- winwidget_destroy_all();
- D_RETURN_(4);
- m = NULL;
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_reset(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- if (m->fehwin->has_rotated) {
- m->fehwin->im_w = gib_imlib_image_get_width(m->fehwin->im);
- m->fehwin->im_h = gib_imlib_image_get_height(m->fehwin->im);
- winwidget_resize(m->fehwin, m->fehwin->im_w, m->fehwin->im_h);
- }
- winwidget_reset_image(m->fehwin);
- winwidget_render_image(m->fehwin, 1, 1);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-
-static void
-feh_menu_cb_reload(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_reload_image(m->fehwin, 0, 0);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_remove(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_filelist_image_remove(m->fehwin, 0);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_delete(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_filelist_image_remove(m->fehwin, 1);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_remove_thumb(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 0);
- feh_filelist_image_remove(m->fehwin, 0);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_delete_thumb(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 1);
- feh_filelist_image_remove(m->fehwin, 1);
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-
-static void
-feh_menu_cb_sort_filename(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- filelist = gib_list_sort(filelist, feh_cmp_filename);
- if(!opt.no_jump_on_resort){
- slideshow_change_image(m->fehwin, SLIDE_FIRST);
- };
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_sort_imagename(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- filelist = gib_list_sort(filelist, feh_cmp_name);
- if(!opt.no_jump_on_resort){
- slideshow_change_image(m->fehwin, SLIDE_FIRST);
- };
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_sort_filesize(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- filelist = gib_list_sort(filelist, feh_cmp_size);
- if(!opt.no_jump_on_resort){
- slideshow_change_image(m->fehwin, SLIDE_FIRST);
- };
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_cb_sort_randomize(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- D_ENTER(4);
- filelist = gib_list_randomize(filelist);
- if(!opt.no_jump_on_resort){
- slideshow_change_image(m->fehwin, SLIDE_FIRST);
- };
- D_RETURN_(4);
- i = NULL;
- data = NULL;
-}
-
-static feh_menu *
-feh_menu_func_gen_jump(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- feh_menu *mm;
- gib_list *l;
-
- D_ENTER(4);
- mm = feh_menu_new();
- mm->name = estrdup("JUMP");
- for (l = filelist; l; l = l->next) {
- feh_menu_add_entry(mm, FEH_FILE(l->data)->name, NULL, NULL,
- feh_menu_cb_jump_to, l, NULL);
- }
- D_RETURN(4, mm);
- m = NULL;
- i = NULL;
- data = NULL;
-}
-
-static feh_menu *
-feh_menu_func_gen_info(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- Imlib_Image im;
- feh_menu *mm;
- feh_file *file;
- char buffer[400];
-
- D_ENTER(4);
- if (!m->fehwin->file)
- D_RETURN(4, NULL);
- file = FEH_FILE(m->fehwin->file->data);
- im = m->fehwin->im;
- if (!im)
- D_RETURN(4, NULL);
- mm = feh_menu_new();
- mm->name = estrdup("INFO");
- snprintf(buffer, sizeof(buffer), "Filename: %s", file->name);
- feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
- if (!file->info)
- feh_file_info_load(file, im);
- if (file->info) {
- snprintf(buffer, sizeof(buffer), "Size: %dKb", file->info->size / 1024);
- feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
- snprintf(buffer, sizeof(buffer), "Dimensions: %dx%d", file->info->width,
- file->info->height);
- feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
- snprintf(buffer, sizeof(buffer), "Type: %s", file->info->format);
- feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
- }
-
- mm->func_free = feh_menu_func_free_info;
- D_RETURN(4, mm);
- i = NULL;
- data = NULL;
-}
-
-static void
-feh_menu_func_free_info(feh_menu * m,
- void *data)
-{
- D_ENTER(4);
- feh_menu_free(m);
- D_RETURN_(4);
- data = NULL;
-}
-
-
-static feh_menu *
-feh_menu_func_gen_options(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- feh_menu *mm;
-
- D_ENTER(4);
- mm = feh_menu_new();
- mm->name = estrdup("OPTIONS");
- mm->fehwin = m->fehwin;
- feh_menu_add_toggle_entry(mm, "Auto-Zoom", NULL, NULL,
- feh_menu_cb_opt_auto_zoom, NULL, NULL,
- opt.auto_zoom);
- feh_menu_add_toggle_entry(mm, "Freeze Window Size", NULL, NULL,
- feh_menu_cb_opt_freeze_window, NULL, NULL,
- opt.geom_flags);
- feh_menu_add_toggle_entry(mm, "Fullscreen", NULL, NULL,
- feh_menu_cb_opt_fullscreen, NULL, NULL,
- m->fehwin->full_screen);
+ D_ENTER(4);
+ path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
+ feh_wm_set_bg(path, m->fehwin->im, 1, 0, (int) data, 1);
+ free(path);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_tiled_no_file(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_wm_set_bg(NULL, m->fehwin->im, 0, 0, (int) data, 1);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_scaled_no_file(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_wm_set_bg(NULL, m->fehwin->im, 0, 1, (int) data, 1);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_background_set_centered_no_file(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_wm_set_bg(NULL, m->fehwin->im, 1, 0, (int) data, 1);
+ D_RETURN_(4);
+ i = NULL;
+}
+
+static void feh_menu_cb_about(feh_menu * m, feh_menu_item * i, void *data)
+{
+ Imlib_Image im;
+ winwidget winwid;
+
+ D_ENTER(4);
+ if (feh_load_image_char(&im, PREFIX "/share/feh/images/about.png")
+ != 0) {
+ winwid = winwidget_create_from_image(im, "About " PACKAGE, WIN_TYPE_ABOUT);
+ winwid->file = gib_list_add_front(NULL, feh_file_new(PREFIX "/share/feh/images/about.png"));
+ winwidget_show(winwid);
+ }
+ D_RETURN_(4);
+ m = NULL;
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_close(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ winwidget_destroy(m->fehwin);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_exit(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ winwidget_destroy_all();
+ D_RETURN_(4);
+ m = NULL;
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_reset(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ if (m->fehwin->has_rotated) {
+ m->fehwin->im_w = gib_imlib_image_get_width(m->fehwin->im);
+ m->fehwin->im_h = gib_imlib_image_get_height(m->fehwin->im);
+ winwidget_resize(m->fehwin, m->fehwin->im_w, m->fehwin->im_h);
+ }
+ winwidget_reset_image(m->fehwin);
+ winwidget_render_image(m->fehwin, 1, 1);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_reload(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_reload_image(m->fehwin, 0, 0);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_remove(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_filelist_image_remove(m->fehwin, 0);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_delete(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_filelist_image_remove(m->fehwin, 1);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_remove_thumb(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 0);
+ feh_filelist_image_remove(m->fehwin, 0);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_delete_thumb(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 1);
+ feh_filelist_image_remove(m->fehwin, 1);
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_sort_filename(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ filelist = gib_list_sort(filelist, feh_cmp_filename);
+ if (!opt.no_jump_on_resort) {
+ slideshow_change_image(m->fehwin, SLIDE_FIRST);
+ };
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_sort_imagename(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ filelist = gib_list_sort(filelist, feh_cmp_name);
+ if (!opt.no_jump_on_resort) {
+ slideshow_change_image(m->fehwin, SLIDE_FIRST);
+ };
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_sort_filesize(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ filelist = gib_list_sort(filelist, feh_cmp_size);
+ if (!opt.no_jump_on_resort) {
+ slideshow_change_image(m->fehwin, SLIDE_FIRST);
+ };
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_cb_sort_randomize(feh_menu * m, feh_menu_item * i, void *data)
+{
+ D_ENTER(4);
+ filelist = gib_list_randomize(filelist);
+ if (!opt.no_jump_on_resort) {
+ slideshow_change_image(m->fehwin, SLIDE_FIRST);
+ };
+ D_RETURN_(4);
+ i = NULL;
+ data = NULL;
+}
+
+static feh_menu *feh_menu_func_gen_jump(feh_menu * m, feh_menu_item * i, void *data)
+{
+ feh_menu *mm;
+ gib_list *l;
+
+ D_ENTER(4);
+ mm = feh_menu_new();
+ mm->name = estrdup("JUMP");
+ for (l = filelist; l; l = l->next) {
+ feh_menu_add_entry(mm, FEH_FILE(l->data)->name, NULL, NULL, feh_menu_cb_jump_to, l, NULL);
+ }
+ D_RETURN(4, mm);
+ m = NULL;
+ i = NULL;
+ data = NULL;
+}
+
+static feh_menu *feh_menu_func_gen_info(feh_menu * m, feh_menu_item * i, void *data)
+{
+ Imlib_Image im;
+ feh_menu *mm;
+ feh_file *file;
+ char buffer[400];
+
+ D_ENTER(4);
+ if (!m->fehwin->file)
+ D_RETURN(4, NULL);
+ file = FEH_FILE(m->fehwin->file->data);
+ im = m->fehwin->im;
+ if (!im)
+ D_RETURN(4, NULL);
+ mm = feh_menu_new();
+ mm->name = estrdup("INFO");
+ snprintf(buffer, sizeof(buffer), "Filename: %s", file->name);
+ feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
+ if (!file->info)
+ feh_file_info_load(file, im);
+ if (file->info) {
+ snprintf(buffer, sizeof(buffer), "Size: %dKb", file->info->size / 1024);
+ feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
+ snprintf(buffer, sizeof(buffer), "Dimensions: %dx%d", file->info->width, file->info->height);
+ feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
+ snprintf(buffer, sizeof(buffer), "Type: %s", file->info->format);
+ feh_menu_add_entry(mm, buffer, NULL, NULL, NULL, NULL, NULL);
+ }
+
+ mm->func_free = feh_menu_func_free_info;
+ D_RETURN(4, mm);
+ i = NULL;
+ data = NULL;
+}
+
+static void feh_menu_func_free_info(feh_menu * m, void *data)
+{
+ D_ENTER(4);
+ feh_menu_free(m);
+ D_RETURN_(4);
+ data = NULL;
+}
+
+static feh_menu *feh_menu_func_gen_options(feh_menu * m, feh_menu_item * i, void *data)
+{
+ feh_menu *mm;
+
+ D_ENTER(4);
+ mm = feh_menu_new();
+ mm->name = estrdup("OPTIONS");
+ mm->fehwin = m->fehwin;
+ feh_menu_add_toggle_entry(mm, "Auto-Zoom", NULL, NULL, feh_menu_cb_opt_auto_zoom, NULL, NULL, opt.auto_zoom);
+ feh_menu_add_toggle_entry(mm, "Freeze Window Size", NULL, NULL,
+ feh_menu_cb_opt_freeze_window, NULL, NULL, opt.geom_flags);
+ feh_menu_add_toggle_entry(mm, "Fullscreen", NULL, NULL,
+ feh_menu_cb_opt_fullscreen, NULL, NULL, m->fehwin->full_screen);
#ifdef HAVE_LIBXINERAMA
- feh_menu_add_toggle_entry(mm, "Use Xinerama", NULL, NULL,
- feh_menu_cb_opt_xinerama, NULL, NULL,
- opt.xinerama);
-#endif /* HAVE_LIBXINERAMA */
- feh_menu_add_entry(mm, NULL, NULL, NULL, NULL, NULL, NULL);
- feh_menu_add_toggle_entry(mm, "Draw Filename", NULL, NULL,
- feh_menu_cb_opt_draw_filename, NULL, NULL,
- opt.draw_filename);
- feh_menu_add_toggle_entry(mm, "Keep HTTP Files", NULL, NULL,
- feh_menu_cb_opt_keep_http, NULL, NULL,
- opt.keep_http);
- mm->func_free = feh_menu_func_free_options;
- D_RETURN(4, mm);
- i = NULL;
- data = NULL;
+ feh_menu_add_toggle_entry(mm, "Use Xinerama", NULL, NULL, feh_menu_cb_opt_xinerama, NULL, NULL, opt.xinerama);
+#endif /* HAVE_LIBXINERAMA */
+ feh_menu_add_entry(mm, NULL, NULL, NULL, NULL, NULL, NULL);
+ feh_menu_add_toggle_entry(mm, "Draw Filename", NULL, NULL,
+ feh_menu_cb_opt_draw_filename, NULL, NULL, opt.draw_filename);
+ feh_menu_add_toggle_entry(mm, "Keep HTTP Files", NULL, NULL,
+ feh_menu_cb_opt_keep_http, NULL, NULL, opt.keep_http);
+ mm->func_free = feh_menu_func_free_options;
+ D_RETURN(4, mm);
+ i = NULL;
+ data = NULL;
}
-static void
-feh_menu_func_free_options(feh_menu * m,
- void *data)
-{
- D_ENTER(4);
- feh_menu_free(m);
- D_RETURN_(4);
- data = NULL;
+static void feh_menu_func_free_options(feh_menu * m, void *data)
+{
+ D_ENTER(4);
+ feh_menu_free(m);
+ D_RETURN_(4);
+ data = NULL;
}
-static void
-feh_menu_cb_jump_to(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- gib_list *l;
+static void feh_menu_cb_jump_to(feh_menu * m, feh_menu_item * i, void *data)
+{
+ gib_list *l;
- D_ENTER(4);
- l = (gib_list *) data;
- if (l->prev) {
- current_file = l->prev;
- slideshow_change_image(m->fehwin, SLIDE_NEXT);
- } else if (l->next) {
- current_file = l->next;
- slideshow_change_image(m->fehwin, SLIDE_PREV);
- }
+ D_ENTER(4);
+ l = (gib_list *) data;
+ if (l->prev) {
+ current_file = l->prev;
+ slideshow_change_image(m->fehwin, SLIDE_NEXT);
+ } else if (l->next) {
+ current_file = l->next;
+ slideshow_change_image(m->fehwin, SLIDE_PREV);
+ }
- D_RETURN_(4);
- i = NULL;
- m = NULL;
+ D_RETURN_(4);
+ i = NULL;
+ m = NULL;
}
-static void
-feh_menu_cb_fit(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_fit(feh_menu * m, feh_menu_item * i, void *data)
{
- D_ENTER(4);
- winwidget_size_to_image(m->fehwin);
- D_RETURN_(4);
- data = NULL;
+ D_ENTER(4);
+ winwidget_size_to_image(m->fehwin);
+ D_RETURN_(4);
+ data = NULL;
}
-static void
-feh_menu_cb_edit_rotate(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_edit_rotate(feh_menu * m, feh_menu_item * i, void *data)
{
- D_ENTER(4);
- feh_edit_inplace_orient(m->fehwin, (int) data);
- D_RETURN_(4);
+ D_ENTER(4);
+ feh_edit_inplace_orient(m->fehwin, (int) data);
+ D_RETURN_(4);
}
-static void
-feh_menu_cb_save_image(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_save_image(feh_menu * m, feh_menu_item * i, void *data)
{
- slideshow_save_image(m->fehwin);
+ slideshow_save_image(m->fehwin);
}
-static void
-feh_menu_cb_save_filelist(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_save_filelist(feh_menu * m, feh_menu_item * i, void *data)
{
- feh_save_filelist();
+ feh_save_filelist();
}
-static void
-feh_menu_cb_opt_draw_filename(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_opt_draw_filename(feh_menu * m, feh_menu_item * i, void *data)
{
- MENU_ITEM_TOGGLE(i);
- if (MENU_ITEM_IS_ON(i))
- opt.draw_filename = TRUE;
- else
- opt.draw_filename = FALSE;
- winwidget_rerender_all(0, 1);
+ MENU_ITEM_TOGGLE(i);
+ if (MENU_ITEM_IS_ON(i))
+ opt.draw_filename = TRUE;
+ else
+ opt.draw_filename = FALSE;
+ winwidget_rerender_all(0, 1);
}
-static void
-feh_menu_cb_opt_keep_http(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_opt_keep_http(feh_menu * m, feh_menu_item * i, void *data)
{
- MENU_ITEM_TOGGLE(i);
- if (MENU_ITEM_IS_ON(i))
- opt.keep_http = TRUE;
- else
- opt.keep_http = FALSE;
+ MENU_ITEM_TOGGLE(i);
+ if (MENU_ITEM_IS_ON(i))
+ opt.keep_http = TRUE;
+ else
+ opt.keep_http = FALSE;
}
-static void
-feh_menu_cb_opt_freeze_window(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_opt_freeze_window(feh_menu * m, feh_menu_item * i, void *data)
{
- MENU_ITEM_TOGGLE(i);
- if (MENU_ITEM_IS_ON(i)) {
- opt.geom_flags = (WidthValue | HeightValue);
- opt.geom_w = m->fehwin->w;
- opt.geom_h = m->fehwin->h;
- } else {
- opt.geom_flags = 0;
- }
+ MENU_ITEM_TOGGLE(i);
+ if (MENU_ITEM_IS_ON(i)) {
+ opt.geom_flags = (WidthValue | HeightValue);
+ opt.geom_w = m->fehwin->w;
+ opt.geom_h = m->fehwin->h;
+ } else {
+ opt.geom_flags = 0;
+ }
}
-static void
-feh_menu_cb_opt_fullscreen(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_opt_fullscreen(feh_menu * m, feh_menu_item * i, void *data)
{
- int curr_screen = 0;
+ int curr_screen = 0;
- MENU_ITEM_TOGGLE(i);
- if (MENU_ITEM_IS_ON(i))
- m->fehwin->full_screen = TRUE;
- else
- m->fehwin->full_screen = FALSE;
+ MENU_ITEM_TOGGLE(i);
+ if (MENU_ITEM_IS_ON(i))
+ m->fehwin->full_screen = TRUE;
+ else
+ m->fehwin->full_screen = FALSE;
#ifdef HAVE_LIBXINERAMA
- if (opt.xinerama && xinerama_screens) {
- int i, rect[4];
-
- winwidget_get_geometry(m->fehwin, rect);
- /* printf("window: (%d, %d)\n", rect[0], rect[1]);
- printf("found %d screens.\n", num_xinerama_screens); */
- for (i = 0; i < num_xinerama_screens; i++) {
- xinerama_screen = 0;
- /* printf("%d: [%d, %d, %d, %d] (%d, %d)\n",
- i,
- xinerama_screens[i].x_org, xinerama_screens[i].y_org,
- xinerama_screens[i].width, xinerama_screens[i].height,
- rect[0], rect[1]);*/
- if (XY_IN_RECT(rect[0], rect[1],
- xinerama_screens[i].x_org, xinerama_screens[i].y_org,
- xinerama_screens[i].width, xinerama_screens[i].height)) {
- curr_screen = xinerama_screen = i;
- break;
- }
-
- }
- }
-#endif /* HAVE_LIBXINERAMA */
-
- winwidget_destroy_xwin(m->fehwin);
- winwidget_create_window(m->fehwin, m->fehwin->im_w, m->fehwin->im_h);
-
- winwidget_render_image(m->fehwin, 1, 1);
- winwidget_show(m->fehwin);
+ if (opt.xinerama && xinerama_screens) {
+ int i, rect[4];
+
+ winwidget_get_geometry(m->fehwin, rect);
+ /* printf("window: (%d, %d)\n", rect[0], rect[1]);
+ printf("found %d screens.\n", num_xinerama_screens); */
+ for (i = 0; i < num_xinerama_screens; i++) {
+ xinerama_screen = 0;
+ /* printf("%d: [%d, %d, %d, %d] (%d, %d)\n",
+ i,
+ xinerama_screens[i].x_org, xinerama_screens[i].y_org,
+ xinerama_screens[i].width, xinerama_screens[i].height,
+ rect[0], rect[1]); */
+ if (XY_IN_RECT(rect[0], rect[1],
+ xinerama_screens[i].x_org,
+ xinerama_screens[i].y_org,
+ xinerama_screens[i].width, xinerama_screens[i].height)) {
+ curr_screen = xinerama_screen = i;
+ break;
+ }
+
+ }
+ }
+#endif /* HAVE_LIBXINERAMA */
+
+ winwidget_destroy_xwin(m->fehwin);
+ winwidget_create_window(m->fehwin, m->fehwin->im_w, m->fehwin->im_h);
+
+ winwidget_render_image(m->fehwin, 1, 1);
+ winwidget_show(m->fehwin);
#ifdef HAVE_LIBXINERAMA
- /* if we have xinerama and we're using it, then full screen the window
- * on the head that the window was active on */
- if (m->fehwin->full_screen == TRUE && opt.xinerama && xinerama_screens) {
- xinerama_screen = curr_screen;
- winwidget_move(m->fehwin,
- xinerama_screens[curr_screen].x_org,
- xinerama_screens[curr_screen].y_org);
- }
-#endif /* HAVE_LIBXINERAMA */
+ /* if we have xinerama and we're using it, then full screen the window
+ * on the head that the window was active on */
+ if (m->fehwin->full_screen == TRUE && opt.xinerama && xinerama_screens) {
+ xinerama_screen = curr_screen;
+ winwidget_move(m->fehwin, xinerama_screens[curr_screen].x_org, xinerama_screens[curr_screen].y_org);
+ }
+#endif /* HAVE_LIBXINERAMA */
}
-static void
-feh_menu_cb_opt_auto_zoom(feh_menu * m,
- feh_menu_item * i,
- void *data)
+static void feh_menu_cb_opt_auto_zoom(feh_menu * m, feh_menu_item * i, void *data)
{
- MENU_ITEM_TOGGLE(i);
- opt.auto_zoom = MENU_ITEM_IS_ON(i) ? 1 : 0;
- winwidget_rerender_all(1, 1);
+ MENU_ITEM_TOGGLE(i);
+ opt.auto_zoom = MENU_ITEM_IS_ON(i) ? 1 : 0;
+ winwidget_rerender_all(1, 1);
}
#ifdef HAVE_LIBXINERAMA
-static void
-feh_menu_cb_opt_xinerama(feh_menu * m,
- feh_menu_item * i,
- void *data)
-{
- MENU_ITEM_TOGGLE(i);
- opt.xinerama = MENU_ITEM_IS_ON(i) ? 1 : 0;
-
- if (opt.xinerama) {
- init_xinerama();
- } else {
- XFree(xinerama_screens);
- xinerama_screens = NULL;
- }
- winwidget_rerender_all(1, 1);
-}
-#endif /* HAVE_LIBXINERAMA */
+static void feh_menu_cb_opt_xinerama(feh_menu * m, feh_menu_item * i, void *data)
+{
+ MENU_ITEM_TOGGLE(i);
+ opt.xinerama = MENU_ITEM_IS_ON(i) ? 1 : 0;
+
+ if (opt.xinerama) {
+ init_xinerama();
+ } else {
+ XFree(xinerama_screens);
+ xinerama_screens = NULL;
+ }
+ winwidget_rerender_all(1, 1);
+}
+#endif /* HAVE_LIBXINERAMA */