login: add public sd_session_get_desktop() API

The desktop brand is stored as DESKTOP variable for sessions. It can be
set arbitrarily by the session owner and identifies the desktop
environment that is running on that session.
This commit is contained in:
David Herrmann 2014-09-20 18:42:29 +02:00
parent 7f3d3ba1a6
commit c72d5456e2
5 changed files with 54 additions and 2 deletions

View File

@ -268,7 +268,9 @@
as defined by the <ulink
url="http://standards.freedesktop.org/desktop-entry-spec/latest/">Desktop
Entry
Specification</ulink>.</para></listitem>
Specification</ulink>. See
<citerefentry><refentrytitle>sd_session_get_desktop</refentrytitle><manvolnum>3</manvolnum></citerefentry>
for more details.</para></listitem>
</varlistentry>
<varlistentry>

View File

@ -51,6 +51,7 @@
<refname>sd_session_get_service</refname>
<refname>sd_session_get_type</refname>
<refname>sd_session_get_class</refname>
<refname>sd_session_get_desktop</refname>
<refname>sd_session_get_display</refname>
<refname>sd_session_get_tty</refname>
<refname>sd_session_get_vt</refname>
@ -109,6 +110,12 @@
<paramdef>char **<parameter>class</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_session_get_desktop</function></funcdef>
<paramdef>const char *<parameter>session</parameter></paramdef>
<paramdef>char **<parameter>desktop</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_session_get_display</function></funcdef>
<paramdef>const char *<parameter>session</parameter></paramdef>
@ -218,6 +225,22 @@
<citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call after use.</para>
<para><function>sd_session_get_desktop()</function> may
be used to determine the brand of the desktop running on
the session identified by the specified session identifier.
This field can be set freely by desktop environments and
does not follow any special formatting. However, desktops
are strongly recommended to use the same identifiers and
capitalization as for
<varname>$XDG_CURRENT_DESKTOP</varname>, as defined by
the <ulink
url="http://standards.freedesktop.org/desktop-entry-spec/latest/">Desktop
Entry
Specification</ulink>. The returned string needs to be
freed with the libc
<citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call after use.</para>
<para><function>sd_session_get_display()</function>
may be used to determine the X11 display of the
session identified by the specified session

View File

@ -153,6 +153,11 @@ global:
sd_machine_get_ifindices;
} LIBSYSTEMD_214;
LIBSYSTEMD_217 {
global:
sd_session_get_desktop;
} LIBSYSTEMD_216;
m4_ifdef(`ENABLE_KDBUS',
LIBSYSTEMD_FUTURE {
global:
@ -438,5 +443,5 @@ global:
/* sd-path */
sd_path_home;
sd_path_search;
} LIBSYSTEMD_216;
} LIBSYSTEMD_217;
)

View File

@ -485,6 +485,25 @@ _public_ int sd_session_get_class(const char *session, char **class) {
return session_get_string(session, "CLASS", class);
}
_public_ int sd_session_get_desktop(const char *session, char **desktop) {
_cleanup_free_ char *escaped = NULL;
char *t;
int r;
assert_return(desktop, -EINVAL);
r = session_get_string(session, "DESKTOP", &escaped);
if (r < 0)
return r;
t = cunescape(escaped);
if (!t)
return -ENOMEM;
*desktop = t;
return 0;
}
_public_ int sd_session_get_display(const char *session, char **display) {
return session_get_string(session, "DISPLAY", display);
}

View File

@ -147,6 +147,9 @@ int sd_session_get_type(const char *session, char **type);
/* Determine the class of this session, i.e. one of "user", "greeter" or "lock-screen". */
int sd_session_get_class(const char *session, char **clazz);
/* Determine the desktop brand of this session, i.e. something like "GNOME", "KDE" or "SYSTEMD-CONSOLE". */
int sd_session_get_desktop(const char *session, char **desktop);
/* Determine the X11 display of this session. */
int sd_session_get_display(const char *session, char **display);