Créer une application gtk

Je vois souvent des références à la façon dont les choses sont implémentées dans qt, mais gtk est bien aussi. J'écris en C et je ne veux pas apprendre les normes C ++ tous les trois ans pour être au top. Un simple sishechki me suffit et pour faire du logiciel graphique, le choix s'est porté sur gtk.



J'utilise la documentation correspondante dans le programme devhelp. Alors, commençons.



La première chose à faire est de créer une application qui sera visible sur le bus 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 );
}


Une fois l'application activée, vous devez la remplir de widgets. Je crée une structure dans ce fichier qui stockera tous les widgets dont l'apparence changera si vous spécifiez un jeu de couleurs différent.



Voici la structure:



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;


à la fin je crée une variable spéciale appelée STUBS à laquelle je n'attribue rien. Il existe de nombreux widgets dans l'application et vous avez besoin d'un moyen d'attribuer aux widgets souhaités le nom souhaité. Voilà comment je fais.



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 );
}


pour les widgets qui nécessitent encore une conception spéciale, je leur attribue déjà des noms séparés. Dans cette fonction, je parcours tous les widgets et leur donne un nom de thème.

Le code suivant est utilisé pour créer le menu.



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 );
}


Et puis nous attribuons ces commandes au menu.



	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 );


En conséquence, après avoir uriné cette application, elle se transforme en quelque chose de merveilleux et de beau.



image



All Articles