[sane-devel] Re: [Suggestion/Patch] xsane-preview: select scann area with given proportions
Peter Seiderer
Peter.Seiderer at ciselant.de
Mon Apr 15 22:51:29 BST 2002
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
-------------- next part --------------
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")
More information about the sane-devel
mailing list