From 059bd015a3744330540fce846bcfd79dd2c41be4 Mon Sep 17 00:00:00 2001 From: ISpillMyDrink Date: Thu, 9 Apr 2026 16:07:52 +0200 Subject: [PATCH] oscviewer: add a "Jump to Current" menu entry --- src/oscviewer/oscviewer.c | 62 +++++++++++++++++++++++++++++++++++ src/oscviewer/oscviewer.glade | 7 ++++ src/oscviewer/oscviewer.h | 3 ++ 3 files changed, 72 insertions(+) diff --git a/src/oscviewer/oscviewer.c b/src/oscviewer/oscviewer.c index 2ee1530..463e505 100644 --- a/src/oscviewer/oscviewer.c +++ b/src/oscviewer/oscviewer.c @@ -169,6 +169,7 @@ int main(int argc, char **argv) gtk_menu_item_set_label(GTK_MENU_ITEM(optionsmi), _("View")); // left res menu + jumpcurrentmi = GTK_WIDGET(gtk_builder_get_object(builder, "jumpcurrentmi")); leftresolutionmi = GTK_WIDGET(gtk_builder_get_object(builder, "leftresolutionmi")); leftresbutton1 = GTK_WIDGET(gtk_builder_get_object(builder, "leftresbutton1")); leftresbutton2 = GTK_WIDGET(gtk_builder_get_object(builder, "leftresbutton2")); @@ -460,6 +461,7 @@ int main(int argc, char **argv) gtk_widget_add_accelerator(showgoodcheck, "activate", accel_group, GDK_KEY_g, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); gtk_widget_add_accelerator(showbadcheck, "activate", accel_group, GDK_KEY_b, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); gtk_widget_add_accelerator(showdomaincheck, "activate", accel_group, GDK_KEY_d, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator(jumpcurrentmi, "activate", accel_group, GDK_KEY_j, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); // set it to exit if the quit item is selected g_signal_connect(G_OBJECT(quitmi), "activate", G_CALLBACK(gtk_main_quit), NULL); @@ -481,6 +483,8 @@ int main(int argc, char **argv) g_signal_connect(G_OBJECT(leftresbutton3), "activate", G_CALLBACK(change_left_resolution), GINT_TO_POINTER(3)); g_signal_connect(G_OBJECT(leftresbutton4), "activate", G_CALLBACK(change_left_resolution), GINT_TO_POINTER(4)); + g_signal_connect(G_OBJECT(jumpcurrentmi), "activate", G_CALLBACK(jump_to_current), NULL); + g_signal_connect(G_OBJECT(mainresbutton4), "activate", G_CALLBACK(change_main_resolution), GINT_TO_POINTER(4)); g_signal_connect(G_OBJECT(mainresbutton6), "activate", G_CALLBACK(change_main_resolution), GINT_TO_POINTER(6)); g_signal_connect(G_OBJECT(mainresbutton8), "activate", G_CALLBACK(change_main_resolution), GINT_TO_POINTER(8)); @@ -1610,6 +1614,64 @@ void change_main_grid_size(GtkWidget *w, gpointer data) gtk_widget_queue_draw(main_window); } +void jump_to_current(GtkWidget *w, gpointer data) +{ + if (total_size <= 0 || main_square_size <= 0 || main_scrolled_window == NULL) + { + return; + } + + int columns = main_drawing_area_width / main_square_size; + int rows = main_drawing_area_height / main_square_size; + int squares = columns * rows; + if (columns <= 0 || rows <= 0 || squares <= 0) + { + return; + } + + long long blocks_per_square = total_size / (squares - 1); + int adjustment = 1; + while (total_size > squares * blocks_per_square && (squares - adjustment) > 0) + { + adjustment++; + blocks_per_square = total_size / (squares - adjustment); + } + if (blocks_per_square <= 0) + { + blocks_per_square = 1; + } + + long long current_square = current_position / blocks_per_square; + int current_row = current_square / columns; + int current_col = current_square % columns; + gdouble target = (current_row * main_square_size) - (main_scrolled_window_height / 2.0) + (main_square_size / 2.0); + + GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(main_scrolled_window)); + gdouble lower = gtk_adjustment_get_lower(vadj); + gdouble upper = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj); + if (upper < lower) + { + upper = lower; + } + if (target < lower) + { + target = lower; + } + if (target > upper) + { + target = upper; + } + + mouse_x = (current_col * main_square_size) + square_adjust + (main_square_size / 2); + mouse_y = (current_row * main_square_size) + square_adjust + (main_square_size / 2); + mouse_x_old = mouse_x - 1; + mouse_y_old = mouse_y - 1; + + gtk_adjustment_set_value(vadj, target); + invalidate_render_caches(FALSE, TRUE, FALSE); + gtk_widget_queue_draw(main_window); +} + void get_rgb_color(int color) { bcolor = (double)(color & 0xff) / 255; diff --git a/src/oscviewer/oscviewer.glade b/src/oscviewer/oscviewer.glade index ace5e23..a94d16a 100644 --- a/src/oscviewer/oscviewer.glade +++ b/src/oscviewer/oscviewer.glade @@ -89,6 +89,13 @@ True False + + + True + False + Jump to Current + + True diff --git a/src/oscviewer/oscviewer.h b/src/oscviewer/oscviewer.h index 45f83c7..b821188 100644 --- a/src/oscviewer/oscviewer.h +++ b/src/oscviewer/oscviewer.h @@ -196,6 +196,7 @@ GtkWidget *mainsizebutton2m; GtkWidget *mainsizebutton4m; GtkWidget *mainsizebutton8m; GtkWidget *mainsizebutton16m; +GtkWidget *jumpcurrentmi; GtkWidget *autoupdatemi; GtkWidget *autoupdatemenu; GtkWidget *autoupdatebuttonoff; @@ -338,6 +339,8 @@ void change_main_grid_size(GtkWidget *w, gpointer data); void change_left_resolution(GtkWidget *w, gpointer data); +void jump_to_current(GtkWidget *w, gpointer data); + int initialize_memory(void); int increase_log_memory(int new_lines);