Ich benutze die Dokumentation dafür im devhelp-Programm. Also fangen wir an.
Als erstes müssen Sie eine Anwendung erstellen, die auf dem dbus-Bus sichtbar ist.
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 );
}
Nachdem die Anwendung aktiviert wurde, müssen Sie sie mit Widgets füllen. Ich erstelle eine Struktur in dieser Datei, in der alle Widgets gespeichert werden, deren Erscheinungsbild sich ändert, wenn Sie ein anderes Farbschema angeben.
Hier ist die Struktur:
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;
Am Ende erstelle ich eine spezielle Variable namens STUBS, der ich nichts zuordne. Die Anwendung enthält viele Widgets, und Sie benötigen eine Möglichkeit, den gewünschten Widgets den gewünschten Namen zuzuweisen. So mache ich es.
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 );
}
Für die Widgets, die noch ein spezielles Design benötigen, weise ich ihnen bereits separate Namen zu. In dieser Funktion gehe ich alle Widgets durch und gebe ihnen einen Themennamen.
Der folgende Code wird zum Erstellen des Menüs verwendet.
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 );
}
Und dann weisen wir diese Befehle dem Menü zu.
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 );
Nachdem Sie diese Anwendung gepinkelt haben, verwandelt sie sich in etwas Wunderbares und Schönes.
