From 3001e8147c148ecfdbb172e951c2548619b5be3d Mon Sep 17 00:00:00 2001 From: Dino Date: Sun, 8 Feb 2026 15:57:22 -0500 Subject: [PATCH] gtk3.22 & gtk4 clients: add zoom in/out menu items RM #943 --- client/gui-gtk-3.22/gui_main.c | 72 +++++++++++++++++----------------- client/gui-gtk-3.22/menu.c | 31 +++++++++++++-- client/gui-gtk-4.0/gui_main.c | 20 +++++----- client/gui-gtk-4.0/menu.c | 37 +++++++++++++++++ data/gtk3.22_menus.xml | 6 +++ 5 files changed, 114 insertions(+), 52 deletions(-) diff --git a/client/gui-gtk-3.22/gui_main.c b/client/gui-gtk-3.22/gui_main.c index fcc70d2e9b..aaac81ea28 100644 --- a/client/gui-gtk-3.22/gui_main.c +++ b/client/gui-gtk-3.22/gui_main.c @@ -172,7 +172,7 @@ 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 +static int unit_ids[MAX_NUM_UNITS_BELOW]; /* ids of the units icons in * information display: (or 0) */ GtkTextView *main_message_area; GtkTextBuffer *message_buffer = NULL; @@ -260,7 +260,7 @@ static gboolean timer_callback(gpointer data) /**********************************************************************//** Print extra usage information, including one line help on each option, - to stderr. + to stderr. **************************************************************************/ static void print_usage(void) { @@ -317,14 +317,14 @@ static gboolean toplevel_focus(GtkWidget *w, GtkDirectionType arg) switch (arg) { case GTK_DIR_TAB_FORWARD: case GTK_DIR_TAB_BACKWARD: - + if (!gtk_widget_get_can_focus(w)) { - return FALSE; + return FALSE; } if (!gtk_widget_is_focus(w)) { - gtk_widget_grab_focus(w); - return TRUE; + gtk_widget_grab_focus(w); + return TRUE; } break; @@ -384,8 +384,8 @@ static gboolean toplevel_handler(GtkWidget *w, GdkEvent *ev, gpointer data) && gtk_text_view_get_editable(GTK_TEXT_VIEW(focus)))) { /* Propagate event to currently focused entry widget. */ if (gtk_widget_event(focus, ev)) { - /* Do not propagate event to our children. */ - return TRUE; + /* Do not propagate event to our children. */ + return TRUE; } } } @@ -425,12 +425,12 @@ static gboolean key_press_map_canvas(GtkWidget *w, GdkEventKey *ev, case GDK_KEY_Page_Up: g_signal_emit_by_name(main_message_area, "move_cursor", - GTK_MOVEMENT_PAGES, -1, FALSE); + GTK_MOVEMENT_PAGES, -1, FALSE); return TRUE; case GDK_KEY_Page_Down: g_signal_emit_by_name(main_message_area, "move_cursor", - GTK_MOVEMENT_PAGES, 1, FALSE); + GTK_MOVEMENT_PAGES, 1, FALSE); return TRUE; default: @@ -472,12 +472,10 @@ static gboolean key_press_map_canvas(GtkWidget *w, GdkEventKey *ev, } if (!(ev->state & ACCL_MOD_KEY)) { switch (ev->keyval) { - case GDK_KEY_plus: case GDK_KEY_KP_Add: zoom_step_up(); return TRUE; - case GDK_KEY_minus: case GDK_KEY_KP_Subtract: zoom_step_down(); return TRUE; @@ -551,9 +549,9 @@ static gboolean key_press_map_canvas(GtkWidget *w, GdkEventKey *ev, return TRUE; case GDK_KEY_KP_Begin: - case GDK_KEY_KP_5: + case GDK_KEY_KP_5: case GDK_KEY_5: - key_recall_previous_focus_unit(); + key_recall_previous_focus_unit(); return TRUE; case GDK_KEY_Escape: @@ -802,7 +800,7 @@ static void tearoff_callback(GtkWidget *b, gpointer data) gtk_window_set_position(GTK_WINDOW(w), GTK_WIN_POS_MOUSE); g_signal_connect(w, "destroy", G_CALLBACK(tearoff_destroy), box); g_signal_connect(w, "key_press_event", - G_CALLBACK(propagate_keypress), NULL); + G_CALLBACK(propagate_keypress), NULL); g_object_set_data(G_OBJECT(w), "parent", gtk_widget_get_parent(box)); g_object_set_data(G_OBJECT(w), "toggle", b); @@ -923,7 +921,7 @@ static void populate_unit_image_table(void) gtk_container_add(GTK_CONTAINER(unit_image_button), unit_image); gtk_grid_attach(GTK_GRID(table), unit_image_button, 0, 0, 1, 1); g_signal_connect(unit_image_button, "button_press_event", - G_CALLBACK(select_unit_image_callback), + G_CALLBACK(select_unit_image_callback), GINT_TO_POINTER(-1)); if (!GUI_GTK_OPTION(small_display_layout)) { @@ -1240,28 +1238,28 @@ static void setup_widgets(void) gtk_widget_set_halign(overview_canvas, GTK_ALIGN_CENTER); gtk_widget_set_valign(overview_canvas, GTK_ALIGN_CENTER); gtk_widget_set_size_request(overview_canvas, overview_canvas_store_width, - overview_canvas_store_height); + overview_canvas_store_height); gtk_widget_set_size_request(overview_scrolled_window, overview_canvas_store_width, - overview_canvas_store_height); + overview_canvas_store_height); gtk_widget_set_hexpand(overview_canvas, TRUE); gtk_widget_set_vexpand(overview_canvas, TRUE); gtk_widget_add_events(overview_canvas, GDK_EXPOSURE_MASK - |GDK_BUTTON_PRESS_MASK - |GDK_POINTER_MOTION_MASK); + |GDK_BUTTON_PRESS_MASK + |GDK_POINTER_MOTION_MASK); gtk_container_add(GTK_CONTAINER(avbox), overview_scrolled_window); - gtk_container_add(GTK_CONTAINER(overview_scrolled_window), + gtk_container_add(GTK_CONTAINER(overview_scrolled_window), overview_canvas); - + g_signal_connect(overview_canvas, "draw", - G_CALLBACK(overview_canvas_draw), NULL); + G_CALLBACK(overview_canvas_draw), NULL); g_signal_connect(overview_canvas, "motion_notify_event", - G_CALLBACK(move_overviewcanvas), NULL); + G_CALLBACK(move_overviewcanvas), NULL); g_signal_connect(overview_canvas, "button_press_event", - G_CALLBACK(butt_down_overviewcanvas), NULL); + G_CALLBACK(butt_down_overviewcanvas), NULL); /* The rest */ @@ -1377,7 +1375,7 @@ static void setup_widgets(void) break; case 2: w = flake_label; - flake_ebox = ebox; + flake_ebox = ebox; break; default: case 3: @@ -1610,9 +1608,9 @@ static void setup_widgets(void) sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_ETCHED_IN); + GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); + GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(vgrid), sw); label = gtk_label_new(_("Chat")); @@ -2265,7 +2263,7 @@ static gboolean get_net_input(GIOChannel *source, GIOCondition condition, Set socket writability state **************************************************************************/ static void set_wait_for_writable_socket(struct connection *pc, - bool socket_writable) + bool socket_writable) { static bool previous_state = FALSE; @@ -2351,18 +2349,18 @@ void popup_quit_dialog(void) if (!dialog) { dialog = gtk_message_dialog_new(NULL, - 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_YES_NO, - _("Are you sure you want to quit?")); + 0, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_YES_NO, + _("Are you sure you want to quit?")); setup_dialog(dialog, toplevel); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); - g_signal_connect(dialog, "response", - G_CALLBACK(quit_dialog_response), NULL); + g_signal_connect(dialog, "response", + G_CALLBACK(quit_dialog_response), NULL); g_signal_connect(dialog, "destroy", - G_CALLBACK(gtk_widget_destroyed), &dialog); + G_CALLBACK(gtk_widget_destroyed), &dialog); } gtk_window_present(GTK_WINDOW(dialog)); @@ -2625,7 +2623,7 @@ static void adjust_default_options(void) if (scr_height > 0) { /* Adjust these options only if we do know the screen height. */ - + if (scr_height <= 480) { /* Freeciv is practically unusable outside fullscreen mode in so * small display */ diff --git a/client/gui-gtk-3.22/menu.c b/client/gui-gtk-3.22/menu.c index 0d90bbe2b4..a1e4c838ff 100644 --- a/client/gui-gtk-3.22/menu.c +++ b/client/gui-gtk-3.22/menu.c @@ -40,6 +40,7 @@ #include "mapview_common.h" #include "options.h" #include "tilespec.h" +#include "zoom.h" /* client/gui-gtk-3.22 */ #include "chatline.h" @@ -215,6 +216,8 @@ static void toggle_fog_callback(GtkCheckMenuItem *item, gpointer data); static void scenario_properties_callback(GtkMenuItem *item, gpointer data); static void save_scenario_callback(GtkMenuItem *item, gpointer data); static void center_view_callback(GtkMenuItem *item, gpointer data); +static void zoom_in_callback(GtkMenuItem *item, gpointer data); +static void zoom_out_callback(GtkMenuItem *item, gpointer data); static void report_economy_callback(GtkMenuItem *item, gpointer data); static void report_research_callback(GtkMenuItem *item, gpointer data); static void multiplier_callback(GtkMenuItem *item, gpointer data); @@ -507,6 +510,10 @@ static struct menu_entry_info menu_entries[] = { "CENTER_VIEW", N_("_Center View"), GDK_KEY_c, 0, G_CALLBACK(center_view_callback), MGROUP_PLAYER }, + { "ZOOM_IN", N_("_Zoom in"), GDK_KEY_plus, 0, + G_CALLBACK(zoom_in_callback), MGROUP_PLAYER }, + { "ZOOM_OUT", N_("_Zoom out"), GDK_KEY_minus, 0, + G_CALLBACK(zoom_out_callback), MGROUP_PLAYER }, { "REPORT_ECONOMY", N_("_Economy"), GDK_KEY_F5, 0, G_CALLBACK(report_economy_callback), MGROUP_PLAYER }, { "REPORT_RESEARCH", N_("_Research"), GDK_KEY_F6, 0, @@ -742,7 +749,7 @@ static void leave_callback(GtkMenuItem *item, gpointer data) _("Leaving a local game will end it!")); setup_dialog(dialog, toplevel); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); - g_signal_connect(dialog, "response", + g_signal_connect(dialog, "response", G_CALLBACK(leave_local_game_response), NULL); gtk_window_present(GTK_WINDOW(dialog)); } else { @@ -2076,6 +2083,22 @@ static void center_view_callback(GtkMenuItem *action, gpointer data) center_on_unit(); } +/************************************************************************//** + Action "ZOOM_IN" callback. +****************************************************************************/ +static void zoom_in_callback(GtkMenuItem *action, gpointer data) +{ + zoom_step_up(); +} + +/************************************************************************//** + Action "ZOOM_OUT" callback. +****************************************************************************/ +static void zoom_out_callback(GtkMenuItem *action, gpointer data) +{ + zoom_step_down(); +} + /************************************************************************//** Action "REPORT_UNITS" callback. ****************************************************************************/ @@ -2652,7 +2675,7 @@ void real_menus_update(void) units_can_load(punits)); menu_entry_set_sensitive("UNIT_DEBOARD", units_can_unload(punits)); - menu_entry_set_sensitive("UNIT_UNSENTRY", + menu_entry_set_sensitive("UNIT_UNSENTRY", units_have_activity_on_tile(punits, ACTIVITY_SENTRY)); menu_entry_set_sensitive("AUTO_SETTLER", @@ -2698,7 +2721,7 @@ void real_menus_update(void) extras = extra_type_list_by_cause(EC_IRRIGATION); - if (extra_type_list_size(extras) > 0) { + if (extra_type_list_size(extras) > 0) { struct extra_type *tgt; tgt = extra_type_list_get(extras, 0); @@ -2725,7 +2748,7 @@ void real_menus_update(void) break; } } unit_list_iterate_end; - + if (city_on_tile && units_can_do_action(punits, ACTION_JOIN_CITY, TRUE)) { menus_rename("BUILD_CITY", diff --git a/client/gui-gtk-4.0/gui_main.c b/client/gui-gtk-4.0/gui_main.c index 087da21dfa..65a33bdb4e 100644 --- a/client/gui-gtk-4.0/gui_main.c +++ b/client/gui-gtk-4.0/gui_main.c @@ -337,12 +337,12 @@ static void toplevel_focus(GtkWidget *w, GtkDirectionType arg, case GTK_DIR_TAB_BACKWARD: if (!gtk_widget_get_can_focus(w)) { - return; + return; } if (!gtk_widget_is_focus(w)) { - gtk_widget_grab_focus(w); - return; + gtk_widget_grab_focus(w); + return; } break; @@ -467,12 +467,10 @@ static gboolean key_press_map_canvas(guint keyval, GdkModifierType state) } } else if (!(state & GDK_CONTROL_MASK)) { switch (keyval) { - case GDK_KEY_plus: case GDK_KEY_KP_Add: zoom_step_up(); return TRUE; - case GDK_KEY_minus: case GDK_KEY_KP_Subtract: zoom_step_down(); return TRUE; @@ -1278,7 +1276,7 @@ static void setup_widgets(void) gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(mc_gesture), 3); controller = GTK_EVENT_CONTROLLER(mc_gesture); g_signal_connect(controller, "pressed", - G_CALLBACK(reverse_taxrates_callback), NULL); + G_CALLBACK(reverse_taxrates_callback), NULL); gtk_widget_add_controller(econ_label[i], controller); gtk_grid_attach(GTK_GRID(table2), econ_label[i], i, 0, 1, 1); } @@ -2279,7 +2277,7 @@ static gboolean get_net_input(GIOChannel *source, GIOCondition condition, Set socket writability state **************************************************************************/ static void set_wait_for_writable_socket(struct connection *pc, - bool socket_writable) + bool socket_writable) { static bool previous_state = FALSE; @@ -2365,10 +2363,10 @@ void popup_quit_dialog(void) if (!dialog) { dialog = gtk_message_dialog_new(NULL, - 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_YES_NO, - _("Are you sure you want to quit?")); + 0, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_YES_NO, + _("Are you sure you want to quit?")); setup_dialog(dialog, toplevel); g_signal_connect(dialog, "response", diff --git a/client/gui-gtk-4.0/menu.c b/client/gui-gtk-4.0/menu.c index 0cc26c1c3f..fda959a1c8 100644 --- a/client/gui-gtk-4.0/menu.c +++ b/client/gui-gtk-4.0/menu.c @@ -40,6 +40,7 @@ #include "mapview_common.h" #include "options.h" #include "tilespec.h" +#include "zoom.h" /* client/gui-gtk-4.0 */ #include "chatline.h" @@ -374,6 +375,12 @@ static void full_screen_callback(GSimpleAction *action, static void center_view_callback(GSimpleAction *action, GVariant *parameter, gpointer data); +static void zoom_in_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data); +static void zoom_out_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data); static void report_economy_callback(GSimpleAction *action, GVariant *parameter, gpointer data); @@ -718,6 +725,12 @@ static struct menu_entry_info menu_entries[] = { "CENTER_VIEW", N_("_Center View"), "center_view", "c", MGROUP_PLAYER | MGROUP_CHAR, NULL, FALSE }, + { "ZOOM_IN", N_("_Zoom in"), + "zoom_in", "plus", MGROUP_PLAYER, + NULL, FALSE }, + { "ZOOM_OUT", N_("_Zoom out"), + "zoom_out", "minus", MGROUP_PLAYER, + NULL, FALSE }, /* Select menu */ { "SELECT_SINGLE", N_("_Single Unit (Unselect Others)"), @@ -1087,6 +1100,8 @@ const GActionEntry acts[] = { { "lua_script", client_lua_script_callback }, { "center_view", center_view_callback }, + { "zoom_in", zoom_in_callback }, + { "zoom_out", zoom_out_callback }, { "select_single", select_single_callback }, { "select_all_tile", select_all_on_tile_callback }, @@ -2843,6 +2858,26 @@ static void center_view_callback(GSimpleAction *action, center_on_unit(); } +/************************************************************************//** + Action "ZOOM_IN" callback. +****************************************************************************/ +static void zoom_in_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + zoom_step_up(); +} + +/************************************************************************//** + Action "ZOOM_OUT" callback. +****************************************************************************/ +static void zoom_out_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + zoom_step_down(); +} + /************************************************************************//** Action "REPORT_UNITS" callback. ****************************************************************************/ @@ -3157,6 +3192,8 @@ static GMenu *setup_menus(GtkApplication *app) menu_entry_init(view_menu, "FULL_SCREEN"); menu_entry_init(view_menu, "CENTER_VIEW"); + menu_entry_init(view_menu, "ZOOM_IN"); + menu_entry_init(view_menu, "ZOOM_OUT"); submenu_append_unref(menubar, Q_("?verb:_View"), G_MENU_MODEL(view_menu)); diff --git a/data/gtk3.22_menus.xml b/data/gtk3.22_menus.xml index 7189df6b59..d979d2d819 100644 --- a/data/gtk3.22_menus.xml +++ b/data/gtk3.22_menus.xml @@ -225,6 +225,12 @@ + + + + + + -- 2.31.0