Jasper Ji

开口不在舌头上

0%

学习GTK

GTK之前有看过,还专门购买了一本关于GTK的书籍,那是主要是为了学习C的面向对象实现。现在又看GTK是因为准备购买PinePhone,主要看中了PinePhone可以运行多个Linux发行版本。现在无论是iOS还是Android都不能自由的使用喜欢的语言。作为一个曾经的iOS开发者,iOS的运行速度还真的没得说。Android因为使用Java缘故,总还是没有办法更快似乎,所以一直想着整一台Linux手机自己定制UI,不过找一台Linux手机实在是太难了,主要是目前手机都是这些公司定制的硬件,所以驱动是个大问题。

为什么选择GTK呢?我也看了下QT,之前也简单的使用了下,确实非常适合开发UI程序,不过授权方面还是有点问题,GTK没有这个问题。另外无论C/C++对我来说都不是太大的问题,所以还是用GTK了。

考虑到主要是用来开发Linux的,所以直接在Ubuntu下跑个例子看下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdnoreturn.h>
#include <stdatomic.h>
#include <assert.h>
#include <gtk/gtk.h>
#include <glib/gprintf.h>

#ifndef var
#define var __auto_type
#endif

static void PrintMsg(GtkWidget *widget, gpointer window) {
if(window != NULL)
g_printf("Button clicked\n");

var dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, u8"按钮已被按下!");
gtk_window_set_title(GTK_WINDOW(dialog), u8"请注意");

gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}

int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
var window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GTK Test");
gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(window), 15);

var button = gtk_button_new_with_label("Button");
gtk_widget_set_halign(button, GTK_ALIGN_START);
gtk_widget_set_valign(button, GTK_ALIGN_START);
gtk_widget_set_tooltip_text(button, "This is a button widget");
g_signal_connect(button, "clicked", G_CALLBACK(PrintMsg), window);
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show_all(window);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
static_assert(sizeof(int) == 4, "Not compatible architecture!");
puts("Will enter GTK runloop...");
gtk_main();
puts("Program terminated!");
return 0;
}

问题

1
/usr/include/pango-1.0/pango/pango-coverage.h:28:10: fatal error: 'hb.h' file not found

解决方案运行pkgconf --cflags harfbuzz

1
/usr/bin/ld: cannot find -lBlocksRuntime

解决方案运行sudo apt-get install libblocksruntime-dev

编译

1
clang main.c -std=gnu11 -fblocks -lBlocksRuntime -I/usr/include/glib-2.0/ -I/usr/include/atk-1.0/ -I/usr/include/gdk-pixbuf-2.0/ -I/usr/include/cairo/ -I/usr/include/pango-1.0/ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -I/usr/include/gtk-3.0/ -I /usr/include/harfbuzz/ -L/usr/lib/x86_64-linux-gnu/ -lgtk-3 -lgobject-2.0 -lpangocairo-1.0 -lgio-2.0 -latk-1.0 -lgdk-3 -lglib-2.0    -o gtk-test

总结

GTK开发确实比较麻烦,后续还的配置个好的IDE环境,不过想想要求的OC开发,其实对于C还是蛮亲切的。其实一旦涉及真实项目,更多都是对框架的学习了,先挖个坑。