Changeset 540

Show
Ignore:
Timestamp:
08/23/08 18:46:11 (3 months ago)
Author:
bjourne
Message:

Revert all the smooth scrolling work back to r506. It is not possible
to make smooth scrolling work satisfactory without changes in
GTK+. Hopefully someday
http://bugzilla.gnome.org/show_bug.cgi?id=103811 will be fixed which
would give all widgets smooth scrolling.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gtkimageview/src/gtkimageview.c

    r522 r540  
    254254 * </refsect1> 
    255255 **/ 
     256 
    256257#include <gdk/gdkkeysyms.h> 
    257 #include <math.h> 
    258258#include <stdlib.h> 
    259259 
     
    670670} 
    671671 
    672 typedef struct 
    673 { 
    674     GtkImageView *view; 
    675     int           xsteps[4]; 
    676     int           ysteps[4]; 
    677     int           step_idx; 
    678     gboolean      set_adjustments; 
    679     gboolean      invalidate; 
    680 } ScrollData; 
    681  
    682 static gboolean 
    683 gtk_image_view_scroller (gpointer data) 
    684 { 
    685     ScrollData *scroll = (ScrollData *) data; 
    686     GtkImageView *view = scroll->view; 
    687  
    688     scroll->step_idx--; 
    689     gdouble scroll_x = scroll->xsteps[scroll->step_idx]; 
    690     gdouble scroll_y = scroll->ysteps[scroll->step_idx]; 
    691  
    692     gdouble new_x = view->offset_x + scroll_x; 
    693     gdouble new_y = view->offset_y + scroll_y; 
    694  
    695     gtk_image_view_clamp_offset (view, &new_x, &new_y); 
    696  
    697     scroll_x = new_x - view->offset_x; 
    698     scroll_y = new_y - view->offset_y; 
    699  
    700     view->offset_x += scroll_x; 
    701     view->offset_y += scroll_y; 
    702     if (scroll->invalidate) 
    703         gdk_window_invalidate_rect (GTK_WIDGET (view)->window, NULL, TRUE); 
    704     else 
    705         gtk_image_view_fast_scroll (view, scroll_x, scroll_y); 
    706     gtk_image_view_update_cursor (view); 
    707  
    708     if (scroll->set_adjustments) 
    709     { 
    710         g_signal_handlers_block_by_data (G_OBJECT (view->hadj), view); 
    711         g_signal_handlers_block_by_data (G_OBJECT (view->vadj), view); 
    712         gtk_adjustment_set_value (view->hadj, view->offset_x); 
    713         gtk_adjustment_set_value (view->vadj, view->offset_y); 
    714         g_signal_handlers_unblock_by_data (G_OBJECT (view->hadj), view); 
    715         g_signal_handlers_unblock_by_data (G_OBJECT (view->vadj), view); 
    716     } 
    717  
    718     return scroll->step_idx; 
    719 } 
    720  
    721 /** 
    722  * gtk_image_view_slope: 
    723  * 
    724  * The explanation for this algorithm is here: 
    725  * http://mail.python.org/pipermail/python-list/2008-March/482359.html 
    726  * Thank you, Arnaud Delobelle! 
    727  **/ 
    728 static void 
    729 gtk_image_view_slope (int  dist, 
    730                       int  parts, 
    731                       int *steps) 
    732 { 
    733     for (int n = 0; n < parts; n++) 
    734         steps[n] = (n + 1) * dist / parts - n * dist / parts; 
    735 } 
    736  
    737672/** 
    738673 * gtk_image_view_scroll_to: 
     
    744679 * @invalidate: whether to invalidate the view or redraw immedately, 
    745680 *  see gtk_image_view_set_offset() 
    746  * @smooth: whether to scroll smooth or not 
    747681 * 
    748682 * Set the offset of where in the image the #GtkImageView should begin 
     
    750684 **/ 
    751685static void 
    752 gtk_image_view_scroll_to2 (GtkImageView  *view, 
    753                            gdouble        offset_x, 
    754                            gdouble        offset_y, 
    755                            gboolean       set_adjustments, 
    756                            gboolean       invalidate, 
    757                            gboolean       smooth) 
    758 
    759     if (!GTK_WIDGET (view)->window) 
    760         return; 
     686gtk_image_view_scroll_to (GtkImageView *view, 
     687                          gdouble       offset_x, 
     688                          gdouble       offset_y, 
     689                          gboolean      set_adjustments, 
     690                          gboolean      invalidate) 
     691
     692    /* The offset needs to be truncated, otherwise weird rounding 
     693       errors occur. */ 
     694    offset_x = (int) offset_x; 
     695    offset_y = (int) offset_y; 
     696 
     697    gtk_image_view_clamp_offset (view, &offset_x, &offset_y); 
    761698 
    762699    int delta_x = offset_x - view->offset_x; 
    763700    int delta_y = offset_y - view->offset_y; 
    764701 
    765     // Exit early if the scroll was smaller than one (zoom space) 
    766     // pixel. 
     702    /* Exit early if the scroll was smaller than one (zoom space) 
     703       pixel. */ 
    767704    if (!delta_x && !delta_y) 
    768705        return; 
    769706 
    770     ScrollData *scroll = g_new0 (ScrollData, 1); 
    771     scroll->view = view; 
    772     scroll->step_idx = 1; 
    773     if (smooth) 
    774         scroll->step_idx = 4; 
    775     gtk_image_view_slope (delta_x, scroll->step_idx, scroll->xsteps); 
    776     gtk_image_view_slope (delta_y, scroll->step_idx, scroll->ysteps); 
    777     scroll->set_adjustments = set_adjustments; 
    778     scroll->invalidate = invalidate; 
    779  
    780     if (smooth) 
    781     { 
    782         g_timeout_add_full (G_PRIORITY_DEFAULT, 
    783                             20, 
    784                             gtk_image_view_scroller, 
    785                             scroll, 
    786                             g_free); 
    787     } 
    788     else 
    789     { 
    790         gtk_image_view_scroller (scroll); 
    791         g_free (scroll); 
    792     } 
    793 
    794  
     707    view->offset_x = offset_x; 
     708    view->offset_y = offset_y; 
     709    gtk_image_view_update_cursor (view); 
     710 
     711    if (GTK_WIDGET (view)->window) 
     712    { 
     713        if (invalidate) 
     714            gdk_window_invalidate_rect (GTK_WIDGET (view)->window, NULL, TRUE); 
     715        else 
     716            gtk_image_view_fast_scroll (view, delta_x, delta_y); 
     717    } 
     718 
     719    if (!set_adjustments) 
     720        return; 
     721 
     722    g_signal_handlers_block_by_data (G_OBJECT (view->hadj), view); 
     723    g_signal_handlers_block_by_data (G_OBJECT (view->vadj), view); 
     724    gtk_adjustment_set_value (view->hadj, view->offset_x); 
     725    gtk_adjustment_set_value (view->vadj, view->offset_y); 
     726    g_signal_handlers_unblock_by_data (G_OBJECT (view->hadj), view); 
     727    g_signal_handlers_unblock_by_data (G_OBJECT (view->vadj), view); 
     728
    795729 
    796730static void 
     
    818752    else if (yscroll == GTK_SCROLL_PAGE_DOWN) 
    819753        ystep = view->vadj->page_increment; 
    820  
    821     gdouble new_x = view->offset_x + xstep; 
    822     gdouble new_y = view->offset_y + ystep; 
    823     gtk_image_view_scroll_to2 (view, new_x, new_y, TRUE, FALSE, TRUE); 
     754     
     755    gtk_image_view_scroll_to (view, 
     756                              view->offset_x + xstep, 
     757                              view->offset_y + ystep, 
     758                              TRUE, FALSE); 
    824759} 
    825760 
     
    943878{ 
    944879    gdouble offset_x = GTK_ADJUSTMENT (adj)->value; 
    945     gtk_image_view_scroll_to2 (view, offset_x, view->offset_y, 
    946                                FALSE, FALSE, TRUE); 
    947     return TRUE; 
     880    gtk_image_view_scroll_to (view, offset_x, view->offset_y, FALSE, FALSE); 
     881    return FALSE; 
    948882} 
    949883 
     
    953887{ 
    954888    int offset_y = GTK_ADJUSTMENT (adj)->value; 
    955     gtk_image_view_scroll_to2 (view, view->offset_x, offset_y, 
    956                                FALSE, FALSE, TRUE); 
    957     return TRUE; 
     889    gtk_image_view_scroll_to (view, view->offset_x, offset_y, FALSE, FALSE); 
     890    return FALSE; 
    958891} 
    959892 
     
    1024957    GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS); 
    1025958 
     959    view->interp = GDK_INTERP_BILINEAR; 
    1026960    view->black_bg = FALSE; 
    1027     view->is_rendering = FALSE; 
    1028     view->interp = GDK_INTERP_BILINEAR; 
    1029961    view->fitting = TRUE; 
    1030962    view->pixbuf = NULL; 
     
    1032964    view->offset_x = 0.0; 
    1033965    view->offset_y = 0.0; 
     966    view->is_rendering = FALSE; 
    1034967    view->show_frame = TRUE; 
    1035968    view->show_cursor = TRUE; 
    1036969    view->void_cursor = NULL; 
    1037970    view->tool = gtk_image_tool_dragger_new (view); 
    1038  
    1039     view->transp = GTK_IMAGE_TRANSP_GRID; 
     971     
    1040972    view->check_color1 = 0x666666; 
    1041973    view->check_color2 = 0x999999; 
     974    view->transp = GTK_IMAGE_TRANSP_GRID; 
    1042975 
    1043976    view->hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 1.0, 0.0, 
     
    16091542                           gboolean      invalidate) 
    16101543{ 
    1611     gtk_image_view_scroll_to2 (view, offset_x, offset_y, 
    1612                                TRUE, invalidate, FALSE); 
     1544    gtk_image_view_scroll_to (view, offset_x, offset_y, TRUE, invalidate); 
    16131545} 
    16141546 
     
    17631695          we must also update the adjustments. 
    17641696         */ 
    1765         gtk_image_view_scroll_to2 (view, view->offset_x, view->offset_y, 
    1766                                   FALSE, FALSE, FALSE); 
     1697        gtk_image_view_scroll_to (view, view->offset_x, view->offset_y, 
     1698                                  FALSE, FALSE); 
    17671699        gtk_image_view_update_adjustments (view); 
    17681700        gtk_widget_queue_draw (GTK_WIDGET (view));