diff --git a/Makefile.am b/Makefile.am index b879c017..af283aac 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,8 @@ themedir = $(datadir)/themes localedir = $(datadir)/locale configdir = $(sysconfdir)/xdg rcdir = $(configdir)/openbox -desktopfilesdir = $(datadir)/gnome/wm-properties +xsessionsdir = $(datadir)/xsessions +gnomewmfilesdir = $(datadir)/gnome/wm-properties pkgconfigdir = $(libdir)/pkgconfig pubincludedir = $(includedir)/openbox/@OB_VERSION@/openbox pixmapdir = $(datadir)/pixmaps @@ -29,6 +30,12 @@ bin_PROGRAMS = \ openbox/openbox \ tools/gnome-panel-control/gnome-panel-control +bin_SCRIPTS = \ + data/xsession/openbox-gnome-session \ + data/xsession/openbox-kde-session \ + data/xsession/openbox-gnome \ + data/xsession/openbox-kde + noinst_PROGRAMS = \ tools/themetoxml/themetoxml @@ -386,8 +393,15 @@ data/menu.xml: Makefile $(srcdir)/data/menu.xml.in data @mkdir data 2>/dev/null || true @$(edit) $(srcdir)/data/menu.xml.in >$@ -dist_desktopfiles_DATA = \ - data/openbox.desktop +dist_gnomewmfiles_DATA = \ + data/gnome-wm-properties/openbox.desktop \ + data/gnome-wm-properties/openbox-gnome.desktop \ + data/gnome-wm-properties/openbox-kde.desktop + +dist_xsessions_DATA = \ + data/xsession/openbox.desktop \ + data/xsession/openbox-gnome.desktop \ + data/xsession/openbox-kde.desktop dist_noinst_DATA = \ version.h.in \ diff --git a/data/gnome-wm-properties/Makefile b/data/gnome-wm-properties/Makefile new file mode 100644 index 00000000..b90edacf --- /dev/null +++ b/data/gnome-wm-properties/Makefile @@ -0,0 +1,4 @@ +all clean install: + $(MAKE) -C .. -$(MAKEFLAGS) $@ + +.PHONY: all clean install diff --git a/data/gnome-wm-properties/openbox-gnome.desktop b/data/gnome-wm-properties/openbox-gnome.desktop new file mode 100644 index 00000000..be8ff35f --- /dev/null +++ b/data/gnome-wm-properties/openbox-gnome.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Openbox/GNOME +Exec=openbox-gnome + +# name we put on the WM spec check window +X-GNOME-WMName=openbox-gnome + +# our config tool +ConfigExec=obconf diff --git a/data/gnome-wm-properties/openbox-kde.desktop b/data/gnome-wm-properties/openbox-kde.desktop new file mode 100644 index 00000000..0208c328 --- /dev/null +++ b/data/gnome-wm-properties/openbox-kde.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Openbox/GNOME +Exec=openbox-kde + +# name we put on the WM spec check window +X-GNOME-WMName=openbox-kde + +# our config tool +ConfigExec=obconf + diff --git a/data/openbox.desktop b/data/gnome-wm-properties/openbox.desktop similarity index 71% rename from data/openbox.desktop rename to data/gnome-wm-properties/openbox.desktop index 559a1a00..96418613 100644 --- a/data/openbox.desktop +++ b/data/gnome-wm-properties/openbox.desktop @@ -3,7 +3,7 @@ Name=Openbox Exec=openbox # name we put on the WM spec check window -X-GNOME-WMName=Openbox +X-GNOME-WMName=openbox # our config tool -ConfigExec=obconf2 +ConfigExec=obconf diff --git a/data/xsession/Makefile b/data/xsession/Makefile new file mode 100644 index 00000000..b90edacf --- /dev/null +++ b/data/xsession/Makefile @@ -0,0 +1,4 @@ +all clean install: + $(MAKE) -C .. -$(MAKEFLAGS) $@ + +.PHONY: all clean install diff --git a/data/xsession/openbox-gnome b/data/xsession/openbox-gnome new file mode 100755 index 00000000..03a22d3f --- /dev/null +++ b/data/xsession/openbox-gnome @@ -0,0 +1,5 @@ +#!/bin/sh + +# A temporary script to be replaced by a real program.. +export OPENBOX_RESTART_BINARY=openbox-gnome +exec openbox "$@" diff --git a/data/xsession/openbox-gnome-session b/data/xsession/openbox-gnome-session new file mode 100755 index 00000000..d2b77014 --- /dev/null +++ b/data/xsession/openbox-gnome-session @@ -0,0 +1,5 @@ +#!/bin/sh + +# Run GNOME with Openbox as its window manager +export WINDOW_MANAGER=openbox-gnome +exec gnome-session "$@" diff --git a/data/xsession/openbox-gnome.desktop b/data/xsession/openbox-gnome.desktop new file mode 100644 index 00000000..a7ac098f --- /dev/null +++ b/data/xsession/openbox-gnome.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Openbox/GNOME +Comment=Use the Openbox window manager inside of the GNOME desktop environment +Exec=openbox-gnome-session +TryExec=gnome-session +Icon=openbox.png +Type=XSession diff --git a/data/xsession/openbox-kde b/data/xsession/openbox-kde new file mode 100755 index 00000000..a3b603ac --- /dev/null +++ b/data/xsession/openbox-kde @@ -0,0 +1,5 @@ +#!/bin/sh + +# A temporary script to be replaced by a real program.. +export OPENBOX_RESTART_BINARY=openbox-kde +exec openbox "$@" diff --git a/data/xsession/openbox-kde-session b/data/xsession/openbox-kde-session new file mode 100755 index 00000000..589a2c56 --- /dev/null +++ b/data/xsession/openbox-kde-session @@ -0,0 +1,5 @@ +#!/bin/sh + +# Run KDE with Openbox as its window manager +export KDEWM=openbox-kde +exec startkde "$@" diff --git a/data/xsession/openbox-kde.desktop b/data/xsession/openbox-kde.desktop new file mode 100644 index 00000000..456b0df9 --- /dev/null +++ b/data/xsession/openbox-kde.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Openbox/KDE +Comment=Use the Openbox window manager inside of the K Desktop Environment +Exec=openbox-kde-session +TryExec=startkde +Icon=openbox.png +Type=XSession diff --git a/data/xsession/openbox.desktop b/data/xsession/openbox.desktop new file mode 100644 index 00000000..3b4d998e --- /dev/null +++ b/data/xsession/openbox.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Openbox +Comment=Use this session to run Openbox as your desktop environment +Exec=openbox +TryExec=openbox-shell +Icon=openbox.png +Type=XSession diff --git a/openbox/openbox.c b/openbox/openbox.c index 53299873..198d0735 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -96,6 +96,7 @@ static gint exitcode = 0; static guint remote_control = 0; static gboolean being_replaced = FALSE; static gchar *config_type = NULL; +static pid_t reconfigure_notify = 0; static void signal_handler(gint signal, gpointer data); static void parse_env(char **argv0); @@ -105,6 +106,8 @@ static Cursor load_cursor(const gchar *name, guint fontval); gint main(gint argc, gchar **argv) { + gchar *program_name; + state = OB_STATE_STARTING; /* initialize the locale */ @@ -114,14 +117,17 @@ gint main(gint argc, gchar **argv) bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); textdomain(PACKAGE_NAME); - g_set_prgname(argv[0]); - if (chdir(g_get_home_dir()) == -1) g_message(_("Unable to change to home directory '%s': %s"), g_get_home_dir(), g_strerror(errno)); - /* parse out environment and command line args */ + /* parse the environment first, it can change the argv[0] */ parse_env(&argv[0]); + + program_name = g_path_get_basename(argv[0]); + g_set_prgname(program_name); + + /* parse the command line args */ parse_args(&argc, argv); if (!remote_control) { @@ -216,7 +222,7 @@ gint main(gint argc, gchar **argv) prop_startup(); /* get atoms values for the display */ extensions_query_all(); /* find which extensions are present */ - if (screen_annex()) { /* it will be ours! */ + if (screen_annex(program_name)) { /* it will be ours! */ do { { ObParseInst *i; @@ -404,14 +410,14 @@ gint main(gint argc, gchar **argv) /* re-run me */ execvp(argv[0], argv); /* try how we were run */ - execlp(argv[0], g_path_get_basename(argv[0]), - (char *)NULL); /* last resort */ + execlp(argv[0], program_name, (gchar*)NULL); /* last resort */ } /* free stuff passed in from the command line or environment */ g_free(ob_sm_save_file); g_free(ob_sm_id); g_free(config_type); + g_free(program_name); return exitcode; } @@ -481,6 +487,10 @@ static void parse_env(gchar **argv0) if ((c = getenv("OPENBOX_RESTART_BINARY"))) *argv0 = g_strdup(c); unsetenv("OPENBOX_RESTART_BINARY"); + + /* notify this application when openbox reconfigures */ + if ((c = getenv("OPENBOX_RECONFIGURE_NOTIFY_PID"))) + reconfigure_notify = (pid_t) atol(c); } static void remove_args(gint *argc, gchar **argv, gint index, gint num) @@ -597,6 +607,9 @@ void ob_restart() void ob_reconfigure() { + if (reconfigure_notify) + kill(reconfigure_notify, SIGUSR2); + reconfigure = TRUE; ob_exit(0); } diff --git a/openbox/screen.c b/openbox/screen.c index 3c35395a..b0c3286a 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -153,7 +153,7 @@ static gboolean replace_wm() return TRUE; } -gboolean screen_annex() +gboolean screen_annex(const gchar *program_name) { XSetWindowAttributes attrib; pid_t pid; @@ -203,7 +203,7 @@ gboolean screen_annex() net_supporting_wm_check, window, screen_support_win); /* set properties on the supporting window */ - PROP_SETS(screen_support_win, net_wm_name, "Openbox"); + PROP_SETS(screen_support_win, net_wm_name, program_name); PROP_SET32(screen_support_win, net_supporting_wm_check, window, screen_support_win); diff --git a/openbox/screen.h b/openbox/screen.h index b4c510a7..ccaa4f57 100644 --- a/openbox/screen.h +++ b/openbox/screen.h @@ -53,7 +53,7 @@ extern DesktopLayout screen_desktop_layout; extern gchar **screen_desktop_names; /*! Take over the screen, set the basic hints on it claming it as ours */ -gboolean screen_annex(); +gboolean screen_annex(const gchar *program_name); /*! Once the screen is ours, set up its initial state */ void screen_startup(gboolean reconfig);