Проблема с настройкой GTK3 - PullRequest
0 голосов
/ 12 февраля 2020

Я столкнулся с проблемой, связанной с настройками кнопок прокрутки. Что я хочу сделать, так это в ответ на сигнал переключения переключателя, я хочу изменить настройку, связанную с кнопкой вращения. Таким образом, обработчик сигнала переключения кнопки вращения передает ему кнопку вращения. Сами корректировки являются глобальными, поэтому нет необходимости их пропускать. Пример кода прилагается. Если я не переинициализирую корректировки (закомментированный код) в обработчике, я получаю все предупреждения / ошибки, когда обработчик запускается и пытается настроить значения кнопки прокрутки. Кстати, я запускаю этот код на Rpi3B +. Нажатие переключателя «Pgm by DA C Code» работает - оно изменяет значения кнопки вращения в соответствии с запросом. Но когда нажата радиокнопка «Pgm by Voltage», pgm ведет себя неправильно, как показано в выводе окна консоли, показанном ниже. У кого-нибудь есть идеи, почему это может происходить?

(adjustment_issue:4441): GLib-GObject-CRITICAL **: g_object_ref_sink: assertion 'G_IS_OBJECT (object)' failed

(adjustment_issue:4441): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(adjustment_issue:4441): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

(adjustment_issue:4441): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(adjustment_issue:4441): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

(adjustment_issue:4441): Gtk-CRITICAL **: gtk_adjustment_get_step_increment: assertion 'GTK_IS_ADJUSTMENT (adjustment)' failed

(adjustment_issue:4441): Gtk-CRITICAL **: gtk_spin_button_value_changed: assertion 'GTK_IS_ADJUSTMENT (adjustment)' failed

/*
 * adjustment_issue.c.c
 * 
 */

#include <math.h>
#include <gtk/gtk.h>

typedef struct {
    GtkWidget *sblblVdc;
    GtkWidget *sbVdc;
} dcvWidgets_t;

// structure to hold the data for adjustments
typedef struct {
    double initVal;
    double minVal;
    double maxVal;
    double stepVal;
} adj_t;

adj_t vdcLimits;
adj_t dacCodeLimits;

GtkAdjustment *adjSbVoltLimits;
GtkAdjustment *adjSbCodeLimits;

static void dcPgmModeChanged(GtkToggleButton *btn, dcvWidgets_t *dcvWid)
{
    // BUG WORKAROUND: Re-initialize the adjustments.
    // When the Pgm by Code rb is clicked, all is well.
    // But when the Pgm by Voltage is clicked, the sbVoltLimits adjustment
    // appears to point to nothing and program displays lots of errors in
    // terminal window.

    if (gtk_toggle_button_get_active(btn)) {
/*
        adjSbVoltLimits = gtk_adjustment_new(
            vdcLimits.initVal, vdcLimits.minVal, vdcLimits.maxVal,
            vdcLimits.stepVal, 0, 0);
*/

        // modify the spin button to show voltage range
        gtk_spin_button_configure(GTK_SPIN_BUTTON(dcvWid->sbVdc),
                                    adjSbVoltLimits, 0, 3);
    }
    else {
/*
        adjSbCodeLimits = gtk_adjustment_new(
            dacCodeLimits.initVal, dacCodeLimits.minVal, dacCodeLimits.maxVal,
            dacCodeLimits.stepVal, 0, 0);
*/

        // modify the spin button to show DAC code range
        gtk_spin_button_configure(GTK_SPIN_BUTTON(dcvWid->sbVdc),
                                    adjSbCodeLimits, 0, 0);
    }
}

static void activate(GtkApplication* app, gpointer user_data)
{
  GtkWidget *window;
    dcvWidgets_t *dcvWidgets = g_slice_new(dcvWidgets_t);

  window = gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window), "GTK Adjustment Issue");
  gtk_window_set_default_size(GTK_WINDOW(window), 400, -1);

  GtkWidget *hbx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);

    vdcLimits.initVal = 2.5;
  vdcLimits.minVal = 0.0;
    vdcLimits.maxVal = 4.999;
    vdcLimits.stepVal = 0.001;

    adjSbVoltLimits = gtk_adjustment_new(
        vdcLimits.initVal, vdcLimits.minVal, vdcLimits.maxVal,
        vdcLimits.stepVal, 0, 0);

    dacCodeLimits.initVal = 2048;
    dacCodeLimits.minVal = 0;
    dacCodeLimits.maxVal = 4095;
    dacCodeLimits.stepVal = 1;

    adjSbCodeLimits = gtk_adjustment_new(
        dacCodeLimits.initVal, dacCodeLimits.minVal, dacCodeLimits.maxVal,
        dacCodeLimits.stepVal, 0, 0);

    dcvWidgets->sbVdc = gtk_spin_button_new(adjSbVoltLimits, 0, 3);
    gtk_entry_set_width_chars(GTK_ENTRY(dcvWidgets->sbVdc), 5);


    GtkWidget *rb1Mode = gtk_radio_button_new_with_label(NULL, "Pgm. by voltage");
    GtkWidget *rb2Mode = gtk_radio_button_new_with_label_from_widget(
                            GTK_RADIO_BUTTON(rb1Mode), "Pgm. by DAC code");

    g_signal_connect(rb1Mode, "toggled",
                        G_CALLBACK(dcPgmModeChanged), dcvWidgets);

    GtkWidget *vboxMode = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_box_pack_start(GTK_BOX(vboxMode), rb1Mode, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vboxMode), rb2Mode, FALSE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(hbx), vboxMode, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbx), dcvWidgets->sbVdc, FALSE, FALSE, 0);

  gtk_container_add(GTK_CONTAINER(window),hbx);
  gtk_widget_show_all(window);
}

int main(int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

  status = g_application_run(G_APPLICATION(app), argc, argv);

  g_object_unref(app);

  return status;
}

...