[skip ci] Port glib embedding example to Py3 and Gtk3

This commit is contained in:
wmayer
2020-05-20 12:47:17 +02:00
parent e9318e2649
commit 288aac462d
2 changed files with 38 additions and 27 deletions

View File

@@ -13,19 +13,15 @@
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
<Add directory="/usr/include/python2.6" />
<Add directory="/usr/include/gtk-2.0/" />
<Add directory="/usr/include/python3.6m" />
<Add directory="/usr/include/gtk-3.0/" />
<Add directory="/usr/include/glib-2.0" />
<Add directory="/usr/lib/glib-2.0/include" />
<Add directory="/usr/lib/x86_64-linux-gnu/glib-2.0/include" />
<Add directory="/usr/include/cairo/" />
<Add directory="/usr/include/pango-1.0/" />
<Add directory="/usr/lib/gtk-2.0/include/" />
<Add directory="/usr/include/gtk-2.0/gdk/" />
<Add directory="/usr/include/gdk-pixbuf-2.0/" />
<Add directory="/usr/include/atk-1.0/" />
</Compiler>
<Linker>
<Add library="/usr/lib/libgtk-x11-2.0.so" />
</Linker>
</Target>
<Target title="Release">
<Option output="bin/Release/glib" prefix_auto="1" extension_auto="1" />
@@ -42,13 +38,15 @@
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="`pkg-config gtk+-2.0 --cflags`" />
<Add directory="/usr/include/python2.6" />
<Add option="`pkg-config gtk+-3.0 --cflags`" />
<Add directory="/usr/include/gtk-3.0" />
</Compiler>
<Linker>
<Add option="`pkg-config gtk+-2.0 --libs`" />
<Add library="python2.6" />
<Add directory="/usr/lib" />
<Add option="`pkg-config gtk+-3.0 --libs`" />
<Add library="python3.6m" />
<Add library="glib-2.0" />
<Add library="gobject-2.0" />
<Add directory="/usr/lib/x86_64-linux-gnu/" />
</Linker>
<Unit filename="main.c">
<Option compilerVar="CC" />

View File

@@ -12,24 +12,24 @@ static void helloWorld (GtkWidget *wid, GtkWidget *win)
PyObject* result = PyRun_String("import FreeCADGui\n"
"FreeCADGui.showMainWindow()",
Py_file_input, dict, dict);
if (result) {
Py_DECREF(result);
}
else {
if (result) {
Py_DECREF(result);
}
else {
PyObject *ptype, *pvalue, *ptrace;
PyErr_Fetch(&ptype, &pvalue, &ptrace);
PyObject* pystring = PyObject_Str(pvalue);
const char* error = PyString_AsString(pystring);
const char* error = PyUnicode_AsUTF8(pystring);
GtkWidget *dialog = NULL;
dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, error);
dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", error);
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
Py_DECREF(pystring);
}
Py_DECREF(dict);
}
Py_DECREF(dict);
}
int main (int argc, char *argv[])
@@ -39,10 +39,21 @@ int main (int argc, char *argv[])
GtkWidget *vbox = NULL;
/* Init Python */
Py_SetProgramName(argv[0]);
PyEval_InitThreads();
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program);
Py_Initialize();
PySys_SetArgv(argc, argv);
PyEval_InitThreads();
wchar_t *args[argc];
for (int i = 0; i < argc; i++) {
args[i] = Py_DecodeLocale(argv[i], NULL);
}
PySys_SetArgv(argc, args);
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
@@ -58,14 +69,16 @@ int main (int argc, char *argv[])
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
/* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
vbox = gtk_box_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);
button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
button = gtk_button_new_from_icon_name ("document-open", GTK_ICON_SIZE_BUTTON);
gtk_button_set_label((GtkButton*)button, "Load module");
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
button = gtk_button_new_from_icon_name ("window-close", GTK_ICON_SIZE_BUTTON);
gtk_button_set_label((GtkButton*)button, "Close");
g_signal_connect (button, "clicked", gtk_main_quit, NULL);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);