From: Dana Jansens Date: Wed, 17 Feb 2010 21:11:36 +0000 (-0500) Subject: revamp the autostart functionality, so autostart apps launch after openbox. X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=bcc31faf7ecd8b0ad3b66a75fc72145e93e6c35a;p=chaz%2Fopenbox revamp the autostart functionality, so autostart apps launch after openbox. add /usr/libexec/openbox-autostart which runs the global/user scripts and launches /usr/libexec/openbox-xdg-autostart (which runs .desktop autostart stuff) make openbox-session call openbox with --startup option, to make openbox launch /usr/libexec/openbox-autostart *after* it is initialized. add /etc/xdg/openbox/environment and ~/.config/openbox/environment files to let user change environment variables (locale) for their Openbox session, which openbox-session loads before running openbox. --- diff --git a/.gitignore b/.gitignore index 3e0eac02..fd10068e 100644 --- a/.gitignore +++ b/.gitignore @@ -97,5 +97,4 @@ tests/strut tests/title tests/urgent tests/usertimewin -data/autostart.sh -<+ +data/autostart/openbox-autostart diff --git a/Makefile.am b/Makefile.am index 4c1f89d4..67d6e8b4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,7 @@ obtpubincludedir= $(includedir)/openbox/@OBT_VERSION@/obt rrpubincludedir = $(includedir)/openbox/@RR_VERSION@/obrender pixmapdir = $(datadir)/pixmaps xsddir = $(datadir)/openbox -secretbindir = $(libdir)/openbox +libexecdir = $(prefix)/libexec appsdir = $(datadir)/applications theme = Clearlooks @@ -36,14 +36,20 @@ bin_PROGRAMS = \ tools/gnome-panel-control/gnome-panel-control \ tools/obxprop/obxprop -dist_secretbin_SCRIPTS = \ - tools/xdg-autostart/xdg-autostart - nodist_bin_SCRIPTS = \ data/xsession/openbox-session \ data/xsession/openbox-gnome-session \ data/xsession/openbox-kde-session +dist_rc_SCRIPTS = \ + data/environment \ + data/autostart/autostart + +dist_libexec_SCRIPTS = \ + data/autostart/openbox-xdg-autostart \ + data/autostart/openbox-autostart + + ## obrender ## obrender_rendertest_CPPFLAGS = \ @@ -446,9 +452,6 @@ dist_apps_DATA = \ dist_pixmap_DATA = \ data/openbox.png -nodist_rc_DATA = \ - data/autostart.sh - dist_rc_DATA = \ data/rc.xml \ data/menu.xml @@ -456,10 +459,10 @@ dist_rc_DATA = \ edit = $(SED) \ -e 's!@version\@!$(VERSION)!' \ -e 's!@configdir\@!$(configdir)!' \ - -e 's!@secretbindir\@!$(secretbindir)!' \ + -e 's!@libexecdir\@!$(libexecdir)!' \ -e 's!@bindir\@!$(bindir)!' -data/autostart.sh: $(srcdir)/data/autostart.sh.in Makefile +data/autostart/openbox-autostart: $(srcdir)/data/autostart/openbox-autostart.in Makefile @echo make: creating $@ @$(edit) $< >$@ @@ -488,7 +491,6 @@ nodist_xsessions_DATA = \ data/xsession/openbox-kde.desktop dist_noinst_DATA = \ - data/autostart.sh.in \ data/rc.xsd \ data/menu.xsd \ data/xsession/openbox.desktop.in \ diff --git a/data/autostart.sh.in b/data/autostart.sh.in deleted file mode 100644 index eb55558a..00000000 --- a/data/autostart.sh.in +++ /dev/null @@ -1,44 +0,0 @@ -# This shell script is run before Openbox launches. -# Environment variables set here are passed to the Openbox session. - -# Set a background color -BG="" -if which hsetroot >/dev/null; then - BG=hsetroot -else - if which esetroot >/dev/null; then - BG=esetroot - else - if which xsetroot >/dev/null; then - BG=xsetroot - fi - fi -fi -test -z $BG || $BG -solid "#303030" - -# D-bus -if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then - eval `dbus-launch --sh-syntax --exit-with-session` -fi - -# Make GTK apps look and behave how they were set up in the gnome config tools -if test -x /usr/libexec/gnome-settings-daemon >/dev/null; then - /usr/libexec/gnome-settings-daemon & -elif which gnome-settings-daemon >/dev/null; then - gnome-settings-daemon & -# Make GTK apps look and behave how they were set up in the XFCE config tools -elif which xfce-mcs-manager >/dev/null; then - xfce-mcs-manager n & -fi - -# Preload stuff for KDE apps -if which start_kdeinit >/dev/null; then - LD_BIND_NOW=true start_kdeinit --new-startup +kcminit_startup & -fi - -# Run XDG autostart things. By default don't run anything desktop-specific -# See xdg-autostart --help more info -DESKTOP_ENV="OPENBOX" -if which @secretbindir@/xdg-autostart >/dev/null; then - @secretbindir@/xdg-autostart $DESKTOP_ENV -fi diff --git a/tools/xdg-autostart/Makefile b/data/autostart/Makefile similarity index 56% rename from tools/xdg-autostart/Makefile rename to data/autostart/Makefile index cfc46539..b90edacf 100644 --- a/tools/xdg-autostart/Makefile +++ b/data/autostart/Makefile @@ -1,4 +1,4 @@ all clean install: - $(MAKE) -C ../.. -$(MAKEFLAGS) $@ + $(MAKE) -C .. -$(MAKEFLAGS) $@ .PHONY: all clean install diff --git a/data/autostart/autostart b/data/autostart/autostart new file mode 100644 index 00000000..abd92669 --- /dev/null +++ b/data/autostart/autostart @@ -0,0 +1,17 @@ +# +# These things are run when an Openbox X Session is started. +# You may place a similar script in $HOME/.config/openbox/autostart +# to run user-specific things. +# + +# If you want to use GNOME config tools... +# +#if test -x /usr/libexec/gnome-settings-daemon >/dev/null; then +# /usr/libexec/gnome-settings-daemon & +#elif which gnome-settings-daemon >/dev/null; then +# gnome-settings-daemon & +#fi + +# If you want to use XFCE config tools... +# +#xfce-mcs-manager & diff --git a/data/autostart/openbox-autostart.in b/data/autostart/openbox-autostart.in new file mode 100755 index 00000000..3b2f5ec5 --- /dev/null +++ b/data/autostart/openbox-autostart.in @@ -0,0 +1,34 @@ +#!/bin/sh + +# Set a background color +BG="" +if which hsetroot >/dev/null; then + BG=hsetroot +elif which esetroot >/dev/null; then + BG=esetroot +elif which xsetroot >/dev/null; then + BG=xsetroot +fi +test -z $BG || $BG -solid "#303030" + +GLOBALAUTOSTART="@configdir@/autostart" +AUTOSTART="${XDG_CONFIG_HOME:-"$HOME/.config"}/openbox/autostart" + +# Run the global openbox autostart script +if test -f $GLOBALAUTOSTART; then + sh $GLOBALAUTOSTART +elif test -f $GLOBALAUTOSTART.sh; then + sh $GLOBALAUTOSTART.sh +fi + +# Run the user openbox autostart script +if test -f $AUTOSTART; then + sh $AUTOSTART +elif test -f $AUTOSTART.sh; then + sh $AUTOSTART.sh +fi + +# Run the XDG autostart stuff. These are found in /etc/xdg/autostart and +# in $HOME/.config/autostart. This requires PyXDG to be installed. +# See openbox-xdg-autostart --help for more details. +@libexecdir@/openbox-xdg-autostart OPENBOX diff --git a/tools/xdg-autostart/xdg-autostart b/data/autostart/openbox-xdg-autostart similarity index 98% rename from tools/xdg-autostart/xdg-autostart rename to data/autostart/openbox-xdg-autostart index 4a533826..ea760281 100755 --- a/tools/xdg-autostart/xdg-autostart +++ b/data/autostart/openbox-xdg-autostart @@ -1,6 +1,6 @@ #!/usr/bin/env python -# xdg-autostart runs things based on the XDG autostart specification +# openbox-xdg-autostart runs things based on the XDG autostart specification # Copyright (C) 2008 Dana Jansens # # XDG autostart specification can be found here: @@ -19,8 +19,8 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -ME="xdg-autostart" -VERSION="1.0" +ME="openbox-xdg-autostart" +VERSION="1.1" import os, glob, sys try: diff --git a/data/environment b/data/environment new file mode 100644 index 00000000..3311bd6f --- /dev/null +++ b/data/environment @@ -0,0 +1,10 @@ +# +# Set system-wide environment variables here for Openbox +# User-specific variables should be placed in $HOME/.config/openbox/environment +# + +# To set your language for displaying messages and time/date formats, use the following: +#LANG=en_CA.UTF8 + +# To set your keyboard layout, you need to modify your X config: +# http://www.google.com/search?q=how+to+set+keyboard+layout+xorg diff --git a/data/xsession/openbox-session.in b/data/xsession/openbox-session.in index fa1bb996..3cf3571f 100644 --- a/data/xsession/openbox-session.in +++ b/data/xsession/openbox-session.in @@ -12,15 +12,11 @@ xprop -root -remove _NET_NUMBER_OF_DESKTOPS \ -remove _NET_DESKTOP_NAMES \ -remove _NET_CURRENT_DESKTOP 2> /dev/null -AUTOSTART="${XDG_CONFIG_HOME:-"$HOME/.config"}/openbox/autostart.sh" -GLOBALAUTOSTART="@configdir@/openbox/autostart.sh" +# Set up the environment +A="@configdir@/openbox/environment" +test -r $A && . $A +A="${XDG_CONFIG_HOME:-"$HOME/.config"}/openbox/environment" +test -r $A && . $A -if test -r $AUTOSTART; then - . $AUTOSTART -else - if test -r $GLOBALAUTOSTART; then - . $GLOBALAUTOSTART - fi -fi - -exec @bindir@/openbox "$@" +# Run Openbox, and have it run the autostart stuff +exec @bindir@/openbox --startup "@libexecdir@/openbox-autostart OPENBOX" "$@" diff --git a/openbox/openbox.c b/openbox/openbox.c index 0f9fb179..1b39b404 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -102,6 +102,7 @@ static gint exitcode = 0; static guint remote_control = 0; static gboolean being_replaced = FALSE; static gchar *config_file = NULL; +static gchar *startup_cmd = NULL; static void signal_handler(gint signal, gpointer data); static void remove_args(gint *argc, gchar **argv, gint index, gint num); @@ -342,6 +343,29 @@ gint main(gint argc, gchar **argv) ob_set_state(OB_STATE_RUNNING); + if (startup_cmd) { + gchar **argv = NULL; + GError *e = NULL; + gboolean ok; + + if (!g_shell_parse_argv(startup_cmd, NULL, &argv, &e)) { + g_message("Error parsing startup command: %s", + e->message); + g_error_free(e); + e = NULL; + } + ok = g_spawn_async(NULL, argv, NULL, + G_SPAWN_SEARCH_PATH | + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, NULL, &e); + if (!g_shell_parse_argv(startup_cmd, NULL, &argv, &e)) { + g_message("Error launching startup command: %s", + e->message); + g_error_free(e); + e = NULL; + } + } + /* look for parsing errors */ { xmlErrorPtr e = xmlGetLastError(); @@ -519,6 +543,7 @@ static void print_help(void) g_print(_(" --exit Exit Openbox\n")); g_print(_("\nDebugging options:\n")); g_print(_(" --sync Run in synchronous mode\n")); + g_print(_(" --startup CMD Run CMD after starting\n")); g_print(_(" --debug Display debugging output\n")); g_print(_(" --debug-focus Display debugging output for focus handling\n")); g_print(_(" --debug-session Display debugging output for session management\n")); @@ -580,6 +605,18 @@ static void parse_args(gint *argc, gchar **argv) else if (!strcmp(argv[i], "--sync")) { xsync = TRUE; } + else if (!strcmp(argv[i], "--startup")) { + if (i == *argc - 1) /* no args left */ + g_printerr(_("--startup requires an argument\n")); + else { + /* this will be in the current locale encoding, which is + what we want */ + startup_cmd = argv[i+1]; + remove_args(argc, argv, i, 2); + --i; /* this arg was removed so go back */ + ob_debug("--startup %s", startup_cmd); + } + } else if (!strcmp(argv[i], "--debug")) { ob_debug_enable(OB_DEBUG_NORMAL, TRUE); ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);