summaryrefslogtreecommitdiff
path: root/src/eom-window.c
diff options
context:
space:
mode:
authormbkma <[email protected]>2026-03-14 15:32:03 +0100
committermbkma <[email protected]>2026-03-14 15:32:03 +0100
commit5129f54111334e69d2cf13599a216b60923c1946 (patch)
tree1e4c61b91e90a421ab24fd3a9bdafe0c53b7be13 /src/eom-window.c
parentbcf3bd6ea32d71e57eabe9af44a9f8bc958c6ce5 (diff)
downloadeom-crop.tar.bz2
eom-crop.tar.xz
add crop featurecrop
Diffstat (limited to 'src/eom-window.c')
-rw-r--r--src/eom-window.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/eom-window.c b/src/eom-window.c
index e24738b..04bf737 100644
--- a/src/eom-window.c
+++ b/src/eom-window.c
@@ -185,6 +185,8 @@ struct _EomWindowPrivate {
gboolean save_disabled;
gboolean needs_reload_confirmation;
+ gulong crop_signal_id;
+
GtkPageSetup *page_setup;
PeasExtensionSet *extensions;
@@ -3195,6 +3197,78 @@ eom_window_cmd_rotate_270 (GtkAction *action, gpointer user_data)
}
static void
+eom_window_crop_requested_cb (EomScrollView *view,
+ gint x,
+ gint y,
+ gint width,
+ gint height,
+ gpointer user_data)
+{
+ EomWindow *window;
+ EomWindowPrivate *priv;
+ EomImage *image;
+
+ g_return_if_fail (EOM_IS_WINDOW (user_data));
+
+ window = EOM_WINDOW (user_data);
+ priv = window->priv;
+
+ /* Disconnect and exit crop mode */
+ if (priv->crop_signal_id) {
+ g_signal_handler_disconnect (priv->view, priv->crop_signal_id);
+ priv->crop_signal_id = 0;
+ }
+ eom_scroll_view_set_crop_mode (EOM_SCROLL_VIEW (priv->view), FALSE);
+
+ image = eom_window_get_image (window);
+ g_return_if_fail (EOM_IS_IMAGE (image));
+
+ if (width > 0 && height > 0) {
+ GtkAction *action_undo, *action_save;
+
+ eom_image_crop (image, x, y, width, height);
+ eom_image_modified (image);
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ action_undo = gtk_action_group_get_action (priv->actions_image, "EditUndo");
+ action_save = gtk_action_group_get_action (priv->actions_image, "ImageSave");
+ gtk_action_set_sensitive (action_undo, eom_image_is_modified (image));
+ if (!priv->save_disabled)
+ gtk_action_set_sensitive (action_save, eom_image_is_modified (image));
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ }
+}
+
+static void
+eom_window_cmd_crop (GtkAction *action, gpointer user_data)
+{
+ EomWindow *window;
+ EomWindowPrivate *priv;
+
+ g_return_if_fail (EOM_IS_WINDOW (user_data));
+
+ window = EOM_WINDOW (user_data);
+ priv = window->priv;
+
+ g_return_if_fail (priv->image != NULL);
+
+ /* Clean up any stale signal connection first */
+ if (priv->crop_signal_id) {
+ g_signal_handler_disconnect (priv->view, priv->crop_signal_id);
+ priv->crop_signal_id = 0;
+ }
+
+ if (eom_scroll_view_get_crop_mode (EOM_SCROLL_VIEW (priv->view))) {
+ eom_scroll_view_set_crop_mode (EOM_SCROLL_VIEW (priv->view), FALSE);
+ } else {
+ eom_scroll_view_set_crop_mode (EOM_SCROLL_VIEW (priv->view), TRUE);
+ priv->crop_signal_id = g_signal_connect (priv->view, "crop-requested",
+ G_CALLBACK (eom_window_crop_requested_cb),
+ window);
+ }
+}
+
+static void
eom_window_cmd_wallpaper (GtkAction *action, gpointer user_data)
{
EomWindow *window;
@@ -3836,6 +3910,9 @@ static const GtkActionEntry action_entries_image[] = {
{ "EditRotate270", "object-rotate-left", N_("Rotate Counterc_lockwise"), "<ctrl><shift>r",
N_("Rotate the image 90 degrees to the left"),
G_CALLBACK (eom_window_cmd_rotate_270) },
+ { "EditCrop", "edit-cut", N_("_Crop…"), NULL,
+ N_("Crop the image to a selected region"),
+ G_CALLBACK (eom_window_cmd_crop) },
{ "ImageSetAsWallpaper", NULL, N_("Set as _Desktop Background"),
"<control>F8", N_("Set the selected image as the desktop background"),
G_CALLBACK (eom_window_cmd_wallpaper) },