--- freeciv-1.11.10/client/gui-gtk/gui_main.c.scrollbar Fri Aug 3 04:08:39 2001 +++ freeciv-1.11.10/client/gui-gtk/gui_main.c Sat Aug 4 17:54:15 2001 @@ -123,7 +123,7 @@ GtkWidget * text_scrollbar; GtkWidget * inputline; -GtkWidget * map_horizontal_scrollbar, *map_vertical_scrollbar; +/*GtkWidget * map_horizontal_scrollbar, *map_vertical_scrollbar;*/ gint gdk_input_id; GdkWindow * root_window; @@ -363,11 +363,13 @@ GtkWidget *ahbox; GtkWidget *frame; + GtkWidget *map_scroll_button; GtkWidget *menubar; GtkWidget *table; GtkWidget *ebox, *paned; GtkStyle *text_style; int i; + gint *dir; paned = gtk_vpaned_new(); gtk_container_add(GTK_CONTAINER(toplevel), paned); @@ -545,12 +547,12 @@ gtk_table_attach_defaults(GTK_TABLE(table), more_arrow_pixmap, 4, 5, 1, 2); } - table = gtk_table_new( 2, 2, FALSE ); + table = gtk_table_new( 3, 3, FALSE ); gtk_box_pack_start( GTK_BOX( hbox ), table, TRUE, TRUE, 0 ); frame = gtk_frame_new( NULL ); gtk_table_attach(GTK_TABLE(table), frame, - 0, 1, 0, 1, + 1, 2, 1, 2, GTK_EXPAND|GTK_SHRINK|GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0 ); @@ -564,13 +566,109 @@ gtk_drawing_area_size(GTK_DRAWING_AREA(map_canvas), 510, 300); gtk_container_add(GTK_CONTAINER(frame), map_canvas); - map_horizontal_scrollbar = gtk_hscrollbar_new(NULL); - gtk_table_attach(GTK_TABLE(table), map_horizontal_scrollbar, 0, 1, 1, 2, - GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); + /* map_horizontal_scrollbar = gtk_hscrollbar_new(NULL); + gtk_table_attach(GTK_TABLE(table), map_horizontal_scrollbar, 0, 1, 1, 2, + GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); + + map_vertical_scrollbar = gtk_vscrollbar_new(NULL); + gtk_table_attach(GTK_TABLE(table), map_vertical_scrollbar, 1, 2, 0, 1, + 0, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0);*/ - map_vertical_scrollbar = gtk_vscrollbar_new(NULL); - gtk_table_attach(GTK_TABLE(table), map_vertical_scrollbar, 1, 2, 0, 1, - 0, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0); + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=1; + dir[1]=is_isometric?-1:0; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("N\no\nr\nt\nh\nE\na\ns\nt"):_("E\na\ns\nt")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 2, 3, 1, 2, + 0, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=is_isometric?1:0; + dir[1]=1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("SouthEast"):_("South")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 1, 2, 2, 3, + GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=-1; + dir[1]=is_isometric?1:0; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("S\no\nu\nt\nh\nW\ne\ns\nt"):_("W\ne\ns\nt")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 0, 1, 1, 2, + 0, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=is_isometric?-1:0; + dir[1]=-1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("NorthWest"):_("North")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 1, 2, 0, 1, + GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); + gtk_signal_connect(GTK_OBJECT( map_scroll_button ), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=is_isometric?0:1; + dir[1]=-1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("N"):_("NE")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 2, 3, 0, 1, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_signal_connect(GTK_OBJECT( map_scroll_button ), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=is_isometric?0:-1; + dir[1]=1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("S"):_("SW")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 0, 1, 2, 3, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_signal_connect(GTK_OBJECT( map_scroll_button ), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=-1; + dir[1]=is_isometric?0:-1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("W"):_("NW")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 0, 1, 0, 1, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_signal_connect(GTK_OBJECT( map_scroll_button ), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); + + dir=(gint*)malloc(2*sizeof(int)); + dir[0]=1; + dir[1]=is_isometric?0:1; + map_scroll_button=gtk_button_new_with_label(is_isometric?_("E"):_("SE")); + gtk_table_attach(GTK_TABLE(table), map_scroll_button, 2, 3, 2, 3, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_signal_connect(GTK_OBJECT( map_scroll_button ), "button_press_event", + GTK_SIGNAL_FUNC(map_scroll_push_callback), + (gpointer)dir); + gtk_signal_connect(GTK_OBJECT(map_scroll_button), "button_release_event", + GTK_SIGNAL_FUNC(map_scroll_release_callback),NULL); /* Event signals */ gtk_signal_connect( GTK_OBJECT( map_canvas ), "expose_event", @@ -607,7 +705,6 @@ text_style->text[GTK_STATE_INSENSITIVE]= text_style->text[GTK_STATE_NORMAL]; gtk_widget_set_style (text, text_style); - gtk_text_set_word_wrap(GTK_TEXT(text), 1); main_message_area = GTK_TEXT (text); --- freeciv-1.11.10/client/gui-gtk/mapview.h.scrollbar Sun Feb 4 05:45:20 2001 +++ freeciv-1.11.10/client/gui-gtk/mapview.h Sat Aug 4 19:41:16 2001 @@ -45,8 +45,10 @@ void pixmap_put_black_tile(GdkDrawable *pm, int canvas_x, int canvas_y); -void scrollbar_jump_callback(GtkAdjustment *adj, gpointer hscrollbar); -void update_map_canvas_scrollbars_size(void); +void map_scroll_push_callback(GtkWidget* w, GtkAdjustment *adj, gpointer data); +void map_scroll_release_callback(GtkWidget* w,GtkAdjustment* adj,gpointer data); +gint map_scroll_timeout(gpointer data); +void map_scroll(int n); void get_map_xy(int canvas_x, int canvas_y, int *map_x, int *map_y); --- freeciv-1.11.10/client/gui-gtk/mapview.c.scrollbar Sat Jul 28 09:23:18 2001 +++ freeciv-1.11.10/client/gui-gtk/mapview.c Sat Aug 4 20:36:35 2001 @@ -24,6 +24,8 @@ #include #include +#include + #include "fcintl.h" #include "game.h" #include "government.h" /* government_graphic() */ @@ -67,11 +69,34 @@ #define EXTRA_BOTTOM_ROW (is_isometric ? 6 : 1) /* contains the x0, y0 coordinates of the upper left corner block */ -int map_view_x0, map_view_y0; +int map_view_x0, map_view_y0, map_view_dx, map_view_dy; /* used by map_canvas expose func */ int force_full_repaint; + +#define MAXSCROLLDISTANCE 3 +#define SCROLLTIMEINTERVAL 150 +#define BUTTONDOWNPAUSE 400 + +/* used for a delay in the scrolling idle */ +time_t lasttime; + +/* used to store the idle tag for button handling */ +gint button_timeout_tag; + +/* used to track whether or not a scroll button is already down */ +int scroll_button_down = 0; + +/* used to track when a scroll button was pushed. */ +time_t button_down_time; + +/* used to track which button press this is. Needed so that fast buttonpresses + * don't also activate the background scroll handler and scroll you more than + * you want. + */ +int buttonpress_instance; + /* T: area above the actual tile. M: the top of the actual tile. B: the bottom of the actual tile. @@ -140,7 +165,6 @@ GdkPixmap *scaled_intro_pixmap; int scaled_intro_pixmap_width, scaled_intro_pixmap_height; -static GtkObject *map_hadj, *map_vadj; /************************************************************************** @@ -874,7 +898,7 @@ } update_map_canvas_visible(); - update_map_canvas_scrollbars(); + /* update_map_canvas_scrollbars();*/ refresh_overview_viewrect(); if (hover_state == HOVER_GOTO || hover_state == HOVER_PATROL) create_line_at_mouse_pos(); @@ -901,7 +925,6 @@ overview_canvas_store_width, overview_canvas_store_height); gtk_widget_set_usize(overview_canvas, 2*x, 2*y); - update_map_canvas_scrollbars_size(); } /************************************************************************** @@ -1087,7 +1110,6 @@ 0, 0, NORMAL_TILE_WIDTH*map_canvas_store_twidth, NORMAL_TILE_HEIGHT*map_canvas_store_theight); - update_map_canvas_scrollbars_size(); map_resized=TRUE; } @@ -1121,7 +1143,7 @@ if(map_resized) { update_map_canvas_visible(); - update_map_canvas_scrollbars(); + /* update_map_canvas_scrollbars();*/ refresh_overview_viewrect(); } @@ -1760,7 +1782,6 @@ { if (!ssprite || !width || !height) return; - gdk_gc_set_clip_origin(civ_gc, canvas_x, canvas_y); gdk_gc_set_clip_mask(civ_gc, ssprite->mask); @@ -1870,69 +1891,81 @@ last_pcity=pcity; } +int map_scroll_add_button_handler(gpointer data) { + if (scroll_button_down) { + buttonpress_instance++; + button_timeout_tag = gtk_timeout_add((gint)data, map_scroll_timeout, + (gpointer)buttonpress_instance); + } + return FALSE; +} + /************************************************************************** ... **************************************************************************/ -void update_map_canvas_scrollbars(void) -{ - gtk_adjustment_set_value(GTK_ADJUSTMENT(map_hadj), map_view_x0); - gtk_adjustment_set_value(GTK_ADJUSTMENT(map_vadj), map_view_y0); +void map_scroll_push_callback(GtkWidget* w, GtkAdjustment* adj, gpointer data){ + gint *dir=data; + map_view_dx=dir[0]; + map_view_dy=dir[1]; + button_down_time = time(NULL); + map_scroll(1); + if ( ! scroll_button_down ) { + button_timeout_tag = gtk_timeout_add(BUTTONDOWNPAUSE, + map_scroll_add_button_handler, (gpointer)SCROLLTIMEINTERVAL); + scroll_button_down = 1; + } } /************************************************************************** ... **************************************************************************/ -void update_map_canvas_scrollbars_size(void) -{ - map_hadj=gtk_adjustment_new(-1, 0, map.xsize, 1, - map_canvas_store_twidth, map_canvas_store_twidth); - map_vadj=gtk_adjustment_new(-1, 0, map.ysize+EXTRA_BOTTOM_ROW, 1, - map_canvas_store_theight, map_canvas_store_theight); - gtk_range_set_adjustment(GTK_RANGE(map_horizontal_scrollbar), - GTK_ADJUSTMENT(map_hadj)); - gtk_range_set_adjustment(GTK_RANGE(map_vertical_scrollbar), - GTK_ADJUSTMENT(map_vadj)); - - gtk_signal_connect(GTK_OBJECT(map_hadj), "value_changed", - GTK_SIGNAL_FUNC(scrollbar_jump_callback), (gpointer)TRUE); - gtk_signal_connect(GTK_OBJECT(map_vadj), "value_changed", - GTK_SIGNAL_FUNC(scrollbar_jump_callback), (gpointer)FALSE); +void map_scroll_release_callback(GtkWidget* w, GtkAdjustment* adj, gpointer data){ + map_view_dx=0; + map_view_dy=0; + if ( scroll_button_down ) { + gtk_timeout_remove(button_timeout_tag); + scroll_button_down = 0; + buttonpress_instance++; + } } /************************************************************************** ... **************************************************************************/ -void scrollbar_jump_callback(GtkAdjustment *adj, gpointer hscrollbar) -{ - int last_map_view_x0; - int last_map_view_y0; - - gfloat percent=adj->value; - if(get_client_state()!=CLIENT_GAME_RUNNING_STATE) - return; +void map_scroll(int n) { + map_view_x0 += n * map_view_dx; + map_view_y0 += n * map_view_dy; + /* Be paranoid, in case abs(map_view_x0) > 2*map.xsize... */ + while (map_view_x0>map.xsize) + map_view_x0 -= map.xsize; + while (map_view_x0<0) + map_view_x0 += map.xsize; + if (map_view_y0>map.ysize+EXTRA_BOTTOM_ROW-map_canvas_store_theight) + map_view_y0=map.ysize+EXTRA_BOTTOM_ROW-map_canvas_store_theight; + if (map_view_y0<0) + map_view_y0=0; + update_map_canvas_visible(); + refresh_overview_viewrect(); +} - last_map_view_x0=map_view_x0; - last_map_view_y0=map_view_y0; +static int scroll_distance (int timediff) { + int d; - if(hscrollbar) - map_view_x0=percent; - else { - map_view_y0=percent; - map_view_y0=(map_view_y0<0) ? 0 : map_view_y0; - map_view_y0= - (map_view_y0>map.ysize+EXTRA_BOTTOM_ROW-map_canvas_store_theight) ? - map.ysize+EXTRA_BOTTOM_ROW-map_canvas_store_theight : - map_view_y0; - } + d = timediff / 2 + 1; + return (d > MAXSCROLLDISTANCE ? MAXSCROLLDISTANCE : d); +} - if (last_map_view_x0!=map_view_x0 || last_map_view_y0!=map_view_y0) { - update_map_canvas_visible(); - refresh_overview_viewrect(); +gint map_scroll_timeout(gpointer data){ + time_t now = time(NULL); + if ((int)data == buttonpress_instance) { + map_scroll(scroll_distance(now - button_down_time)); + return TRUE; + } else { + return FALSE; } } - /************************************************************************** draw a line from src_x,src_y -> dest_x,dest_y on both map_canvas and map_canvas_store