--sm4nu43k4a2Rpi4c
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Mon, Apr 15, 2002 at 07:20:59PM +0200, Peter Seiderer wrote:
> 
> Hello,
> updated patch: now for preview selection the cursor can only be moved
> to the bounded positions. This only works with a patched gdk/gtk lib
> because there was no gdk_window_set_pointer function
> (see: http://mail.gnome.org/archives/gtk-devel-list/2002-April/msg00075.html).
> 
> Both patches attached to the mail....
> 
> Peter
> 

Hello,
one more version (fixed some bugs).....
Peter



--sm4nu43k4a2Rpi4c
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; 
filename="patch-preview_selection_proportion-0.3"

diff -ru xsane-0.85_orig/src/xsane-preview.c xsane-0.85/src/xsane-preview.c
--- xsane-0.85_orig/src/xsane-preview.c Mon Apr 15 09:41:27 2002
+++ xsane-0.85/src/xsane-preview.c      Mon Apr 15 21:38:06 2002
@@ -180,6 +180,7 @@
 static gint preview_preset_area_move_down_callback(GtkWidget *widget, 
GtkWidget *preset_area_widget);
 static gint preview_preset_area_context_menu_callback(GtkWidget *widget, 
GdkEvent *event);
 static void preview_preset_area_callback(GtkWidget *widget, gpointer 
call_data);
+static void preview_selection_proportion_callback(GtkWidget *widget, gpointer 
call_data);
 static void preview_rotation_callback(GtkWidget *widget, gpointer call_data);
 static void preview_autoselect_scanarea_callback(GtkWidget *window, gpointer 
data);
 
@@ -550,7 +551,7 @@
       p->selection.coordinate[p->index_xmin] = 
p->selection.coordinate[p->index_xmax];
       p->selection.coordinate[p->index_xmax] = tmp_coordinate;
 
-      p->selection_xedge = (p->selection_xedge + 2) & 3;
+      p->selection_xedge = (p->selection_xedge + 2) % 4;
     }
 
     if (p->selection.coordinate[p->index_ymin] > 
p->selection.coordinate[p->index_ymax])
@@ -559,7 +560,7 @@
       p->selection.coordinate[p->index_ymin] = 
p->selection.coordinate[p->index_ymax];
       p->selection.coordinate[p->index_ymax] = tmp_coordinate;
 
-      p->selection_yedge = (p->selection_yedge + 2) & 3;
+      p->selection_yedge = (p->selection_yedge + 2) % 4;
     }
   }
 }
@@ -2418,6 +2419,12 @@
 }
 
 /* 
----------------------------------------------------------------------------------------------------------------------
 */
+#define CURSOR_IN_LEFT_RANGE   
((preview_selection[0]-SELECTION_RANGE_OUT<event->button.x)&&(event->button.x<preview_selection[0]+SELECTION_RANGE_IN))
+#define CURSOR_IN_TOP_RANGE    
((preview_selection[1]-SELECTION_RANGE_OUT<event->button.y)&&(event->button.y<preview_selection[1]+SELECTION_RANGE_IN))
+#define CURSOR_IN_RIGHT_RANGE  
((preview_selection[2]-SELECTION_RANGE_IN<event->button.x)&&(event->button.x<preview_selection[2]+SELECTION_RANGE_OUT))
+#define CURSOR_IN_BOTTOM_RANGE 
((preview_selection[3]-SELECTION_RANGE_IN<event->button.y)&&(event->button.y<preview_selection[3]+SELECTION_RANGE_OUT))
+#define CURSOR_IN_HEIGHT_RANGE 
((event->button.y>preview_selection[1])&&(event->button.y<preview_selection[3]))
+#define CURSOR_IN_WIDTH_RANGE  
((event->button.x>preview_selection[0])&&(event->button.x<preview_selection[2]))
 
 static gint preview_motion_event_handler(GtkWidget *window, GdkEvent *event, 
gpointer data)
 {
@@ -2442,122 +2449,143 @@
   {
     switch (((GdkEventMotion *)event)->state &
             GDK_Num_Lock & GDK_Caps_Lock & GDK_Shift_Lock & GDK_Scroll_Lock) 
/* mask all Locks */
-    {
+      {
       case 256: /* left button */
-
+       
         DBG(DBG_info2, "left button\n");
-
+       
         if ( (p->selection_drag) || (p->selection_drag_edge) )
-        {
-          p->selection.active = TRUE;
-          p->selection.coordinate[p->selection_xedge] = preview_x;
-          p->selection.coordinate[p->selection_yedge] = preview_y;
+         {
+           p->selection.active = TRUE;
+           if ( p->selection_proportion == -1.0 ) {
+             /* unbound */
+             if ( p->selection_xedge != -1 ) {
+               p->selection.coordinate[p->selection_xedge] = preview_x;
+             }
+             if ( p->selection_yedge != -1 ) {
+               p->selection.coordinate[p->selection_yedge] = preview_y;
+             }
+             preview_order_selection(p);
+             preview_bound_selection(p);
+           } else {
+             /* proportional preview selection */
+             int width;
+             int height;
+             
+             if ( p->selection.coordinate[p->selection_xedge] != preview_x ) {
+               p->selection.coordinate[p->selection_xedge] = preview_x;
+               width = p->selection.coordinate[2] - p->selection.coordinate[0];
+               height = width / p->selection_proportion;
+               if ( p->selection_yedge == 1) {
+                 p->selection.coordinate[p->selection_yedge] = 
p->selection.coordinate[(p->selection_yedge+2)%4] -  height;
+               } else {
+                 p->selection.coordinate[p->selection_yedge] = 
p->selection.coordinate[(p->selection_yedge+2)%4] + height;
+               }
+             } else {
+               p->selection.coordinate[p->selection_yedge] = preview_y;
+               height = p->selection.coordinate[3] - 
p->selection.coordinate[1];
+               width = height * p->selection_proportion;
+               if ( p->selection_xedge == 0 ) {
+                 p->selection.coordinate[p->selection_xedge] = 
p->selection.coordinate[(p->selection_xedge+2)%4] - width;
+               } else {
+                 p->selection.coordinate[p->selection_xedge] = 
p->selection.coordinate[(p->selection_xedge+2)%4] + width;
+               }
+             }
+
+             /* set cursor to calculated position */
+             preview_transform_coordinates_device_to_window(p, 
p->selection.coordinate, preview_selection);
+             gdk_window_set_pointer(window->window, 
(int)preview_selection[p->selection_xedge], 
(int)preview_selection[p->selection_yedge]);
+
+             preview_order_selection(p);
+             preview_bound_selection(p);
+           }
 
-          preview_order_selection(p);
-          preview_bound_selection(p);
-
-          if (preferences.gtk_update_policy == GTK_UPDATE_CONTINUOUS)
-          {
-            if (!p->hold_timer) /* hold timer active? then remove it, we had a 
motion */
-            {
-              p->hold_timer = gtk_timeout_add(XSANE_CONTINUOUS_HOLD_TIME, 
preview_hold_event_handler, (gpointer *) p);
-            }
-            preview_update_maximum_output_size(p);
-            preview_draw_selection(p);
-          }
-          else if (preferences.gtk_update_policy == GTK_UPDATE_DELAYED)
-          {
-            /* call preview_hold_event_hanlder if mouse is not moved for ??? 
ms */
-            if (p->hold_timer) /* hold timer active? then remove it, we had a 
motion */
-            {
-              gtk_timeout_remove(p->hold_timer);
-              p->hold_timer = 0;
-            }
-            p->hold_timer = gtk_timeout_add(XSANE_HOLD_TIME, 
preview_hold_event_handler, (gpointer *) p);
-            preview_update_maximum_output_size(p);
-            preview_draw_selection(p);
-          }
-          else /* discontinuous */
-          {
-            preview_update_maximum_output_size(p);
-            preview_draw_selection(p); /* only draw selection, do not update 
backend geometry options */
-          }
-        }
+           if (preferences.gtk_update_policy == GTK_UPDATE_CONTINUOUS)
+             {
+               if (!p->hold_timer) /* hold timer active? then remove it, we 
had a motion */
+                 {
+                   p->hold_timer = gtk_timeout_add(XSANE_CONTINUOUS_HOLD_TIME, 
preview_hold_event_handler, (gpointer *) p);
+                 }
+               preview_update_maximum_output_size(p);
+               preview_draw_selection(p);
+             }
+           else if (preferences.gtk_update_policy == GTK_UPDATE_DELAYED)
+             {
+               /* call preview_hold_event_hanlder if mouse is not moved for 
??? ms */
+               if (p->hold_timer) /* hold timer active? then remove it, we had 
a motion */
+                 {
+                   gtk_timeout_remove(p->hold_timer);
+                   p->hold_timer = 0;
+                 }
+               p->hold_timer = gtk_timeout_add(XSANE_HOLD_TIME, 
preview_hold_event_handler, (gpointer *) p);
+               preview_update_maximum_output_size(p);
+               preview_draw_selection(p);
+             }
+           else /* discontinuous */
+             {
+               preview_update_maximum_output_size(p);
+               preview_draw_selection(p); /* only draw selection, do not 
update backend geometry options */
+             }
+         }
 
         cursornr = p->cursornr;
-
-        if ( (p->selection_xedge != -1) && (p->selection_yedge != -1) ) /* 
move corner */
-        {
-          if ( ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                 (event->button.x < preview_selection[0] + SELECTION_RANGE_IN) 
) && /* left  */
-               ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                 (event->button.y < preview_selection[1] + SELECTION_RANGE_IN) 
) ) /* top */
-          {
-            cursornr = GDK_TOP_LEFT_CORNER;
-          }
-          else if ( ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                      (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) && /* right */
-                    ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                      (event->button.y < preview_selection[1] + 
SELECTION_RANGE_IN) ) ) /* top */
-          {
-            cursornr = GDK_TOP_RIGHT_CORNER;
-          }
-          else if ( ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                      (event->button.x < preview_selection[0] + 
SELECTION_RANGE_IN) ) && /* left  */
-                    ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                      (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) ) /* bottom */
-          {
-            cursornr = GDK_BOTTOM_LEFT_CORNER;
-          }
-          else if ( ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                      (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) && /* right */
-                    ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                      (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) ) /* bottom */
-          {
-            cursornr = GDK_BOTTOM_RIGHT_CORNER;
-          }
-        }
-        else if ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                  (event->button.x < preview_selection[0] + 
SELECTION_RANGE_IN) ) /* left */
-        {
-          if (cursornr == GDK_RIGHT_SIDE)
-          {
-            cursornr = GDK_LEFT_SIDE;
-          }
-        }
-        else if ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                  (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) )  /* right */
-        {
-          if (cursornr == GDK_LEFT_SIDE)
-          {
-            cursornr = GDK_RIGHT_SIDE;
-          }
-        }
-        else if ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                  (event->button.y < preview_selection[1] + 
SELECTION_RANGE_IN) )  /* top */
-        {
-          if (cursornr == GDK_BOTTOM_SIDE)
-          {
-            cursornr = GDK_TOP_SIDE;
-          }
-        }
-        else if ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                    (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) )  /* bottom */
-        {
-          if (cursornr == GDK_TOP_SIDE)
-          {
-            cursornr = GDK_BOTTOM_SIDE;
-          }
-        }
+       
+       if ( (p->selection_xedge != -1) && (p->selection_yedge != -1) ) /* move 
corner */
+         {
+           if ( CURSOR_IN_LEFT_RANGE && CURSOR_IN_TOP_RANGE )
+             {
+               cursornr = GDK_TOP_LEFT_CORNER;
+             }
+           else if ( CURSOR_IN_RIGHT_RANGE && CURSOR_IN_TOP_RANGE )
+             {
+               cursornr = GDK_TOP_RIGHT_CORNER;
+             }
+           else if ( CURSOR_IN_LEFT_RANGE && CURSOR_IN_BOTTOM_RANGE )
+             {
+               cursornr = GDK_BOTTOM_LEFT_CORNER;
+             }
+           else if ( CURSOR_IN_RIGHT_RANGE && CURSOR_IN_BOTTOM_RANGE )
+             {
+               cursornr = GDK_BOTTOM_RIGHT_CORNER;
+             }
+         }
+        else if ( CURSOR_IN_LEFT_RANGE )
+         {
+           if (cursornr == GDK_RIGHT_SIDE)
+             {
+               cursornr = GDK_LEFT_SIDE;
+             }
+         }
+        else if ( CURSOR_IN_RIGHT_RANGE )
+         {
+           if (cursornr == GDK_LEFT_SIDE)
+             {
+               cursornr = GDK_RIGHT_SIDE;
+             }
+         }
+        else if ( CURSOR_IN_TOP_RANGE )
+         {
+           if (cursornr == GDK_BOTTOM_SIDE)
+             {
+               cursornr = GDK_TOP_SIDE;
+             }
+         }
+        else if ( CURSOR_IN_BOTTOM_RANGE )
+         {
+           if (cursornr == GDK_TOP_SIDE)
+             {
+               cursornr = GDK_BOTTOM_SIDE;
+             }
+         }
 
         if (cursornr != p->cursornr)
-        {
-          cursor = gdk_cursor_new(cursornr);   /* set curosr */
-          gdk_window_set_cursor(p->window->window, cursor);
-          gdk_cursor_unref(cursor);
-          p->cursornr = cursornr;
-        }
-       break;
+         {
+           cursor = gdk_cursor_new(cursornr);  /* set curosr */
+           gdk_window_set_cursor(p->window->window, cursor);
+           gdk_cursor_unref(cursor);
+           p->cursornr = cursornr;
+         }
+       break;
 
       case 512: /* middle button */
       case 1024: /* right button */
@@ -2669,62 +2697,42 @@
        break;
 
       default:
-        if ( ( (preview_selection[0] - SELECTION_RANGE_OUT < event->button.x) 
&&
-               (event->button.x < preview_selection[0] + SELECTION_RANGE_IN) ) 
&& /* left  */
-             ( (preview_selection[1] - SELECTION_RANGE_OUT < event->button.y) 
&&
-               (event->button.y < preview_selection[1] + SELECTION_RANGE_IN) ) 
) /* top */
-        {
-          cursornr = GDK_TOP_LEFT_CORNER;
-        }
-        else if ( ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                    (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) && /* right */
-                  ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                    (event->button.y < preview_selection[1] + 
SELECTION_RANGE_IN) ) ) /* top */
-        {
-          cursornr = GDK_TOP_RIGHT_CORNER;
-        }
-        else if ( ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                    (event->button.x < preview_selection[0] + 
SELECTION_RANGE_IN) ) && /* left  */
-                  ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                    (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) ) /* bottom */
-        {
-          cursornr = GDK_BOTTOM_LEFT_CORNER;
-        }
-        else if ( ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                    (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) && /* right */
-                  ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                    (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) ) /* bottom */
-        {
-          cursornr = GDK_BOTTOM_RIGHT_CORNER;
-        }
-        else if ( ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                    (event->button.x < preview_selection[0] + 
SELECTION_RANGE_IN) ) &&  /* left */
-                  ( (event->button.y > preview_selection[1]) && 
(event->button.y < preview_selection[3]) ) ) /* in height */
-        {
-           cursornr = GDK_LEFT_SIDE;
-        }
-        else if ( ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                    (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) &&  /* right */
-                  ( (event->button.y > preview_selection[1]) && 
(event->button.y < preview_selection[3]) ) ) /* in height */
-        {
-           cursornr = GDK_RIGHT_SIDE;
-        }
-        else if ( ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                    (event->button.y < preview_selection[1] + 
SELECTION_RANGE_IN) ) &&  /* top */
-                  ( (event->button.x > preview_selection[0]) && 
(event->button.x < preview_selection[2]) ) ) /* in width */
-        {
-           cursornr = GDK_TOP_SIDE;
-        }
-        else if ( ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                    (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) &&  /* bottom */
-                  ( (event->button.x > preview_selection[0]) && 
(event->button.x < preview_selection[2]) ) ) /* in width */
-        {
-           cursornr = GDK_BOTTOM_SIDE;
-        }
+        if ( CURSOR_IN_LEFT_RANGE && CURSOR_IN_TOP_RANGE )
+         {
+           cursornr = GDK_TOP_LEFT_CORNER;
+         }
+        else if ( CURSOR_IN_RIGHT_RANGE && CURSOR_IN_TOP_RANGE )
+         {
+           cursornr = GDK_TOP_RIGHT_CORNER;
+         }
+        else if ( CURSOR_IN_LEFT_RANGE && CURSOR_IN_BOTTOM_RANGE )
+         {
+           cursornr = GDK_BOTTOM_LEFT_CORNER;
+         }
+        else if ( CURSOR_IN_RIGHT_RANGE && CURSOR_IN_BOTTOM_RANGE )
+         {
+           cursornr = GDK_BOTTOM_RIGHT_CORNER;
+         }
+        else if ( CURSOR_IN_LEFT_RANGE && CURSOR_IN_HEIGHT_RANGE )
+         {
+           cursornr = GDK_LEFT_SIDE;
+         }
+        else if ( CURSOR_IN_RIGHT_RANGE && CURSOR_IN_HEIGHT_RANGE )
+         {
+           cursornr = GDK_RIGHT_SIDE;
+         }
+        else if ( CURSOR_IN_TOP_RANGE && CURSOR_IN_WIDTH_RANGE )
+         {
+           cursornr = GDK_TOP_SIDE;
+         }
+        else if ( CURSOR_IN_BOTTOM_RANGE && CURSOR_IN_WIDTH_RANGE )
+         {
+           cursornr = GDK_BOTTOM_SIDE;
+         }
         else
-        {
-          cursornr = XSANE_CURSOR_PREVIEW;
-        }
+         {
+           cursornr = XSANE_CURSOR_PREVIEW;
+         }
 
         if ((cursornr != p->cursornr) && (p->cursornr != -1))
         {
@@ -3076,32 +3084,28 @@
               DBG(DBG_info, "left button\n");
 
               p->selection_xedge = -1;
-              if ( (preview_selection[0] - SELECTION_RANGE_OUT < 
event->button.x) &&
-                   (event->button.x < preview_selection[0] + 
SELECTION_RANGE_IN) ) /* left */
-              {
-                DBG(DBG_info, "-left\n");
-                p->selection_xedge = 0;
-              }
-              else if ( (preview_selection[2] - SELECTION_RANGE_IN < 
event->button.x) &&
-                        (event->button.x < preview_selection[2] + 
SELECTION_RANGE_OUT) ) /* right */
-              {
-                DBG(DBG_info, "-right\n");
-                p->selection_xedge = 2;
-              }
+              if ( CURSOR_IN_LEFT_RANGE )
+               {
+                 DBG(DBG_info, "-left\n");
+                 p->selection_xedge = 0;
+               }
+              else if ( CURSOR_IN_RIGHT_RANGE )
+               {
+                 DBG(DBG_info, "-right\n");
+                 p->selection_xedge = 2;
+               }
 
               p->selection_yedge = -1;
-              if ( (preview_selection[1] - SELECTION_RANGE_OUT < 
event->button.y) &&
-                   (event->button.y < preview_selection[1] + 
SELECTION_RANGE_IN) ) /* top */
-              {
-                DBG(DBG_info, "-top\n");
-                p->selection_yedge = 1;
-              }
-              else if ( (preview_selection[3] - SELECTION_RANGE_IN < 
event->button.y) &&
-                        (event->button.y < preview_selection[3] + 
SELECTION_RANGE_OUT) ) /* bottom */
-              {
-                DBG(DBG_info, "-bottom\n");
-                p->selection_yedge = 3;
-              }
+              if ( CURSOR_IN_TOP_RANGE )
+               {
+                 DBG(DBG_info, "-top\n");
+                 p->selection_yedge = 1;
+               }
+              else if ( CURSOR_IN_BOTTOM_RANGE )
+               {
+                 DBG(DBG_info, "-bottom\n");
+                 p->selection_yedge = 3;
+               }
 
               if ( (p->selection_xedge != -1) && (p->selection_yedge != -1) ) 
/* move corner */
               {
@@ -3111,20 +3115,24 @@
                 p->selection.coordinate[p->selection_yedge] = preview_y;
                 preview_draw_selection(p);
               }
-              else if ( (p->selection_xedge != -1) && (event->button.y > 
preview_selection[1])
-                        && (event->button.y < preview_selection[3]) ) /* move 
x-edge */
+              else if ( (p->selection_xedge != -1) && CURSOR_IN_HEIGHT_RANGE ) 
/* move x-edge */
               {
                 DBG(DBG_info, "-move x-edge %f\n", preview_x);
                 p->selection_drag_edge = TRUE;
                 p->selection.coordinate[p->selection_xedge] = preview_x;
+               if ( p->selection_proportion != -1.0 ) {
+                 p->selection_yedge = (p->selection_xedge + 1) % 4;
+               }
                 preview_draw_selection(p);
               }
-              else if ( (p->selection_yedge != -1)  && (event->button.x > 
preview_selection[0])
-                        && (event->button.x < preview_selection[2]) ) /* move 
y-edge */
+              else if ( (p->selection_yedge != -1)  && CURSOR_IN_WIDTH_RANGE ) 
/* move y-edge */
               {
                 DBG(DBG_info, "-move y-edge %f\n", preview_y);
                 p->selection_drag_edge = TRUE;
                 p->selection.coordinate[p->selection_yedge] = preview_y;
+               if ( p->selection_proportion != -1.0 ) {
+                 p->selection_xedge = (p->selection_yedge + 1) % 4;
+               }
                 preview_draw_selection(p);
               } 
               else /* select new area */
@@ -3372,6 +3380,44 @@
   gtk_widget_queue_draw(p->preset_area_option_menu);
 }
 
+typedef struct selection_proportion_s {
+  char *name;
+  float value;
+} selection_proportion_t;
+
+#define NR_SELECTION_PROPORTIONS 4
+
+static selection_proportion_t selection_proportions[NR_SELECTION_PROPORTIONS] =
+{ {"unbound", -1.0 },
+  {"1:1",      1.0 },
+  {"3:4",      (3.0 / 4.0)},
+  {"4:3",      (4.0 / 3.0)}
+};
+
+static void
+preview_create_selection_proportion_menu(Preview *p, int selected)
+{
+  GtkWidget *selection_proportion_menu, *menu_item;
+  int i;
+
+  selection_proportion_menu = gtk_menu_new();
+
+  for ( i = 0; i < NR_SELECTION_PROPORTIONS; i++ ) {
+    menu_item = gtk_menu_item_new_with_label(selection_proportions[i].name);
+    gtk_container_add(GTK_CONTAINER(selection_proportion_menu), menu_item);
+    g_signal_connect(GTK_OBJECT(menu_item), "activate", (GtkSignalFunc) 
preview_selection_proportion_callback, p);
+    gtk_object_set_data(GTK_OBJECT(menu_item), "Selection",  (void *) i);  
+    gtk_object_set_data(GTK_OBJECT(menu_item), "Preview",    (void *) p);
+    gtk_object_set_data(GTK_OBJECT(menu_item), "Proportion", (void *) 
(&selection_proportions[i].value));
+    gtk_widget_show(menu_item);
+  }
+  
+  
gtk_option_menu_set_menu(GTK_OPTION_MENU(p->preview_selection_proportion_menu), 
selection_proportion_menu);
+  
gtk_option_menu_set_history(GTK_OPTION_MENU(p->preview_selection_proportion_menu),
 selected);
+  gtk_widget_show(selection_proportion_menu);
+  gtk_widget_queue_draw(p->preview_selection_proportion_menu);
+}
+
 /* 
----------------------------------------------------------------------------------------------------------------------
 */
 
 void preview_generate_preview_filenames(Preview *p)
@@ -3494,6 +3540,8 @@
   p->preview_colors = -1;
   p->invalid = TRUE; /* no valid preview */
 
+  p->selection_proportion = -1.0; /* unbound selection proportion */
+
 #ifndef XSERVER_WITH_BUGGY_VISUALS
   gtk_widget_push_visual(gtk_preview_get_visual()); /* this has no function 
for gtk+-2.0 */
 #endif
@@ -3562,6 +3610,12 @@
   p->preset_area_option_menu = preset_area_option_menu;
   preview_create_preset_area_menu(p, 0); /* build menu and set default to 
0=full size */
 
+  /* select preview selection proportion */
+  p->preview_selection_proportion_menu = gtk_option_menu_new();
+  xsane_back_gtk_set_tooltip(xsane.tooltips, 
p->preview_selection_proportion_menu, DESC_SELECTION_PROPORTION);
+  gtk_box_pack_start(GTK_BOX(p->button_box), 
p->preview_selection_proportion_menu, FALSE, FALSE, 0);
+  gtk_widget_show(p->preview_selection_proportion_menu);
+  preview_create_selection_proportion_menu(p, 0); /* default to 0=unbound */
 
   /* select rotation */
   rotation_menu = gtk_menu_new();
@@ -5046,6 +5100,24 @@
 
   preview_update_surface(p, 0);
   preview_zoom_not(NULL, p);
+}
+
+static void
+preview_selection_proportion_callback(GtkWidget *widget, gpointer call_data)
+{
+  Preview *p = call_data;
+  float proportion;
+  
+  DBG(DBG_proc, "preview_selection_proportion_callback\n");
+  
+  proportion = *((float *) gtk_object_get_data(GTK_OBJECT(widget), 
"Proportion"));
+
+  DBG(DBG_proc, " - porportion = %f\n", proportion);
+
+  if ( p->selection_proportion != proportion ) {
+    p->selection_proportion = proportion;
+    /* XXXXX adjust actual selection to proportion !!!!!!!!!!! */
+  }
 }
 
 /* 
----------------------------------------------------------------------------------------------------------------------
 */
diff -ru xsane-0.85_orig/src/xsane-preview.h xsane-0.85/src/xsane-preview.h
--- xsane-0.85_orig/src/xsane-preview.h Mon Apr 15 09:41:27 2002
+++ xsane-0.85/src/xsane-preview.h      Mon Apr 15 11:24:29 2002
@@ -138,7 +138,9 @@
   int selection_ypos;
   int selection_xedge;
   int selection_yedge;
-
+  
+  float selection_proportion;
+  
   Tselection selection;                                /* selected area to 
scan */
   Tselection previous_selection;               /* previous ... */
   Tselection selection_maximum;                        /* maximum selection 
size (photocopy) */
@@ -169,6 +171,7 @@
   GtkWidget *autoraise;                /* autoraise scanarea */
   GtkWidget *autoselect;       /* autoselect scanarea */
   GtkWidget *preset_area_option_menu;  /* menu for selection of preview area */
+  GtkWidget *preview_selection_proportion_menu; /* menu for proportion of 
selection of preview area */
   GtkWidget *rotation_option_menu;     /* menu for selection of rotation */
   GtkWidget *scanning_pixmap;  /* pixmap that shows preview is in scanning 
progress */
   GtkWidget *valid_pixmap;     /* pixmap that shows preview is valid */
diff -ru xsane-0.85_orig/src/xsane-text.h xsane-0.85/src/xsane-text.h
--- xsane-0.85_orig/src/xsane-text.h    Mon Apr 15 09:41:28 2002
+++ xsane-0.85/src/xsane-text.h Mon Apr 15 10:39:39 2002
@@ -553,6 +553,7 @@
 #define DESC_DELETE_IMAGES             _("Delete preview image cache")
 
 #define DESC_PRESET_AREA               _("Preset area")
+#define DESC_SELECTION_PROPORTION       _("Selection proportion")
 #define DESC_ROTATION                  _("Rotate preview and scan")
 
 #define DESC_VIEWER_SAVE               _("Save image")

--sm4nu43k4a2Rpi4c--

Reply via email to