/* * browseaction.c -- Enfle main browsing actions * (C)Copyright 1999, 2000 by Hiroshi Takekawa * This file is part of Enfle. * * Last Modified: Mon Jun 26 19:33:58 2000. * $Id: browseaction.c,v 1.13 2000/06/27 18:19:57 sian Exp $ * * Enfle is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Enfle is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include "action.h" #include "browse.h" #include "browseaction.h" #include #define SCMask (ShiftMask | ControlMask) /* used keys: dqvhmrtwfspjnb<[]/ */ static Action_key keys[] = { { XK_d, 0, browseaction_delete }, { XK_q, 0, browseaction_quit }, { XK_v, 0, browseaction_flip_vertical }, { XK_h, 0, browseaction_flip_horizontal }, { XK_t, 0, browseaction_create_thumbnail }, { XK_w, 0, browseaction_set_wallpaper }, { XK_f, 0, browseaction_fullscreen }, { XK_space, 0, browseaction_next }, { XK_n, 0, browseaction_next }, { XK_N, ShiftMask, browseaction_nextdir }, { XK_b, 0, browseaction_prev }, { XK_m, 0, browseaction_magnify }, { XK_M, ShiftMask, browseaction_magnify_fit }, { XK_m, ControlMask, browseaction_magnify_fit_if_large }, { XK_m, Mod1Mask, browseaction_magnify_fit_short }, { XK_r, 0, browseaction_restore }, { XK_s, 0, browseaction_save_png }, { XK_S, ShiftMask, browseaction_smooth }, { XK_p, 0, browseaction_save_pms }, { XK_j, 0, browseaction_save_jpeg }, { XK_less, ShiftMask, browseaction_top }, { XK_bracketleft, 0, browseaction_speed_slower }, { XK_bracketright, 0, browseaction_speed_faster }, { XK_backslash, 0, browseaction_speed_normal }, { 0, 0, NULL } }; int browseaction_initialize(Hash *act_hash) { return action_register_by_keys(act_hash, keys); } Event browseaction_delete(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { unlink(info->filename); fprintf(stderr, "Deleted: %s\n", info->filename); return _DELETE; } Event browseaction_quit(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { return _END; } Event browseaction_flip_vertical(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (image_flip_vertical(p)) browse_refresh(info, binfo, p, 0); return _NOTHING; } Event browseaction_flip_horizontal(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (image_flip_horizontal(p)) browse_refresh(info, binfo, p, 0); return _NOTHING; } Event browseaction_fullscreen(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { XSetWindowAttributes set_attr; binfo->if_fullscreen = binfo->if_fullscreen ? 0 : 1; if (binfo->if_fullscreen) { info->win_save = info->win; info->win = XCreateSimpleWindow(info->disp, info->root, 0, 0, binfo->swidth, binfo->sheight, 0, WhitePixel(info->disp, 0), BlackPixel(info->disp, 0)); XSelectInput(info->disp, info->win, MAIN_WIN_MASK); set_attr.override_redirect = True; XChangeWindowAttributes(info->disp, info->win, CWOverrideRedirect, &set_attr); XRaiseWindow(info->disp, info->win); XMapWindow(info->disp, info->win); } else { XDestroyWindow(info->disp, info->win); info->win = info->win_save; } browse_refresh(info, binfo, p, 0); return _NOTHING; } Event browseaction_create_thumbnail(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { browse_create_thumbnail(info, binfo, p, t); return _NOTHING; } Event browseaction_set_wallpaper(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { browse_set_wallpaper(info, binfo, p); return _NOTHING; } Event browseaction_save_png(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (browse_save_image(info, binfo, p, "PNG", NULL)) printf("%s saved\n", info->filename); else fprintf(stderr, "%s save failed\n", info->filename); return _NOTHING; } Event browseaction_save_pms(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (browse_save_image(info, binfo, p, "PMS", NULL)) printf("%s saved\n", info->filename); else fprintf(stderr, "%s save failed\n", info->filename); return _NOTHING; } Event browseaction_save_jpeg(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (browse_save_image(info, binfo, p, "JPEG", "jpg")) printf("%s saved\n", info->filename); else fprintf(stderr, "%s save failed\n", info->filename); return _NOTHING; } Event browseaction_smooth(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (binfo->interpolate_method == _NONE) binfo->interpolate_method = _BILINEAR; else if (binfo->interpolate_method == _BILINEAR) binfo->interpolate_method = _NONE; image_destroy(info->top_image); info->top_image = image_duplicate(info->image); if (browse_magnify(info, binfo, info->top_image)) browse_refresh(info, binfo, info->top_image, 0); else { image_destroy(info->top_image); info->shown_image = info->top_image = image_duplicate(info->image); } return _NOTHING; } Event browseaction_next(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { return _NEXT; } Event browseaction_nextdir(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { return _NEXTDIR; } Event browseaction_prev(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { return _PREV; } Event browseaction_top(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { return _TOP; } Event browseaction_speed_slower(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { info->delay_factor *= 1.067; if (info->delay_factor > 10) info->delay_factor = 10; return _NOTHING; } Event browseaction_speed_faster(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { info->delay_factor *= 0.9375; if (info->delay_factor < 0.05) info->delay_factor = 0.05; return _NOTHING; } Event browseaction_speed_normal(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { info->delay_factor = 1.0; return _NOTHING; } Event browseaction_magnify(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (binfo->if_magnify) return browseaction_restore(info, binfo, p, t); binfo->if_magnify = 1; if (browse_magnify(info, binfo, info->top_image)) browse_refresh(info, binfo, info->top_image, 0); else { image_destroy(info->top_image); info->shown_image = info->top_image = image_duplicate(info->image); } return _NOTHING; } Event browseaction_magnify_fit(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (binfo->if_magnify) return browseaction_restore(info, binfo, p, t); binfo->if_magnify = 2; if (browse_magnify(info, binfo, info->top_image)) browse_refresh(info, binfo, info->top_image, 0); else { image_destroy(info->top_image); info->shown_image = info->top_image = image_duplicate(info->image); } return _NOTHING; } Event browseaction_magnify_fit_if_large(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (binfo->if_magnify) return browseaction_restore(info, binfo, p, t); binfo->if_magnify = 3; if (browse_magnify(info, binfo, info->top_image)) browse_refresh(info, binfo, info->top_image, 0); else { image_destroy(info->top_image); info->shown_image = info->top_image = image_duplicate(info->image); } return _NOTHING; } Event browseaction_magnify_fit_short(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { if (binfo->if_magnify) return browseaction_restore(info, binfo, p, t); binfo->if_magnify = 4; if (browse_magnify(info, binfo, info->top_image)) browse_refresh(info, binfo, info->top_image, 0); else { image_destroy(info->top_image); info->shown_image = info->top_image = image_duplicate(info->image); } return _NOTHING; } Event browseaction_restore(Info *info, Binfo *binfo, Image *p, Dlist_data *t) { binfo->if_magnify = 0; image_destroy(info->top_image); p = info->shown_image = info->top_image = image_duplicate(info->image); /* restore screen */ info->mswidth = info->swidth; info->msheight = info->sheight; if (binfo->if_fullscreen) XClearWindow(info->disp, info->win); browse_refresh(info, binfo, p, 0); return _NOTHING; }