GtkProgressBar пульсирует в Ubuntu 18.04?

Я уже задавал этот вопрос о переполнении стека и не получил ответа, поэтому решил, что вместо этого попытаю счастья: у меня есть приложение GTK, которое зависит от пульсации GtkProgressBar для уведомления пользователя о запуске программы , Это действие прекрасно работает в Ubuntu 16.04 (GTK версия 3.20.8), но я замечаю, что пульсация не работает правильно - и быстро вообще не работает - в Ubuntu 18.04 (GTK версия 3.22.30). Я думаю, что это ошибка в самом GTK, но я не могу найти информацию где-либо, и если это действительно ошибка, она кажется большой. Я надеялся получить разъяснения от сообщества. Минимальный пример кода C выглядит следующим образом:

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>
#include <glib/gprintf.h>

GtkBuilder* builder;
gboolean CONTINUE_PULSING = TRUE;
guint pulsing;                      // The ID returned by g_timeout_add

gboolean pulse_progress_bar(__attribute__((unused)) gpointer user_data)
{
  GtkProgressBar * pbar = GTK_PROGRESS_BAR(gtk_builder_get_object(builder, "pbar"));
  gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(pbar), 0.1); // Sets the fraction of total progress bar length to move
  gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pbar));

  return CONTINUE_PULSING;
}

void run_press_event(__attribute__((unused)) GtkWidget * widget, __attribute__((unused)) GdkEventButton * event, __attribute__((unused)) gpointer user_data)
{
  // Start the progress bar going
  GtkProgressBar * pbar = GTK_PROGRESS_BAR(gtk_builder_get_object(builder, "pbar"));

  // g_timeout_add will call pulse_progress_bar every 100ms (to keep it moving)
  pulsing = g_timeout_add(100, pulse_progress_bar, GTK_PROGRESS_BAR(pbar));
}

void stop_press_event(__attribute__((unused)) GtkWidget * widget, __attribute__((unused)) GdkEventButton * event)
{
  // Stop the progress bar going
  g_source_remove(pulsing);
}

void main_window_destroy(__attribute__((unused)) GtkWidget *widget, __attribute__((unused)) gpointer data)
{
  gtk_main_quit ();
}

int main(int argc, char *argv[])
{
  GtkWidget * window ;
  GError * err = NULL ;

  gtk_init(&argc, &argv);

  builder = gtk_builder_new();

  gtk_builder_add_from_file(builder, "pulse.glade", &err);

  if (err != NULL)
  {
    fprintf(stderr, "Unable to read glade file: %s\n", err -> message);
    g_error_free(err);

    return 1;
  }

  window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));

  gtk_builder_connect_signals(builder, builder);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

И определение XML файла glade для чтения в GtkBuilder:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window_main">
    <property name="can_focus">False</property>
    <property name="window_position">center-always</property>
    <signal name="destroy" handler="main_window_destroy" swapped="no"/>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkProgressBar" id="pbar">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="fraction">0.10000000000000001</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="run_button">
            <property name="label" translatable="yes">RUN</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="run_press_event" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="stop_button">
            <property name="label" translatable="yes">STOP</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="stop_press_event" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Назовите файл C "pbar.c" и файл glade "pulse.glade", затем скомпилируйте, используя:

gcc -Wall -Wextra -o pbar pbar.c $(pkg-config gtk+-3.0 --cflags --libs) -rdynamic -lm

. Если вы работаете в Ubuntu 16.04, вы заметите, что импульс на индикаторе выполнения согласован и не гаснет, удаляя идентификатор источника ( т. е. нажатие кнопки «Стоп»), но в Ubuntu 18.04 индикатор выполнения запускается нормально, но как только идентификатор источника удаляется, а импульс запускается снова, импульс становится прерывистым и начинает затухать до такой степени, что несколько комбинаций RUN / STOP приводит к тому, что индикатор выполнения вообще не срабатывает. Я не могу определить причину этого, и это большая проблема для переноса моего приложения GTK на Ubuntu 18.04. Любая помощь будет оценена. Спасибо!

0
задан 25 July 2019 в 16:15

0 ответов

Другие вопросы по тегам:

Похожие вопросы: