#include "ping.h"
#include "prompt.h"
#include "gettext.h"
-#include "render/render.h"
-#include "render/theme.h"
+#include "obrender/render.h"
+#include "obrender/theme.h"
#include "obt/display.h"
#include "obt/prop.h"
#include "obt/keyboard.h"
-#include "obt/parse.h"
+#include "obt/xml.h"
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
static gboolean restart = FALSE;
static gchar *restart_path = NULL;
static Cursor cursors[OB_NUM_CURSORS];
-static KeyCode keys[OB_NUM_KEYS];
+static KeyCode *keys[OB_NUM_KEYS];
static gint exitcode = 0;
static guint remote_control = 0;
static gboolean being_replaced = FALSE;
{
gchar *program_name;
- state = OB_STATE_STARTING;
+ ob_set_state(OB_STATE_STARTING);
ob_debug_startup();
bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
textdomain(PACKAGE_NAME);
+ 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 the command line args, which can change the argv[0] */
parse_args(&argc, argv);
/* parse the environment variables */
* remote_control = 2 -> restart */
OBT_PROP_MSG(ob_screen, obt_root(ob_screen),
OB_CONTROL, remote_control, 0, 0, 0, 0);
- obt_display_close(obt_display);
+ obt_display_close();
exit(EXIT_SUCCESS);
}
if (screen_annex()) { /* it will be ours! */
do {
+ ObPrompt *xmlprompt = NULL;
+
if (reconfigure) obt_keyboard_reload();
/* get the keycodes for keys we use */
keys[OB_KEY_SPACE] = obt_keyboard_keysym_to_keycode(XK_space);
{
- ObtParseInst *i;
+ ObtXmlInst *i;
/* startup the parsing so everything can register sections
of the rc */
- i = obt_parse_instance_new();
+ i = obt_xml_instance_new();
/* register all the available actions */
actions_startup(reconfigure);
/* parse/load user options */
if ((config_file &&
- obt_parse_load_file(i, config_file, "openbox_config")) ||
- obt_parse_load_config_file(i, "openbox", "rc.xml",
- "openbox_config"))
+ obt_xml_load_file(i, config_file, "openbox_config")) ||
+ obt_xml_load_config_file(i, "openbox", "rc.xml",
+ "openbox_config"))
{
- obt_parse_tree_from_root(i);
- obt_parse_close(i);
+ obt_xml_tree_from_root(i);
+ obt_xml_close(i);
}
else {
g_message(_("Unable to find a valid config file, using some simple defaults"));
OBT_PROP_ERASE(obt_root(ob_screen), OB_CONFIG_FILE);
/* we're done with parsing now, kill it */
- obt_parse_instance_unref(i);
+ obt_xml_instance_unref(i);
}
/* load the theme specified in the rc file */
config_font_inactivewindow,
config_font_menutitle,
config_font_menuitem,
- config_font_osd)))
+ config_font_activeosd,
+ config_font_inactiveosd)))
{
RrThemeFree(ob_rr_theme);
ob_rr_theme = theme;
grab_startup(reconfigure);
group_startup(reconfigure);
ping_startup(reconfigure);
- prompt_startup(reconfigure);
client_startup(reconfigure);
dock_startup(reconfigure);
moveresize_startup(reconfigure);
mouse_startup(reconfigure);
menu_frame_startup(reconfigure);
menu_startup(reconfigure);
+ prompt_startup(reconfigure);
if (!reconfigure) {
guint32 xid;
reconfigure = FALSE;
- state = OB_STATE_RUNNING;
+ ob_set_state(OB_STATE_RUNNING);
+
+ /* look for parsing errors */
+ {
+ xmlErrorPtr e = xmlGetLastError();
+ if (e) {
+ gchar *m;
+
+ m = g_strdup_printf(_("One or more XML syntax errors were found while parsing the Openbox configuration files. See stdout for more information. The last error seen was in file \"%s\" line %d, with message: %s"), e->file, e->line, e->message);
+ xmlprompt =
+ prompt_show_message(m, _("Openbox Syntax Error"), _("Close"));
+ g_free(m);
+ xmlResetError(e);
+ }
+ }
+
obt_main_loop_run(ob_main_loop);
- state = OB_STATE_EXITING;
+ ob_set_state(reconfigure ?
+ OB_STATE_RECONFIGURING : OB_STATE_EXITING);
+
+ if (xmlprompt) {
+ prompt_unref(xmlprompt);
+ xmlprompt = NULL;
+ }
if (!reconfigure)
window_unmanage_all();
+ prompt_shutdown(reconfigure);
menu_shutdown(reconfigure);
menu_frame_shutdown(reconfigure);
mouse_shutdown(reconfigure);
moveresize_shutdown(reconfigure);
dock_shutdown(reconfigure);
client_shutdown(reconfigure);
- prompt_shutdown(reconfigure);
ping_shutdown(reconfigure);
group_shutdown(reconfigure);
grab_shutdown(reconfigure);
event_shutdown(reconfigure);
config_shutdown();
actions_shutdown(reconfigure);
+
+ /* Free the key codes for built in keys */
+ g_free(keys[OB_KEY_RETURN]);
+ g_free(keys[OB_KEY_ESCAPE]);
+ g_free(keys[OB_KEY_LEFT]);
+ g_free(keys[OB_KEY_RIGHT]);
+ g_free(keys[OB_KEY_UP]);
+ g_free(keys[OB_KEY_DOWN]);
+ g_free(keys[OB_KEY_TAB]);
+ g_free(keys[OB_KEY_SPACE]);
} while (reconfigure);
}
session_shutdown(being_replaced);
- obt_display_close(obt_display);
+ obt_display_close();
if (restart) {
+ ob_debug_shutdown();
if (restart_path != NULL) {
gint argcp;
gchar **argvp;
g_strfreev(argvp);
} else {
g_message(
- _("Restart failed to execute new executable '%s': %s"),
+ _("Restart failed to execute new executable \"%s\": %s"),
restart_path, err->message);
g_error_free(err);
}
g_free(ob_sm_id);
g_free(program_name);
- ob_debug_shutdown();
+ if (!restart)
+ ob_debug_shutdown();
return exitcode;
}
}
}
-static void print_version()
+static void print_version(void)
{
g_print("Openbox %s\n", PACKAGE_VERSION);
g_print(_("Copyright (c)"));
g_print("under certain conditions. See the file COPYING for details.\n\n");
}
-static void print_help()
+static void print_help(void)
{
g_print(_("Syntax: openbox [options]\n"));
g_print(_("\nOptions:\n"));
g_print(_(" --help Display this help and exit\n"));
g_print(_(" --version Display the version and exit\n"));
g_print(_(" --replace Replace the currently running window manager\n"));
+ /* TRANSLATORS: if you translate "FILE" here, make sure to keep the "Specify..."
+ aligned still, if you have to, make a new line with \n and 22 spaces. It's
+ fine to leave it as FILE though. */
g_print(_(" --config-file FILE Specify the path to the config file to use\n"));
g_print(_(" --sm-disable Disable connection to the session manager\n"));
g_print(_("\nPassing messages to a running Openbox instance:\n"));
g_print(_(" --sync Run in synchronous mode\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 managment\n"));
+ g_print(_(" --debug-session Display debugging output for session management\n"));
g_print(_(" --debug-xinerama Split the display into fake xinerama screens\n"));
g_print(_("\nPlease report bugs at %s\n"), PACKAGE_BUGREPORT);
}
*argc -= num;
}
-static void parse_env()
+static void parse_env(void)
{
+ const gchar *id;
+
/* unset this so we don't pass it on unknowingly */
unsetenv("DESKTOP_STARTUP_ID");
+
+ /* this is how gnome-session passes in a session client id */
+ id = g_getenv("DESKTOP_AUTOSTART_ID");
+ if (id) {
+ unsetenv("DESKTOP_AUTOSTART_ID");
+ if (ob_sm_id) g_free(ob_sm_id);
+ ob_sm_id = g_strdup(id);
+ ob_debug_type(OB_DEBUG_SM,
+ "DESKTOP_AUTOSTART_ID %s supercedes --sm-client-id\n",
+ ob_sm_id);
+ }
}
static void parse_args(gint *argc, gchar **argv)
ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
}
else if (!strcmp(argv[i], "--debug-focus")) {
- ob_debug_enable(OB_DEBUG_NORMAL, TRUE);
- ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
ob_debug_enable(OB_DEBUG_FOCUS, TRUE);
}
else if (!strcmp(argv[i], "--debug-session")) {
- ob_debug_enable(OB_DEBUG_NORMAL, TRUE);
- ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
ob_debug_enable(OB_DEBUG_SM, TRUE);
}
else if (!strcmp(argv[i], "--debug-xinerama")) {
what we want */
config_file = argv[i+1];
++i; /* skip the argument */
- ob_debug("--config-file %s\n", config_file);
+ ob_debug("--config-file %s", config_file);
}
}
else if (!strcmp(argv[i], "--sm-save-file")) {
else {
/* this is a memleak.. oh well.. heh */
gchar *err = g_strdup_printf
- (_("Invalid command line argument '%s'\n"), argv[i]);
+ (_("Invalid command line argument \"%s\"\n"), argv[i]);
ob_exit_with_error(err);
}
}
void ob_exit_with_error(const gchar *msg)
{
- g_message(msg);
+ g_message("%s", msg);
session_shutdown(TRUE);
exit(EXIT_FAILURE);
}
ob_restart();
}
-void ob_restart()
+void ob_restart(void)
{
restart = TRUE;
ob_exit(0);
}
-void ob_reconfigure()
+void ob_reconfigure(void)
{
reconfigure = TRUE;
ob_exit(0);
obt_main_loop_exit(ob_main_loop);
}
-void ob_exit_replace()
+void ob_exit_replace(void)
{
exitcode = 0;
being_replaced = TRUE;
return cursors[cursor];
}
-KeyCode ob_keycode(ObKey key)
+gboolean ob_keycode_match(KeyCode code, ObKey key)
{
+ KeyCode *k;
+
g_assert(key < OB_NUM_KEYS);
- return keys[key];
+ for (k = keys[key]; *k; ++k)
+ if (*k == code) return TRUE;
+ return FALSE;
}
-ObState ob_state()
+ObState ob_state(void)
{
return state;
}
+
+void ob_set_state(ObState s)
+{
+ state = s;
+}