--- 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 Sun Aug 5 03:53:42 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 Sun Aug 5 04:16:16 2001 @@ -45,8 +45,11 @@ 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_handler(gpointer data); +gint adjust_scroll_speed(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 Sun Aug 5 05:07:45 2001 @@ -24,6 +24,8 @@ #include #include +#include + #include "fcintl.h" #include "game.h" #include "government.h" /* government_graphic() */ @@ -67,11 +69,36 @@ #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 MAXSCROLLSPEED ((map.xsize + map.ysize)/6 + 1) +/* #define MAXSCROLLSPEED 50 */ +#define SCROLLTIMEINTERVALUPDATEINTERVAL 100 +#define INITIALSCROLLSPEED 5 +#define BUTTONDOWNPAUSE (1000/INITIALSCROLLSPEED) + +/* how much time to wait until we scroll again with the button down */ +int scroll_speed; + +/* used to store the timeout tag for button handling */ +gint button_timeout_tag; + +/* used to store the timeout tag for interval adjustment */ +gint adjust_timeout_tag; + +/* used to store how long it took to draw the last map update */ +gdouble map_update_time = 0.0; + +/* 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 = 0; +int buttonrelease_instance = 0; + /* T: area above the actual tile. M: the top of the actual tile. B: the bottom of the actual tile. @@ -140,7 +167,6 @@ GdkPixmap *scaled_intro_pixmap; int scaled_intro_pixmap_width, scaled_intro_pixmap_height; -static GtkObject *map_hadj, *map_vadj; /************************************************************************** @@ -874,7 +900,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 +927,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 +1112,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 +1145,7 @@ if(map_resized) { update_map_canvas_visible(); - update_map_canvas_scrollbars(); + /* update_map_canvas_scrollbars();*/ refresh_overview_viewrect(); } @@ -1760,7 +1784,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 +1893,109 @@ last_pcity=pcity; } +int map_scroll_start_continuous_scrolling(gpointer data) { + scroll_speed = (gint)data; + map_scroll_timeout_handler((gpointer)buttonpress_instance); + /* button_timeout_tag = gtk_timeout_add(1000/scroll_speed, + map_scroll_timeout_handler, (gpointer)buttonpress_instance); */ + adjust_timeout_tag = gtk_timeout_add(SCROLLTIMEINTERVALUPDATEINTERVAL, + adjust_scroll_speed, (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; + if (buttonpress_instance > buttonrelease_instance) return; + buttonpress_instance++; + map_view_dx=dir[0]; + map_view_dy=dir[1]; + map_scroll(1); + gtk_timeout_remove(button_timeout_tag); + gtk_timeout_remove(adjust_timeout_tag); + map_update_time = 0.0; + button_timeout_tag = gtk_timeout_add(BUTTONDOWNPAUSE, + map_scroll_start_continuous_scrolling, + (gpointer)INITIALSCROLLSPEED); } /************************************************************************** ... **************************************************************************/ -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; + buttonrelease_instance++; + gtk_timeout_remove(button_timeout_tag); + gtk_timeout_remove(adjust_timeout_tag); } /************************************************************************** ... **************************************************************************/ -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; - - last_map_view_x0=map_view_x0; - last_map_view_y0=map_view_y0; +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(); + gdk_flush(); +} - 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; +gint adjust_scroll_speed(gpointer data){ + if ((int)data != buttonpress_instance || (map_view_dx == 0 && + map_view_dy == 0)) return FALSE; + scroll_speed ++; + if (scroll_speed > MAXSCROLLSPEED) { + scroll_speed = MAXSCROLLSPEED; + return FALSE; } + return TRUE; +} - 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_handler(gpointer data){ + static GTimer *timer = NULL; + gdouble interval; + gint timeout = 0; + static gint oldtimeout = 0; + static gdouble old_map_update_time = 0.0; + + if ((int)data != buttonpress_instance || (map_view_dx == 0 && + map_view_dy == 0)) return FALSE; + if ( timer == NULL ) timer = g_timer_new(); + interval = 1.0 / scroll_speed; + g_timer_reset(timer); + g_timer_start(timer); + map_scroll(1 + (int)((old_map_update_time + map_update_time) / + (2.0*interval))); + g_timer_stop(timer); + old_map_update_time = map_update_time; + map_update_time = g_timer_elapsed(timer, NULL); + gtk_timeout_remove(button_timeout_tag); + oldtimeout = timeout; + timeout = 1000/scroll_speed - (gint)map_update_time; + /* if (timeout < (1000/MAXSCROLLSPEED)) timeout = 1000/MAXSCROLLSPEED; */ + if (timeout < 1) timeout = 1; + if (timeout != oldtimeout) { + button_timeout_tag = gtk_timeout_add(timeout, + map_scroll_timeout_handler, data); + return FALSE; } + return TRUE; } - /************************************************************************** draw a line from src_x,src_y -> dest_x,dest_y on both map_canvas and map_canvas_store