...
 
Commits (2116)
language: c
sudo: required
dist: trusty
services:
- docker
before_script:
- docker build -t packagekit-fedora -f contrib/ci/Dockerfile-fedora .
- docker build -t packagekit-debian -f contrib/ci/Dockerfile-debian .
script:
- docker run -t -v `pwd`:/build packagekit-fedora ./contrib/ci/build_and_test.sh
- docker run -t -v `pwd`:/build packagekit-debian ./contrib/ci/build_and_test.sh
[main]
host = https://www.transifex.com
[colord.master]
file_filter = po/<lang>.po
source_file = po/colord.pot
source_lang = en
Richard Hughes <richard@hughsie.com>
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at colord@lists.freedesktop.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
This diff is collapsed.
Richard Hughes <richard@hughsie.com>
This diff is collapsed.
colord
======
colord is a system service that makes it easy to manage, install and generate
color profiles to accurately color manage input and output devices.
This functionality is implemented as a system activated daemon called colord.
Being system activated means that it's only started when the user is using a
text mode or graphical tool.
What colord does:
* Provides a DBus API for other programs to query, e.g.
"Get me the profiles for device $foo" or
"Create a device and assign it profile $bar"
* Provides a persistent database backed store for device -> profile mapping.
* Provides the session for a way to set system settings, for instance
setting the display profile for all users and all sessions.
See [the website](https://www.freedesktop.org/software/colord/) for more details.
Compiling for Linux
===================
Ensure the following packages are installed:
* dbus-devel
* docbook-utils
* gettext
* glib2-devel
* gobject-introspection-devel
* gtk-doc
* intltool
* lcms2-devel
* libgudev1-devel
* libgusb-devel
* polkit-devel
* sqlite-devel
* systemd-devel
* vala-tools
Then just do `mkdir build && cd build && meson --prefix=/usr .. && ninja`
Compiling for Microsoft Windows
===============================
* Ensure wine is installed
* Compile with a lot of restricted options, e.g.
mingw64-configure \
--disable-argyllcms-sensor \
--disable-bash-completion \
--disable-polkit \
--disable-print-profiles \
--disable-sane \
--disable-session-example \
--disable-systemd \
--disable-udev \
--disable-unix \
--without-pic \
--with-systemdsystemunitdir=/tmp \
--with-udevrulesdir=/tmp && make
colord Release Notes
1. Write NEWS entries for colord in the same format as usual.
git shortlog 1.4.2.. | grep -i -v trivial | grep -v Merge > NEWS.new
Version 1.4.3
~~~~~~~~~~~~~
Released: 2017-xx-xx
New Features:
Bugfixes:
Write release date to ../doc/website/download.html
2: Update translations:
ninja colord-pot
tx push --source
tx pull --all --minimum-perc=5
git add ../po/*.po
# MAKE SURE THIS IS CORRECT
export release_ver="1.4.3"
3. Generate the tarball:
git commit -a -m "Release colord ${release_ver}"
git tag -s -f -m "Release colord ${release_ver}" "${release_ver}"
ninja dist
git push --tags
git push
gpg -b -a meson-dist/colord-${release_ver}.tar.xz
4. Upload tarball:
scp meson-dist/colord-${release_ver}.tar.* hughsient@annarchy.freedesktop.org:/srv/www.freedesktop.org/www/software/colord/releases/
5. Do post release version bump in meson.build
6. Commit changes:
git commit -a -m "trivial: post release version bump"
git push
7. Sync website with ./upload.sh
8. Send an email to colord@lists.freedesktop.org
colord is a system activated daemon that maps devices to color profiles.
See https://www.freedesktop.org/software/colord/ for more details.
Tarballs can be found here:
https://www.freedesktop.org/software/colord/releases/
This diff is collapsed.
This diff is collapsed.
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2013 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU General Public License Version 2
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <glib/gi18n.h>
#include <locale.h>
#include <lcms2.h>
#include <lcms2_plugin.h>
#include <stdlib.h>
#include <math.h>
#include <colord-private.h>
static gint lcms_error_code = 0;
static void
cd_fix_profile_error_cb (cmsContext ContextID,
cmsUInt32Number errorcode,
const char *text)
{
g_warning ("LCMS error %" G_GUINT32_FORMAT ": %s", errorcode, text);
/* copy this sytemwide */
lcms_error_code = errorcode;
}
static gboolean
cd_iccdump_print_file (const gchar *filename, GError **error)
{
g_autofree gchar *str = NULL;
g_autoptr(CdIcc) icc = NULL;
g_autoptr(GFile) file = NULL;
/* load the profile */
icc = cd_icc_new ();
file = g_file_new_for_path (filename);
if (!cd_icc_load_file (icc, file, CD_ICC_LOAD_FLAGS_NONE, NULL, error))
return FALSE;
/* dump it to text on the console */
str = cd_icc_to_string (icc);
g_print ("%s\n", str);
return TRUE;
}
int
main (int argc, char **argv)
{
gboolean ret;
GOptionContext *context;
gint i;
guint retval = EXIT_FAILURE;
g_autoptr(GError) error = NULL;
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
/* setup LCMS */
cmsSetLogErrorHandler (cd_fix_profile_error_cb);
context = g_option_context_new (NULL);
/* TRANSLATORS: program name */
g_set_application_name (_("ICC profile dump program"));
ret = g_option_context_parse (context, &argc, &argv, &error);
if (!ret) {
/* TRANSLATORS: the user didn't read the man page */
g_print ("%s: %s\n", _("Failed to parse arguments"),
error->message);
goto out;
}
/* dump each option */
for (i = 1; i < argc; i++) {
ret = cd_iccdump_print_file (argv[i], &error);
if (!ret) {
g_warning ("Failed to dump %s: %s",
argv[i], error->message);
goto out;
}
}
/* success */
retval = EXIT_SUCCESS;
out:
g_option_context_free (context);
return retval;
}
This diff is collapsed.
This diff is collapsed.
cargs = ['-DG_LOG_DOMAIN="Cd"']
executable(
'colormgr',
sources : [
'cd-util.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
gio,
lcms,
libm,
],
link_with : colord,
c_args : [
cargs,
],
install : true,
install_dir : bindir
)
executable(
'cd-fix-profile',
sources : [
'cd-fix-profile.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
gio,
lcms,
libm,
],
link_with : colord,
c_args : [
cargs,
],
install : true,
install_dir : bindir
)
executable(
'cd-iccdump',
sources : [
'cd-iccdump.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
gio,
lcms,
libm,
],
link_with : colord,
c_args : [
cargs,
],
install : true,
install_dir : bindir
)
cd_idt8 = executable(
'cd-it8',
sources : [
'cd-it8.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
gio,
lcms,
libm,
],
link_with : colord,
c_args : [
cargs,
],
install : true,
install_dir : bindir
)
cd_create_profile = executable(
'cd-create-profile',
sources : [
'cd-create-profile.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
gio,
lcms,
libm,
],
link_with : colordprivate,
c_args : [
cargs,
],
install : true,
install_dir : bindir
)
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:gnome="http://api.gnome.org/doap-extensions#"
xmlns="http://usefulinc.com/ns/doap#">
<name xml:lang="en">colord</name>
<shortdesc xml:lang="en">colord maps devices to color profiles.</shortdesc>
<description xml:lang="en">
colord is a system activated daemon that maps devices to color
profiles.
It is used by gnome-color-manager for system integration and use
when there are no users logged in.
</description>
<homepage rdf:resource="http://colord.hughsie.com/" />
<maintainer>
<foaf:Person>
<foaf:name>Richard Hughes</foaf:name>
<foaf:mbox rdf:resource="mailto:richard@hughsie.com" />
<foaf:homepage rdf:resource="http://www.hughsie.com/" />
</foaf:Person>
</maintainer>
<license rdf:resource="http://www.gnu.org/licenses/gpl-2.0.txt" />
</Project>
FROM debian:unstable
RUN apt-get update -qq
RUN apt-get install -yq --no-install-recommends \
bash-completion \
docbook-utils \
gettext \
gobject-introspection \
gtk-doc-tools \
gvfs-bin \
libdbus-glib-1-dev \
libgirepository1.0-dev \
libglib2.0-dev \
libgudev-1.0-dev \
libgusb-dev \
liblcms2-dev \
libpolkit-gobject-1-dev \
libsane-dev \
libsoup2.4-dev \
libsqlite3-dev \
libsystemd-dev \
libtool-bin \
libudev-dev \
meson \
pkg-config \
policykit-1 \
shared-mime-info \
systemd \
udev \
valac \
valgrind
RUN mkdir /build
WORKDIR /build
FROM fedora:26
RUN dnf -y update
RUN dnf -y install \
argyllcms \
bash-completion \
color-filesystem \
dbus-devel \
docbook-utils \
gettext \
glib2-devel \
gobject-introspection-devel \
gtk-doc \
lcms2-devel \
libgudev1-devel \
libgusb-devel \
libtool \
meson \
polkit-devel \
redhat-rpm-config \
sane-backends-devel \
sqlite-devel \
systemd-devel \
systemd-udev \
vala-tools
RUN mkdir /build
WORKDIR /build
#!/bin/sh
set -e
export LC_ALL=C.UTF-8
mkdir -p build && cd build
rm * -rf
meson .. \
-Dvapi=true \
-Dprint_profiles=false \
-Dargyllcms_sensor=false \
-Dsane=true \
-Dlibcolordcompat=true $@
ninja -v || bash
ninja test -v
DESTDIR=/tmp/install-ninja ninja install
cd ..
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2009-2014 Richard Hughes <richard@hughsie.com>
* Copyright (C) 2013 Christopher James Halse Rogers <raof@ubuntu.com>
*
* Licensed under the GNU General Public License Version 2
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <gio/gio.h>
#include <glib/gi18n.h>
#include <locale.h>
#include <sane/sane.h>
#include <gudev/gudev.h>
#include <dbus/dbus.h>
#include <colord/colord.h>
typedef struct {
gchar *argv0;
CdClient *client;
GMainLoop *loop;
GPtrArray *array; /* of CdMainDev's */
} CdMainPrivate;
typedef struct {
CdDevice *device;
gchar *id; /* note: we can get this from CdDevice, but we don't wan't to connect() */
gboolean valid;
} CdMainDev;
static void
cd_main_dev_free (CdMainDev *tmp)
{
g_object_unref (tmp->device);
g_free (tmp->id);
g_free (tmp);
}
static CdMainDev *
cd_main_dev_find_by_id (CdMainPrivate *priv,
const gchar *id)
{
CdMainDev *tmp;
guint i;
/* nothing to find */
if (priv->array->len == 0)
return NULL;
for (i = 0; i < priv->array->len; i++) {
tmp = g_ptr_array_index (priv->array, i);
if (g_strcmp0 (tmp->id, id) == 0)
return tmp;
}
return NULL;
}
static gchar *
cd_client_get_id_for_sane_device (const SANE_Device *sane_device)
{
return g_strdup_printf ("sane-%s", sane_device->model);
}
typedef struct {
CdMainPrivate *priv;
gchar *id;
} CdMainCreateDeviceHelper;
static void
cd_main_colord_create_device_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
CdClient *client = CD_CLIENT (source_object);
g_autoptr(GError) error = NULL;
g_autoptr(CdDevice) device = NULL;
/* get result */
device = cd_client_create_device_finish (client, res, &error);
if (device == NULL)
g_warning ("failed to create device: %s", error->message);
}
static void
cd_sane_client_add (CdMainPrivate *priv, const SANE_Device *sane_device)
{
CdMainDev *dev;
g_autofree gchar *id = NULL;
g_autofree gchar *model = NULL;
g_autofree gchar *vendor = NULL;
g_autoptr(GHashTable) properties = NULL;
/* ignore noname, no support devices */
if (g_strcmp0 (sane_device->vendor, "Noname") == 0) {
g_debug ("CdSaneClient: Ignoring sane device %s",
sane_device->name);
return;
}
/* convert device_id 'plustek:libusb:004:002' to suitable id */
id = cd_client_get_id_for_sane_device (sane_device);
/* see if this device already exists */
dev = cd_main_dev_find_by_id (priv, id);
if (dev != NULL) {
dev->valid = TRUE;
return;
}
/* Make human readable */
model = g_strdup (sane_device->model);
g_strdelimit (model, "_", ' ');
vendor = g_strdup (sane_device->vendor);
g_strdelimit (vendor, "_", ' ');
/* create initial device properties */
properties = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, NULL);
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_KIND,
(gpointer) cd_device_kind_to_string (CD_DEVICE_KIND_SCANNER));
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_MODE,
(gpointer) cd_device_mode_to_string (CD_DEVICE_MODE_PHYSICAL));
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_COLORSPACE,
(gpointer) cd_colorspace_to_string (CD_COLORSPACE_RGB));
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_VENDOR,
(gpointer) vendor);
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_MODEL,
(gpointer) model);
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_PROPERTY_SERIAL,
(gpointer) sane_device->name);
#if 0
g_hash_table_insert (properties,
(gpointer) CD_DEVICE_METADATA_OWNER_CMDLINE,
(gpointer) priv->argv0);
#endif
cd_client_create_device (priv->client,
id,
CD_OBJECT_SCOPE_NORMAL,
properties,
NULL,
cd_main_colord_create_device_cb,
NULL);
}
static void
cd_main_colord_delete_device_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
CdClient *client = CD_CLIENT (source_object);
g_autoptr(GError) error = NULL;
/* get result */
if (!cd_client_delete_device_finish (client, res, &error))
g_warning ("failed to delete device: %s", error->message);
}
static void
cd_sane_client_remove (CdMainPrivate *priv, CdDevice *device)
{
g_debug ("Deleting device: %s", cd_device_get_object_path (device));
cd_client_delete_device (priv->client,
device,
NULL,
cd_main_colord_delete_device_cb,
priv);
}
static void
cd_sane_client_refresh (CdMainPrivate *priv)
{
CdMainDev *tmp;
const SANE_Device **device_list = NULL;
gint idx;
guint i;
SANE_Status status;
status = sane_init (NULL, NULL);
if (status != SANE_STATUS_GOOD) {
g_warning ("failed to init SANE: %s",
sane_strstatus (status));
goto out;
}
/* get scanners on the local server */
status = sane_get_devices (&device_list, TRUE);
if (status != SANE_STATUS_GOOD) {
g_warning ("failed to get devices from SANE: %s",
sane_strstatus (status));
goto out;
}
/* nothing */
if (device_list == NULL || device_list[0] == NULL)
goto out;
/* add them */
for (idx = 0; device_list[idx] != NULL; idx++)
cd_sane_client_add (priv, device_list[idx]);
/* remove any that are invalid */
for (i = 0; i < priv->array->len; i++) {
tmp = g_ptr_array_index (priv->array, i);
if (tmp->valid)
continue;
cd_sane_client_remove (priv, tmp->device);
}
out:
g_main_loop_quit (priv->loop);
}
static void
cd_sane_add_device_if_from_colord_sane (gpointer data,
gpointer user_data)
{
CdDevice *device = (CdDevice *) data;
CdMainDev *sane_device;
CdMainPrivate *priv = (CdMainPrivate *) user_data;
const gchar *cmdline;
gboolean ret;
g_autoptr(GError) error = NULL;
ret = cd_device_connect_sync (device, NULL, &error);
if (!ret) {
g_warning ("failed to receive list of devices: %s",
error->message);
return;
}
cmdline = cd_device_get_metadata_item (device,
CD_DEVICE_METADATA_OWNER_CMDLINE);
if (g_strcmp0 (cmdline, priv->argv0) == 0) {
sane_device = g_new (CdMainDev, 1);
sane_device->device = g_object_ref (device);
sane_device->id = (gchar *)cd_device_get_id (device);
sane_device->valid = FALSE;
g_ptr_array_add (priv->array, sane_device);
}
}
static void
cd_sane_populate_existing_devices_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
CdMainPrivate *priv = (CdMainPrivate *) user_data;
GPtrArray *devices;
g_autoptr(GError) error = NULL;
devices = cd_client_get_devices_by_kind_finish (priv->client, res, &error);
if (error != NULL) {
g_warning ("failed to receive list of devices: %s",
error->message);
return;
}
g_ptr_array_foreach (devices,
cd_sane_add_device_if_from_colord_sane,
priv);
cd_sane_client_refresh (priv);
}
static void
cd_main_colord_connect_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
CdMainPrivate *priv = (CdMainPrivate *) user_data;
gboolean ret;
g_autoptr(GError) error = NULL;
/* get result */
ret = cd_client_connect_finish (priv->client, res, &error);
if (!ret) {
g_warning ("failed to connect to colord: %s",
error->message);
return;
}
cd_client_get_devices_by_kind (priv->client,
CD_DEVICE_KIND_SCANNER,
NULL,
cd_sane_populate_existing_devices_cb,
priv);
}
int
main (int argc, char *argv[])
{
CdMainPrivate *priv = NULL;
guint retval = 1;
/* We need to init DBus' threading support as libSANE uses raw DBus */
dbus_threads_init_default ();
/* create new objects */
priv = g_new0 (CdMainPrivate, 1);
priv->loop = g_main_loop_new (NULL, FALSE);
priv->client = cd_client_new ();
priv->argv0 = g_strdup (argv[0]);
priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) cd_main_dev_free);
/* connect to daemon */
cd_client_connect (priv->client,
NULL,
cd_main_colord_connect_cb,
priv);
/* process */
g_main_loop_run (priv->loop);
/* success */
retval = 0;
if (priv != NULL) {
g_free (priv->argv0);
if (priv->array != NULL)
g_ptr_array_unref (priv->array);
if (priv->client != NULL)
g_object_unref (priv->client);
g_main_loop_unref (priv->loop);
}
return retval;
}
cargs = ['-DG_LOG_DOMAIN="Cd"']
executable(
'colord-sane',
sources : [
'cd-main.c',
],
include_directories : [
colord_incdir,
lib_incdir,
root_incdir,
],
dependencies : [
dbus,
gio,
gudev,
sane,
],
link_with : colord,
c_args : [
cargs,
],
install : true,
install_dir : libexecdir
)
This diff is collapsed.
subdir('session-helper')
if get_option('sane')
subdir('colord-sane')
endif
../../src/cd-debug.c
\ No newline at end of file
../../src/cd-debug.h
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="dialog_calibrate">
<property name="can_focus">False</property>
<property name="border_width">12</property>
<property name="title" translatable="yes">Display Calibration</property>
<property name="hide_titlebar_when_maximized">True</property>
<property name="type_hint">dialog</property>
<property name="deletable">False</property>
<property name="has_resize_grip">False</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button_cancel">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
<property name="secondary">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_start">
<property name="label" translatable="yes">Start</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="vbox_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<property name="spacing">15</property>
<child>
<object class="GtkImage" id="image_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">1</property>
<property name="pixel_size">200</property>
<property name="icon_name">address-book-new</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Do not disturb the calibration device while in progress</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="foreground" value="#ffffffffffff"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="progressbar_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">6</property>
</object>
<packing>
<property name="expand">False</property>