]> Dogcows Code - chaz/openbox/blobdiff - openbox/openbox.c
make control keys work in menus/dialogs/etc with the new obt code, using XLookup...
[chaz/openbox] / openbox / openbox.c
index 01aa58a2de0819b520679797acd91f3864d78d6c..0f9fb1793825342bbb2adf6821239d563ce0cfd6 100644 (file)
 #include "config.h"
 #include "ping.h"
 #include "prompt.h"
-#include "hooks.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>
@@ -81,9 +80,6 @@
 #include <X11/Xcursor/Xcursor.h>
 #endif
 
-#include <X11/Xlib.h>
-#include <X11/keysym.h>
-
 RrInstance   *ob_rr_inst;
 RrImageCache *ob_rr_icons;
 RrTheme      *ob_rr_theme;
@@ -102,7 +98,6 @@ static gboolean  reconfigure = FALSE;
 static gboolean  restart = FALSE;
 static gchar    *restart_path = NULL;
 static Cursor    cursors[OB_NUM_CURSORS];
-static KeyCode   keys[OB_NUM_KEYS];
 static gint      exitcode = 0;
 static guint     remote_control = 0;
 static gboolean  being_replaced = FALSE;
@@ -118,7 +113,7 @@ gint main(gint argc, gchar **argv)
 {
     gchar *program_name;
 
-    state = OB_STATE_STARTING;
+    ob_set_state(OB_STATE_STARTING);
 
     ob_debug_startup();
 
@@ -167,6 +162,8 @@ gint main(gint argc, gchar **argv)
     obt_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler,  NULL,NULL);
     obt_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL,NULL);
     obt_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGTTIN, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGTTOU, signal_handler, NULL,NULL);
 
     ob_screen = DefaultScreen(obt_display);
 
@@ -212,39 +209,30 @@ gint main(gint argc, gchar **argv)
 
     if (screen_annex()) { /* it will be ours! */
         do {
-            if (reconfigure) obt_keyboard_reload();
+            ObPrompt *xmlprompt = NULL;
 
-            /* get the keycodes for keys we use */
-            keys[OB_KEY_RETURN] = obt_keyboard_keysym_to_keycode(XK_Return);
-            keys[OB_KEY_ESCAPE] = obt_keyboard_keysym_to_keycode(XK_Escape);
-            keys[OB_KEY_LEFT] = obt_keyboard_keysym_to_keycode(XK_Left);
-            keys[OB_KEY_RIGHT] = obt_keyboard_keysym_to_keycode(XK_Right);
-            keys[OB_KEY_UP] = obt_keyboard_keysym_to_keycode(XK_Up);
-            keys[OB_KEY_DOWN] = obt_keyboard_keysym_to_keycode(XK_Down);
-            keys[OB_KEY_TAB] = obt_keyboard_keysym_to_keycode(XK_Tab);
-            keys[OB_KEY_SPACE] = obt_keyboard_keysym_to_keycode(XK_space);
+            if (reconfigure) obt_keyboard_reload();
 
             {
-                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);
-                hooks_startup(reconfigure);
                 /* start up config which sets up with the parser */
                 config_startup(i);
 
                 /* 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"));
@@ -263,7 +251,7 @@ gint main(gint argc, gchar **argv)
                     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 */
@@ -274,7 +262,8 @@ gint main(gint argc, gchar **argv)
                                         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;
@@ -308,7 +297,6 @@ gint main(gint argc, gchar **argv)
             grab_startup(reconfigure);
             group_startup(reconfigure);
             ping_startup(reconfigure);
-            prompt_startup(reconfigure);
             client_startup(reconfigure);
             dock_startup(reconfigure);
             moveresize_startup(reconfigure);
@@ -316,6 +304,7 @@ gint main(gint argc, gchar **argv)
             mouse_startup(reconfigure);
             menu_frame_startup(reconfigure);
             menu_startup(reconfigure);
+            prompt_startup(reconfigure);
 
             if (!reconfigure) {
                 guint32 xid;
@@ -351,13 +340,35 @@ gint main(gint argc, gchar **argv)
 
             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);
@@ -365,7 +376,6 @@ gint main(gint argc, gchar **argv)
             moveresize_shutdown(reconfigure);
             dock_shutdown(reconfigure);
             client_shutdown(reconfigure);
-            prompt_shutdown(reconfigure);
             ping_shutdown(reconfigure);
             group_shutdown(reconfigure);
             grab_shutdown(reconfigure);
@@ -378,7 +388,6 @@ gint main(gint argc, gchar **argv)
             sn_shutdown(reconfigure);
             event_shutdown(reconfigure);
             config_shutdown();
-            hooks_shutdown(reconfigure);
             actions_shutdown(reconfigure);
         } while (reconfigure);
     }
@@ -394,6 +403,7 @@ gint main(gint argc, gchar **argv)
     obt_display_close();
 
     if (restart) {
+        ob_debug_shutdown();
         if (restart_path != NULL) {
             gint argcp;
             gchar **argvp;
@@ -447,7 +457,8 @@ gint main(gint argc, gchar **argv)
     g_free(ob_sm_id);
     g_free(program_name);
 
-    ob_debug_shutdown();
+    if (!restart)
+        ob_debug_shutdown();
 
     return exitcode;
 }
@@ -467,6 +478,10 @@ static void signal_handler(gint signal, gpointer data)
         /* reap children */
         while (waitpid(-1, NULL, WNOHANG) > 0);
         break;
+    case SIGTTIN:
+    case SIGTTOU:
+        ob_debug("Caught signal %d. Ignoring.", signal);
+        break;
     default:
         ob_debug("Caught signal %d. Exiting.", signal);
         /* TERM and INT return a 0 code */
@@ -506,7 +521,7 @@ static void print_help(void)
     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);
 }
@@ -524,8 +539,21 @@ static void remove_args(gint *argc, gchar **argv, gint index, gint num)
 
 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)
@@ -557,13 +585,9 @@ 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")) {
@@ -586,7 +610,7 @@ static void parse_args(gint *argc, gchar **argv)
                    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")) {
@@ -643,7 +667,7 @@ static Cursor load_cursor(const gchar *name, guint fontval)
 
 void ob_exit_with_error(const gchar *msg)
 {
-    g_message(msg);
+    g_message("%s", msg);
     session_shutdown(TRUE);
     exit(EXIT_FAILURE);
 }
@@ -685,13 +709,12 @@ Cursor ob_cursor(ObCursor cursor)
     return cursors[cursor];
 }
 
-KeyCode ob_keycode(ObKey key)
+ObState ob_state(void)
 {
-    g_assert(key < OB_NUM_KEYS);
-    return keys[key];
+    return state;
 }
 
-ObState ob_state(void)
+void ob_set_state(ObState s)
 {
-    return state;
+    state = s;
 }
This page took 0.0308 seconds and 4 git commands to generate.