gtk-stats: Replace uses of deprecated GTK APIs

As of this change, requires GTK 2.24
This commit is contained in:
rdb 2022-02-01 11:32:36 +01:00
parent 350836cc38
commit 174cb48990
7 changed files with 179 additions and 119 deletions

View File

@ -45,7 +45,7 @@ GtkStatsGraph(GtkStatsMonitor *monitor) :
GtkWidget *parent_window = monitor->get_window();
GdkDisplay *display = gdk_drawable_get_display(parent_window->window);
GdkDisplay *display = gdk_window_get_display(gtk_widget_get_window(parent_window));
_hand_cursor = gdk_cursor_new_for_display(display, GDK_HAND2);
_pixmap = nullptr;
@ -323,12 +323,14 @@ gboolean GtkStatsGraph::
handle_motion(GtkWidget *widget, int graph_x, int graph_y) {
_potential_drag_mode = consider_drag_start(graph_x, graph_y);
GdkWindow *window = gtk_widget_get_window(_window);
if (_potential_drag_mode == DM_guide_bar ||
_drag_mode == DM_guide_bar) {
gdk_window_set_cursor(_window->window, _hand_cursor);
gdk_window_set_cursor(window, _hand_cursor);
} else {
gdk_window_set_cursor(_window->window, nullptr);
gdk_window_set_cursor(window, nullptr);
}
return TRUE;
@ -344,7 +346,8 @@ setup_pixmap(int xsize, int ysize) {
_pixmap_xsize = std::max(xsize, 0);
_pixmap_ysize = std::max(ysize, 0);
_pixmap = gdk_pixmap_new(_graph_window->window, _pixmap_xsize, _pixmap_ysize, -1);
GdkWindow *window = gtk_widget_get_window(_graph_window);
_pixmap = gdk_pixmap_new(window, _pixmap_xsize, _pixmap_ysize, -1);
// g_object_ref(_pixmap); Should this be ref_sink?
_pixmap_gc = gdk_gc_new(_pixmap);
// g_object_ref(_pixmap_gc); Should this be ref_sink?
@ -392,8 +395,10 @@ graph_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
GtkStatsGraph *self = (GtkStatsGraph *)data;
if (self->_pixmap != nullptr) {
gdk_draw_drawable(self->_graph_window->window,
self->_graph_window->style->fg_gc[0],
GdkWindow *window = gtk_widget_get_window(self->_graph_window);
GtkStyle *style = gtk_widget_get_style(self->_graph_window);
gdk_draw_drawable(window,
style->fg_gc[0],
self->_pixmap, 0, 0, 0, 0,
self->_pixmap_xsize, self->_pixmap_ysize);
}

View File

@ -162,25 +162,28 @@ gboolean GtkStatsLabel::
expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
GtkStatsLabel *self = (GtkStatsLabel *)data;
GdkGC *gc = gdk_gc_new(widget->window);
GdkWindow *window = gtk_widget_get_window(widget);
GdkGC *gc = gdk_gc_new(window);
gdk_gc_set_rgb_fg_color(gc, &self->_bg_color);
gdk_draw_rectangle(widget->window, gc, TRUE, 0, 0,
widget->allocation.width, widget->allocation.height);
GtkAllocation allocation;
gtk_widget_get_allocation(widget, &allocation);
gdk_draw_rectangle(window, gc, TRUE, 0, 0, allocation.width, allocation.height);
// Center the text within the rectangle.
int width, height;
pango_layout_get_pixel_size(self->_layout, &width, &height);
gdk_gc_set_rgb_fg_color(gc, &self->_fg_color);
gdk_draw_layout(widget->window, gc,
(widget->allocation.width - width) / 2, 0,
gdk_draw_layout(window, gc,
(allocation.width - width) / 2, 0,
self->_layout);
// Now draw the highlight rectangle, if any.
if (self->_highlight || self->_mouse_within) {
gdk_draw_rectangle(widget->window, gc, FALSE, 0, 0,
widget->allocation.width - 1, widget->allocation.height - 1);
gdk_draw_rectangle(window, gc, FALSE, 0, 0,
allocation.width - 1, allocation.height - 1);
}
g_object_unref(gc);

View File

@ -48,9 +48,12 @@ int GtkStatsLabelStack::
get_label_y(int label_index, GtkWidget *target_widget) const {
nassertr(label_index >= 0 && label_index < (int)_labels.size(), 0);
GtkAllocation allocation;
gtk_widget_get_allocation(_widget, &allocation);
// Assume all labels have the same height.
int height = _labels[0]->get_height();
int start_y = _widget->allocation.height - height * label_index;
int start_y = allocation.height - height * label_index;
int x, y;
gtk_widget_translate_coordinates(_widget, target_widget,

View File

@ -22,32 +22,12 @@
#include "pStatCollectorDef.h"
#include "indent.h"
typedef void vc();
GtkItemFactoryEntry GtkStatsMonitor::menu_entries[] = {
{ (gchar *)"/Options", nullptr, nullptr, 0, (gchar *)"<Branch>" },
{ (gchar *)"/Options/Units", nullptr, nullptr, 0, (gchar *)"<Branch>" },
{ (gchar *)"/Options/Units/ms", nullptr, (vc *)&handle_menu_command, MI_time_ms, (gchar *)"<RadioItem>" },
{ (gchar *)"/Options/Units/Hz", nullptr, (vc *)&handle_menu_command, MI_time_hz, (gchar *)"/Options/Units/ms" },
{ (gchar *)"/Speed", nullptr, nullptr, 0, (gchar *)"<Branch>" },
{ (gchar *)"/Speed/1", nullptr, (vc *)&handle_menu_command, MI_speed_1, (gchar *)"<RadioItem>" },
{ (gchar *)"/Speed/2", nullptr, (vc *)&handle_menu_command, MI_speed_2, (gchar *)"/Speed/1" },
{ (gchar *)"/Speed/3", nullptr, (vc *)&handle_menu_command, MI_speed_3, (gchar *)"/Speed/1" },
{ (gchar *)"/Speed/6", nullptr, (vc *)&handle_menu_command, MI_speed_6, (gchar *)"/Speed/1" },
{ (gchar *)"/Speed/12", nullptr, (vc *)&handle_menu_command, MI_speed_12, (gchar *)"/Speed/1" },
{ (gchar *)"/Speed/sep", nullptr, nullptr, 0, (gchar *)"<Separator>" },
{ (gchar *)"/Speed/pause", nullptr, (vc *)&handle_menu_command, MI_pause, (gchar *)"<CheckItem>" },
};
int GtkStatsMonitor::num_menu_entries = sizeof(menu_entries) / sizeof(GtkItemFactoryEntry);
/**
*
*/
GtkStatsMonitor::
GtkStatsMonitor(GtkStatsServer *server) : PStatMonitor(server) {
_window = nullptr;
_item_factory = nullptr;
// These will be filled in later when the menu is created.
_time_units = 0;
@ -160,8 +140,7 @@ new_collector(int collector_index) {
void GtkStatsMonitor::
new_thread(int thread_index) {
GtkStatsChartMenu *chart_menu = new GtkStatsChartMenu(this, thread_index);
GtkWidget *menu_bar = gtk_item_factory_get_widget(_item_factory, "<PStats>");
chart_menu->add_to_menu_bar(menu_bar, _next_chart_index);
chart_menu->add_to_menu_bar(_menu_bar, _next_chart_index);
++_next_chart_index;
_chart_menus.push_back(chart_menu);
}
@ -379,40 +358,27 @@ create_window() {
gtk_window_set_default_size(GTK_WINDOW(_window), 500, 360);
// Set up the menu.
GtkAccelGroup *accel_group = gtk_accel_group_new();
_item_factory =
gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<PStats>", accel_group);
gtk_item_factory_create_items(_item_factory, num_menu_entries, menu_entries,
this);
GtkAccelGroup *accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(_window), accel_group);
GtkWidget *menu_bar = gtk_item_factory_get_widget(_item_factory, "<PStats>");
_menu_bar = gtk_menu_bar_new();
_next_chart_index = 2;
setup_options_menu();
setup_speed_menu();
setup_frame_rate_label();
ChartMenus::iterator mi;
for (mi = _chart_menus.begin(); mi != _chart_menus.end(); ++mi) {
(*mi)->add_to_menu_bar(menu_bar, _next_chart_index);
for (GtkStatsChartMenu *chart_menu : _chart_menus) {
chart_menu->add_to_menu_bar(_menu_bar, _next_chart_index);
++_next_chart_index;
}
// Pack the menu into the window.
GtkWidget *main_vbox = gtk_vbox_new(FALSE, 1);
gtk_container_add(GTK_CONTAINER(_window), main_vbox);
gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar, FALSE, TRUE, 0);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(_item_factory, "/Speed/3")),
TRUE);
set_scroll_speed(3);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(_item_factory, "/Options/Units/ms")),
TRUE);
set_time_units(PStatGraph::GBU_ms);
gtk_box_pack_start(GTK_BOX(main_vbox), _menu_bar, FALSE, TRUE, 0);
gtk_widget_show_all(_window);
gtk_widget_show(_window);
set_pause(false);
}
/**
@ -462,6 +428,126 @@ window_destroy(GtkWidget *widget, gpointer data) {
self->close();
}
/**
* Creates the "Options" pulldown menu.
*/
void GtkStatsMonitor::
setup_options_menu() {
_options_menu = gtk_menu_new();
GtkWidget *item = gtk_menu_item_new_with_label("Options");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), _options_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(_menu_bar), item);
GtkWidget *units_menu = gtk_menu_new();
item = gtk_menu_item_new_with_label("Units");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), units_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(_options_menu), item);
item = gtk_radio_menu_item_new_with_label(nullptr, "ms");
gtk_menu_shell_append(GTK_MENU_SHELL(units_menu), item);
g_signal_connect(G_OBJECT(item), "activate",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_time_units(PStatGraph::GBU_ms);
}), this);
item = gtk_radio_menu_item_new_with_label(
gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)), "Hz");
gtk_menu_shell_append(GTK_MENU_SHELL(units_menu), item);
g_signal_connect(G_OBJECT(item), "activate",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_time_units(PStatGraph::GBU_hz);
}), this);
set_time_units(PStatGraph::GBU_ms);
}
/**
* Creates the "Speed" pulldown menu.
*/
void GtkStatsMonitor::
setup_speed_menu() {
_speed_menu = gtk_menu_new();
GtkWidget *item = gtk_menu_item_new_with_label("Speed");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), _speed_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(_menu_bar), item);
GSList *group = nullptr;
item = gtk_radio_menu_item_new_with_label(group, "1");
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_scroll_speed(1);
}
}), this);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
item = gtk_radio_menu_item_new_with_label(group, "2");
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_scroll_speed(2);
}
}), this);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
item = gtk_radio_menu_item_new_with_label(group, "3");
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_scroll_speed(3);
}
}), this);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
item = gtk_radio_menu_item_new_with_label(group, "6");
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_scroll_speed(6);
}
}), this);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
item = gtk_radio_menu_item_new_with_label(group, "12");
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_scroll_speed(12);
}
}), this);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
item = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
item = gtk_check_menu_item_new_with_label("pause");
gtk_menu_shell_append(GTK_MENU_SHELL(_speed_menu), item);
g_signal_connect(G_OBJECT(item), "toggled",
G_CALLBACK(+[](GtkMenuItem *item, gpointer data) {
GtkStatsMonitor *self = (GtkStatsMonitor *)data;
self->set_pause(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)));
}), this);
set_scroll_speed(3);
set_pause(false);
}
/**
* Creates the frame rate label on the right end of the menu bar. This is
* used as a text label to display the main thread's frame rate to the user,
@ -470,59 +556,13 @@ window_destroy(GtkWidget *widget, gpointer data) {
*/
void GtkStatsMonitor::
setup_frame_rate_label() {
GtkWidget *menu_bar = gtk_item_factory_get_widget(_item_factory, "<PStats>");
_frame_rate_menu_item = gtk_menu_item_new();
_frame_rate_label = gtk_label_new("");
gtk_container_add(GTK_CONTAINER(_frame_rate_menu_item), _frame_rate_label);
gtk_widget_show(_frame_rate_menu_item);
gtk_widget_show(_frame_rate_label);
gtk_menu_item_right_justify(GTK_MENU_ITEM(_frame_rate_menu_item));
gtk_menu_item_set_right_justified(GTK_MENU_ITEM(_frame_rate_menu_item), TRUE);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), _frame_rate_menu_item);
}
/**
*
*/
void GtkStatsMonitor::
handle_menu_command(gpointer callback_data, guint menu_id, GtkWidget *widget) {
GtkStatsMonitor *self = (GtkStatsMonitor *)callback_data;
switch (menu_id) {
case MI_none:
break;
case MI_time_ms:
self->set_time_units(PStatGraph::GBU_ms);
break;
case MI_time_hz:
self->set_time_units(PStatGraph::GBU_hz);
break;
case MI_speed_1:
self->set_scroll_speed(1);
break;
case MI_speed_2:
self->set_scroll_speed(2);
break;
case MI_speed_3:
self->set_scroll_speed(3);
break;
case MI_speed_6:
self->set_scroll_speed(6);
break;
case MI_speed_12:
self->set_scroll_speed(12);
break;
case MI_pause:
self->set_pause(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
break;
}
gtk_menu_shell_append(GTK_MENU_SHELL(_menu_bar), _frame_rate_menu_item);
}

View File

@ -82,10 +82,10 @@ private:
static gboolean window_delete_event(GtkWidget *widget, GdkEvent *event,
gpointer data);
static void window_destroy(GtkWidget *widget, gpointer data);
void setup_options_menu();
void setup_speed_menu();
void setup_frame_rate_label();
static void handle_menu_command(gpointer callback_data, guint menu_id, GtkWidget *widget);
typedef pset<GtkStatsGraph *> Graphs;
Graphs _graphs;
@ -96,7 +96,9 @@ private:
Menus _menus;
GtkWidget *_window;
GtkItemFactory *_item_factory;
GtkWidget *_menu_bar;
GtkWidget *_options_menu;
GtkWidget *_speed_menu;
int _next_chart_index;
GtkWidget *_frame_rate_menu_item;
GtkWidget *_frame_rate_label;
@ -105,9 +107,6 @@ private:
double _scroll_speed;
bool _pause;
static GtkItemFactoryEntry menu_entries[];
static int num_menu_entries;
friend class GtkStatsGraph;
};

View File

@ -204,9 +204,11 @@ idle() {
*/
void GtkStatsPianoRoll::
additional_graph_window_paint() {
GdkWindow *window = gtk_widget_get_window(_graph_window);
int num_user_guide_bars = get_num_user_guide_bars();
for (int i = 0; i < num_user_guide_bars; i++) {
draw_guide_bar(_graph_window->window, get_user_guide_bar(i));
draw_guide_bar(window, get_user_guide_bar(i));
}
}
@ -424,7 +426,8 @@ draw_guide_labels() {
*/
void GtkStatsPianoRoll::
draw_guide_label(const PStatGraph::GuideBar &bar) {
GdkGC *gc = gdk_gc_new(_scale_area->window);
GdkWindow *window = gtk_widget_get_window(_scale_area);
GdkGC *gc = gdk_gc_new(window);
switch (bar._style) {
case GBS_target:
@ -467,9 +470,11 @@ draw_guide_label(const PStatGraph::GuideBar &bar) {
x, 0,
&x, &junk_y);
GtkAllocation allocation;
gtk_widget_get_allocation(_scale_area, &allocation);
int this_x = x - width / 2;
gdk_draw_layout(_scale_area->window, gc, this_x,
_scale_area->allocation.height - height, layout);
gdk_draw_layout(window, gc, this_x, allocation.height - height, layout);
}
g_object_unref(layout);

View File

@ -255,10 +255,11 @@ copy_region(int start_x, int end_x, int dest_x) {
_brush_origin += (dest_x - start_x);
// SetBrushOrgEx(_bitmap_dc, _brush_origin, 0, NULL);
GdkWindow *window = gtk_widget_get_window(_graph_window);
GdkRectangle rect = {
dest_x, 0, end_x - start_x, get_ysize()
};
gdk_window_invalidate_rect(_graph_window->window, &rect, FALSE);
gdk_window_invalidate_rect(window, &rect, FALSE);
}
/**
@ -327,10 +328,11 @@ end_draw(int from_x, int to_x) {
draw_guide_bar(_pixmap, from_x, to_x, get_guide_bar(i));
}
GdkWindow *window = gtk_widget_get_window(_graph_window);
GdkRectangle rect = {
from_x, 0, to_x - from_x + 1, get_ysize()
};
gdk_window_invalidate_rect(_graph_window->window, &rect, FALSE);
gdk_window_invalidate_rect(window, &rect, FALSE);
}
/**
@ -339,9 +341,11 @@ end_draw(int from_x, int to_x) {
*/
void GtkStatsStripChart::
additional_graph_window_paint() {
GdkWindow *window = gtk_widget_get_window(_graph_window);
int num_user_guide_bars = get_num_user_guide_bars();
for (int i = 0; i < num_user_guide_bars; i++) {
draw_guide_bar(_graph_window->window, 0, get_xsize(), get_user_guide_bar(i));
draw_guide_bar(window, 0, get_xsize(), get_user_guide_bar(i));
}
}
@ -558,7 +562,8 @@ draw_guide_labels() {
*/
int GtkStatsStripChart::
draw_guide_label(const PStatGraph::GuideBar &bar, int last_y) {
GdkGC *gc = gdk_gc_new(_scale_area->window);
GdkWindow *window = gtk_widget_get_window(_scale_area);
GdkGC *gc = gdk_gc_new(window);
switch (bar._style) {
case GBS_target:
@ -603,7 +608,7 @@ draw_guide_label(const PStatGraph::GuideBar &bar, int last_y) {
int this_y = y - height / 2;
if (last_y < this_y || last_y > this_y + height) {
gdk_draw_layout(_scale_area->window, gc, 0, this_y, layout);
gdk_draw_layout(window, gc, 0, this_y, layout);
last_y = this_y;
}
}