AddToFunc MakeMenuWallpaper
+ I DestroyMenu recreate MenuWallpaper
+ I AddToMenu MenuWallpaper Wallpaper Title
- + I PipeRead 'exec $[FVWM_USERDIR]/scripts/bgmenu.zsh $[BGROOT] MenuWallpaper'
+ + I PipeRead 'exec $[FVWM_USERDIR]/scripts/bgmenu.sh --menu=MenuWallpaper $[BGROOT]'
DestroyFunc SetWallpaper
AddToFunc SetWallpaper
/*
- * Copyright © 2007 Nick Bowler
+ * Copyright © 2008, 2017 Nick Bowler
*
* License WTFPL2: Do What The Fuck You Want To Public License, version 2.
* This is free software: you are free to do what the fuck you want to.
#include <inttypes.h>
#include <xcb/xcb.h>
-#define MKASPECT(w, h) { (double)w/h, #w ":" #h }
-
/* Table of common monitor aspect ratios. Add to this as necessary. */
-static struct aspect {
- double ratio;
- char *name;
+static const struct aspect {
+ unsigned num, denom;
} aspects[] = {
- MKASPECT(16, 10),
- MKASPECT(16, 9),
- MKASPECT(8, 3),
- MKASPECT(5, 4),
- MKASPECT(4, 3)
+ { 16, 10 },
+ { 16, 9 },
+ { 8, 3 },
+ { 5, 4 },
+ { 4, 3 }
};
/*
return NULL;
}
-char *testaspect(xcb_screen_t *screen)
+void find_nearest_aspect(xcb_screen_t *screen, struct aspect *out)
{
unsigned int w = screen->width_in_millimeters;
unsigned int h = screen->height_in_millimeters;
- double ratio = (double)w/h;
- double diff = 0;
- char *best = NULL;
+ double r = (double)w/h;
+ double d = HUGE_VAL;
int i;
for (i = 0; i < (sizeof aspects / sizeof aspects[0]); i++) {
- if (!best || fabs(aspects[i].ratio - ratio) < diff) {
- best = aspects[i].name;
- diff = fabs(aspects[i].ratio - ratio);
+ double t = (double) aspects[i].num / aspects[i].denom;
+ double cmp;
+
+ cmp = fabs(r - t);
+ if (cmp < d) {
+ *out = aspects[i];
+ d = cmp;
}
- }
- return best;
+ cmp = fabs(r - 1/t);
+ if (cmp < d) {
+ out->num = aspects[i].denom;
+ out->denom = aspects[i].num;
+ d = cmp;
+ }
+ }
}
struct options {
int main(int argc, char **argv)
{
+ struct aspect screenaspect;
xcb_connection_t *display;
xcb_screen_t *screen;
int screen_num;
printf("%" PRIu16 "x%" PRIu16 "-",
screen->width_in_pixels, screen->height_in_pixels);
}
- printf("%s\n", testaspect(screen));
+
+ find_nearest_aspect(screen, &screenaspect);
+ printf("%u:%u\n", screenaspect.num, screenaspect.denom);
xcb_disconnect(display);
return EXIT_SUCCESS;
--- /dev/null
+#!/bin/sh
+#
+# Copyright © 2008, 2017 Nick Bowler
+#
+# Generates an FVWM menu for selecting the PNG images found in a given
+# directory. Thumbnails for the images are generated on the fly using
+# the thumbnailer.zsh script. Menu items run the specified function
+# with the filename as the first argument.
+
+thumber="$FVWM_USERDIR/scripts/thumbnail.zsh --size x160"
+xaspect=$FVWM_USERDIR/scripts/C/xaspect
+menu=MenuWallpaper
+func=SetWallpaper
+
+lastarg=
+dashdash=
+for arg; do
+ if test ${lastarg:+y}; then
+ arg=$lastarg=$arg
+ lastarg=
+ fi
+
+ case $dashdash$arg in
+ --menu=*) menu=${arg#--menu=} ;;
+ --func=*) func=${arg#--func=} ;;
+ --menu|--func) lastarg=$arg ;;
+ --) dashdash=: ;;
+ -*) printf '%s: unrecognized argument: %s\n' "$0" "$arg" 1>&2; exit 1 ;;
+ *) set x "$@" "$arg"; shift
+ esac
+
+ shift
+done
+
+case $# in
+1) dir=$1 ;;
+*) printf 'usage: %s [options] directory\n' "$0" 1>&2
+esac
+
+size=`$xaspect -dimensions`
+find $1 -maxdepth 1 -name "*$size.png" -print0 -exec $thumber {} \; |
+ awk -F '\0' '{
+ gsub(/["\\]/, "\\\\&");
+ caption = gensub(/.*\/(.*)\..*/, "\\1", 1, $1);
+ print "AddToMenu", menuname, "\"" caption "*" $2 "*\"",
+ funcname, "\"" $1 "\""
+ }' "menuname=$menu" "funcname=$func"
+++ /dev/null
-#!/usr/bin/env zsh
-# Generates an FVWM menu for selecting the PNG images found in a given
-# directory. Thumbnails for the images are generated on the fly using convert
-# from ImageMagick, and stored in the .thumbs subdirectory. The menu items
-# run the specified function with the filename as the first argument.
-
-menu="MenuWallpaper"
-func="SetWallpaper"
-thumber="$FVWM_USERDIR/scripts/thumbnail.zsh"
-
-if [ ! -d "$1" ]; then
- echo "usage: $0 <directory> [menuname]" 1>&2
- exit 1
-fi
-[ -n "$2" ] && menu="$2"
-
-for i in "$1"/*$($FVWM_USERDIR/scripts/C/xaspect).png; do
- thumb="`$thumber --size x160 "$i"`"
- echo "AddToMenu $menu \"`basename "${i%.png}"`*$thumb*\" $func \"$i\""
-done