Re: [dev] Announcing a couple small X11 utilities

From: Lars Lindqvist <lars.lindqvist_AT_yandex.com>
Date: Fri, 18 Aug 2023 03:56:20 +0200

tor 2023-08-17 10:19:01 skrev Max Schillinger:
> On Tue Jul 4, 2023 at 3:51 PM CEST, NRK wrote:
> > sx4
> > ===
> >
> > This one is a selection tool. It outputs the selection rectangle to
> > stdout which can then be used for other purposes, such as screenshoting
> > or screen-recording a specific area.
>
> All these tools are great! Thanks for sharing.
>
> I don't do much image processing but when I do, it's most often cropping
> images. Of course, GIMP can do this. But it's huge. I usually use nomacs
> instead. But now the nomacs package for Arch Linux is broken because of
> dependencies. Now I use gThumb as a replacement but it's also big.
>
> When I heard about sx4, I was wondering if it's somehow possible to
> connect sxiv, sx4 and ImageMagick. I could open an image with sxiv (or
> feh or something simple) without any zoom, then I could select a region
> with sx4 and pass it to ImageMagick. For this I would have to correct
> the coordinates by the offset of the canvas relative to the screen. This
> seems to be the missing link.
>
> Any ideas how to achieve this?

I think this can be done with (image|graphics)magick import, simply
`import cropped.png` and select the region you want.

I do a lot of cropping using some ugly hacks, attached diff is for
nsxiv master and uses ctrl-q to crop the active image to what is
currenly visible, regardless of zoom (a 100x100 window at 400% zoom
will give a 25x25 image). (Replace 'mogrify -crop' with some wrapper
script if you don't want to accidentally destroy images..)

>
> Regards,
> Max
>


diff --git a/commands.c b/commands.c
index 97cadf2..ff80201 100644
--- a/commands.c
+++ b/commands.c
_AT_@ -253,6 +253,24 @@ bool cg_change_contrast(arg_t d)
         return change_color_modifier(d, &img.contrast);
 }
 
+bool ci_crop(arg_t _)
+{
+ char geo[64];
+ char *argv[5];
+ int x, y, w, h;
+
+ x = MAX(0, -img.x / img.zoom);
+ y = MAX(0, -img.y / img.zoom);
+ w = MIN(img.w, win.w / img.zoom);
+ h = MIN(img.h, win.h / img.zoom);
+ if (x == 0 && y == 0 && w == img.w && h == img.h)
+ return false;
+ construct_argv(argv, ARRLEN(argv), "mogrify", "-crop", geo, files[fileidx].path, NULL);
+ waitpid(spawn(NULL, NULL, argv), NULL, 0);
+ img.dirty = true;
+ return true;
+}
+
 bool ci_navigate(arg_t n)
 {
         if (prefix > 0)
diff --git a/commands.h b/commands.h
index 4e694f0..530c363 100644
--- a/commands.h
+++ b/commands.h
_AT_@ -25,6 +25,7 @@ bool cg_unmark_all(arg_t);
 bool cg_zoom(arg_t);
 /* image mode */
 bool ci_alternate(arg_t);
+bool ci_crop(arg_t);
 bool ci_cursor_navigate(arg_t);
 bool ci_drag(arg_t);
 bool ci_fit_to_win(arg_t);
_AT_@ -72,6 +73,7 @@ bool ct_select(arg_t);
 
 /* image mode */
 #define i_alternate { ci_alternate, MODE_IMAGE }
+#define i_crop { ci_crop, MODE_IMAGE }
 #define i_cursor_navigate { ci_cursor_navigate, MODE_IMAGE }
 #define i_drag { ci_drag, MODE_IMAGE }
 #define i_fit_to_win { ci_fit_to_win, MODE_IMAGE }
diff --git a/config.def.h b/config.def.h
index 7fbfb17..c530e8a 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -137,6 +137,7 @@ static const keymap_t keys[] = {
         { 0, XK_Right, t_move_sel, DIR_RIGHT },
         { 0, XK_R, t_reload_all, None },
 
+ { ControlMask, XK_q, i_crop, None },
         { 0, XK_n, i_navigate, +1 },
         { 0, XK_n, i_scroll_to_edge, DIR_LEFT | DIR_UP },
         { 0, XK_space, i_navigate, +1 },
Received on Fri Aug 18 2023 - 03:56:20 CEST

This archive was generated by hypermail 2.3.0 : Fri Aug 18 2023 - 04:36:10 CEST