как скомпилировать программу gtk2.0 с gtk3?

у меня есть простая программа, которая скомпилирована с помощью gtk2.0 в ubuntu. В ubuntu11.04 я установил gtk3. затем я скомпилировал тот же код, я получил ошибку в следующей строке

/* Add a timer callback to update the value of the progress bar */
timer = gtk_timeout_add (100, progress_timeout, pdata);

я просто комментирую строку и перекомпилирую ее. Затем я получаю выходной файл. Но он не работает должным образом без закомментированной строки.

в gtk2.0 я скомпилировал следующую команду

gcc progressbar.c `pkg-config --cflags --libs gtk+-2.0`

и в гтк3

gcc progressbar.c `pkg-config --cflags --libs gtk+-3.0`

У меня есть сомнения, есть ли какое-либо устаревание в этом методе в gtk3. Пожалуйста, дайте мне ссылку на простую документацию с примерами. В чем основное различие между 2 и 3. Полный исходный код показан ниже

#include <gtk/gtk.h>

typedef struct _ProgressData {
GtkWidget *pbar; 
} ProgressData;

gint progress_timeout( gpointer data )
{
  ProgressData *pdata = (ProgressData *)data;
  gdouble new_val;
  new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;

  if (new_val > 1.0)
new_val = 0.0;

  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);

  return TRUE;
} 


int main( int   argc,
      char *argv[])
{
ProgressData *pdata;
GtkWidget *align;
GtkWidget *window;

int timer;  

GtkWidget *vbox;

gtk_init (&argc, &argv);

/* Allocate memory for the data that is passed to the callbacks */
pdata = g_malloc (sizeof (ProgressData));

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);

    g_signal_connect ( window, "destroy", gtk_main_quit, NULL ) ;

gtk_window_set_title (GTK_WINDOW (window), "GtkProgressBar");
gtk_container_set_border_width (GTK_CONTAINER (window), 0);

vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);

/* Create a centering alignment object */
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5);
gtk_widget_show (align);

/* Create the GtkProgressBar */
pdata->pbar = gtk_progress_bar_new ();

gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
gtk_widget_show (pdata->pbar);

/* Add a timer callback to update the value of the progress bar */
timer = gtk_timeout_add (100, progress_timeout, pdata);


gtk_widget_show (window);

gtk_main ();

return 0;
}

person KIRAN K J    schedule 09.09.2011    source источник


Ответы (2)


Вам нужно изменить вызов gtk_timeout_add на g_timeout_add.

gtk_timeout_add()

guint               gtk_timeout_add                     (guint32 interval,
                                                         GtkFunction function,
                                                         gpointer data);

Warning

gtk_timeout_add has been deprecated since version 2.4 and should not be used in 
newly-written code. Use g_timeout_add() instead.

Google «gtk_timeout_add g_timeout_add» предоставит вам примеры, например. этот, http://gna.org/patch/?2563.

person jsz    schedule 09.09.2011

Как сказал вам Джесси, вы используете gtk_timeout_add, который устарел в GTK2. Все символы, устаревшие в GTK2, были удалены в GTK3.

Чтобы ваша программа работала в GTK3, вам нужно убедиться, что вы не используете символы, не рекомендуемые для GTK2. Для этого используйте такие символы, как G_DISABLE_DEPRECATED (для GLib), GTK_DISABLE_DEPRECATED и т. д. , это может помочь вам убедиться, что при компиляции с GTK2 вы не используете символ, который был удален в GTK3.

Существует также руководство по переходу с GTK2 на GTK3. которые вы можете использовать, а также некоторые цели GNOME, которые связаны с исправлениями, которые использовались в GNOME для выполнения той же задачи, для GLib и GTK символы .

person liberforce    schedule 09.09.2011