Construyendo una aplicación gtk

A menudo veo referencias a cómo se implementa esto o aquello en qt, pero gtk también es bueno. Escribo en C y no quiero aprender los estándares de C ++ cada tres años para estar al tanto. Un simple sishechki es suficiente para mí y para hacer software gráfico, la elección recayó en gtk.



Utilizo la documentación para ello en el programa devhelp. Vamos a empezar.



Lo primero que debe hacer es crear una aplicación que será visible en el 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 );
}


Una vez que se ha activado la aplicación, debe llenarla con widgets. Creo en este archivo una estructura que almacenará todos los widgets que cambiarán de apariencia si especifica un esquema de color diferente.



Aquí está la estructura:



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;


al final creo una variable especial llamada STUBS a la que no le asigno nada. Hay muchos widgets en la aplicación y necesita alguna forma de asignar el nombre deseado a los widgets deseados. Así es como lo hago.



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


para aquellos widgets que todavía necesitan un diseño especial, ya les asigno nombres separados. En esta función, reviso todos los widgets y les doy un nombre de tema.

El siguiente código se utiliza para crear el menú.



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


Y luego asignamos estos comandos al menú.



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


Como resultado, después de orinar esta aplicación, se convierte en algo maravilloso y hermoso.



imagen



All Articles