Skip to content
Snippets Groups Projects
menu.c 49 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	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(4);
    	if (!common_menus)
    		feh_menu_init_common();
    
    	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) {
    
    		mi = feh_menu_add_entry(menu_main, "Jump to", NULL, "JUMP", NULL, NULL, NULL);
    		mi->func_gen_sub = feh_menu_func_gen_jump;
    
    		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);
    
    		feh_menu_add_entry(menu_bg, "Set Filled", NULL, "FILLED", 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);
    		}
    
    		m = feh_menu_new();
    		m->name = estrdup("FILLED");
    		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_filled,
    						(void *) i, NULL);
    			else
    				feh_menu_add_entry(m, buf, NULL, NULL,
    						feh_menu_cb_background_set_filled_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);
    			feh_menu_add_entry(menu_bg, "Set Filled", NULL,
    					NULL, feh_menu_cb_background_set_filled, 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);
    			feh_menu_add_entry(menu_bg, "Set Filled", NULL,
    					NULL, feh_menu_cb_background_set_filled_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, 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, 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, 0, (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)
    
    	D_ENTER(4);
    	path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename);
    
    	feh_wm_set_bg(path, m->fehwin->im, 1, 0, 0, (int) data, 1);
    	free(path);
    	D_RETURN_(4);
    	i = NULL;
    }
    
    static void feh_menu_cb_background_set_filled(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, 1, (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, 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, 0, (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, 0, (int) data, 1);
    	D_RETURN_(4);
    	i = NULL;
    }
    
    static void feh_menu_cb_background_set_filled_no_file(feh_menu * m, feh_menu_item * i, void *data)
    {
    	D_ENTER(4);
    	feh_wm_set_bg(NULL, m->fehwin->im, 0, 0, 1, (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;
    
    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;
    
    	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);
    	}
    
    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;
    
    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);
    
    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_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);
    
    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;
    
    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;
    	}
    
    static void feh_menu_cb_opt_fullscreen(feh_menu * m, feh_menu_item * i, void *data)
    
    	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);
    
    
    #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 */
    
    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);
    
    }
    
    #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 */