Создаём приложение на gtk

от автора

Я вижу часто отсылки на то, как реализуется то или иное на qt, но gtk тоже хорош. Я пишу на C и не хочу учить каждые три года стандарты C++, чтобы быть на волне. Мне хватает простой сишечки и чтобы делать графический софт, выбор пал на gtk.
Документацию к нему я использую в программе devhelp. Итак начнем.

Первое что нужно сделать, это создать приложение, которое будет видно на dbus шине.

GtkApplication *app;  static void app_activate_cb ( GtkApplication *app, gpointer user_data ) { }  int main ( int argc, char **argv ) { 	app = gtk_application_new ( "com.xverizex.configurator", G_APPLICATION_FLAGS_NONE ); 	g_application_register ( ( GApplication * ) app, NULL, NULL ); 	g_signal_connect ( app, "activate", G_CALLBACK ( app_activate_cb ), NULL ); 	return g_application_run ( ( GApplication * ) app, argc, argv ); } 

После того, как приложение активировалось, нужно наполнить его виджетами. Я создаю в этом файле структуру, которая будет хранить все виджеты, которые будут изменяться в оформлении, если указать другую цветовую схему.
вот структура.

struct widgets { 	GtkWidget *main_window; 	GtkWidget *notebook; 	GtkWidget *tree_view_sources; 	GtkWidget *label_tab_sources; 	GtkWidget *header_bar; 	GtkWidget *search_entry; 	GtkWidget *button_add_item; 	GtkWidget *tree_view_reactions; 	GtkWidget *label_tab_reactions; 	GtkWidget *window_add_source;         ...         GtkWidget *STUBS; 

в конце я создаю специальную переменную, так называемую STUBS, которой я ничего не присваиваю. В приложении виджетов очень много и нужен какой то способ присвоить нужным виджетам нужное имя. Я делаю это так.

static void set_theme_name ( const char *name ) { 	struct widgets **p = ( struct widgets ** ) &w; 	for ( int i = 0; p[i] != NULL; i++ ) { 		gtk_widget_set_name ( ( GtkWidget * ) p[i], name ); 	} 	char buf[255]; 	snprintf ( buf, 255, "%s_info", name ); 	gtk_widget_set_name ( w.label_info_db_settings, buf ); 	gtk_widget_set_name ( w.label_info_mail_settings, buf ); } 

тем виджетам, которым нужно ещё особенное оформление, я уже назначаю им отдельные названия. В этой функции я пробегаю по всем виджетам и указываю им имя темы.
Для создания меню используюется вот такой код.

static void create_actions ( void ) { 	const GActionEntry entries[] = { 		{ "quit", action_activate_quit }, 		{ "settings", action_settings }, 		{ "apply_settings", action_activate_apply_settings }, 		{ "select_light_theme", action_activate_select_light_theme }, 		{ "select_dark_theme", action_activate_select_dark_theme }, 		{ "select_standard_theme", action_activate_select_standard_theme } 	}; 	g_action_map_add_action_entries ( G_ACTION_MAP (app), entries, G_N_ELEMENTS (entries), NULL ); } 

И потом назначаем эти команды в меню.

	pop_menu = g_menu_new ( ); 	GMenu *menu_app = g_menu_new ( ); 	GMenu *menu_themes = g_menu_new ( ); 	g_menu_append ( menu_app, "Настройки", "app.settings" ); 	g_menu_append ( menu_app, "Обновить", "app.apply_settings" ); 	g_menu_append ( menu_themes, "Светлая тема", "app.select_light_theme" ); 	g_menu_append ( menu_themes, "Темная тема", "app.select_dark_theme" ); 	g_menu_append ( menu_themes, "Стандартная тема", "app.select_standard_theme" ); 	g_menu_append_submenu ( menu_app, "Сменить тему", ( GMenuModel * ) menu_themes ); 	g_menu_append ( menu_app, "Выход", "app.quit" );  	gtk_application_set_app_menu ( app, ( GMenuModel * ) menu_app ); 

В итоге пописав это приложение, оно превращается в нечто прекрасное и красивое.
image

ссылка на оригинал статьи https://habr.com/ru/post/518548/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *