Link Search Menu Expand Document

Glib Examples

Debugging

// Delta-debugging...
g_print ("Some string\n");
g_printf ("Cannot open file %s\n", filename);

g_warning ("Some warning");
g_error ("Some error");

Enable fatal warnings/criticals and other checks

# Stop on assertions:
export G_DEBUG=fatal_warnings
export G_DEBUG=fatal_criticals

# Logging from all glib based libraries
export G_MESSAGES_DEBUG=all

# Check memory allocation 
export G_SLICE=debug-blocks

Data Types

Strings

gchar *s = "static";
s = g_strdup ("copy");
s = g_strdup_printf ("on the fly format: %s %d", s2, i);

g_free (s);

String Replace

Split text separated by literal “;;;” and join fields using new separator “  
char **split = g_strsplit(text, ";;;", -1);
g_free(text);
text = g_strjoinv("|||", split);
g_strfreev(split);

String Buffer

GString *s = g_string_new ();

g_string_assign (s, "new value");
g_string_printf (s, "new value %s", s2);
g_string_prepend (s, "prefix");
g_string_append (s, "additional text");
g_string_append_printf (s, "additional text %s", s2);

g_string_append_uri_escaped (s, "q=some search string", NULL, FALSE);

g_string_free (s);

Arrays

GArray *a = g_array_new (FALSE, FALSE, sizeof (gint));

gint index = 17;
gint value = 55;

// Writing
g_array_append_val (a, value);
g_array_insert_val (a, index, value);
g_array_remove_index (a, index);

// Reading
gint i = &g_array_index (a, gint, index);

g_array_free (a, FALSE);

Linked Lists

File System

Get XDG paths

g_get_user_config_dir ()
g_get_user_data_dir ()
g_get_user_cache_dir ()

Filenames

g_strdup_printf ("%s%s%s", directory, G_DIR_SEPARATOR_S, filename);

Check for file

if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
    // File exists.
}

Read file

gsize length;
gchar *content, *filename = "input.txt";
if (g_file_get_contents (filename, &content, &length, NULL)) {
    // Process contents
    g_free (content);
}

Write files

g_file_set_contents (backupFilename, content, length, NULL);

GSettings (DConf)

General usage:

GSettings *settings = g_settings_new ("org.myproject");

g_signal_connect (
    settings,
    "changed::some-setting",
    G_CALLBACK (some_settings_cb),
    NULL
);

gboolean b = g_settings_get_boolean (settings, key);
gchar *s = g_settings_get_string (settings, key);
gint i = g_settings_get_int (settings, key);

g_settings_set_boolean (settings, key, b);
g_settings_set_string (settings, key, s);
g_settings_set_int (settings, key, i);

DConf - CLI

# Print a key value
gsettings get org.gnome.liferea browser

# Set a key value
gsettings set net.sf.liferea browser 'firefox %s'

# Print subtree (mandatory trailing slash!)
dconf dump /apps/liferea/

# Dump and Restore non-default values
dconf dump /apps/liferea/  >liferea.dump
dconf load liferea.dump

# Reset a single key to schema default
dconf reset /apps/liferea/last-window-height

# Reset an entire tree to schema
dconf reset -f /apps/liferea/

GConf - CLI

# Print a key's schema
gconftool-2 --get /schemas/apps/liferea/browser

# Print a key value
gconftool-2 --get /apps/liferea/browser

# Set a key
gconftool-2 --type Boolean --set /desktop/gnome/peripherals/mouse/touchpad_enabled false

GConf/DConf Migration

Testing for GConf -> DConf schema migration:

cd /usr/share/GConf/gsettings
# Here you find .convert files per application

# Check for conversion using 
gsettings-data-convert --verbose --dry-run <.convert file name> 

GTK Inspector

Enable GTK Inspector by configuring the following setting:

gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true

Some GNOME core apps now have a “Help” menu entry to start the inspector. Alternatively launch the inspector by pressing Ctrl-Shift-I or Crtl-Shift-D

Or explicitely start the application with open inspector

GTK_DEBUG=interactive <program>