]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/ioncore.c
Imported Upstream version 20090110
[ion3.git] / ioncore / ioncore.c
index 62f616b985135b5ccbc94fc2483fccf70cfd7ba6..0675d0a83c6b8bcfdfd5daa58443ecc972eadd12 100644 (file)
@@ -1,12 +1,9 @@
 /*
  * ion/ioncore/ioncore.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
  */
 
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <string.h>
+#include <strings.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <ctype.h>
 #ifndef CF_NO_LOCALE
 #include <locale.h>
 #include <langinfo.h>
+#endif
+#ifndef CF_NO_GETTEXT
 #include <libintl.h>
 #endif
+#include <stdarg.h>
 
 #include <libtu/util.h>
 #include <libtu/optparser.h>
 #include "group-cw.h"
 #include "group-ws.h"
 #include "llist.h"
+#include "exec.h"
+#include "screen-notify.h"
+#include "key.h"
+
 
 #include "../version.h"
 #include "exports.h"
@@ -69,18 +74,18 @@ WGlobal ioncore_g;
 static const char *progname="ion";
 
 static const char ioncore_copy[]=
-    "Ion " ION_VERSION ", copyright (c) Tuomo Valkonen 1999-2007.";
+    "Ion " ION_VERSION ", copyright (c) Tuomo Valkonen 1999-2009.";
 
 static const char ioncore_license[]=DUMMY_TR(
-    "This program is free software; you can redistribute it and/or\n"
-    "modify it under the terms of the GNU Lesser General Public\n"
-    "License as published by the Free Software Foundation; either\n"
-    "version 2.1 of the License, or (at your option) any later version.\n"
+    "This software is licensed under the GNU Lesser General Public License\n"
+    "(LGPL), version 2.1, extended with terms applying to the use of the name\n"
+    "of the project, Ion(tm), unless otherwise indicated in components taken\n"
+    "from elsewhere. For details, see the file LICENSE that you should have\n"
+    "received with this software.\n"
     "\n"
     "This program is distributed in the hope that it will be useful,\n"
     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
-    "Lesser General Public License for more details.\n");
+    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); 
 
 static const char *ioncore_about=NULL;
 
@@ -95,12 +100,23 @@ WHook *ioncore_deinit_hook=NULL;
 /*{{{ warn_nolog */
 
 
-void ioncore_warn_nolog(const char *str)
+void ioncore_warn_nolog(const char *str, ...)
 {
-    fprintf(stderr, "%s: %s\n", prog_execname(), str);
+    va_list args;
+    
+    va_start(args, str);
+    
+    if(ioncore_g.opmode==IONCORE_OPMODE_INIT){
+        fprintf(stderr, "%s: ", libtu_progname());
+        vfprintf(stderr, str, args);
+        fprintf(stderr, "\n");
+    }else{
+        warn_v(str, args);
+    }
+    
+    va_end(args);
 }
 
-
 /*}}}*/
 
 
@@ -179,7 +195,7 @@ static bool check_encoding()
     }
 
     if(mbtowc(NULL, NULL, 0)!=0){
-        warn("Statefull encodings are unsupported.");
+        warn(TR("Statefull encodings are unsupported."));
         return FALSE;
     }
     
@@ -189,11 +205,11 @@ static bool check_encoding()
     return TRUE;
     
 integr_err:
-    warn("Cannot verify locale encoding setting integrity "
-         "(LC_CTYPE=%s, nl_langinfo(CODESET)=%s). "
-         "The LC_CTYPE environment variable should be of the form "
-         "language_REGION.encoding (e.g. en_GB.UTF-8), and encoding "
-         "should match the nl_langinfo value above.", ctype, langi);
+    warn(TR("Cannot verify locale encoding setting integrity "
+            "(LC_CTYPE=%s, nl_langinfo(CODESET)=%s). "
+            "The LC_CTYPE environment variable should be of the form "
+            "language_REGION.encoding (e.g. en_GB.UTF-8), and encoding "
+            "should match the nl_langinfo value above."), ctype, langi);
     return FALSE;
 }
 
@@ -227,6 +243,10 @@ static bool init_locale()
     return FALSE;
 }
 
+#endif
+
+#ifndef CF_NO_GETTEXT
+
 #define TEXTDOMAIN "ion3"
 
 static bool init_messages(const char *localedir)
@@ -253,12 +273,12 @@ static bool init_messages(const char *localedir)
 
 #define INIT_HOOK_(NM)                             \
     NM=mainloop_register_hook(#NM, create_hook()); \
-    if(NM==NULL) return FALSE;
+    if(NM==NULL) return FALSE
 
-#define INIT_HOOK(NM, DFLT)                           \
-    INIT_HOOK_(NM)                                    \
-    if(!hook_add(NM, (void (*)())DFLT)) return FALSE;
+#define ADD_HOOK_(NM, FN)                          \
+    if(!hook_add(NM, (void (*)())FN)) return FALSE
 
+#define INIT_HOOK(NM, DFLT) INIT_HOOK_(NM); ADD_HOOK_(NM, DFLT)
 
 static bool init_hooks()
 {
@@ -270,12 +290,16 @@ static bool init_hooks()
     INIT_HOOK_(clientwin_mapped_hook);
     INIT_HOOK_(clientwin_unmapped_hook);
     INIT_HOOK_(clientwin_property_change_hook);
+    INIT_HOOK_(ioncore_submap_ungrab_hook);
+    
+    INIT_HOOK_(region_notify_hook);
+    ADD_HOOK_(region_notify_hook, ioncore_screen_activity_notify);
     
-    INIT_HOOK(region_notify_hook, ioncore_frame_quasiactivation_notify);
     INIT_HOOK(clientwin_do_manage_alt, clientwin_do_manage_default);
     INIT_HOOK(ioncore_handle_event_alt, ioncore_handle_event);
     INIT_HOOK(region_do_warp_alt, region_do_warp_default);
-
+    INIT_HOOK(ioncore_exec_environ_hook, ioncore_setup_environ);
+    
     mainloop_sigchld_hook=mainloop_register_hook("ioncore_sigchld_hook",
                                                  create_hook());
     mainloop_sigusr2_hook=mainloop_register_hook("ioncore_sigusr2_hook",
@@ -321,6 +345,7 @@ static bool init_global()
     ioncore_g.screens=NULL;
     ioncore_g.focus_next=NULL;
     ioncore_g.warp_next=FALSE;
+    ioncore_g.focus_next_source=IONCORE_FOCUSNEXT_OTHER;
     
     ioncore_g.focus_current=NULL;
 
@@ -330,6 +355,9 @@ static bool init_global()
     ioncore_g.opaque_resize=0;
     ioncore_g.warp_enabled=TRUE;
     ioncore_g.switchto_new=TRUE;
+    ioncore_g.no_mousefocus=FALSE;
+    ioncore_g.unsqueeze_enabled=TRUE;
+    ioncore_g.autoraise=TRUE;
     
     ioncore_g.enc_utf8=FALSE;
     ioncore_g.enc_sb=TRUE;
@@ -354,6 +382,8 @@ static bool init_global()
     INITSTR(pseudoinactivated);
     INITSTR(tag);
     INITSTR(deinit);
+    INITSTR(map);
+    INITSTR(unmap);
     
     return TRUE;
 }
@@ -371,6 +401,8 @@ bool ioncore_init(const char *prog, int argc, char *argv[],
 
 #ifndef CF_NO_LOCALE    
     init_locale();
+#endif
+#ifndef CF_NO_GETTEXT
     init_messages(localedir);
 #endif
 
@@ -491,6 +523,7 @@ static bool ioncore_init_x(const char *display, int stflags)
     ioncore_g.atom_wm_window_role=XInternAtom(dpy, "WM_WINDOW_ROLE", False);
     ioncore_g.atom_checkcode=XInternAtom(dpy, "_ION_CWIN_RESTART_CHECKCODE", False);
     ioncore_g.atom_selection=XInternAtom(dpy, "_ION_SELECTION_STRING", False);
+    ioncore_g.atom_dockapp_hack=XInternAtom(dpy, "_ION_DOCKAPP_HACK", False);
     ioncore_g.atom_mwm_hints=XInternAtom(dpy, "_MOTIF_WM_HINTS", False);
 
     ioncore_init_xim();