summaryrefslogtreecommitdiff
path: root/src/winwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/winwidget.c')
-rw-r--r--src/winwidget.c1802
1 files changed, 864 insertions, 938 deletions
diff --git a/src/winwidget.c b/src/winwidget.c
index c494123..dd0adbb 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -32,1068 +32,994 @@ static void winwidget_unregister(winwidget win);
static void winwidget_register(winwidget win);
static winwidget winwidget_allocate(void);
-static char bm_no_data[] = { 0,0,0,0, 0,0,0,0 };
-int window_num = 0; /* For window list */
-winwidget *windows = NULL; /* List of windows to loop though */
+static char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-static winwidget
-winwidget_allocate(void)
+int window_num = 0; /* For window list */
+winwidget *windows = NULL; /* List of windows to loop though */
+
+static winwidget winwidget_allocate(void)
{
- winwidget ret = NULL;
-
- D_ENTER(4);
- ret = emalloc(sizeof(_winwidget));
-
- ret->win = 0;
- ret->w = 0;
- ret->h = 0;
- ret->full_screen = 0;
- ret->im_w = 0;
- ret->im_h = 0;
- ret->im_angle = 0;
- ret->bg_pmap = 0;
- ret->bg_pmap_cache = 0;
- ret->im = NULL;
- ret->name = NULL;
- ret->file = NULL;
- ret->type = WIN_TYPE_UNSET;
- ret->visible = 0;
- ret->caption_entry = 0;
-
- /* Zoom stuff */
- ret->mode = MODE_NORMAL;
-
- ret->gc = None;
-
- /* New stuff */
- ret->im_x = 0;
- ret->im_y = 0;
- ret->zoom = 1.0;
-
- ret->click_offset_x = 0;
- ret->click_offset_y = 0;
- ret->im_click_offset_x = 0;
- ret->im_click_offset_y = 0;
- ret->has_rotated = 0;
-
- D_RETURN(4, ret);
+ winwidget ret = NULL;
+
+ D_ENTER(4);
+ ret = emalloc(sizeof(_winwidget));
+
+ ret->win = 0;
+ ret->w = 0;
+ ret->h = 0;
+ ret->full_screen = 0;
+ ret->im_w = 0;
+ ret->im_h = 0;
+ ret->im_angle = 0;
+ ret->bg_pmap = 0;
+ ret->bg_pmap_cache = 0;
+ ret->im = NULL;
+ ret->name = NULL;
+ ret->file = NULL;
+ ret->type = WIN_TYPE_UNSET;
+ ret->visible = 0;
+ ret->caption_entry = 0;
+
+ /* Zoom stuff */
+ ret->mode = MODE_NORMAL;
+
+ ret->gc = None;
+
+ /* New stuff */
+ ret->im_x = 0;
+ ret->im_y = 0;
+ ret->zoom = 1.0;
+
+ ret->click_offset_x = 0;
+ ret->click_offset_y = 0;
+ ret->im_click_offset_x = 0;
+ ret->im_click_offset_y = 0;
+ ret->has_rotated = 0;
+
+ D_RETURN(4, ret);
}
-winwidget
-winwidget_create_from_image(Imlib_Image im,
- char *name,
- char type)
+winwidget winwidget_create_from_image(Imlib_Image im, char *name, char type)
{
- winwidget ret = NULL;
+ winwidget ret = NULL;
- D_ENTER(4);
+ D_ENTER(4);
- if (im == NULL)
- D_RETURN(4, NULL);
+ if (im == NULL)
+ D_RETURN(4, NULL);
- ret = winwidget_allocate();
- ret->type = type;
+ ret = winwidget_allocate();
+ ret->type = type;
- ret->im = im;
- ret->w = ret->im_w = gib_imlib_image_get_width(ret->im);
- ret->h = ret->im_h = gib_imlib_image_get_height(ret->im);
+ ret->im = im;
+ ret->w = ret->im_w = gib_imlib_image_get_width(ret->im);
+ ret->h = ret->im_h = gib_imlib_image_get_height(ret->im);
- if (name)
- ret->name = estrdup(name);
- else
- ret->name = estrdup(PACKAGE);
+ if (name)
+ ret->name = estrdup(name);
+ else
+ ret->name = estrdup(PACKAGE);
- if (opt.full_screen)
- ret->full_screen = True;
- winwidget_create_window(ret, ret->w, ret->h);
- winwidget_render_image(ret, 1, 1);
+ if (opt.full_screen)
+ ret->full_screen = True;
+ winwidget_create_window(ret, ret->w, ret->h);
+ winwidget_render_image(ret, 1, 1);
- D_RETURN(4, ret);
+ D_RETURN(4, ret);
}
-winwidget
-winwidget_create_from_file(gib_list * list,
- char *name,
- char type)
+winwidget winwidget_create_from_file(gib_list * list, char *name, char type)
{
- winwidget ret = NULL;
- feh_file *file = FEH_FILE(list->data);
-
- D_ENTER(4);
-
- if (!file || !file->filename)
- D_RETURN(4, NULL);
-
- ret = winwidget_allocate();
- ret->file = list;
- ret->type = type;
- if (name)
- ret->name = estrdup(name);
- else
- ret->name = estrdup(file->filename);
-
- if (winwidget_loadimage(ret, file) == 0) {
- winwidget_destroy(ret);
- D_RETURN(4, NULL);
- }
-
- if (!ret->win) {
- ret->w = ret->im_w = gib_imlib_image_get_width(ret->im);
- ret->h = ret->im_h = gib_imlib_image_get_height(ret->im);
- D(3,
- ("image is %dx%d pixels, format %s\n", ret->w, ret->h,
- gib_imlib_image_format(ret->im)));
- if (opt.full_screen)
- ret->full_screen = True;
- winwidget_create_window(ret, ret->w, ret->h);
- winwidget_render_image(ret, 1, 1);
- }
-
- D_RETURN(4, ret);
+ winwidget ret = NULL;
+ feh_file *file = FEH_FILE(list->data);
+
+ D_ENTER(4);
+
+ if (!file || !file->filename)
+ D_RETURN(4, NULL);
+
+ ret = winwidget_allocate();
+ ret->file = list;
+ ret->type = type;
+ if (name)
+ ret->name = estrdup(name);
+ else
+ ret->name = estrdup(file->filename);
+
+ if (winwidget_loadimage(ret, file) == 0) {
+ winwidget_destroy(ret);
+ D_RETURN(4, NULL);
+ }
+
+ if (!ret->win) {
+ ret->w = ret->im_w = gib_imlib_image_get_width(ret->im);
+ ret->h = ret->im_h = gib_imlib_image_get_height(ret->im);
+ D(3, ("image is %dx%d pixels, format %s\n", ret->w, ret->h, gib_imlib_image_format(ret->im)));
+ if (opt.full_screen)
+ ret->full_screen = True;
+ winwidget_create_window(ret, ret->w, ret->h);
+ winwidget_render_image(ret, 1, 1);
+ }
+
+ D_RETURN(4, ret);
}
-void
-winwidget_create_window(winwidget ret,
- int w,
- int h)
+void winwidget_create_window(winwidget ret, int w, int h)
{
- XSetWindowAttributes attr;
- XEvent ev;
- XClassHint *xch;
- MWMHints mwmhints;
- Atom prop = None;
- int x = 0;
- int y = 0;
+ XSetWindowAttributes attr;
+ XEvent ev;
+ XClassHint *xch;
+ MWMHints mwmhints;
+ Atom prop = None;
+ int x = 0;
+ int y = 0;
- D_ENTER(4);
+ D_ENTER(4);
- if (ret->full_screen) {
- w = scr->width;
- h = scr->height;
+ if (ret->full_screen) {
+ w = scr->width;
+ h = scr->height;
#ifdef HAVE_LIBXINERAMA
- if (opt.xinerama && xinerama_screens) {
- w = xinerama_screens[xinerama_screen].width;
- h = xinerama_screens[xinerama_screen].height;
- }
-#endif /* HAVE_LIBXINERAMA */
- } else if (opt.geom_flags) {
- if (opt.geom_flags & WidthValue) {
- w = opt.geom_w;
- }
- if (opt.geom_flags & HeightValue) {
- h = opt.geom_h;
- }
- if (opt.geom_flags & XValue) {
- if (opt.geom_flags & XNegative) {
- x = scr->width - opt.geom_x;
- } else {
- x = opt.geom_x;
- }
- }
- if (opt.geom_flags & YValue) {
- if (opt.geom_flags & YNegative) {
- y = scr->height - opt.geom_y;
- } else {
- y = opt.geom_y;
- }
- }
- } else if (opt.screen_clip) {
- if (w > scr->width)
- w = scr->width;
- if (h > scr->height)
- h = scr->height;
+ if (opt.xinerama && xinerama_screens) {
+ w = xinerama_screens[xinerama_screen].width;
+ h = xinerama_screens[xinerama_screen].height;
+ }
+#endif /* HAVE_LIBXINERAMA */
+ } else if (opt.geom_flags) {
+ if (opt.geom_flags & WidthValue) {
+ w = opt.geom_w;
+ }
+ if (opt.geom_flags & HeightValue) {
+ h = opt.geom_h;
+ }
+ if (opt.geom_flags & XValue) {
+ if (opt.geom_flags & XNegative) {
+ x = scr->width - opt.geom_x;
+ } else {
+ x = opt.geom_x;
+ }
+ }
+ if (opt.geom_flags & YValue) {
+ if (opt.geom_flags & YNegative) {
+ y = scr->height - opt.geom_y;
+ } else {
+ y = opt.geom_y;
+ }
+ }
+ } else if (opt.screen_clip) {
+ if (w > scr->width)
+ w = scr->width;
+ if (h > scr->height)
+ h = scr->height;
#ifdef HAVE_LIBXINERAMA
- if (opt.xinerama && xinerama_screens) {
- if (w > xinerama_screens[xinerama_screen].width)
- w = xinerama_screens[xinerama_screen].width;
- if (h > xinerama_screens[xinerama_screen].height)
- h = xinerama_screens[xinerama_screen].height;
- }
-#endif /* HAVE_LIBXINERAMA */
- }
-
- ret->x = x;
- ret->y = y;
- ret->w = w;
- ret->h = h;
- ret->visible = False;
-
- attr.backing_store = NotUseful;
- attr.override_redirect = False;
- attr.colormap = cm;
- attr.border_pixel = 0;
- attr.background_pixel = 0;
- attr.save_under = False;
- attr.event_mask =
- StructureNotifyMask | ButtonPressMask | ButtonReleaseMask |
- PointerMotionMask | EnterWindowMask | LeaveWindowMask | KeyPressMask |
- KeyReleaseMask | ButtonMotionMask | ExposureMask | FocusChangeMask |
- PropertyChangeMask | VisibilityChangeMask;
-
- if (opt.borderless || ret->full_screen) {
- prop = XInternAtom(disp, "_MOTIF_WM_HINTS", True);
- if (prop == None) {
- weprintf("Window Manager does not support MWM hints. "
- "To get a borderless window I have to bypass your wm.");
- attr.override_redirect = True;
- mwmhints.flags = 0;
- } else {
- mwmhints.flags = MWM_HINTS_DECORATIONS;
- mwmhints.decorations = 0;
- }
- } else
- mwmhints.flags = 0;
-
- ret->win =
- XCreateWindow(disp, DefaultRootWindow(disp), x, y, w, h, 0, depth,
- InputOutput, vis,
- CWOverrideRedirect | CWSaveUnder | CWBackingStore |
- CWColormap | CWBackPixel | CWBorderPixel | CWEventMask,
- &attr);
-
- if (mwmhints.flags) {
- XChangeProperty(disp, ret->win, prop, prop, 32, PropModeReplace,
- (unsigned char *) &mwmhints, PROP_MWM_HINTS_ELEMENTS);
- }
- if (ret->full_screen) {
- Atom prop_fs = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False);
- Atom prop_state = XInternAtom(disp, "_NET_WM_STATE", False);
-
- memset(&ev, 0, sizeof(ev));
- ev.xclient.type = ClientMessage;
- ev.xclient.message_type = prop_state;
- ev.xclient.display = disp;
- ev.xclient.window = ret->win;
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = (ret->full_screen ? 1 : 0);
- ev.xclient.data.l[1] = prop_fs;
-
- XChangeProperty(disp, ret->win, prop_state, XA_ATOM, 32,
- PropModeReplace, &prop_fs, 1);
- }
-
- XSetWMProtocols(disp, ret->win, &wmDeleteWindow, 1);
- winwidget_update_title(ret);
- xch = XAllocClassHint();
- xch->res_name = "feh";
- xch->res_class = "feh";
- XSetClassHint(disp, ret->win, xch);
- XFree(xch);
-
- /* Size hints */
- if (ret->full_screen || opt.geom_flags) {
- XSizeHints xsz;
-
- xsz.flags = USPosition;
- xsz.x = x;
- xsz.y = y;
- XSetWMNormalHints(disp, ret->win, &xsz);
- XMoveWindow(disp, ret->win, x, y);
- }
- if (ret->full_screen && opt.hide_pointer) {
- Cursor no_ptr;
- XColor black, dummy;
- Pixmap bm_no;
- bm_no = XCreateBitmapFromData(disp, ret->win, bm_no_data, 8, 8);
- XAllocNamedColor(disp, DefaultColormapOfScreen(DefaultScreenOfDisplay(disp)), "black", &black, &dummy);
-
- no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0);
- XDefineCursor(disp, ret->win, no_ptr);
- }
-
- /* set the icon name property */
- XSetIconName(disp, ret->win, "feh");
- /* set the command hint */
- XSetCommand(disp, ret->win, cmdargv, cmdargc);
-
- winwidget_register(ret);
- D_RETURN_(4);
+ if (opt.xinerama && xinerama_screens) {
+ if (w > xinerama_screens[xinerama_screen].width)
+ w = xinerama_screens[xinerama_screen].width;
+ if (h > xinerama_screens[xinerama_screen].height)
+ h = xinerama_screens[xinerama_screen].height;
+ }
+#endif /* HAVE_LIBXINERAMA */
+ }
+
+ ret->x = x;
+ ret->y = y;
+ ret->w = w;
+ ret->h = h;
+ ret->visible = False;
+
+ attr.backing_store = NotUseful;
+ attr.override_redirect = False;
+ attr.colormap = cm;
+ attr.border_pixel = 0;
+ attr.background_pixel = 0;
+ attr.save_under = False;
+ attr.event_mask =
+ StructureNotifyMask | ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask | EnterWindowMask | LeaveWindowMask |
+ KeyPressMask | KeyReleaseMask | ButtonMotionMask | ExposureMask
+ | FocusChangeMask | PropertyChangeMask | VisibilityChangeMask;
+
+ if (opt.borderless || ret->full_screen) {
+ prop = XInternAtom(disp, "_MOTIF_WM_HINTS", True);
+ if (prop == None) {
+ weprintf
+ ("Window Manager does not support MWM hints. "
+ "To get a borderless window I have to bypass your wm.");
+ attr.override_redirect = True;
+ mwmhints.flags = 0;
+ } else {
+ mwmhints.flags = MWM_HINTS_DECORATIONS;
+ mwmhints.decorations = 0;
+ }
+ } else
+ mwmhints.flags = 0;
+
+ ret->win =
+ XCreateWindow(disp, DefaultRootWindow(disp), x, y, w, h, 0,
+ depth, InputOutput, vis,
+ CWOverrideRedirect | CWSaveUnder | CWBackingStore
+ | CWColormap | CWBackPixel | CWBorderPixel | CWEventMask, &attr);
+
+ if (mwmhints.flags) {
+ XChangeProperty(disp, ret->win, prop, prop, 32,
+ PropModeReplace, (unsigned char *) &mwmhints, PROP_MWM_HINTS_ELEMENTS);
+ }
+ if (ret->full_screen) {
+ Atom prop_fs = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False);
+ Atom prop_state = XInternAtom(disp, "_NET_WM_STATE", False);
+
+ memset(&ev, 0, sizeof(ev));
+ ev.xclient.type = ClientMessage;
+ ev.xclient.message_type = prop_state;
+ ev.xclient.display = disp;
+ ev.xclient.window = ret->win;
+ ev.xclient.format = 32;
+ ev.xclient.data.l[0] = (ret->full_screen ? 1 : 0);
+ ev.xclient.data.l[1] = prop_fs;
+
+ XChangeProperty(disp, ret->win, prop_state, XA_ATOM, 32, PropModeReplace, &prop_fs, 1);
+ }
+
+ XSetWMProtocols(disp, ret->win, &wmDeleteWindow, 1);
+ winwidget_update_title(ret);
+ xch = XAllocClassHint();
+ xch->res_name = "feh";
+ xch->res_class = "feh";
+ XSetClassHint(disp, ret->win, xch);
+ XFree(xch);
+
+ /* Size hints */
+ if (ret->full_screen || opt.geom_flags) {
+ XSizeHints xsz;
+
+ xsz.flags = USPosition;
+ xsz.x = x;
+ xsz.y = y;
+ XSetWMNormalHints(disp, ret->win, &xsz);
+ XMoveWindow(disp, ret->win, x, y);
+ }
+ if (ret->full_screen && opt.hide_pointer) {
+ Cursor no_ptr;
+ XColor black, dummy;
+ Pixmap bm_no;
+ bm_no = XCreateBitmapFromData(disp, ret->win, bm_no_data, 8, 8);
+ XAllocNamedColor(disp, DefaultColormapOfScreen(DefaultScreenOfDisplay(disp)), "black", &black, &dummy);
+
+ no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0);
+ XDefineCursor(disp, ret->win, no_ptr);
+ }
+
+ /* set the icon name property */
+ XSetIconName(disp, ret->win, "feh");
+ /* set the command hint */
+ XSetCommand(disp, ret->win, cmdargv, cmdargc);
+
+ winwidget_register(ret);
+ D_RETURN_(4);
}
-void
-winwidget_update_title(winwidget ret)
+void winwidget_update_title(winwidget ret)
{
- char *name;
-
- D_ENTER(4);
- D(4, ("winwid->name = %s\n", ret->name));
- name = ret->name ? ret->name : "feh";
- XStoreName(disp, ret->win, name);
- XSetIconName(disp, ret->win, name);
- /* XFlush(disp); */
- D_RETURN_(4);
+ char *name;
+
+ D_ENTER(4);
+ D(4, ("winwid->name = %s\n", ret->name));
+ name = ret->name ? ret->name : "feh";
+ XStoreName(disp, ret->win, name);
+ XSetIconName(disp, ret->win, name);
+ /* XFlush(disp); */
+ D_RETURN_(4);
}
-void
-winwidget_setup_pixmaps(winwidget winwid)
+void winwidget_setup_pixmaps(winwidget winwid)
{
- D_ENTER(4);
-
- if (winwid->full_screen) {
- if (!(winwid->bg_pmap)) {
- if (winwid->gc == None) {
- XGCValues gcval;
-
- gcval.foreground = BlackPixel(disp, DefaultScreen(disp));
- winwid->gc = XCreateGC(disp, winwid->win, GCForeground, &gcval);
- }
- winwid->bg_pmap =
- XCreatePixmap(disp, winwid->win, scr->width, scr->height, depth);
- }
- XFillRectangle(disp, winwid->bg_pmap, winwid->gc, 0, 0, scr->width,
- scr->height);
- } else {
- if (!winwid->bg_pmap || winwid->had_resize) {
- D(4, ("recreating background pixmap (%dx%d)\n", winwid->w, winwid->h));
- if (winwid->bg_pmap)
- XFreePixmap(disp, winwid->bg_pmap);
-
- if (winwid->w == 0)
- winwid->w = 1;
- if (winwid->h == 0)
- winwid->h = 1;
- winwid->bg_pmap =
- XCreatePixmap(disp, winwid->win, winwid->w, winwid->h, depth);
- winwid->had_resize = 0;
- }
- }
- D_RETURN_(4);
+ D_ENTER(4);
+
+ if (winwid->full_screen) {
+ if (!(winwid->bg_pmap)) {
+ if (winwid->gc == None) {
+ XGCValues gcval;
+
+ gcval.foreground = BlackPixel(disp, DefaultScreen(disp));
+ winwid->gc = XCreateGC(disp, winwid->win, GCForeground, &gcval);
+ }
+ winwid->bg_pmap = XCreatePixmap(disp, winwid->win, scr->width, scr->height, depth);
+ }
+ XFillRectangle(disp, winwid->bg_pmap, winwid->gc, 0, 0, scr->width, scr->height);
+ } else {
+ if (!winwid->bg_pmap || winwid->had_resize) {
+ D(4, ("recreating background pixmap (%dx%d)\n", winwid->w, winwid->h));
+ if (winwid->bg_pmap)
+ XFreePixmap(disp, winwid->bg_pmap);
+
+ if (winwid->w == 0)
+ winwid->w = 1;
+ if (winwid->h == 0)
+ winwid->h = 1;
+ winwid->bg_pmap = XCreatePixmap(disp, winwid->win, winwid->w, winwid->h, depth);
+ winwid->had_resize = 0;
+ }
+ }
+ D_RETURN_(4);
}
-void
-winwidget_render_image(winwidget winwid,
- int resize,
- int alias)
+void winwidget_render_image(winwidget winwid, int resize, int alias)
{
- int sx, sy, sw, sh, dx, dy, dw, dh;
- int calc_w, calc_h;
-
- D_ENTER(4);
-
- if (!winwid->full_screen && resize) {
- winwidget_resize(winwid, winwid->im_w, winwid->im_h);
- winwidget_reset_image(winwid);
- }
-
- /* bounds checks for panning */
- if (winwid->im_x > winwid->w)
- winwid->im_x = winwid->w;
- if (winwid->im_y > winwid->h)
- winwid->im_y = winwid->h;
-
- winwidget_setup_pixmaps(winwid);
-
- if (!winwid->full_screen
- && ((gib_imlib_image_has_alpha(winwid->im)) || (opt.geom_flags)
- || (winwid->im_x || winwid->im_y) || (winwid->zoom != 1.0)
- || (winwid->w > winwid->im_w || winwid->h > winwid->im_h)
- || (winwid->has_rotated)))
- feh_draw_checks(winwid);
-
- if (!winwid->full_screen && opt.scale_down
- && ((winwid->w < winwid->im_w) || (winwid->h < winwid->im_h))) {
- D(2, ("scaling down image\n"));
-
- feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h,
- winwid->w, winwid->h);
- winwidget_resize(winwid, winwid->im_w * winwid->zoom,
- winwid->im_h * winwid->zoom);
- }
-
- if (resize && (winwid->full_screen || opt.geom_flags)) {
- int smaller; /* Is the image smaller than screen? */
- int max_w, max_h;
-
- if (winwid->full_screen) {
- max_w = scr->width;
- max_h = scr->height;
+ int sx, sy, sw, sh, dx, dy, dw, dh;
+ int calc_w, calc_h;
+
+ D_ENTER(4);
+
+ if (!winwid->full_screen && resize) {
+ winwidget_resize(winwid, winwid->im_w, winwid->im_h);
+ winwidget_reset_image(winwid);
+ }
+
+ /* bounds checks for panning */
+ if (winwid->im_x > winwid->w)
+ winwid->im_x = winwid->w;
+ if (winwid->im_y > winwid->h)
+ winwid->im_y = winwid->h;
+
+ winwidget_setup_pixmaps(winwid);
+
+ if (!winwid->full_screen && ((gib_imlib_image_has_alpha(winwid->im)) || (opt.geom_flags)
+ || (winwid->im_x || winwid->im_y) || (winwid->zoom != 1.0)
+ || (winwid->w > winwid->im_w || winwid->h > winwid->im_h)
+ || (winwid->has_rotated)))
+ feh_draw_checks(winwid);
+
+ if (!winwid->full_screen && opt.scale_down && ((winwid->w < winwid->im_w)
+ || (winwid->h < winwid->im_h))) {
+ D(2, ("scaling down image\n"));
+
+ feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, winwid->w, winwid->h);
+ winwidget_resize(winwid, winwid->im_w * winwid->zoom, winwid->im_h * winwid->zoom);
+ }
+
+ if (resize && (winwid->full_screen || opt.geom_flags)) {
+ int smaller; /* Is the image smaller than screen? */
+ int max_w, max_h;
+
+ if (winwid->full_screen) {
+ max_w = scr->width;
+ max_h = scr->height;
#ifdef HAVE_LIBXINERAMA
- if (opt.xinerama && xinerama_screens) {
- max_w = xinerama_screens[xinerama_screen].width;
- max_h = xinerama_screens[xinerama_screen].height;
- }
-#endif /* HAVE_LIBXINERAMA */
- } else {
- if (opt.geom_flags & WidthValue) {
- max_w = opt.geom_w;
- }
- if (opt.geom_flags & HeightValue) {
- max_h = opt.geom_h;
- }
- }
-
- D(4, ("Calculating for fullscreen/fixed geom render\n"));
- smaller = ((winwid->im_w < max_w) && (winwid->im_h < max_h));
-
- if (!smaller || opt.auto_zoom) {
- double ratio = 0.0;
-
- /* Image is larger than the screen (so wants shrinking), or it's
- smaller but wants expanding to fill it */
- ratio =
- feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h,
- max_w, max_h);
-
- /* contributed by Jens Laas <jens.laas@data.slu.se>
- * What it does:
- * zooms images by a fixed amount but never larger than the screen.
- *
- * Why:
- * This is nice if you got a collection of images where some
- * are small and can stand a small zoom. Large images are unaffected.
- *
- * When does it work, and how?
- * You have to be in fullscreen mode _and_ have auto-zoom turned on.
- * "feh -FZ --zoom 130 imagefile" will do the trick.
- * -zoom percent - the new switch.
- * 100 = orignal size,
- * 130 is 30% larger.
- */
- if (opt.default_zoom) {
- double old_zoom = winwid->zoom;
-
- winwid->zoom = 0.01 * opt.default_zoom;
- if ((winwid->im_h * winwid->zoom) > max_h)
- winwid->zoom = old_zoom;
- if ((winwid->im_w * winwid->zoom) > max_w)
- winwid->zoom = old_zoom;
-
- winwid->im_x = ((int) (max_w - (winwid->im_w * winwid->zoom))) >> 1;
- winwid->im_y = ((int) (max_h - (winwid->im_h * winwid->zoom))) >> 1;
- } else {
- if (ratio > 1.0) {
- /* height is the factor */
- winwid->im_x = 0;
- winwid->im_y = ((int) (max_h - (winwid->im_h * winwid->zoom))) >> 1;
- } else {
- /* width is the factor */
- winwid->im_x = ((int) (max_w - (winwid->im_w * winwid->zoom))) >> 1;
- winwid->im_y = 0;
- }
- }
- } else {
- /* my modification to jens hack, allow --zoom without auto-zoom mode */
- if(opt.default_zoom) {
- winwid->zoom = 0.01 * opt.default_zoom;
- } else {
- winwid->zoom = 1.0;
- }
- /* Just center the image in the window */
- winwid->im_x = (int)(max_w - (winwid->im_w * winwid->zoom)) >> 1;
- winwid->im_y = (int)(max_h - (winwid->im_h * winwid->zoom)) >> 1;
- }
- }
-
- /* Now we ensure only to render the area we're looking at */
- dx = winwid->im_x;
- dy = winwid->im_y;
- if (dx < 0)
- dx = 0;
- if (dy < 0)
- dy = 0;
-
- if (winwid->im_x < 0)
- sx = 0 - (winwid->im_x / winwid->zoom);
- else
- sx = 0;
-
- if (winwid->im_y < 0)
- sy = 0 - (winwid->im_y / winwid->zoom);
- else
- sy = 0;
-
- calc_w = winwid->im_w * winwid->zoom;
- calc_h = winwid->im_h * winwid->zoom;
- dw = (winwid->w - winwid->im_x);
- dh = (winwid->h - winwid->im_y);
- if (calc_w < dw)
- dw = calc_w;
- if (calc_h < dh)
- dh = calc_h;
- if (dw > winwid->w)
- dw = winwid->w;
- if (dh > winwid->h)
- dh = winwid->h;
-
- sw = dw / winwid->zoom;
- sh = dh / winwid->zoom;
-
- D(5,
- ("sx: %d sy: %d sw: %d sh: %d dx: %d dy: %d dw: %d dh: %d zoom: %f\n", sx,
- sy, sw, sh, dx, dy, dw, dh, winwid->zoom));
-
- D(5, ("winwidget_render(): winwid->im_angle = %f\n", winwid->im_angle));
- if (winwid->has_rotated)
- gib_imlib_render_image_part_on_drawable_at_size_with_rotation(winwid->
- bg_pmap,
- winwid->im,
- sx, sy, sw,
- sh, dx, dy,
- dw, dh,
- winwid->
- im_angle, 1,
- 1, alias);
- else
- gib_imlib_render_image_part_on_drawable_at_size(winwid->bg_pmap,
- winwid->im, sx, sy, sw,
- sh, dx, dy, dw, dh, 1,
- gib_imlib_image_has_alpha
- (winwid->im), alias);
- if (opt.caption_path) {
- /* cache bg pixmap. during caption entry, multiple redraws are done
- * because the caption overlay changes - the image doesn't though, so re-
- * rendering that is a waste of time */
- if (winwid->caption_entry) {
- GC gc;
- if (winwid->bg_pmap_cache)
- XFreePixmap(disp, winwid->bg_pmap_cache);
- winwid->bg_pmap_cache = XCreatePixmap(disp,
- winwid->win,
- winwid->w,
- winwid->h,
- depth);
- gc = XCreateGC(disp, winwid->win, 0, NULL);
- XCopyArea(disp, winwid->bg_pmap, winwid->bg_pmap_cache, gc, 0, 0, winwid->w, winwid->h, 0, 0);
- XFreeGC(disp, gc);
- }
- feh_draw_caption(winwid);
- }
-
- if (opt.draw_filename)
- feh_draw_filename(winwid);
- if (opt.draw_actions)
- feh_draw_actions(winwid);
- if ((opt.mode == MODE_ZOOM) && !alias)
- feh_draw_zoom(winwid);
- XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
- XClearWindow(disp, winwid->win);
- D_RETURN_(4);
+ if (opt.xinerama && xinerama_screens) {
+ max_w = xinerama_screens[xinerama_screen].width;
+ max_h = xinerama_screens[xinerama_screen].height;
+ }
+#endif /* HAVE_LIBXINERAMA */
+ } else {
+ if (opt.geom_flags & WidthValue) {
+ max_w = opt.geom_w;
+ }
+ if (opt.geom_flags & HeightValue) {
+ max_h = opt.geom_h;
+ }
+ }
+
+ D(4, ("Calculating for fullscreen/fixed geom render\n"));
+ smaller = ((winwid->im_w < max_w)
+ && (winwid->im_h < max_h));
+
+ if (!smaller || opt.auto_zoom) {
+ double ratio = 0.0;
+
+ /* Image is larger than the screen (so wants shrinking), or it's
+ smaller but wants expanding to fill it */
+ ratio = feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, max_w, max_h);
+
+ /* contributed by Jens Laas <jens.laas@data.slu.se>
+ * What it does:
+ * zooms images by a fixed amount but never larger than the screen.
+ *
+ * Why:
+ * This is nice if you got a collection of images where some
+ * are small and can stand a small zoom. Large images are unaffected.
+ *
+ * When does it work, and how?
+ * You have to be in fullscreen mode _and_ have auto-zoom turned on.
+ * "feh -FZ --zoom 130 imagefile" will do the trick.
+ * -zoom percent - the new switch.
+ * 100 = orignal size,
+ * 130 is 30% larger.
+ */
+ if (opt.default_zoom) {
+ double old_zoom = winwid->zoom;
+
+ winwid->zoom = 0.01 * opt.default_zoom;
+ if ((winwid->im_h * winwid->zoom) > max_h)
+ winwid->zoom = old_zoom;
+ if ((winwid->im_w * winwid->zoom) > max_w)
+ winwid->zoom = old_zoom;
+
+ winwid->im_x = ((int)
+ (max_w - (winwid->im_w * winwid->zoom))) >> 1;
+ winwid->im_y = ((int)
+ (max_h - (winwid->im_h * winwid->zoom))) >> 1;
+ } else {
+ if (ratio > 1.0) {
+ /* height is the factor */
+ winwid->im_x = 0;
+ winwid->im_y = ((int)
+ (max_h - (winwid->im_h * winwid->zoom))) >> 1;
+ } else {
+ /* width is the factor */
+ winwid->im_x = ((int)
+ (max_w - (winwid->im_w * winwid->zoom))) >> 1;
+ winwid->im_y = 0;
+ }
+ }
+ } else {
+ /* my modification to jens hack, allow --zoom without auto-zoom mode */
+ if (opt.default_zoom) {
+ winwid->zoom = 0.01 * opt.default_zoom;
+ } else {
+ winwid->zoom = 1.0;
+ }
+ /* Just center the image in the window */
+ winwid->im_x = (int) (max_w - (winwid->im_w * winwid->zoom)) >> 1;
+ winwid->im_y = (int) (max_h - (winwid->im_h * winwid->zoom)) >> 1;
+ }
+ }
+
+ /* Now we ensure only to render the area we're looking at */
+ dx = winwid->im_x;
+ dy = winwid->im_y;
+ if (dx < 0)
+ dx = 0;
+ if (dy < 0)
+ dy = 0;
+
+ if (winwid->im_x < 0)
+ sx = 0 - (winwid->im_x / winwid->zoom);
+ else
+ sx = 0;
+
+ if (winwid->im_y < 0)
+ sy = 0 - (winwid->im_y / winwid->zoom);
+ else
+ sy = 0;
+
+ calc_w = winwid->im_w * winwid->zoom;
+ calc_h = winwid->im_h * winwid->zoom;
+ dw = (winwid->w - winwid->im_x);
+ dh = (winwid->h - winwid->im_y);
+ if (calc_w < dw)
+ dw = calc_w;
+ if (calc_h < dh)
+ dh = calc_h;
+ if (dw > winwid->w)
+ dw = winwid->w;
+ if (dh > winwid->h)
+ dh = winwid->h;
+
+ sw = dw / winwid->zoom;
+ sh = dh / winwid->zoom;
+
+ D(5,
+ ("sx: %d sy: %d sw: %d sh: %d dx: %d dy: %d dw: %d dh: %d zoom: %f\n",
+ sx, sy, sw, sh, dx, dy, dw, dh, winwid->zoom));
+
+ D(5, ("winwidget_render(): winwid->im_angle = %f\n", winwid->im_angle));
+ if (winwid->has_rotated)
+ gib_imlib_render_image_part_on_drawable_at_size_with_rotation
+ (winwid->bg_pmap, winwid->im, sx, sy, sw, sh, dx, dy, dw, dh, winwid->im_angle, 1, 1, alias);
+ else
+ gib_imlib_render_image_part_on_drawable_at_size(winwid->bg_pmap,
+ winwid->im,
+ sx, sy, sw,
+ sh, dx, dy,
+ dw, dh, 1,
+ gib_imlib_image_has_alpha(winwid->im), alias);
+ if (opt.caption_path) {
+ /* cache bg pixmap. during caption entry, multiple redraws are done
+ * because the caption overlay changes - the image doesn't though, so re-
+ * rendering that is a waste of time */
+ if (winwid->caption_entry) {
+ GC gc;
+ if (winwid->bg_pmap_cache)
+ XFreePixmap(disp, winwid->bg_pmap_cache);
+ winwid->bg_pmap_cache = XCreatePixmap(disp, winwid->win, winwid->w, winwid->h, depth);
+ gc = XCreateGC(disp, winwid->win, 0, NULL);
+ XCopyArea(disp, winwid->bg_pmap, winwid->bg_pmap_cache, gc, 0, 0, winwid->w, winwid->h, 0, 0);
+ XFreeGC(disp, gc);
+ }
+ feh_draw_caption(winwid);
+ }
+
+ if (opt.draw_filename)
+ feh_draw_filename(winwid);
+ if (opt.draw_actions)
+ feh_draw_actions(winwid);
+ if ((opt.mode == MODE_ZOOM) && !alias)
+ feh_draw_zoom(winwid);
+ XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
+ XClearWindow(disp, winwid->win);
+ D_RETURN_(4);
}
-void winwidget_render_image_cached(winwidget winwid) {
- static GC gc = None;
-
- if (gc == None) {
- gc = XCreateGC(disp, winwid->win, 0, NULL);
- }
- XCopyArea(disp, winwid->bg_pmap_cache, winwid->bg_pmap, gc, 0, 0, winwid->w, winwid->h, 0, 0);
-
- if (opt.caption_path)
- feh_draw_caption(winwid);
- if (opt.draw_filename)
- feh_draw_filename(winwid);
- if (opt.draw_actions)
- feh_draw_actions(winwid);
- XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
- XClearWindow(disp, winwid->win);
+void winwidget_render_image_cached(winwidget winwid)
+{
+ static GC gc = None;
+
+ if (gc == None) {
+ gc = XCreateGC(disp, winwid->win, 0, NULL);
+ }
+ XCopyArea(disp, winwid->bg_pmap_cache, winwid->bg_pmap, gc, 0, 0, winwid->w, winwid->h, 0, 0);
+
+ if (opt.caption_path)
+ feh_draw_caption(winwid);
+ if (opt.draw_filename)
+ feh_draw_filename(winwid);
+ if (opt.draw_actions)
+ feh_draw_actions(winwid);
+ XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
+ XClearWindow(disp, winwid->win);
}
-double
-feh_calc_needed_zoom(double *zoom,
- int orig_w,
- int orig_h,
- int dest_w,
- int dest_h)
+double feh_calc_needed_zoom(double *zoom, int orig_w, int orig_h, int dest_w, int dest_h)
{
- double ratio = 0.0;
+ double ratio = 0.0;
- D_ENTER(4);
+ D_ENTER(4);
- ratio = ((double) orig_w / orig_h) / ((double) dest_w / dest_h);
+ ratio = ((double) orig_w / orig_h) / ((double) dest_w / dest_h);
- if (ratio > 1.0)
- *zoom = ((double) dest_w / orig_w);
- else
- *zoom = ((double) dest_h / orig_h);
+ if (ratio > 1.0)
+ *zoom = ((double) dest_w / orig_w);
+ else
+ *zoom = ((double) dest_h / orig_h);
- D_RETURN(4, ratio);
+ D_RETURN(4, ratio);
}
-Pixmap
-feh_create_checks(void)
+Pixmap feh_create_checks(void)
{
- static Pixmap checks_pmap = None;
- Imlib_Image checks = NULL;
-
- D_ENTER(4);
- if (checks_pmap == None) {
- int onoff, x, y;
-
- checks = imlib_create_image(16, 16);
-
- if (!checks)
- eprintf
- ("Unable to create a teeny weeny imlib image. I detect problems");
-
- if (strncmp(opt.image_bg, "white", 5) == 0)
- gib_imlib_image_fill_rectangle(checks, 0, 0, 16, 16, 255, 255, 255, 255);
- else if (strncmp(opt.image_bg, "black", 5) == 0)
- gib_imlib_image_fill_rectangle(checks, 0, 0, 16, 16, 0, 0, 0, 255);
- else {
- for (y = 0; y < 16; y += 8) {
- onoff = (y / 8) & 0x1;
- for (x = 0; x < 16; x += 8) {
- if (onoff)
- gib_imlib_image_fill_rectangle(checks, x, y, 8, 8, 144, 144, 144,
- 255);
- else
- gib_imlib_image_fill_rectangle(checks, x, y, 8, 8, 100, 100, 100,
- 255);
- onoff++;
- if (onoff == 2)
- onoff = 0;
- }
- }
- }
-
- checks_pmap = XCreatePixmap(disp, root, 16, 16, depth);
- gib_imlib_render_image_on_drawable(checks_pmap, checks, 0, 0, 1, 0, 0);
- gib_imlib_free_image_and_decache(checks);
- }
- D_RETURN(4, checks_pmap);
+ static Pixmap checks_pmap = None;
+ Imlib_Image checks = NULL;
+
+ D_ENTER(4);
+ if (checks_pmap == None) {
+ int onoff, x, y;
+
+ checks = imlib_create_image(16, 16);
+
+ if (!checks)
+ eprintf("Unable to create a teeny weeny imlib image. I detect problems");
+
+ if (strncmp(opt.image_bg, "white", 5) == 0)
+ gib_imlib_image_fill_rectangle(checks, 0, 0, 16, 16, 255, 255, 255, 255);
+ else if (strncmp(opt.image_bg, "black", 5) == 0)
+ gib_imlib_image_fill_rectangle(checks, 0, 0, 16, 16, 0, 0, 0, 255);
+ else {
+ for (y = 0; y < 16; y += 8) {
+ onoff = (y / 8) & 0x1;
+ for (x = 0; x < 16; x += 8) {
+ if (onoff)
+ gib_imlib_image_fill_rectangle(checks, x, y, 8, 8, 144, 144, 144, 255);
+ else
+ gib_imlib_image_fill_rectangle(checks, x, y, 8, 8, 100, 100, 100, 255);
+ onoff++;
+ if (onoff == 2)
+ onoff = 0;
+ }
+ }
+ }
+
+ checks_pmap = XCreatePixmap(disp, root, 16, 16, depth);
+ gib_imlib_render_image_on_drawable(checks_pmap, checks, 0, 0, 1, 0, 0);
+ gib_imlib_free_image_and_decache(checks);
+ }
+ D_RETURN(4, checks_pmap);
}
-void
-winwidget_clear_background(winwidget w)
+void winwidget_clear_background(winwidget w)
{
- D_ENTER(4);
- XSetWindowBackgroundPixmap(disp, w->win, feh_create_checks());
- /* XClearWindow(disp, w->win); */
- D_RETURN_(4);
+ D_ENTER(4);
+ XSetWindowBackgroundPixmap(disp, w->win, feh_create_checks());
+ /* XClearWindow(disp, w->win); */
+ D_RETURN_(4);
}
-void
-feh_draw_checks(winwidget win)
+void feh_draw_checks(winwidget win)
{
- static GC gc = None;
- XGCValues gcval;
-
- D_ENTER(4);
- if (gc == None) {
- gcval.tile = feh_create_checks();
- gcval.fill_style = FillTiled;
- gc = XCreateGC(disp, win->win, GCTile | GCFillStyle, &gcval);
- }
- XFillRectangle(disp, win->bg_pmap, gc, 0, 0, win->w, win->h);
- D_RETURN_(4);
+ static GC gc = None;
+ XGCValues gcval;
+
+ D_ENTER(4);
+ if (gc == None) {
+ gcval.tile = feh_create_checks();
+ gcval.fill_style = FillTiled;
+ gc = XCreateGC(disp, win->win, GCTile | GCFillStyle, &gcval);
+ }
+ XFillRectangle(disp, win->bg_pmap, gc, 0, 0, win->w, win->h);
+ D_RETURN_(4);
}
-void
-winwidget_destroy_xwin(winwidget winwid)
+void winwidget_destroy_xwin(winwidget winwid)
{
- D_ENTER(4);
- if (winwid->win) {
- winwidget_unregister(winwid);
- XDestroyWindow(disp, winwid->win);
- }
- if (winwid->bg_pmap) {
- XFreePixmap(disp, winwid->bg_pmap);
- winwid->bg_pmap = None;
- }
- D_RETURN_(4);
+ D_ENTER(4);
+ if (winwid->win) {
+ winwidget_unregister(winwid);
+ XDestroyWindow(disp, winwid->win);
+ }
+ if (winwid->bg_pmap) {
+ XFreePixmap(disp, winwid->bg_pmap);
+ winwid->bg_pmap = None;
+ }
+ D_RETURN_(4);
}
-void
-winwidget_destroy(winwidget winwid)
+void winwidget_destroy(winwidget winwid)
{
- D_ENTER(4);
- winwidget_destroy_xwin(winwid);
- if (winwid->name)
- free(winwid->name);
- if ((winwid->type == WIN_TYPE_ABOUT) && winwid->file) {
- feh_file_free(FEH_FILE(winwid->file->data));
- free(winwid->file);
- }
- if (winwid->gc)
- XFreeGC(disp, winwid->gc);
- if (winwid->im)
- gib_imlib_free_image_and_decache(winwid->im);
- free(winwid);
- D_RETURN_(4);
+ D_ENTER(4);
+ winwidget_destroy_xwin(winwid);
+ if (winwid->name)
+ free(winwid->name);
+ if ((winwid->type == WIN_TYPE_ABOUT) && winwid->file) {
+ feh_file_free(FEH_FILE(winwid->file->data));
+ free(winwid->file);
+ }
+ if (winwid->gc)
+ XFreeGC(disp, winwid->gc);
+ if (winwid->im)
+ gib_imlib_free_image_and_decache(winwid->im);
+ free(winwid);
+ D_RETURN_(4);
}
-void
-winwidget_destroy_all(void)
+void winwidget_destroy_all(void)
{
- int i;
+ int i;
- D_ENTER(4);
- /* Have to DESCEND the list here, 'cos of the way _unregister works */
- for (i = window_num - 1; i >= 0; i--)
- winwidget_destroy(windows[i]);
- D_RETURN_(4);
+ D_ENTER(4);
+ /* Have to DESCEND the list here, 'cos of the way _unregister works */
+ for (i = window_num - 1; i >= 0; i--)
+ winwidget_destroy(windows[i]);
+ D_RETURN_(4);
}
-void
-winwidget_rerender_all(int resize,
- int alias)
+void winwidget_rerender_all(int resize, int alias)
{
- int i;
+ int i;
- D_ENTER(4);
- /* Have to DESCEND the list here, 'cos of the way _unregister works */
- for (i = window_num - 1; i >= 0; i--)
- winwidget_render_image(windows[i], resize, alias);
- D_RETURN_(4);
+ D_ENTER(4);
+ /* Have to DESCEND the list here, 'cos of the way _unregister works */
+ for (i = window_num - 1; i >= 0; i--)
+ winwidget_render_image(windows[i], resize, alias);
+ D_RETURN_(4);
}
-winwidget
-winwidget_get_first_window_of_type(unsigned int type)
+winwidget winwidget_get_first_window_of_type(unsigned int type)
{
- int i;
+ int i;
- D_ENTER(4);
- for (i = 0; i < window_num; i++)
- if (windows[i]->type == type)
- D_RETURN(4, windows[i]);
- D_RETURN(4, NULL);
+ D_ENTER(4);
+ for (i = 0; i < window_num; i++)
+ if (windows[i]->type == type)
+ D_RETURN(4, windows[i]);
+ D_RETURN(4, NULL);
}
-int
-winwidget_loadimage(winwidget winwid,
- feh_file * file)
+int winwidget_loadimage(winwidget winwid, feh_file * file)
{
- D_ENTER(4);
- D(4, ("filename %s\n", file->filename));
- D_RETURN(4, feh_load_image(&(winwid->im), file));
+ D_ENTER(4);
+ D(4, ("filename %s\n", file->filename));
+ D_RETURN(4, feh_load_image(&(winwid->im), file));
}
-void
-winwidget_show(winwidget winwid)
+void winwidget_show(winwidget winwid)
{
- XEvent ev;
-
- D_ENTER(4);
-
- /* feh_debug_print_winwid(winwid); */
- if (!winwid->visible) {
- XMapWindow(disp, winwid->win);
- if (opt.full_screen)
- XMoveWindow(disp, winwid->win, 0, 0);
- /* wait for the window to map */
- D(4, ("Waiting for window to map\n"));
- XMaskEvent(disp, StructureNotifyMask, &ev);
- D(4, ("Window mapped\n"));
- winwid->visible = 1;
- }
- D_RETURN_(4);
+ XEvent ev;
+
+ D_ENTER(4);
+
+ /* feh_debug_print_winwid(winwid); */
+ if (!winwid->visible) {
+ XMapWindow(disp, winwid->win);
+ if (opt.full_screen)
+ XMoveWindow(disp, winwid->win, 0, 0);
+ /* wait for the window to map */
+ D(4, ("Waiting for window to map\n"));
+ XMaskEvent(disp, StructureNotifyMask, &ev);
+ D(4, ("Window mapped\n"));
+ winwid->visible = 1;
+ }
+ D_RETURN_(4);
}
-int
-winwidget_count(void)
+int winwidget_count(void)
{
- D_ENTER(4);
- D_RETURN(4, window_num);
+ D_ENTER(4);
+ D_RETURN(4, window_num);
}
-void
-winwidget_move(winwidget winwid,
- int x,
- int y)
+void winwidget_move(winwidget winwid, int x, int y)
{
- D_ENTER(4);
- if (winwid && ((winwid->x != x) || (winwid->y != y))) {
- winwid->x = x;
- winwid->y = y;
- winwid->x = (x > scr->width) ? scr->width : x;
- winwid->y = (y > scr->height) ? scr->height : y;
- XMoveWindow(disp, winwid->win, winwid->x, winwid->y);
- XFlush(disp);
- } else {
- D(4, ("No move actually needed\n"));
- }
- D_RETURN_(4);
+ D_ENTER(4);
+ if (winwid && ((winwid->x != x) || (winwid->y != y))) {
+ winwid->x = x;
+ winwid->y = y;
+ winwid->x = (x > scr->width) ? scr->width : x;
+ winwid->y = (y > scr->height) ? scr->height : y;
+ XMoveWindow(disp, winwid->win, winwid->x, winwid->y);
+ XFlush(disp);
+ } else {
+ D(4, ("No move actually needed\n"));
+ }
+ D_RETURN_(4);
}
-void
-winwidget_resize(winwidget winwid,
- int w,
- int h)
+void winwidget_resize(winwidget winwid, int w, int h)
{
- Window ignored_window;
- XWindowAttributes attributes;
- int tc_x, tc_y;
-
- D_ENTER(4);
- if (opt.geom_flags) {
- winwid->had_resize = 1;
- return;
- }
- if (winwid && ((winwid->w != w) || (winwid->h != h))) {
- D(4, ("Really doing a resize\n"));
- /* winwidget_clear_background(winwid); */
- if (opt.screen_clip) {
- winwid->w = (w > scr->width) ? scr->width : w;
- winwid->h = (h > scr->height) ? scr->height : h;
- }
- /* XResizeWindow(disp, winwid->win, winwid->w, winwid->h); */
- XGetWindowAttributes(disp, winwid->win, &attributes);
- XTranslateCoordinates(disp, winwid->win, attributes.root,
- -attributes.border_width - attributes.x,
- -attributes.border_width - attributes.y,
- &tc_x, &tc_y, &ignored_window);
- winwid->x = tc_x;
- winwid->y = tc_y;
- XMoveResizeWindow(disp, winwid->win, tc_x, tc_y, winwid->w, winwid->h);
-
- winwid->had_resize = 1;
- XFlush(disp);
+ Window ignored_window;
+ XWindowAttributes attributes;
+ int tc_x, tc_y;
+
+ D_ENTER(4);
+ if (opt.geom_flags) {
+ winwid->had_resize = 1;
+ return;
+ }
+ if (winwid && ((winwid->w != w) || (winwid->h != h))) {
+ D(4, ("Really doing a resize\n"));
+ /* winwidget_clear_background(winwid); */
+ if (opt.screen_clip) {
+ winwid->w = (w > scr->width) ? scr->width : w;
+ winwid->h = (h > scr->height) ? scr->height : h;
+ }
+ /* XResizeWindow(disp, winwid->win, winwid->w, winwid->h); */
+ XGetWindowAttributes(disp, winwid->win, &attributes);
+ XTranslateCoordinates(disp, winwid->win, attributes.root,
+ -attributes.border_width -
+ attributes.x,
+ -attributes.border_width - attributes.y, &tc_x, &tc_y, &ignored_window);
+ winwid->x = tc_x;
+ winwid->y = tc_y;
+ XMoveResizeWindow(disp, winwid->win, tc_x, tc_y, winwid->w, winwid->h);
+
+ winwid->had_resize = 1;
+ XFlush(disp);
#ifdef HAVE_LIBXINERAMA
- if (opt.xinerama && xinerama_screens) {
- int i;
-
- for (i = 0; i < num_xinerama_screens; i++) {
- xinerama_screen = 0;
- if (XY_IN_RECT(winwid->x, winwid->y,
- xinerama_screens[i].x_org, xinerama_screens[i].y_org,
- xinerama_screens[i].width, xinerama_screens[i].height)) {
- xinerama_screen = i;
- break;
- }
-
- }
- }
-#endif /* HAVE_LIBXINERAMA */
-
- } else {
- D(4, ("No resize actually needed\n"));
- }
-
- D_RETURN_(4);
+ if (opt.xinerama && xinerama_screens) {
+ int i;
+
+ for (i = 0; i < num_xinerama_screens; i++) {
+ xinerama_screen = 0;
+ if (XY_IN_RECT(winwid->x, winwid->y,
+ xinerama_screens[i].x_org,
+ xinerama_screens[i].y_org,
+ xinerama_screens[i].width, xinerama_screens[i].height)) {
+ xinerama_screen = i;
+ break;
+ }
+
+ }
+ }
+#endif /* HAVE_LIBXINERAMA */
+
+ } else {
+ D(4, ("No resize actually needed\n"));
+ }
+
+ D_RETURN_(4);
}
-void
-winwidget_hide(winwidget winwid)
+void winwidget_hide(winwidget winwid)
{
- D_ENTER(4);
- XUnmapWindow(disp, winwid->win);
- winwid->visible = 0;
- D_RETURN_(4);
+ D_ENTER(4);
+ XUnmapWindow(disp, winwid->win);
+ winwid->visible = 0;
+ D_RETURN_(4);
}
-static void
-winwidget_register(winwidget win)
+static void winwidget_register(winwidget win)
{
- D_ENTER(4);
- D(5, ("window %p\n", win));
- window_num++;
- if (windows)
- windows = erealloc(windows, window_num * sizeof(winwidget));
- else
- windows = emalloc(window_num * sizeof(winwidget));
- windows[window_num - 1] = win;
-
- XSaveContext(disp, win->win, xid_context, (XPointer) win);
- D_RETURN_(4);
+ D_ENTER(4);
+ D(5, ("window %p\n", win));
+ window_num++;
+ if (windows)
+ windows = erealloc(windows, window_num * sizeof(winwidget));
+ else
+ windows = emalloc(window_num * sizeof(winwidget));
+ windows[window_num - 1] = win;
+
+ XSaveContext(disp, win->win, xid_context, (XPointer) win);
+ D_RETURN_(4);
}
-static void
-winwidget_unregister(winwidget win)
+static void winwidget_unregister(winwidget win)
{
- int i, j;
-
- D_ENTER(4);
- for (i = 0; i < window_num; i++) {
- if (windows[i] == win) {
- for (j = i; j < window_num - 1; j++)
- windows[j] = windows[j + 1];
- window_num--;
- if (window_num > 0)
- windows = erealloc(windows, window_num * sizeof(winwidget));
- else {
- free(windows);
- windows = NULL;
- }
- }
- }
- XDeleteContext(disp, win->win, xid_context);
- D_RETURN_(4);
+ int i, j;
+
+ D_ENTER(4);
+ for (i = 0; i < window_num; i++) {
+ if (windows[i] == win) {
+ for (j = i; j < window_num - 1; j++)
+ windows[j] = windows[j + 1];
+ window_num--;
+ if (window_num > 0)
+ windows = erealloc(windows, window_num * sizeof(winwidget));
+ else {
+ free(windows);
+ windows = NULL;
+ }
+ }
+ }
+ XDeleteContext(disp, win->win, xid_context);
+ D_RETURN_(4);
}
-winwidget
-winwidget_get_from_window(Window win)
+winwidget winwidget_get_from_window(Window win)
{
- winwidget ret = NULL;
+ winwidget ret = NULL;
- D_ENTER(4);
- if (XFindContext(disp, win, xid_context, (XPointer *) & ret) != XCNOENT)
- D_RETURN(4, ret);
- D_RETURN(4, NULL);
+ D_ENTER(4);
+ if (XFindContext(disp, win, xid_context, (XPointer *) & ret) != XCNOENT)
+ D_RETURN(4, ret);
+ D_RETURN(4, NULL);
}
-void
-winwidget_rename(winwidget winwid,
- char *newname)
+void winwidget_rename(winwidget winwid, char *newname)
{
- D_ENTER(4);
- if (winwid->name)
- free(winwid->name);
- winwid->name = estrdup(newname);
- winwidget_update_title(winwid);
- D_RETURN_(4);
+ D_ENTER(4);
+ if (winwid->name)
+ free(winwid->name);
+ winwid->name = estrdup(newname);
+ winwidget_update_title(winwid);
+ D_RETURN_(4);
}
-void
-winwidget_free_image(winwidget w)
+void winwidget_free_image(winwidget w)
{
- D_ENTER(4);
- if (w->im)
- gib_imlib_free_image_and_decache(w->im);
- w->im = NULL;
- w->im_w = 0;
- w->im_h = 0;
- D_RETURN_(4);
+ D_ENTER(4);
+ if (w->im)
+ gib_imlib_free_image_and_decache(w->im);
+ w->im = NULL;
+ w->im_w = 0;
+ w->im_h = 0;
+ D_RETURN_(4);
}
-void
-feh_debug_print_winwid(winwidget w)
+void feh_debug_print_winwid(winwidget w)
{
- printf("winwid_debug:\n" "winwid = %p\n" "win = %ld\n" "w = %d\n" "h = %d\n"
- "im_w = %d\n" "im_h = %d\n" "im_angle = %f\n" "type = %d\n"
- "had_resize = %d\n" "im = %p\n" "GC = %p\n" "pixmap = %ld\n"
- "name = %s\n" "file = %p\n" "mode = %d\n" "im_x = %d\n" "im_y = %d\n"
- "zoom = %f\n" "click_offset_x = %d\n" "click_offset_y = %d\n"
- "im_click_offset_x = %d\n" "im_click_offset_y = %d\n"
- "has_rotated = %d\n", w, w->win, w->w, w->h, w->im_w, w->im_h,
- w->im_angle, w->type, w->had_resize, w->im, w->gc, w->bg_pmap,
- w->name, w->file, w->mode, w->im_x, w->im_y, w->zoom,
- w->click_offset_x, w->click_offset_y, w->im_click_offset_x,
- w->im_click_offset_y, w->has_rotated);
+ printf("winwid_debug:\n" "winwid = %p\n" "win = %ld\n" "w = %d\n"
+ "h = %d\n" "im_w = %d\n" "im_h = %d\n" "im_angle = %f\n"
+ "type = %d\n" "had_resize = %d\n" "im = %p\n" "GC = %p\n"
+ "pixmap = %ld\n" "name = %s\n" "file = %p\n" "mode = %d\n"
+ "im_x = %d\n" "im_y = %d\n" "zoom = %f\n"
+ "click_offset_x = %d\n" "click_offset_y = %d\n"
+ "im_click_offset_x = %d\n" "im_click_offset_y = %d\n"
+ "has_rotated = %d\n", w, w->win, w->w, w->h, w->im_w,
+ w->im_h, w->im_angle, w->type, w->had_resize, w->im, w->gc,
+ w->bg_pmap, w->name, w->file, w->mode, w->im_x, w->im_y,
+ w->zoom, w->click_offset_x, w->click_offset_y,
+ w->im_click_offset_x, w->im_click_offset_y, w->has_rotated);
}
-void
-winwidget_reset_image(winwidget winwid)
+void winwidget_reset_image(winwidget winwid)
{
- D_ENTER(4);
- winwid->zoom = 1.0;
- winwid->im_x = 0;
- winwid->im_y = 0;
- winwid->im_angle = 0.0;
- winwid->has_rotated = 0;
- D_RETURN_(4);
+ D_ENTER(4);
+ winwid->zoom = 1.0;
+ winwid->im_x = 0;
+ winwid->im_y = 0;
+ winwid->im_angle = 0.0;
+ winwid->has_rotated = 0;
+ D_RETURN_(4);
}
-void
-winwidget_sanitise_offsets(winwidget winwid)
+void winwidget_sanitise_offsets(winwidget winwid)
{
- int far_left, far_top;
- int min_x, max_x, max_y, min_y;
-
- D_ENTER(4);
-
- far_left = winwid->w - (winwid->im_w * winwid->zoom);
- far_top = winwid->h - (winwid->im_h * winwid->zoom);
-
- if ((winwid->im_w * winwid->zoom) > winwid->w) {
- min_x = far_left;
- max_x = 0;
- } else {
- min_x = 0;
- max_x = far_left;
- }
- if ((winwid->im_h * winwid->zoom) > winwid->h) {
- min_y = far_top;
- max_y = 0;
- } else {
- min_y = 0;
- max_y = far_top;
- }
- if (winwid->im_x > max_x)
- winwid->im_x = max_x;
- if (winwid->im_x < min_x)
- winwid->im_x = min_x;
- if (winwid->im_y > max_y)
- winwid->im_y = max_y;
- if (winwid->im_y < min_y)
- winwid->im_y = min_y;
-
- D_RETURN_(4);
+ int far_left, far_top;
+ int min_x, max_x, max_y, min_y;
+
+ D_ENTER(4);
+
+ far_left = winwid->w - (winwid->im_w * winwid->zoom);
+ far_top = winwid->h - (winwid->im_h * winwid->zoom);
+
+ if ((winwid->im_w * winwid->zoom) > winwid->w) {
+ min_x = far_left;
+ max_x = 0;
+ } else {
+ min_x = 0;
+ max_x = far_left;
+ }
+ if ((winwid->im_h * winwid->zoom) > winwid->h) {
+ min_y = far_top;
+ max_y = 0;
+ } else {
+ min_y = 0;
+ max_y = far_top;
+ }
+ if (winwid->im_x > max_x)
+ winwid->im_x = max_x;
+ if (winwid->im_x < min_x)
+ winwid->im_x = min_x;
+ if (winwid->im_y > max_y)
+ winwid->im_y = max_y;
+ if (winwid->im_y < min_y)
+ winwid->im_y = min_y;
+
+ D_RETURN_(4);
}
-
-void
-winwidget_size_to_image(winwidget winwid)
+void winwidget_size_to_image(winwidget winwid)
{
- D_ENTER(4);
- winwidget_resize(winwid, winwid->im_w * winwid->zoom,
- winwid->im_h * winwid->zoom);
- winwid->im_x = winwid->im_y = 0;
- winwidget_render_image(winwid, 0, 1);
- D_RETURN_(4);
+ D_ENTER(4);
+ winwidget_resize(winwid, winwid->im_w * winwid->zoom, winwid->im_h * winwid->zoom);
+ winwid->im_x = winwid->im_y = 0;
+ winwidget_render_image(winwid, 0, 1);
+ D_RETURN_(4);
}
-int winwidget_get_width(winwidget winwid) {
- int rect[4];
- D_ENTER(4);
- winwidget_get_geometry(winwid, rect);
- D_RETURN(4, rect[2]);
+int winwidget_get_width(winwidget winwid)
+{
+ int rect[4];
+ D_ENTER(4);
+ winwidget_get_geometry(winwid, rect);
+ D_RETURN(4, rect[2]);
}
-int winwidget_get_height(winwidget winwid) {
- int rect[4];
- D_ENTER(4);
- winwidget_get_geometry(winwid, rect);
- D_RETURN(4, rect[3]);
+int winwidget_get_height(winwidget winwid)
+{
+ int rect[4];
+ D_ENTER(4);
+ winwidget_get_geometry(winwid, rect);
+ D_RETURN(4, rect[3]);
}
-void winwidget_get_geometry(winwidget winwid, int *rect) {
- int bw, bp;
- Window child;
- D_ENTER(4);
- if (!rect)
- return;
-
- XGetGeometry(disp, winwid->win, &root,
- &(rect[0]), &(rect[1]), &(rect[2]), &(rect[3]), &bw, &bp);
-
- XTranslateCoordinates(disp, winwid->win, root,
- 0, 0, &(rect[0]), &(rect[1]), &child);
-
- /* update the window geometry (in case it's inaccurate) */
- winwid->x = rect[0];
- winwid->y = rect[1];
- winwid->w = rect[2];
- winwid->h = rect[3];
- D_RETURN_(4);
+void winwidget_get_geometry(winwidget winwid, int *rect)
+{
+ int bw, bp;
+ Window child;
+ D_ENTER(4);
+ if (!rect)
+ return;
+
+ XGetGeometry(disp, winwid->win, &root, &(rect[0]), &(rect[1]), &(rect[2]), &(rect[3]), &bw, &bp);
+
+ XTranslateCoordinates(disp, winwid->win, root, 0, 0, &(rect[0]), &(rect[1]), &child);
+
+ /* update the window geometry (in case it's inaccurate) */
+ winwid->x = rect[0];
+ winwid->y = rect[1];
+ winwid->w = rect[2];
+ winwid->h = rect[3];
+ D_RETURN_(4);
}
-void winwidget_show_menu(winwidget winwid) {
- int x, y, b;
- unsigned int c;
- Window r;
-
- XQueryPointer(disp, winwid->win, &r, &r, &x, &y, &b, &b, &c);
- if (winwid->type == WIN_TYPE_ABOUT)
- {
- if (!menu_about_win)
- feh_menu_init_about_win();
- feh_menu_show_at_xy(menu_about_win, winwid, x, y);
- }
- else if (winwid->type == WIN_TYPE_SINGLE)
- {
- if (!menu_single_win)
- feh_menu_init_single_win();
- feh_menu_show_at_xy(menu_single_win, winwid, x, y);
- }
- else if (winwid->type == WIN_TYPE_THUMBNAIL)
- {
- if (!menu_thumbnail_win)
- feh_menu_init_thumbnail_win();
- feh_menu_show_at_xy(menu_thumbnail_win, winwid, x, y);
- }
- else if (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER)
- {
- if (!menu_single_win)
- feh_menu_init_thumbnail_viewer();
- feh_menu_show_at_xy(menu_thumbnail_viewer, winwid, x, y);
- }
- else
- {
- if (!menu_main)
- feh_menu_init_main();
- feh_menu_show_at_xy(menu_main, winwid, x, y);
- }
+void winwidget_show_menu(winwidget winwid)
+{
+ int x, y, b;
+ unsigned int c;
+ Window r;
+
+ XQueryPointer(disp, winwid->win, &r, &r, &x, &y, &b, &b, &c);
+ if (winwid->type == WIN_TYPE_ABOUT) {
+ if (!menu_about_win)
+ feh_menu_init_about_win();
+ feh_menu_show_at_xy(menu_about_win, winwid, x, y);
+ } else if (winwid->type == WIN_TYPE_SINGLE) {
+ if (!menu_single_win)
+ feh_menu_init_single_win();
+ feh_menu_show_at_xy(menu_single_win, winwid, x, y);
+ } else if (winwid->type == WIN_TYPE_THUMBNAIL) {
+ if (!menu_thumbnail_win)
+ feh_menu_init_thumbnail_win();
+ feh_menu_show_at_xy(menu_thumbnail_win, winwid, x, y);
+ } else if (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER) {
+ if (!menu_single_win)
+ feh_menu_init_thumbnail_viewer();
+ feh_menu_show_at_xy(menu_thumbnail_viewer, winwid, x, y);
+ } else {
+ if (!menu_main)
+ feh_menu_init_main();
+ feh_menu_show_at_xy(menu_main, winwid, x, y);
+ }
}