diff options
author | Richard Hughes <richard@hughsie.com> | 2007-01-17 23:09:09 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2007-01-17 23:09:09 +0000 |
commit | e34bbaa10953dda54a043439c6ef53d0c64d4268 (patch) | |
tree | 50f6a48b9bf3b90d34ca193c0d62bc94f0e7ee34 /docs |
initial import of my local version of ohm
Diffstat (limited to 'docs')
-rw-r--r-- | docs/Makefile.am | 37 | ||||
-rw-r--r-- | docs/config.xsl | 9 | ||||
-rw-r--r-- | docs/dbus-interface.xml | 341 | ||||
-rw-r--r-- | docs/docbook.css | 50 | ||||
-rw-r--r-- | docs/faq.xml | 124 | ||||
-rw-r--r-- | docs/index.html | 395 | ||||
-rw-r--r-- | docs/index.xml.in | 42 | ||||
-rw-r--r-- | docs/introduction.xml | 322 | ||||
-rw-r--r-- | docs/ohm-logo.png | bin | 0 -> 758 bytes | |||
-rw-r--r-- | docs/ohm-logo.svg | 150 | ||||
-rw-r--r-- | docs/ohm-sessions.png | bin | 0 -> 35021 bytes | |||
-rw-r--r-- | docs/ohm-sessions.svg | 393 | ||||
-rw-r--r-- | docs/ohm-structure.png | bin | 0 -> 38899 bytes | |||
-rw-r--r-- | docs/ohm-structure.svg | 435 |
14 files changed, 2298 insertions, 0 deletions
diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000..676dd6a --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,37 @@ +IMAGE_FILES = \ + ohm-logo.png \ + ohm-logo.svg \ + ohm-structure.png \ + ohm-structure.svg \ + ohm-sessions.png \ + ohm-sessions.svg + +SPEC_XML_FILES = \ + index.xml \ + introduction.xml \ + faq.xml \ + dbus-interface.xml + +SPEC_HTML_FILES = \ + index.html + +htmldocdir = $(DOCDIR) +htmldoc_DATA = index.html + +if DOCBOOK_DOCS_ENABLED + +index.html : introduction.xml + $(XMLTO) html-nochunks -m config.xsl index.xml +endif # DOCBOOK_DOCS_ENABLED + +clean-local: + rm -f *~ + rm -f *.html + +EXTRA_DIST = \ + index.xml.in \ + config.xsl \ + docbook.css \ + $(SPEC_XML_FILES) \ + $(IMAGE_FILES) \ + $(SPEC_HTML_FILES) diff --git a/docs/config.xsl b/docs/config.xsl new file mode 100644 index 0000000..1ae0c22 --- /dev/null +++ b/docs/config.xsl @@ -0,0 +1,9 @@ +<?xml version='1.0'?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:fo="http://www.w3.org/1999/XSL/Format" + version="1.0"> + <xsl:param name="html.stylesheet" select="'docbook.css'"/> + <xsl:param name="use.id.as.filename" select="1"/> + <xsl:param name="chunk.section.depth" select="0"/> + +</xsl:stylesheet> diff --git a/docs/dbus-interface.xml b/docs/dbus-interface.xml new file mode 100644 index 0000000..35d383b --- /dev/null +++ b/docs/dbus-interface.xml @@ -0,0 +1,341 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!-- CVSID: $Id: dbus-interface.xml 1820 2007-01-14 23:24:00Z rhughes $ --> +<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> + +<chapter id="dbus-interface"> + <title>DBUS Interface</title> + <para> + This API is currently unstable and is likely to change in the future. + </para> + + <sect1 id="pm-intro"> + <title>Introduction</title> + <para> + Open Hardware Manager exposes a DBUS API for programs to obtain information about + the power state and to change it if required. + </para> + <para> + The following constants are used to uniquely refer to the session-wide + Open Hardware Manager object when making DBUS method calls: + </para> + <informaltable> + <tgroup cols="2"> + <tbody> + <row> + <entry>DBUS Service:</entry> + <entry><literal>org.freedesktop.ohm</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect1> + + <sect1 id="pm-manager"> + <title>Manager functionality</title> + <para> + The manager is the core of <literal>ohmd</literal> and processes all + core functionality such as loading plugins. + </para> + + <informaltable> + <tgroup cols="2"> + <tbody> + <row> + <entry>DBUS Object Path:</entry> + <entry><literal>/org/freedesktop/ohm/Manager</literal></entry> + </row> + <row> + <entry>DBUS Interface:</entry> + <entry><literal>org.freedesktop.ohm.Manager</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + <sect2 id="pm-manager-keys"> + <title> + <literal>Exported keys</literal> + </title> + <para> + Keys exported by the manager: + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Key</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry><literal>manager.version.major</literal></entry> + <entry>The major version number</entry> + </row> + <row> + <entry><literal>manager.version.minor</literal></entry> + <entry>The minor version number</entry> + </row> + <row> + <entry><literal>manager.version.patch</literal></entry> + <entry>The patch version number</entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + <sect2 id="pm-manager-GetVersion"> + <title> + <literal>GetVersion()</literal> + </title> + <para> + Gets the version of the <literal>ohmd</literal> daemon. + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Direction</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>out</entry> + <entry>string</entry> + <entry>The version, e.g. 0.2.3</entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + <sect2 id="pm-manager-GetPlugins"> + <title> + <literal>GetPlugins()</literal> + </title> + <para> + Gets the plugings currently loaded in the daemon. + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Direction</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>out</entry> + <entry>string array</entry> + <entry>A list of plugins, for instance, + <literal>backlight</literal>, <literal>heat-pol</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + </sect1> + + <sect1 id="pm-keystore"> + <title>Keystore functionality</title> + <para> + The keystore is the configuration plugin and processes all + preferences functionality such as the getting and setting of keys. + Session software can attempt to redefine any keys for the current user + but these may not be marked override and the operation may fail. + </para> + + <informaltable> + <tgroup cols="2"> + <tbody> + <row> + <entry>DBUS Object Path:</entry> + <entry><literal>/org/freedesktop/ohm/Keystore</literal></entry> + </row> + <row> + <entry>DBUS Interface:</entry> + <entry><literal>org.freedesktop.ohm.Keystore</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + <sect2 id="pm-keystore-GetKey"> + <title> + <literal>GetKey()</literal> + </title> + <para> + Gets a 32 bit signed integer value. + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Direction</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>in</entry> + <entry>string</entry> + <entry>the key name, e.g. <literal>ac.state</literal></entry> + </row> + <row> + <entry>out</entry> + <entry>integer</entry> + <entry></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + <sect2 id="pm-keystore-SetKey"> + <title> + <literal>SetKey()</literal> + </title> + <para> + Sets a 32 bit signed integer value. + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Direction</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>in</entry> + <entry>string</entry> + <entry>the key name, e.g. <literal>ac.state</literal></entry> + </row> + <row> + <entry>in</entry> + <entry>integer</entry> + <entry></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + <sect2 id="pm-keystore-AddNotifyKey"> + <title> + <literal>AddNotifyKey()</literal> + </title> + <para> + Tells OHM that an application or plugin wants notification of this key + change. + This prevents uninteresting keys from being changed with no action + causing unnecessary context switches and processor usage. + <literal>KeyChanged</literal> signals will not be sent unless at least + one application has requested notifications. + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Direction</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>in</entry> + <entry>string</entry> + <entry>the key name, e.g. <literal>ac.state</literal></entry> + </row> + <row> + <entry>in</entry> + <entry>integer</entry> + <entry></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + </sect1> + + <sect1 id="pm-backlight"> + <title>Backlight Adjustment</title> + <para> + Backlight brightness and state can be changed on most backlight hardware. + These are the optional DBUS methods for controlling the brightness of + the backlight. + </para> + + <informaltable> + <tgroup cols="2"> + <tbody> + <row> + <entry>DBUS Object Path:</entry> + <entry><literal>/org/freedesktop/ohm/Backlight</literal></entry> + </row> + <row> + <entry>DBUS Interface:</entry> + <entry><literal>org.freedesktop.ohm.Backlight</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + <sect2 id="pm-backlight-keys"> + <title> + <literal>Exported keys</literal> + </title> + <para> + Keys exported by this plugin: + </para> + <informaltable> + <tgroup cols="2"> + <thead> + <row> + <entry>Key</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry><literal>backlight.value_ac</literal></entry> + <entry>Brightness in percentage when on AC</entry> + </row> + <row> + <entry><literal>backlight.value_battery</literal></entry> + <entry>Brightness in percentage when on battery</entry> + </row> + <row> + <entry><literal>backlight.value_idle</literal></entry> + <entry>Brightness in percentage when idle</entry> + </row> + <row> + <entry><literal>backlight.time_idle</literal></entry> + <entry> + The amount of time in seconds before the backlight is put + into idle mode, or zero to disable. + Idle mode is typically dimming for most backlight devices. + </entry> + </row> + <row> + <entry><literal>backlight.time_off</literal></entry> + <entry> + The amount of time in seconds before the backlight is turned + off, or zero to disable. + </entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + </sect1> + +</chapter> diff --git a/docs/docbook.css b/docs/docbook.css new file mode 100644 index 0000000..50292d1 --- /dev/null +++ b/docs/docbook.css @@ -0,0 +1,50 @@ +body { + font-family: luxi sans,sans-serif; +} + +table { + border: 0px; + width: 100%; +} + +div.informaltable { + border: solid 1px; + background: #eeeeff; + width: 50%; +} + +code.email { + color: #a00000; +} + +th { + padding: 2px; + border: 0px; +} + +hr { + border: 0; + width: 80%; + background-color: #a00000; + height: 1px; +} + +td { + border: 0px; + padding: 5px; +} + +tr { + border: 0px; + padding: 5px; +} + +a { + color: #000000; + text-decoration: none; +} + +a:hover { + color: #a00000; + text-decoration: none; +} diff --git a/docs/faq.xml b/docs/faq.xml new file mode 100644 index 0000000..2081ae9 --- /dev/null +++ b/docs/faq.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> + +<chapter id="faq"> + <title>Frequently Asked Questions</title> + <para> + Please read through these common questions and answers before asking + developers. + </para> + + <sect1 id="faq-sessionpolicy"> + <title> + How does OHM fit in with other session policy agents? + </title> + <para> + At the moment, no distributions ship OHM, so there is no problem. + When they do, session power daemons will talk to <literal>hald</literal> + and <literal>ohmd</literal> together, and there should be no visible + changes to the user. + </para> + </sect1> + + <sect1 id="faq-specificdevice"> + <title> + Why not just do a specific device hack for all the different + embedded hardware? + </title> + <para> + As lots of manufacturers are hacking the same thing, over and over. + We need some sort of central common framework. + </para> + </sect1> + + <sect1 id="faq-lgpl"> + <title> + So it's LGPL... does that mean some of the code is closed source? + </title> + <para> + No. It just means that code protected by intellectual property laws + can be used by manufacturers, but OHM works really well without any + non-free stuff. + </para> + </sect1> + + <sect1 id="faq-installcode"> + <title> + Can I install the latest stable code? + </title> + <para> + No, at the moment it is proof of concept and only really useful for + developers. Feel free to look at the code and spec and give feedback, + but please don't expect anything to actually work well yet. + </para> + </sect1> + + <sect1 id="faq-releasedate"> + <title> + What is the release date plan for OHM? + </title> + <para> + Currently we are aiming at a 2 month stakeholder involvement prototype + period, and then 10 months of code polishing and maturing. + That gives an approximate release date of January 2008 + </para> + </sect1> + + <sect1 id="faq-systemprefs"> + <title> + Do you need to use system GConf for the system preferences? + </title> + <para> + No. We plan to use a flat file for minimum dependencies and speed, + and also each file is going to be really small and simple. + </para> + </sect1> + + <sect1 id="faq-noxml"> + <title> + Is OHM using XML to define the policy rules? + </title> + <para> + No, as we don't need to. + We are using compiled logic for speed and low dependencies. + </para> + </sect1> + + <sect1 id="faq-whysessionlayer"> + <title> + Why include a session layer for embedded appliances? + </title> + <para> + Devices can omit the session layer, and talk directly to OHM on the + system bus. This removes the ability to do fast user switching or + have multiple logged in users and does reduce security. + </para> + </sect1> + + <sect1 id="faq-whysinglehash"> + <title> + Why are all the keys exposed in a single hash table? + </title> + <para> + Plugins have to query to state of other plugins. + To store the state of each plugin in itself, we would have to do + inter-plugin methods, and expose the SetKey and GetKey methods on every + plugin. + We can also optimise the global keystore for a fast hash lookup to avoid + scalability problems. + This also makes it easier to code as the keystore can just be a + compiled <literal>.o</literal> object rather than a shared library. + </para> + </sect1> + + <sect1 id="faq-restartdeps"> + <title> + Will OHM break if I restart <literal>messagebus</literal> or + <literal>hald</literal>? + </title> + <para> + Yes. Please restart your computer if you want to restart these daemons. + </para> + </sect1> + +</chapter> diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..2158200 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,395 @@ +<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Open Hardware Manager 0.0.1 Documentation</title><link rel="stylesheet" href="docbook.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"><meta name="description" content='Executive Summary + OHM is a small open source systems daemon which sits above HAL and + abstracts out common hardware management tasks such as system wide + inhibit action control and controlling heat dissipation on embedded + devices. + OHM is built using a lightweight plugin architecture. + Each plugin can query data from HAL or execute methods on HAL devices + and expose preferences for session programs to modify. + OHM is product and vendor neutral and is currently being developed by + a small team of developers. + + OHM : "Resistance is futile" + '></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="index"></a>Open Hardware Manager 0.0.1 Documentation</h1></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Richard</span> <span class="surname">Hughes</span></h3><div class="affiliation"><div class="address"><p><br> + <code class="email"><<a href="mailto:richard@hughsie.com">richard@hughsie.com</a>></code><br> + </p></div></div></div></div></div><div><p class="releaseinfo">Version 0.0.1</p></div><div><div class="abstract"><p class="title"><b>Executive Summary</b></p><p> + OHM is a small open source systems daemon which sits above HAL and + abstracts out common hardware management tasks such as system wide + inhibit action control and controlling heat dissipation on embedded + devices. + OHM is built using a lightweight plugin architecture. + Each plugin can query data from HAL or execute methods on HAL devices + and expose preferences for session programs to modify. + OHM is product and vendor neutral and is currently being developed by + a small team of developers. + </p><p> + OHM : <span class="emphasis"><em>"Resistance is futile"</em></span> + </p></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="#introduction">1. Open Hardware Manager Introduction</a></span></dt><dd><dl><dt><span class="sect1"><a href="#introduction-description">Overall Description</a></span></dt><dt><span class="sect1"><a href="#introduction-plugins">Plugins</a></span></dt><dt><span class="sect1"><a href="#introduction-deps">Dependencies</a></span></dt></dl></dd><dt><span class="chapter"><a href="#dbus-interface">2. DBUS Interface</a></span></dt><dd><dl><dt><span class="sect1"><a href="#pm-intro">Introduction</a></span></dt><dt><span class="sect1"><a href="#pm-manager">Manager functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-manager-keys"> + <code class="literal">Exported keys</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetVersion"> + <code class="literal">GetVersion()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetPlugins"> + <code class="literal">GetPlugins()</code> + </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-keystore">Keystore functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-keystore-GetKey"> + <code class="literal">GetKey()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-SetKey"> + <code class="literal">SetKey()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-AddNotifyKey"> + <code class="literal">AddNotifyKey()</code> + </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-backlight">Backlight Adjustment</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-backlight-keys"> + <code class="literal">Exported keys</code> + </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#faq">3. Frequently Asked Questions</a></span></dt><dd><dl><dt><span class="sect1"><a href="#faq-sessionpolicy"> + How does OHM fit in with other session policy agents? + </a></span></dt><dt><span class="sect1"><a href="#faq-specificdevice"> + Why not just do a specific device hack for all the different + embedded hardware? + </a></span></dt><dt><span class="sect1"><a href="#faq-lgpl"> + So it's LGPL... does that mean some of the code is closed source? + </a></span></dt><dt><span class="sect1"><a href="#faq-installcode"> + Can I install the latest stable code? + </a></span></dt><dt><span class="sect1"><a href="#faq-releasedate"> + What is the release date plan for OHM? + </a></span></dt><dt><span class="sect1"><a href="#faq-systemprefs"> + Do you need to use system GConf for the system preferences? + </a></span></dt><dt><span class="sect1"><a href="#faq-noxml"> + Is OHM using XML to define the policy rules? + </a></span></dt><dt><span class="sect1"><a href="#faq-whysessionlayer"> + Why include a session layer for embedded appliances? + </a></span></dt><dt><span class="sect1"><a href="#faq-whysinglehash"> + Why are all the keys exposed in a single hash table? + </a></span></dt><dt><span class="sect1"><a href="#faq-restartdeps"> + Will OHM break if I restart <code class="literal">messagebus</code> or + <code class="literal">hald</code>? + </a></span></dt></dl></dd></dl></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="introduction"></a>Chapter 1. Open Hardware Manager Introduction</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#introduction-description">Overall Description</a></span></dt><dt><span class="sect1"><a href="#introduction-plugins">Plugins</a></span></dt><dt><span class="sect1"><a href="#introduction-deps">Dependencies</a></span></dt></dl></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-description"></a>Overall Description</h2></div></div></div><p> + OHM is a small open source systems daemon which sits above HAL and + abstracts out common hardware management tasks such as: + </p><div class="itemizedlist"><ul type="disc"><li><p> + System wide power management statistics (for instance calculating + hysteresis of battery curves). + </p></li><li><p> + Managing system wide inhibit actions, for instance system + firmware updating. + </p></li><li><p> + Controlling heat dissipation on embedded and PC devices. + </p></li></ul></div><p> + OHM is built using a plugin architecture with a low-overhead messaging + structure. + This gives a very configurable base system that can be configured in many + different ways. + Each plugin can query data from HAL or execute methods on HAL devices and + expose preferences interfaces for session-space to use. + </p><div class="mediaobject" align="center"><a name="ohm-structure"></a><img src="ohm-structure.png" align="middle"></div><p> + OHM is LGPL licensed to allow proprietary licensed plug-ins to be used + where absolutely required. + It is also uses the minimum of memory and processor requirement to fulfill + the task. + This makes it suitable for use on the latest smart-phones, the OLPC device + or any other embedded products such as set top boxes. + </p><p> + HAL has traditionally been seen too heavyweight for use on an embedded device. + While this was once true, there have been very many developers working on + adding conditional compilation to parts of HAL, and to reduce memory usage. + This can be seen with the startup speed of 0.5.9 being 40% than of 0.5.8. + Context switching has been reduced, and memory pressure on coldplug has been + reduced for devices with a small amount of devices. + It is expected that <code class="literal">hald</code> will start in the few hundred + millisecond range and consume less than half a megabyte of RAM at coldplug. + </p><p> + Using HAL allows us to use a common framework for hardware management, + which means plugins designed for one architecture or chip will work on + any other system. + Working together is the best way to get high quality, maintainable code + rather than all the hacky systems we have now. + </p><div class="mediaobject" align="center"><a name="ohm-sessions"></a><img src="ohm-sessions.png" align="middle"></div><p> + Proof of concept code is available on the project page. + There are no tarball releases yet, checking out using git is the best + option. + </p><p> + OHM comprises: + </p><div class="itemizedlist"><ul type="disc"><li><p> + The <code class="literal">ohmd</code> system daemon which co-ordinates the + rules and acts as a keystore for multiple users. + </p></li><li><p> + The interface specification which outlines core + <code class="literal">ohmd</code> functionality + </p></li><li><p> + A method for plugins to request notification when keys change, for + example when the system AC state is changed. + </p></li><li><p> + The test suite which tests functionality + </p></li></ul></div><p> + OHM is very suitable for embedded devices that need to manage power, heat + and other critical tasks early in the boot sequence. + Using HAL, it provides an abstract method for all plugins to be written in + a generic way, not tied to the specific implementation of the device. + </p><p> + What OHM is not: + </p><div class="itemizedlist"><ul type="disc"><li><p> + A power saving daemon. + It is not doing power saving specifically, it is just doing device + specific rules that manage power and heat dissipation and other + hardware specific stuff. + </p></li><li><p> + An abstraction of HAL. HAL acts as the input and the output of OHM, + and OHM enforces policy for HAL. + </p></li><li><p> + A huge daemon with lots of dependencies. + </p></li><li><p> + API or ABI stable. Expect the ABI and API to change on a regular + basis until we ship 1.0.0. + </p></li><li><p> + Targeted to a particular architecture or platform. + </p></li><li><p> + Produced by any one vendor. + There are many contributors helping to get this done. + </p></li></ul></div><p> + Why not do everything in a session daemon?: + </p><div class="itemizedlist"><ul type="disc"><li><p> + Sometimes we need to start very early in the boot sequence. + </p></li><li><p> + We don't want to die if X dies. + </p></li><li><p> + On a server with 100 logged in users we don't want an instance for + each user. + </p></li><li><p> + We need to apply policy at boot-up or before X starts. + </p></li></ul></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-plugins"></a>Plugins</h2></div></div></div><p> + Plugins have keys and policy, and also install a default system + preferences file. + </p><p> + We need to set system preferences when there is no user logged in or we + are very early in the boot sequence. + We do this with each plugin installing a text file with the plugin key + name, the value, and optionally the public switch. + </p><p> + The core setup file is read from <code class="filename">/etc/ohm/core</code> and + plugin preferences are read from <code class="filename">/etc/ohm/plugins/{name}</code> + Comments are lines with first character <code class="literal">#</code> and then the + rest of the line is ignored. + Files are flat text with the following formal description, + <code class="literal">plugin_prefix.key value type public</code> + </p><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p> + There is a single space between the values. + Line endings have to be UNIX not WIN or MAC. + Parsing is very strict, and <code class="literal">ohmd</code> will exit with an + error if the syntax is not perfect. This is by design. + </p></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> + Public is only set if the key can be changed by the session, and if the + key is tried to be set, the set method will fail. + This is a way to enforce fine-grained rules on users when writing + PolicyKit rules for every action would be too great an overhead. + </p></div><p> + Plugins can tell <code class="literal">ohmd</code> that other plugins are required + for certain functionality, for instance, the backlight unit on a mobile + phone may require the temperature module to be present, so it can do the + temperature shutdown checks. + This is done with <code class="literal">ohm_module_require()</code>. + <code class="literal">ohmd</code> daemon will fail to load if any required plugin + is not present after the plugins have finished initializing. + </p><p> + Plugins can also tell <code class="literal">ohmd</code> that other plugins are suggested for certain + functionality, for instance, the backlight unit may work best when the + battery plugin is loaded so we can dim when we are low on power. + This is done with <code class="literal">ohm_module_suggest()</code>. + <code class="literal">ohmd</code> daemon will print a message to the console if any + suggested plugin is not present. + </p><p> + Plugins can also tell <code class="literal">ohmd</code> that other plugins are banned, for instance, + a proprietary battery discharge plugin maybe incompatible with the + standard battery plugin. + This is done with <code class="literal">ohm_module_prevent()</code>. + <code class="literal">ohmd</code> will fail to load if any prevented plugin is + manually loaded or loaded through a dependency of another plugin. + </p><p> + In <code class="literal">ohmd</code>, keys are created read/write by the plugin. + Other plugins can watch for changes on these keys (even on other modules) + using <code class="literal">ohm_key_monitor()</code>. + The callback will be issued local to the plugin when the state of this + key changes. + </p><p> + NOTE: There is no ordering of priority (yet?) of monitored keys. + Make sure that policy per key is kept to one plugin, else strange + races might start happening. + </p><p> + A library called <code class="literal">libohm</code> allows system and session + programs to easily interface with <code class="literal">ohmd</code>. + This library will remove the implementation detail from plugins and + session applications. + This library, like the rest of OHM will not be API or ABI stable until + version 1.0.0 is released. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-deps"></a>Dependencies</h2></div></div></div><p> + OHM is lightweight. + </p><div class="itemizedlist"><ul type="disc"><li><p> + GLib 2.10.0 (required) + </p></li><li><p> + DBUS 0.70 (required) + </p></li><li><p> + HAL 0.5.8 (required) + </p></li><li><p> + PolicyKit (optional) + </p></li><li><p> + ConsoleKit (optional) + </p></li></ul></div></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="dbus-interface"></a>Chapter 2. DBUS Interface</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#pm-intro">Introduction</a></span></dt><dt><span class="sect1"><a href="#pm-manager">Manager functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-manager-keys"> + <code class="literal">Exported keys</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetVersion"> + <code class="literal">GetVersion()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetPlugins"> + <code class="literal">GetPlugins()</code> + </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-keystore">Keystore functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-keystore-GetKey"> + <code class="literal">GetKey()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-SetKey"> + <code class="literal">SetKey()</code> + </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-AddNotifyKey"> + <code class="literal">AddNotifyKey()</code> + </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-backlight">Backlight Adjustment</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-backlight-keys"> + <code class="literal">Exported keys</code> + </a></span></dt></dl></dd></dl></div><p> + This API is currently unstable and is likely to change in the future. + </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-intro"></a>Introduction</h2></div></div></div><p> + Open Hardware Manager exposes a DBUS API for programs to obtain information about + the power state and to change it if required. + </p><p> + The following constants are used to uniquely refer to the session-wide + Open Hardware Manager object when making DBUS method calls: + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Service:</td><td><code class="literal">org.freedesktop.ohm</code></td></tr></tbody></table></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-manager"></a>Manager functionality</h2></div></div></div><p> + The manager is the core of <code class="literal">ohmd</code> and processes all + core functionality such as loading plugins. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Manager</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Manager</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-keys"></a> + <code class="literal">Exported keys</code> + </h3></div></div></div><p> + Keys exported by the manager: + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody><tr><td><code class="literal">manager.version.major</code></td><td>The major version number</td></tr><tr><td><code class="literal">manager.version.minor</code></td><td>The minor version number</td></tr><tr><td><code class="literal">manager.version.patch</code></td><td>The patch version number</td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-GetVersion"></a> + <code class="literal">GetVersion()</code> + </h3></div></div></div><p> + Gets the version of the <code class="literal">ohmd</code> daemon. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>out</td><td>string</td><td>The version, e.g. 0.2.3</td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-GetPlugins"></a> + <code class="literal">GetPlugins()</code> + </h3></div></div></div><p> + Gets the plugings currently loaded in the daemon. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>out</td><td>string array</td><td>A list of plugins, for instance, + <code class="literal">backlight</code>, <code class="literal">heat-pol</code></td></tr></tbody></table></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-keystore"></a>Keystore functionality</h2></div></div></div><p> + The keystore is the configuration plugin and processes all + preferences functionality such as the getting and setting of keys. + Session software can attempt to redefine any keys for the current user + but these may not be marked override and the operation may fail. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Keystore</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Keystore</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-GetKey"></a> + <code class="literal">GetKey()</code> + </h3></div></div></div><p> + Gets a 32 bit signed integer value. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>out</td><td>integer</td><td> </td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-SetKey"></a> + <code class="literal">SetKey()</code> + </h3></div></div></div><p> + Sets a 32 bit signed integer value. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>in</td><td>integer</td><td> </td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-AddNotifyKey"></a> + <code class="literal">AddNotifyKey()</code> + </h3></div></div></div><p> + Tells OHM that an application or plugin wants notification of this key + change. + This prevents uninteresting keys from being changed with no action + causing unnecessary context switches and processor usage. + <code class="literal">KeyChanged</code> signals will not be sent unless at least + one application has requested notifications. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>in</td><td>integer</td><td> </td></tr></tbody></table></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-backlight"></a>Backlight Adjustment</h2></div></div></div><p> + Backlight brightness and state can be changed on most backlight hardware. + These are the optional DBUS methods for controlling the brightness of + the backlight. + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Backlight</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Backlight</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-backlight-keys"></a> + <code class="literal">Exported keys</code> + </h3></div></div></div><p> + Keys exported by this plugin: + </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody><tr><td><code class="literal">backlight.value_ac</code></td><td>Brightness in percentage when on AC</td></tr><tr><td><code class="literal">backlight.value_battery</code></td><td>Brightness in percentage when on battery</td></tr><tr><td><code class="literal">backlight.value_idle</code></td><td>Brightness in percentage when idle</td></tr><tr><td><code class="literal">backlight.time_idle</code></td><td> + The amount of time in seconds before the backlight is put + into idle mode, or zero to disable. + Idle mode is typically dimming for most backlight devices. + </td></tr><tr><td><code class="literal">backlight.time_off</code></td><td> + The amount of time in seconds before the backlight is turned + off, or zero to disable. + </td></tr></tbody></table></div></div></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="faq"></a>Chapter 3. Frequently Asked Questions</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#faq-sessionpolicy"> + How does OHM fit in with other session policy agents? + </a></span></dt><dt><span class="sect1"><a href="#faq-specificdevice"> + Why not just do a specific device hack for all the different + embedded hardware? + </a></span></dt><dt><span class="sect1"><a href="#faq-lgpl"> + So it's LGPL... does that mean some of the code is closed source? + </a></span></dt><dt><span class="sect1"><a href="#faq-installcode"> + Can I install the latest stable code? + </a></span></dt><dt><span class="sect1"><a href="#faq-releasedate"> + What is the release date plan for OHM? + </a></span></dt><dt><span class="sect1"><a href="#faq-systemprefs"> + Do you need to use system GConf for the system preferences? + </a></span></dt><dt><span class="sect1"><a href="#faq-noxml"> + Is OHM using XML to define the policy rules? + </a></span></dt><dt><span class="sect1"><a href="#faq-whysessionlayer"> + Why include a session layer for embedded appliances? + </a></span></dt><dt><span class="sect1"><a href="#faq-whysinglehash"> + Why are all the keys exposed in a single hash table? + </a></span></dt><dt><span class="sect1"><a href="#faq-restartdeps"> + Will OHM break if I restart <code class="literal">messagebus</code> or + <code class="literal">hald</code>? + </a></span></dt></dl></div><p> + Please read through these common questions and answers before asking + developers. + </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-sessionpolicy"></a> + How does OHM fit in with other session policy agents? + </h2></div></div></div><p> + At the moment, no distributions ship OHM, so there is no problem. + When they do, session power daemons will talk to <code class="literal">hald</code> + and <code class="literal">ohmd</code> together, and there should be no visible + changes to the user. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-specificdevice"></a> + Why not just do a specific device hack for all the different + embedded hardware? + </h2></div></div></div><p> + As lots of manufacturers are hacking the same thing, over and over. + We need some sort of central common framework. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-lgpl"></a> + So it's LGPL... does that mean some of the code is closed source? + </h2></div></div></div><p> + No. It just means that code protected by intellectual property laws + can be used by manufacturers, but OHM works really well without any + non-free stuff. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-installcode"></a> + Can I install the latest stable code? + </h2></div></div></div><p> + No, at the moment it is proof of concept and only really useful for + developers. Feel free to look at the code and spec and give feedback, + but please don't expect anything to actually work well yet. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-releasedate"></a> + What is the release date plan for OHM? + </h2></div></div></div><p> + Currently we are aiming at a 2 month stakeholder involvement prototype + period, and then 10 months of code polishing and maturing. + That gives an approximate release date of January 2008 + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-systemprefs"></a> + Do you need to use system GConf for the system preferences? + </h2></div></div></div><p> + No. We plan to use a flat file for minimum dependencies and speed, + and also each file is going to be really small and simple. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-noxml"></a> + Is OHM using XML to define the policy rules? + </h2></div></div></div><p> + No, as we don't need to. + We are using compiled logic for speed and low dependencies. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-whysessionlayer"></a> + Why include a session layer for embedded appliances? + </h2></div></div></div><p> + Devices can omit the session layer, and talk directly to OHM on the + system bus. This removes the ability to do fast user switching or + have multiple logged in users and does reduce security. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-whysinglehash"></a> + Why are all the keys exposed in a single hash table? + </h2></div></div></div><p> + Plugins have to query to state of other plugins. + To store the state of each plugin in itself, we would have to do + inter-plugin methods, and expose the SetKey and GetKey methods on every + plugin. + We can also optimise the global keystore for a fast hash lookup to avoid + scalability problems. + This also makes it easier to code as the keystore can just be a + compiled <code class="literal">.o</code> object rather than a shared library. + </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-restartdeps"></a> + Will OHM break if I restart <code class="literal">messagebus</code> or + <code class="literal">hald</code>? + </h2></div></div></div><p> + Yes. Please restart your computer if you want to restart these daemons. + </p></div></div></div></body></html> diff --git a/docs/index.xml.in b/docs/index.xml.in new file mode 100644 index 0000000..d381a92 --- /dev/null +++ b/docs/index.xml.in @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"> + +<book id="index"> + <bookinfo> + <title>Open Hardware Manager @VERSION@ Documentation</title> + <releaseinfo>Version @VERSION@</releaseinfo> + <abstract> + <title>Executive Summary</title> + <para> + OHM is a small open source systems daemon which sits above HAL and + abstracts out common hardware management tasks such as system wide + inhibit action control and controlling heat dissipation on embedded + devices. + OHM is built using a lightweight plugin architecture. + Each plugin can query data from HAL or execute methods on HAL devices + and expose preferences for session programs to modify. + OHM is product and vendor neutral and is currently being developed by + a small team of developers. + </para> + <para> + OHM : <emphasis>"Resistance is futile"</emphasis> + </para> + </abstract> + <date>January 17th, 2007</date> + <authorgroup> + <author> + <firstname>Richard</firstname> + <surname>Hughes</surname> + <affiliation> + <address> + <email>richard@hughsie.com</email> + </address> + </affiliation> + </author> + </authorgroup> + </bookinfo> + <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="introduction.xml" /> + <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="dbus-interface.xml" /> + <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="faq.xml" /> + +</book> diff --git a/docs/introduction.xml b/docs/introduction.xml new file mode 100644 index 0000000..33334b6 --- /dev/null +++ b/docs/introduction.xml @@ -0,0 +1,322 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> + +<chapter id="introduction"> + <title>Open Hardware Manager Introduction</title> + + <sect1 id="introduction-description"> + <title>Overall Description</title> + + <para> + OHM is a small open source systems daemon which sits above HAL and + abstracts out common hardware management tasks such as: + </para> + <itemizedlist> + <listitem> + <para> + System wide power management statistics (for instance calculating + hysteresis of battery curves). + </para> + </listitem> + <listitem> + <para> + Managing system wide inhibit actions, for instance system + firmware updating. + </para> + </listitem> + <listitem> + <para> + Controlling heat dissipation on embedded and PC devices. + </para> + </listitem> + </itemizedlist> + + <para> + OHM is built using a plugin architecture with a low-overhead messaging + structure. + This gives a very configurable base system that can be configured in many + different ways. + Each plugin can query data from HAL or execute methods on HAL devices and + expose preferences interfaces for session-space to use. + </para> + + <mediaobject id="ohm-structure"> + <imageobject> + <imagedata format="PNG" fileref="ohm-structure.png" align="center"/> + </imageobject> + </mediaobject> + + <para> + OHM is LGPL licensed to allow proprietary licensed plug-ins to be used + where absolutely required. + It is also uses the minimum of memory and processor requirement to fulfill + the task. + This makes it suitable for use on the latest smart-phones, the OLPC device + or any other embedded products such as set top boxes. + </para> + + <para> + HAL has traditionally been seen too heavyweight for use on an embedded device. + While this was once true, there have been very many developers working on + adding conditional compilation to parts of HAL, and to reduce memory usage. + This can be seen with the startup speed of 0.5.9 being 40% than of 0.5.8. + Context switching has been reduced, and memory pressure on coldplug has been + reduced for devices with a small amount of devices. + It is expected that <literal>hald</literal> will start in the few hundred + millisecond range and consume less than half a megabyte of RAM at coldplug. + </para> + + <para> + Using HAL allows us to use a common framework for hardware management, + which means plugins designed for one architecture or chip will work on + any other system. + Working together is the best way to get high quality, maintainable code + rather than all the hacky systems we have now. + </para> + + <mediaobject id="ohm-sessions"> + <imageobject> + <imagedata format="PNG" fileref="ohm-sessions.png" align="center"/> + </imageobject> + </mediaobject> + + <para> + Proof of concept code is available on the project page. + There are no tarball releases yet, checking out using git is the best + option. + </para> + + <para> + OHM comprises: + </para> + <itemizedlist> + <listitem> + <para> + The <literal>ohmd</literal> system daemon which co-ordinates the + rules and acts as a keystore for multiple users. + </para> + </listitem> + <listitem> + <para> + The interface specification which outlines core + <literal>ohmd</literal> functionality + </para> + </listitem> + <listitem> + <para> + A method for plugins to request notification when keys change, for + example when the system AC state is changed. + </para> + </listitem> + <listitem> + <para> + The test suite which tests functionality + </para> + </listitem> + </itemizedlist> + + <para> + OHM is very suitable for embedded devices that need to manage power, heat + and other critical tasks early in the boot sequence. + Using HAL, it provides an abstract method for all plugins to be written in + a generic way, not tied to the specific implementation of the device. + </para> + + <para> + What OHM is not: + </para> + <itemizedlist> + <listitem> + <para> + A power saving daemon. + It is not doing power saving specifically, it is just doing device + specific rules that manage power and heat dissipation and other + hardware specific stuff. + </para> + </listitem> + <listitem> + <para> + An abstraction of HAL. HAL acts as the input and the output of OHM, + and OHM enforces policy for HAL. + </para> + </listitem> + <listitem> + <para> + A huge daemon with lots of dependencies. + </para> + </listitem> + <listitem> + <para> + API or ABI stable. Expect the ABI and API to change on a regular + basis until we ship 1.0.0. + </para> + </listitem> + <listitem> + <para> + Targeted to a particular architecture or platform. + </para> + </listitem> + <listitem> + <para> + Produced by any one vendor. + There are many contributors helping to get this done. + </para> + </listitem> + </itemizedlist> + + <para> + Why not do everything in a session daemon?: + </para> + <itemizedlist> + <listitem> + <para> + Sometimes we need to start very early in the boot sequence. + </para> + </listitem> + <listitem> + <para> + We don't want to die if X dies. + </para> + </listitem> + <listitem> + <para> + On a server with 100 logged in users we don't want an instance for + each user. + </para> + </listitem> + <listitem> + <para> + We need to apply policy at boot-up or before X starts. + </para> + </listitem> + </itemizedlist> + </sect1> + + <sect1 id="introduction-plugins"> + <title>Plugins</title> + <para> + Plugins have keys and policy, and also install a default system + preferences file. + </para> + + <para> + We need to set system preferences when there is no user logged in or we + are very early in the boot sequence. + We do this with each plugin installing a text file with the plugin key + name, the value, and optionally the public switch. + </para> + + <para> + The core setup file is read from <filename>/etc/ohm/core</filename> and + plugin preferences are read from <filename>/etc/ohm/plugins/{name}</filename> + Comments are lines with first character <literal>#</literal> and then the + rest of the line is ignored. + Files are flat text with the following formal description, + <literal>plugin_prefix.key value type public</literal> + </para> + <important> + <para> + There is a single space between the values. + Line endings have to be UNIX not WIN or MAC. + Parsing is very strict, and <literal>ohmd</literal> will exit with an + error if the syntax is not perfect. This is by design. + </para> + </important> + + <note> + <para> + Public is only set if the key can be changed by the session, and if the + key is tried to be set, the set method will fail. + This is a way to enforce fine-grained rules on users when writing + PolicyKit rules for every action would be too great an overhead. + </para> + </note> + + <para> + Plugins can tell <literal>ohmd</literal> that other plugins are required + for certain functionality, for instance, the backlight unit on a mobile + phone may require the temperature module to be present, so it can do the + temperature shutdown checks. + This is done with <literal>ohm_module_require()</literal>. + <literal>ohmd</literal> daemon will fail to load if any required plugin + is not present after the plugins have finished initializing. + </para> + + <para> + Plugins can also tell <literal>ohmd</literal> that other plugins are suggested for certain + functionality, for instance, the backlight unit may work best when the + battery plugin is loaded so we can dim when we are low on power. + This is done with <literal>ohm_module_suggest()</literal>. + <literal>ohmd</literal> daemon will print a message to the console if any + suggested plugin is not present. + </para> + + <para> + Plugins can also tell <literal>ohmd</literal> that other plugins are banned, for instance, + a proprietary battery discharge plugin maybe incompatible with the + standard battery plugin. + This is done with <literal>ohm_module_prevent()</literal>. + <literal>ohmd</literal> will fail to load if any prevented plugin is + manually loaded or loaded through a dependency of another plugin. + </para> + + <para> + In <literal>ohmd</literal>, keys are created read/write by the plugin. + Other plugins can watch for changes on these keys (even on other modules) + using <literal>ohm_key_monitor()</literal>. + The callback will be issued local to the plugin when the state of this + key changes. + </para> + + <para> + NOTE: There is no ordering of priority (yet?) of monitored keys. + Make sure that policy per key is kept to one plugin, else strange + races might start happening. + </para> + + <para> + A library called <literal>libohm</literal> allows system and session + programs to easily interface with <literal>ohmd</literal>. + This library will remove the implementation detail from plugins and + session applications. + This library, like the rest of OHM will not be API or ABI stable until + version 1.0.0 is released. + </para> + + </sect1> + + <sect1 id="introduction-deps"> + <title>Dependencies</title> + <para> + OHM is lightweight. + </para> + <itemizedlist> + <listitem> + <para> + GLib 2.10.0 (required) + </para> + </listitem> + <listitem> + <para> + DBUS 0.70 (required) + </para> + </listitem> + <listitem> + <para> + HAL 0.5.8 (required) + </para> + </listitem> + <listitem> + <para> + PolicyKit (optional) + </para> + </listitem> + <listitem> + <para> + ConsoleKit (optional) + </para> + </listitem> + </itemizedlist> + </sect1> + +</chapter> diff --git a/docs/ohm-logo.png b/docs/ohm-logo.png Binary files differnew file mode 100644 index 0000000..ae61d5e --- /dev/null +++ b/docs/ohm-logo.png diff --git a/docs/ohm-logo.svg b/docs/ohm-logo.svg new file mode 100644 index 0000000..0679f1e --- /dev/null +++ b/docs/ohm-logo.svg @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="500" + height="500" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hughsie/ohm/docs" + sodipodi:docname="logo.svg" + version="1.0" + inkscape:export-filename="/home/hughsie/ohm/docs/ohm-logo.png" + inkscape:export-xdpi="9" + inkscape:export-ydpi="9"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4888" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path4894" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.49497475" + inkscape:cx="187.11704" + inkscape:cy="395.25968" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-points="true" + inkscape:object-nodes="true" + inkscape:object-points="true" + inkscape:object-bbox="true" + inkscape:window-width="1270" + inkscape:window-height="721" + inkscape:window-x="0" + inkscape:window-y="25" + width="500px" + height="500px" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <rect + style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4933" + width="240" + height="60" + x="160" + y="100" /> + <rect + style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4939" + width="240" + height="60" + x="160" + y="160" /> + <rect + style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4945" + width="240" + height="60" + x="160" + y="220" /> + <rect + style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4953" + width="240" + height="59.999989" + x="160" + y="280" /> + <rect + style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4927" + width="110" + height="319.88245" + x="80" + y="100.11755" /> + <text + xml:space="preserve" + style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="132.48047" + y="190" + id="text4929" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan4931" + x="132.48047" + y="190" + style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans">O</tspan><tspan + sodipodi:role="line" + x="132.48047" + y="290" + style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans" + id="tspan1952">H</tspan><tspan + sodipodi:role="line" + x="132.48047" + y="390" + style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans" + id="tspan1954">M</tspan></text> + </g> +</svg> diff --git a/docs/ohm-sessions.png b/docs/ohm-sessions.png Binary files differnew file mode 100644 index 0000000..979b077 --- /dev/null +++ b/docs/ohm-sessions.png diff --git a/docs/ohm-sessions.svg b/docs/ohm-sessions.svg new file mode 100644 index 0000000..bf423e0 --- /dev/null +++ b/docs/ohm-sessions.svg @@ -0,0 +1,393 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1052.3622" + height="744.09448" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hughsie/ohm/docs" + sodipodi:docname="ohm-sessions.svg" + version="1.0" + inkscape:export-filename="/home/hughsie/ohm/docs/ohm-sessions.png" + inkscape:export-xdpi="48.419998" + inkscape:export-ydpi="48.419998"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4888" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path4894" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="-164.42156" + inkscape:cy="518.3343" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-points="true" + inkscape:object-nodes="true" + inkscape:object-points="true" + inkscape:object-bbox="true" + inkscape:window-width="1270" + inkscape:window-height="721" + inkscape:window-x="0" + inkscape:window-y="25" + width="1052.3622px" + height="744.09448px" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <rect + style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4927" + width="110" + height="400" + x="111" + y="304.09448" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="118.83203" + y="343.78198" + id="text4929"><tspan + sodipodi:role="line" + id="tspan4931" + x="118.83203" + y="343.78198" + style="font-size:40px">OHM</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:2.95964074, 5.91928148;stroke-dashoffset:0;stroke-opacity:1" + d="M 710.9801,404.32514 L 849.1606,404.09751 L 849.35897,254.09448" + id="path5946" + sodipodi:nodetypes="ccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 431,404.07978 L 710.9801,404.32514 L 711,214.09447 L 671,214.05008" + id="path5011" + sodipodi:nodetypes="cccc" /> + <rect + style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4933" + width="210" + height="80" + x="221" + y="303.97693" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="228.75391" + y="343.41052" + id="text4935"><tspan + sodipodi:role="line" + id="tspan4937" + x="228.75391" + y="343.41052" + style="font-size:28px">Backlight</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 431,433.87163 L 612.58923,433.36979 L 612.11716,472.57946" + id="path5023" + sodipodi:nodetypes="ccc" /> + <rect + style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4939" + width="210" + height="80" + x="221" + y="383.97693" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="228.75391" + y="423.41052" + id="text4941"><tspan + sodipodi:role="line" + id="tspan4943" + x="228.75391" + y="423.41052" + style="font-size:28px">Inhibit</tspan></text> + <rect + style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4945" + width="210" + height="80" + x="221" + y="463.97693" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="228.25195" + y="493.15268" + id="text4947"><tspan + sodipodi:role="line" + id="tspan4949" + x="228.25195" + y="493.15268" + style="font-size:28px">Heat Mgmt</tspan><tspan + sodipodi:role="line" + x="228.25195" + y="528.15268" + style="font-size:28px" + id="tspan4951">Policy</tspan></text> + <rect + style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4953" + width="210" + height="80" + x="221" + y="543.97693" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="228.25195" + y="573.15271" + id="text4957"><tspan + sodipodi:role="line" + x="228.25195" + y="573.15271" + style="font-size:28px" + id="tspan4959">Internal</tspan><tspan + sodipodi:role="line" + x="228.25195" + y="608.15271" + style="font-size:28px" + id="tspan4961">Protected IP</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 588.81737,170.49268 L 588.81737,134.25822" + id="path5009" + sodipodi:nodetypes="cc" /> + <rect + style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4989" + width="200" + height="80" + x="491" + y="64.094482" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="587.28711" + y="98.697983" + id="text4991"><tspan + sodipodi:role="line" + x="587.28711" + y="98.697983" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan4995">Random</tspan><tspan + sodipodi:role="line" + x="587.28711" + y="133.69798" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5007">Program</tspan></text> + <rect + style="opacity:1;fill:#8ae234;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4997" + width="200" + height="80" + x="491" + y="174.09447" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="587.28711" + y="208.69798" + id="text4999"><tspan + sodipodi:role="line" + id="tspan5001" + x="587.28711" + y="208.69798" + style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan + sodipodi:role="line" + x="587.28711" + y="243.69798" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5003">Screensaver</tspan></text> + <rect + style="opacity:1;fill:#c17d11;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5015" + width="200" + height="80" + x="501" + y="474.09448" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="597.28711" + y="508.69797" + id="text5017"><tspan + sodipodi:role="line" + x="597.28711" + y="508.69797" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5021">System</tspan><tspan + sodipodi:role="line" + x="597.28711" + y="543.69797" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5027">Update</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 24;stroke-dashoffset:0;stroke-opacity:1" + d="M 1,285.09448 L 1039.8329,285.09448 L 1039.8329,285.09448" + id="path5029" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 318.81737,170.49268 L 318.81737,134.25822" + id="path5031" + sodipodi:nodetypes="cc" /> + <rect + style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5033" + width="200" + height="80" + x="221" + y="64.094482" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="319.4082" + y="115.33862" + id="text5035"><tspan + sodipodi:role="line" + x="319.4082" + y="115.33862" + style="font-size:36px;text-align:center;text-anchor:middle" + id="tspan5039">Totem</tspan></text> + <rect + style="opacity:1;fill:#8ae234;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5041" + width="200" + height="80" + x="221" + y="174.09447" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="317.28711" + y="208.69798" + id="text5043"><tspan + sodipodi:role="line" + id="tspan5045" + x="317.28711" + y="208.69798" + style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan + sodipodi:role="line" + x="317.28711" + y="243.69798" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5047">Screensaver</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 454.79077,402.77145 L 456,214.09447 L 421,214.25568" + id="path5049" + sodipodi:nodetypes="ccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.94685829;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.94685827, 23.36229919;stroke-dashoffset:0;stroke-opacity:1" + d="M 468.16943,55.067902 L 467.11629,275.12104" + id="path5936" + sodipodi:nodetypes="cc" /> + <rect + style="opacity:1;fill:#c17d11;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5938" + width="200" + height="80" + x="731" + y="174.09448" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="827.28711" + y="208.69801" + id="text5940"><tspan + sodipodi:role="line" + x="827.28711" + y="208.69801" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5944">Nautilus</tspan><tspan + sodipodi:role="line" + x="827.28711" + y="243.69801" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5950">(copying)</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 216.72233,202.09651 L 100.88913,200.86991 L 101.00509,144.09448" + id="path5952" + sodipodi:nodetypes="ccc" /> + <rect + style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5954" + width="200" + height="80" + x="1" + y="64.094482" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="97.287109" + y="98.697983" + id="text5956"><tspan + sodipodi:role="line" + x="97.287109" + y="98.697983" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5958">Random</tspan><tspan + sodipodi:role="line" + x="97.287109" + y="133.69798" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan5960">Program</tspan></text> + </g> +</svg> diff --git a/docs/ohm-structure.png b/docs/ohm-structure.png Binary files differnew file mode 100644 index 0000000..a1bc9e5 --- /dev/null +++ b/docs/ohm-structure.png diff --git a/docs/ohm-structure.svg b/docs/ohm-structure.svg new file mode 100644 index 0000000..66e7ae5 --- /dev/null +++ b/docs/ohm-structure.svg @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hughsie/ohm/docs" + sodipodi:docname="ohm-structure.svg" + inkscape:export-filename="/home/hughsie/ohm/docs/ohm-structure.png" + inkscape:export-xdpi="51.209103" + inkscape:export-ydpi="51.209103"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4888" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path4894" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.8) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="-676.03043" + inkscape:cy="617.89993" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-points="true" + inkscape:object-nodes="true" + inkscape:object-points="true" + inkscape:object-bbox="true" + inkscape:window-width="1270" + inkscape:window-height="721" + inkscape:window-x="0" + inkscape:window-y="25" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.8838985;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 370.00001,928.75731 C 370.00001,892.19769 370.00001,892.19769 370.00001,892.19769" + id="path4907" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2,24;stroke-dashoffset:0" + d="M 20,912.36218 L 720,912.36218 L 720,912.36218" + id="path1950" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2,24;stroke-dashoffset:0;stroke-opacity:1" + d="M 19,313.36218 L 719,313.36218 L 719,313.36218" + id="path2839" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91596603;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 389.28571,135.92782 L 389.28571,210.9042" + id="path3818" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91596603;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 413.21428,208.71723 L 413.21428,133.74085" + id="path4903" + sodipodi:nodetypes="cc" /> + <rect + style="opacity:1;fill:#ededed;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1878" + width="200" + height="80" + x="300" + y="52.362183" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="401.40625" + y="82.362183" + id="text1938"><tspan + sodipodi:role="line" + id="tspan1940" + x="401.40625" + y="82.362183" + style="font-size:32px;text-align:center;text-anchor:middle">User</tspan><tspan + sodipodi:role="line" + x="401.40625" + y="122.36218" + style="font-size:32px;text-align:center;text-anchor:middle" + id="tspan3796">Interface</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91515112;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 316.33358,261.6479 C 241.40144,261.6479 241.40144,261.6479 241.40144,261.6479" + id="path3820" /> + <rect + style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1880" + width="200" + height="160" + x="40" + y="132.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="141" + y="242.36218" + id="text1926" + inkscape:transform-center-x="21.841616"><tspan + sodipodi:role="line" + id="tspan1928" + x="141" + y="242.36218" + style="font-size:32px;text-align:center;text-anchor:middle">Session</tspan><tspan + sodipodi:role="line" + x="141" + y="282.36218" + style="font-size:32px;text-align:center;text-anchor:middle" + id="tspan3798">Policy</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="78.183594" + y="182.75281" + id="text1934"><tspan + sodipodi:role="line" + id="tspan1936" + x="78.183594" + y="182.75281" + style="font-size:32">UI Prefs</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.99146724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.97440156, 1.99146719;stroke-dashoffset:0;stroke-opacity:1" + d="M 40.991485,212.36218 L 238.72361,212.36218 L 238.72361,212.36218" + id="path2841" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Mstart)" + d="M 525,262.36218 L 670,262.36218 L 670,862.36218 L 440,862.36218" + id="path3822" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.94025731;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 340,735.98136 C 340,812.39205 340,812.39205 340,812.39205" + id="path3824" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95138264;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 350,328.63 C 350,290.08787 350,290.08787 350,290.08787" + id="path3826" + sodipodi:nodetypes="cc" /> + <rect + style="opacity:1;fill:#ededed;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1882" + width="200" + height="80" + x="320" + y="212.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="416.28711" + y="246.9657" + id="text1942"><tspan + sodipodi:role="line" + id="tspan1944" + x="416.28711" + y="246.9657" + style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan + sodipodi:role="line" + x="416.28711" + y="281.9657" + style="font-size:28px;text-align:center;text-anchor:middle" + id="tspan3730">Daemon</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96102691;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 276.26486,372.36218 C 227.73051,372.36218 227.73051,372.36218 227.73051,372.36218" + id="path3828" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96292162;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 276.33154,481.6479 C 227.73146,481.6479 227.73146,481.6479 227.73146,481.6479" + id="path3830" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96292162;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 276.33154,611.6479 C 227.73146,611.6479 227.73146,611.6479 227.73146,611.6479" + id="path3832" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.97630692;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 315.35714,808.66441 C 315.35714,730.10033 315.35714,730.10033 315.35714,730.10033" + id="path4905" /> + <rect + style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1876" + width="110" + height="400" + x="280" + y="332.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="287.83203" + y="372.04968" + id="text1946"><tspan + sodipodi:role="line" + id="tspan1948" + x="287.83203" + y="372.04968" + style="font-size:40px">OHM</tspan></text> + <rect + style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3740" + width="210" + height="80" + x="390" + y="332.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="397.75391" + y="371.79578" + id="text3742"><tspan + sodipodi:role="line" + id="tspan3744" + x="397.75391" + y="371.79578" + style="font-size:28">Backlight</tspan></text> + <rect + style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3746" + width="210" + height="80" + x="390" + y="412.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="397.75391" + y="451.79578" + id="text3748"><tspan + sodipodi:role="line" + id="tspan3750" + x="397.75391" + y="451.79578" + style="font-size:28">Inhibit</tspan></text> + <rect + style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3756" + width="210" + height="80" + x="390" + y="492.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="397.25195" + y="521.53796" + id="text3758"><tspan + sodipodi:role="line" + id="tspan3760" + x="397.25195" + y="521.53796" + style="font-size:28px">Heat Mgmt</tspan><tspan + sodipodi:role="line" + x="397.25195" + y="556.53796" + style="font-size:28px" + id="tspan3762">Policy</tspan></text> + <rect + style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3784" + width="210" + height="80" + x="390" + y="572.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="397.25195" + y="601.53796" + id="text3786"><tspan + sodipodi:role="line" + x="397.25195" + y="601.53796" + style="font-size:28px" + id="tspan3790">Internal</tspan><tspan + sodipodi:role="line" + x="397.25195" + y="636.53796" + style="font-size:28px" + id="tspan3794">Protected IP</tspan></text> + <rect + style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1884" + width="190" + height="80" + x="40" + y="332.36218" /> + <rect + style="opacity:1;fill:#e9b96e;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1886" + width="190" + height="80" + x="40" + y="452.36218" /> + <rect + style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1888" + width="190" + height="80" + x="40" + y="572.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="51.40625" + y="506.67468" + id="text1898"><tspan + sodipodi:role="line" + id="tspan1900" + x="51.40625" + y="506.67468" + style="font-size:32px">ConsoleKit</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="131.02734" + y="610.59656" + id="text1906"><tspan + sodipodi:role="line" + id="tspan1908" + x="131.02734" + y="610.59656" + style="font-size:24px;text-align:center;text-anchor:middle">PolicyKit</tspan><tspan + sodipodi:role="line" + x="131.02734" + y="640.59656" + style="font-size:24px;text-align:center;text-anchor:middle" + id="tspan3734">(permissions)</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="137.54688" + y="363.79074" + id="text1918"><tspan + sodipodi:role="line" + id="tspan1920" + x="137.54688" + y="363.79074" + style="font-size:28;text-align:center;text-anchor:middle">Default</tspan><tspan + sodipodi:role="line" + x="137.54688" + y="398.79074" + style="font-size:28;text-align:center;text-anchor:middle" + id="tspan3732">Preferences</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.8838985;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 340.71429,895.86061 C 340.71429,932.42023 340.71429,932.42023 340.71429,932.42023" + id="path3834" /> + <rect + style="opacity:1;fill:#888a85;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1872" + width="240" + height="80" + x="240" + y="932.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="300" + y="982.36218" + id="text1890"><tspan + sodipodi:role="line" + id="tspan1892" + x="300" + y="982.36218" + style="font-size:40px">Kernel</tspan></text> + <rect + style="opacity:1;fill:#ef2929;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1874" + width="160" + height="80" + x="280" + y="812.36218" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="316.07422" + y="862.36218" + id="text1894"><tspan + sodipodi:role="line" + id="tspan1896" + x="316.07422" + y="862.36218" + style="font-size:40px">HAL</tspan></text> + </g> +</svg> |