Author: jtn Date: Mon May 4 13:51:04 2015 New Revision: 28987 URL: http://svn.gna.org/viewcvs/freeciv?rev=28987&view=rev Log: In Gtk client, make the more-units arrow button fixed-size, so that the layout doesn't jump around when switching focus between unit stacks of different sizes.
See gna bug #23562. Modified: branches/S2_5/client/gui-gtk-2.0/gui_main.c branches/S2_5/client/gui-gtk-3.0/gui_main.c Modified: branches/S2_5/client/gui-gtk-2.0/gui_main.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/gui-gtk-2.0/gui_main.c?rev=28987&r1=28986&r2=28987&view=diff ============================================================================== --- branches/S2_5/client/gui-gtk-2.0/gui_main.c (original) +++ branches/S2_5/client/gui-gtk-2.0/gui_main.c Mon May 4 13:51:04 2015 @@ -183,6 +183,7 @@ static GtkWidget *unit_below_pixmap_button[MAX_NUM_UNITS_BELOW]; static GtkWidget *more_arrow_pixmap; static GtkWidget *more_arrow_pixmap_button; +static GtkWidget *more_arrow_pixmap_container; static int unit_id_top; static int unit_ids[MAX_NUM_UNITS_BELOW]; /* ids of the units icons in @@ -871,24 +872,36 @@ } /* create arrow (popup for all units on the selected tile) */ - more_arrow_pixmap = gtk_image_new_from_pixbuf( - sprite_get_pixbuf(get_arrow_sprite(tileset, ARROW_RIGHT))); - g_object_ref(more_arrow_pixmap); - more_arrow_pixmap_button = gtk_event_box_new(); - g_object_ref(more_arrow_pixmap_button); - gtk_container_add(GTK_CONTAINER(more_arrow_pixmap_button), - more_arrow_pixmap); - g_signal_connect(more_arrow_pixmap_button, - "button_press_event", - G_CALLBACK(select_more_arrow_pixmap_callback), NULL); + { + GdkPixbuf *more_arrow = + sprite_get_pixbuf(get_arrow_sprite(tileset, ARROW_RIGHT)); + + more_arrow_pixmap = gtk_image_new_from_pixbuf(more_arrow); + g_object_ref(more_arrow_pixmap); + more_arrow_pixmap_button = gtk_event_box_new(); + g_object_ref(more_arrow_pixmap_button); + gtk_container_add(GTK_CONTAINER(more_arrow_pixmap_button), + more_arrow_pixmap); + g_signal_connect(more_arrow_pixmap_button, + "button_press_event", + G_CALLBACK(select_more_arrow_pixmap_callback), NULL); + /* An extra layer so that we can hide the clickable button but keep + * an explicit size request to avoid the layout jumping around */ + more_arrow_pixmap_container = gtk_alignment_new(0.5, 0.5, 0, 0); + g_object_ref(more_arrow_pixmap_container); + gtk_container_add(GTK_CONTAINER(more_arrow_pixmap_container), + more_arrow_pixmap_button); + gtk_widget_set_size_request(more_arrow_pixmap_container, + gdk_pixbuf_get_width(more_arrow), -1); + } if (!gui_gtk2_small_display_layout) { /* Display on bottom row. */ - gtk_table_attach_defaults(GTK_TABLE(table), more_arrow_pixmap_button, + gtk_table_attach_defaults(GTK_TABLE(table), more_arrow_pixmap_container, MAX_NUM_UNITS_BELOW, MAX_NUM_UNITS_BELOW+1, 1, 2); } else { /* Display on top row (there is no bottom row). */ - gtk_table_attach_defaults(GTK_TABLE(table), more_arrow_pixmap_button, + gtk_table_attach_defaults(GTK_TABLE(table), more_arrow_pixmap_container, MAX_NUM_UNITS_BELOW, MAX_NUM_UNITS_BELOW+1, 0, 1); } @@ -920,9 +933,10 @@ } } gtk_container_remove(GTK_CONTAINER(unit_pixmap_table), - more_arrow_pixmap_button); + more_arrow_pixmap_container); g_object_unref(more_arrow_pixmap); g_object_unref(more_arrow_pixmap_button); + g_object_unref(more_arrow_pixmap_container); } populate_unit_pixmap_table(); Modified: branches/S2_5/client/gui-gtk-3.0/gui_main.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/gui-gtk-3.0/gui_main.c?rev=28987&r1=28986&r2=28987&view=diff ============================================================================== --- branches/S2_5/client/gui-gtk-3.0/gui_main.c (original) +++ branches/S2_5/client/gui-gtk-3.0/gui_main.c Mon May 4 13:51:04 2015 @@ -168,6 +168,7 @@ static GtkWidget *unit_below_pixmap_button[MAX_NUM_UNITS_BELOW]; static GtkWidget *more_arrow_pixmap; static GtkWidget *more_arrow_pixmap_button; +static GtkWidget *more_arrow_pixmap_container; static int unit_id_top; static int unit_ids[MAX_NUM_UNITS_BELOW]; /* ids of the units icons in @@ -868,24 +869,33 @@ /* create arrow (popup for all units on the selected tile) */ pix = sprite_get_pixbuf(get_arrow_sprite(tileset, ARROW_RIGHT)); more_arrow_pixmap = gtk_image_new_from_pixbuf(pix); - g_object_unref(G_OBJECT(pix)); g_object_ref(more_arrow_pixmap); more_arrow_pixmap_button = gtk_event_box_new(); g_object_ref(more_arrow_pixmap_button); - gtk_event_box_set_visible_window(GTK_EVENT_BOX(more_arrow_pixmap_button), FALSE); + gtk_event_box_set_visible_window(GTK_EVENT_BOX(more_arrow_pixmap_button), + FALSE); gtk_container_add(GTK_CONTAINER(more_arrow_pixmap_button), more_arrow_pixmap); g_signal_connect(more_arrow_pixmap_button, "button_press_event", G_CALLBACK(select_more_arrow_pixmap_callback), NULL); + /* An extra layer so that we can hide the clickable button but keep + * an explicit size request to avoid the layout jumping around */ + more_arrow_pixmap_container = gtk_alignment_new(0.5, 0.5, 0, 0); + g_object_ref(more_arrow_pixmap_container); + gtk_container_add(GTK_CONTAINER(more_arrow_pixmap_container), + more_arrow_pixmap_button); + gtk_widget_set_size_request(more_arrow_pixmap_container, + gdk_pixbuf_get_width(pix), -1); + g_object_unref(G_OBJECT(pix)); if (!gui_gtk3_small_display_layout) { /* Display on bottom row. */ - gtk_grid_attach(GTK_GRID(table), more_arrow_pixmap_button, + gtk_grid_attach(GTK_GRID(table), more_arrow_pixmap_container, MAX_NUM_UNITS_BELOW, 1, 1, 1); } else { /* Display on top row (there is no bottom row). */ - gtk_grid_attach(GTK_GRID(table), more_arrow_pixmap_button, + gtk_grid_attach(GTK_GRID(table), more_arrow_pixmap_container, MAX_NUM_UNITS_BELOW, 0, 1, 1); } @@ -917,9 +927,10 @@ } } gtk_container_remove(GTK_CONTAINER(unit_pixmap_table), - more_arrow_pixmap_button); + more_arrow_pixmap_container); g_object_unref(more_arrow_pixmap); g_object_unref(more_arrow_pixmap_button); + g_object_unref(more_arrow_pixmap_container); } populate_unit_pixmap_table(); _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits