#define LENGTH(x) (sizeof x / sizeof x[0])
-#define MAX_BINDINGS 256
#define _POSIX_SOURCE
#include <gtk/gtk.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
+#include <assert.h>
#include "uzbl.h"
#include "config.h"
"Uri to load at startup (equivalent to 'set uri = URI')", "URI" },
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &uzbl.state.verbose,
"Whether to print all messages or just errors.", NULL },
- { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
+ { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
"Name of the current instance (defaults to Xorg window id)", "NAME" },
- { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
+ { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
"Config file (this is pretty much equivalent to uzbl < FILE )", "FILE" },
- { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
+ { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
"Socket ID", "SOCKET" },
- { "geometry", 'g', 0, G_OPTION_ARG_STRING, &uzbl.gui.geometry,
+ { "geometry", 'g', 0, G_OPTION_ARG_STRING, &uzbl.gui.geometry,
"Set window geometry (format: WIDTHxHEIGHT+-X+-Y)", "GEOMETRY" },
{ "version", 'V', 0, G_OPTION_ARG_NONE, &uzbl.behave.print_version,
"Print the version and exit", NULL },
{ NULL, 0, 0, 0, NULL, NULL, NULL }
};
+enum ptr_type {TYPE_INT, TYPE_STR, TYPE_FLOAT};
+
/* associate command names to their properties */
typedef const struct {
/* TODO: Make this ambiguous void **ptr into a union { char *char_p; int *int_p; float *float_p; } val;
the PTR() macro is kind of preventing this change at the moment. */
void **ptr;
- int type;
+ enum ptr_type type;
int dump;
int writeable;
- void (*func)(void);
+ /*@null@*/ void (*func)(void);
} uzbl_cmdprop;
-enum {TYPE_INT, TYPE_STR, TYPE_FLOAT};
-
/* abbreviations to help keep the table's width humane */
#define PTR_V(var, t, d, fun) { .ptr = (void*)&(var), .type = TYPE_##t, .dump = d, .writeable = 1, .func = fun }
#define PTR_C(var, t, fun) { .ptr = (void*)&(var), .type = TYPE_##t, .dump = 0, .writeable = 0, .func = fun }
const struct {
- char *name;
+ const char *name;
uzbl_cmdprop cp;
} var_name_to_ptr[] = {
/* variable name pointer to variable in code type dump callback function */
{ "status_pbar_pending", PTR_V(uzbl.gui.sbar.progress_u, STR, 1, update_title)},
{ "status_pbar_width", PTR_V(uzbl.gui.sbar.progress_w, INT, 1, update_title)},
{ "status_background", PTR_V(uzbl.behave.status_background, STR, 1, update_title)},
- { "insert_indicator", PTR_V(uzbl.behave.insert_indicator, STR, 1, update_title)},
- { "command_indicator", PTR_V(uzbl.behave.cmd_indicator, STR, 1, update_title)},
+ { "insert_indicator", PTR_V(uzbl.behave.insert_indicator, STR, 1, update_indicator)},
+ { "command_indicator", PTR_V(uzbl.behave.cmd_indicator, STR, 1, update_indicator)},
{ "title_format_long", PTR_V(uzbl.behave.title_format_long, STR, 1, update_title)},
{ "title_format_short", PTR_V(uzbl.behave.title_format_short, STR, 1, update_title)},
{ "icon", PTR_V(uzbl.gui.icon, STR, 1, set_icon)},
const struct {
- char *key;
+ /*@null@*/ char *key;
guint mask;
} modkeys[] = {
{ "SHIFT", GDK_SHIFT_MASK }, // shift
/* --- UTILITY FUNCTIONS --- */
enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE};
guint
-get_exp_type(gchar *s) {
+get_exp_type(const gchar *s) {
/* variables */
if(*(s+1) == '(')
return EXP_EXPR;
else
return EXP_SIMPLE_VAR;
+ /*@notreached@*/
return EXP_ERR;
}
* recurse == 2: don't expand '@<java script>@'
*/
gchar *
-expand(char *s, guint recurse) {
+expand(const char *s, guint recurse) {
uzbl_cmdprop *c;
guint etype;
- char upto = ' ';
char *end_simple_var = "^°!\"§$%&/()=?'`'+~*'#-.:,;@<>| \\{}[]¹²³¼½";
- char str_end[2];
- char ret[4096];
+ char *ret = NULL;
char *vend = NULL;
GError *err = NULL;
gchar *cmd_stdout = NULL;
if(!vend) vend = strchr(s, '\0');
break;
case EXP_BRACED_VAR:
- s++; upto = '}';
- vend = strchr(s, upto);
+ s++;
+ vend = strchr(s, '}');
if(!vend) vend = strchr(s, '\0');
break;
case EXP_EXPR:
s++;
- strcpy(str_end, ")@");
- str_end[2] = '\0';
- vend = strstr(s, str_end);
+ vend = strstr(s, ")@");
if(!vend) vend = strchr(s, '\0');
break;
case EXP_JS:
s++;
- strcpy(str_end, ">@");
- str_end[2] = '\0';
- vend = strstr(s, str_end);
+ vend = strstr(s, ">@");
if(!vend) vend = strchr(s, '\0');
break;
case EXP_ESCAPE:
s++;
- strcpy(str_end, "]@");
- str_end[2] = '\0';
- vend = strstr(s, str_end);
+ vend = strstr(s, "]@");
if(!vend) vend = strchr(s, '\0');
break;
}
+ assert(vend);
- if(vend) {
- strncpy(ret, s, vend-s);
- ret[vend-s] = '\0';
- }
+ ret = g_strndup(s, vend-s);
if(etype == EXP_SIMPLE_VAR ||
etype == EXP_BRACED_VAR) {
g_error_free (err);
}
else if (*cmd_stdout) {
- int len = strlen(cmd_stdout);
+ size_t len = strlen(cmd_stdout);
- if(cmd_stdout[len-1] == '\n')
- cmd_stdout[--len] = 0; /* strip trailing newline */
+ if(len > 0 && cmd_stdout[len-1] == '\n')
+ cmd_stdout[--len] = '\0'; /* strip trailing newline */
g_string_append(buf, cmd_stdout);
g_free(cmd_stdout);
g_free(mycmd);
s = vend+2;
}
+
+ free(ret);
+ ret = NULL;
break;
default:
g_free(uzbl.state.keycmd);
g_hash_table_destroy(uzbl.bindings);
g_hash_table_destroy(uzbl.behave.commands);
- g_scanner_destroy(uzbl.scan);
}
/* used for html_mode_timeout
if(uzbl.state.verbose)
printf("Error in geometry string: %s\n", uzbl.gui.geometry);
}
- /* update geometry var with the actual geometry
+ /* update geometry var with the actual geometry
this is necessary as some WMs don't seem to honour
the above setting and we don't want to end up with
wrong geometry information
}
void
+update_indicator() {
+ set_mode_indicator();
+ update_title();
+}
+
+void
set_insert_mode(gboolean mode) {
uzbl.behave.insert_mode = mode;
set_mode_indicator();
char *buf = NULL;
if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) {
- if(!c->writeable) return TRUE;
+ if(!c->writeable) return FALSE;
/* check for the variable type */
if (c->type == TYPE_STR) {
return TRUE;
}
- if (uzbl.behave.insert_mode &&
- ( ((event->state & uzbl.behave.modmask) != uzbl.behave.modmask) ||
+ if (uzbl.behave.insert_mode &&
+ ( ((event->state & uzbl.behave.modmask) != uzbl.behave.modmask) ||
(!uzbl.behave.modmask)
)
)
if (uzbl.behave.print_version) {
printf("Commit: %s\n", COMMIT);
- exit(0);
+ exit(EXIT_SUCCESS);
}
/* initialize hash table */
if(setup_signal(SIGALRM, catch_alrm) == SIG_ERR)
fprintf(stderr, "uzbl: error hooking SIGALARM\n");
- uzbl.gui.sbar.progress_s = g_strdup("=");
+ uzbl.gui.sbar.progress_s = g_strdup("="); //TODO: move these to config.h
uzbl.gui.sbar.progress_u = g_strdup("·");
uzbl.gui.sbar.progress_w = 10;
retreive_geometry();
gchar *uri_override = (uzbl.state.uri ? g_strdup(uzbl.state.uri) : NULL);
+ if (argc > 1 && !uzbl.state.uri)
+ uri_override = g_strdup(argv[1]);
gboolean verbose_override = uzbl.state.verbose;
settings_init ();
set_var_value("uri", uri_override);
g_free(uri_override);
} else if (uzbl.state.uri)
- cmd_load_uri(uzbl.gui.web_view, NULL);
+ cmd_load_uri();
gtk_main ();
clean_up();