Вот программа:
#include <gtk/gtk.h>
#include <glib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
static void click1_cb (GtkButton *btn1, gpointer user_data, int & n) {
const gchar *s;
s = gtk_button_get_label (btn1);
if (g_strcmp0 (s, "Hello.") == 0) {
gtk_button_set_label(btn1, "Good-bye.");
n = 1;
} else {
gtk_button_set_label(btn1, "Hello.");
n = 2;
}
}
string GetStdoutFromCommand(string cmd) {
string data;
FILE * stream;
const int max_buffer = 256;
char buffer[max_buffer];
cmd.append(" 2>&1");
stream = popen(cmd.c_str(), "r");
if (stream) {
while (!feof(stream))
if (fgets(buffer, max_buffer, stream) != NULL) data.append(buffer);
pclose(stream);
}
return data;
}
static void
app_activate (GApplication *app, gpointer user_data) {
GtkWidget *win;
GtkWidget *box;
GtkWidget *btn1;
GtkWidget *label;
GtkWidget *label2;
GtkWidget *grid;
GtkWidget *textview = gtk_text_view_new();
int n = 0;
// app is new
win = gtk_application_window_new (GTK_APPLICATION (app));
gtk_window_set_title (GTK_WINDOW (win), "win");
gtk_window_set_default_size (GTK_WINDOW (win), 500, 300);
// setup box1
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
gtk_widget_set_halign (box, GTK_ALIGN_START);
gtk_widget_set_valign (box, GTK_ALIGN_START);
gtk_window_set_child (GTK_WINDOW (win), box);
// setup labels
//label = gtk_label_new(GetStdoutFromCommand("netstat -tuwapn").c_str());
//GetStdoutFromCommand("netstat -tuwapn").c_str()
label = gtk_label_new("dfgdf");
gtk_label_set_markup(GTK_LABEL(label), "<span font_desc=\"sans 20\">Network Connections</span>);");
// label2 = gtk_label_new(GetStdoutFromCommand("netstat -tuwapn").c_str());
//gtk_label_set_markup(GTK_LABEL(label2), "<span style=\"bold\">%s</span>");
// button
btn1 = gtk_button_new_with_label ("Reload.");
g_signal_connect (btn1, "clicked", G_CALLBACK(click1_cb), &n);
gtk_widget_set_margin_top (btn1, 1);
// grid
grid = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (grid), 1);
gtk_window_set_child (GTK_WINDOW (win), grid);
gtk_grid_attach (GTK_GRID (grid), btn1,20, 3, 20, 50);
gtk_grid_attach (GTK_GRID (grid), label,200, 3, 200, 50);
// gtk_grid_attach (GTK_GRID (grid), label2,300, 4, 50, 50);
// show window
gtk_widget_show (win);
}
int main (int argc, char **argv) {
GtkApplication *app;
int stat;
app = gtk_application_new ("gtk.org", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
stat =g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return stat;
}
Все синтаксически правильно, программа компилируется на linux’e g++ xfce. Но, при работе она сама закрывается так и не выполнив весь код. Конкретно ошибка, в этой части кода, когда присываивается цифра переменной типа int.
static void click1_cb (GtkButton *btn1, gpointer user_data, int & n) {
const gchar *s;
s = gtk_button_get_label (btn1);
if (g_strcmp0 (s, "Hello.") == 0) {
gtk_button_set_label(btn1, "Good-bye.");
n = 1;
} else {
gtk_button_set_label(btn1, "Hello.");
n = 2;
}
}
когда удаляю строки n = 1
и n = 2;
прорамма нормально работает. Вот, вопрос,возможно, нужно присваивать не int и указателю на *int? И какой тулзой можно посмотретьь, при запуске и работе такого bin файла, почему он впадает в crash, т.е.сам выключается?