fix pull
[uzbl-mobile] / uzbl.c
diff --git a/uzbl.c b/uzbl.c
index 193d0ba..1031930 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -65,16 +65,18 @@ static Uzbl uzbl;
 static const
 GOptionEntry entries[] =
 {
-    { "uri",     'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
+    { "uri",      'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
         "Uri to load at startup (equivalent to 'set uri = URI')", "URI" },
-    { "verbose", 'v', 0, G_OPTION_ARG_NONE,   &uzbl.state.verbose,
+    { "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, 
+        "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 }
@@ -100,6 +102,7 @@ const struct {
 /*    variable name         pointer to variable in code          type  dump callback function    */
 /*  --------------------------------------------------------------------------------------- */
     { "uri",                 PTR(uzbl.state.uri,                  STR,  1,   cmd_load_uri)},
+    { "geometry",            PTR(uzbl.gui.geometry,               STR,  1,   cmd_set_geometry)},
     { "verbose",             PTR(uzbl.state.verbose,              INT,  1,   NULL)},
     { "mode",                PTR(uzbl.behave.mode,                INT,  0,   NULL)},
     { "inject_html",         PTR(uzbl.behave.inject_html,         STR,  0,   cmd_inject_html)},
@@ -591,6 +594,20 @@ scroll_horz(WebKitWebView* page, GArray *argv, GString *result) {
 }
 
 static void
+cmd_set_geometry() {
+    if(!gtk_window_parse_geometry(GTK_WINDOW(uzbl.gui.main_window), uzbl.gui.geometry)) {
+        if(uzbl.state.verbose)
+            printf("Error in geometry string: %s\n", uzbl.gui.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
+    */
+    retreive_geometry();
+}
+
+static void
 cmd_set_status() {
     if (!uzbl.behave.show_status) {
         gtk_widget_hide(uzbl.gui.mainbar);
@@ -2158,14 +2175,30 @@ update_title (void) {
 }
 
 static gboolean
+configure_event_cb(GtkWidget* window, GdkEventConfigure* event) {
+    (void) window;
+    (void) event;
+
+    retreive_geometry();
+    return FALSE;
+}
+
+static gboolean
 key_press_cb (GtkWidget* window, GdkEventKey* event)
 {
     //TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
 
     (void) window;
 
-    if (event->type != GDK_KEY_PRESS || event->keyval == GDK_Page_Up || event->keyval == GDK_Page_Down
-        || event->keyval == GDK_Up || event->keyval == GDK_Down || event->keyval == GDK_Left || event->keyval == GDK_Right || event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R)
+    if (event->type   != GDK_KEY_PRESS ||
+        event->keyval == GDK_Page_Up   ||
+        event->keyval == GDK_Page_Down ||
+        event->keyval == GDK_Up        ||
+        event->keyval == GDK_Down      ||
+        event->keyval == GDK_Left      ||
+        event->keyval == GDK_Right     ||
+        event->keyval == GDK_Shift_L   ||
+        event->keyval == GDK_Shift_R)
         return FALSE;
 
     /* turn off insert mode (if always_insert_mode is not used) */
@@ -2175,7 +2208,11 @@ key_press_cb (GtkWidget* window, GdkEventKey* event)
         return TRUE;
     }
 
-    if (uzbl.behave.insert_mode && (((event->state & uzbl.behave.modmask) != uzbl.behave.modmask) || (!uzbl.behave.modmask)))
+    if (uzbl.behave.insert_mode && 
+        ( ((event->state & uzbl.behave.modmask) != uzbl.behave.modmask) || 
+          (!uzbl.behave.modmask)
+        )
+       )
         return FALSE;
 
     if (event->keyval == GDK_Escape) {
@@ -2322,6 +2359,7 @@ GtkWidget* create_window () {
     gtk_widget_set_name (window, "Uzbl browser");
     g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy_cb), NULL);
     g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (key_press_cb), NULL);
+    g_signal_connect (G_OBJECT (window), "configure-event", G_CALLBACK (configure_event_cb), NULL);
 
     return window;
 }
@@ -2701,11 +2739,26 @@ dump_key_hash(gpointer k, gpointer v, gpointer ud) {
 }
 
 static void
-dump_config() {
+dump_config() { //ADD "result" var so we can use this with uzblctrl
     g_hash_table_foreach(uzbl.comm.proto_var, dump_var_hash, NULL);
     g_hash_table_foreach(uzbl.bindings, dump_key_hash, NULL);
 }
 
+static void
+retreive_geometry() {
+    int w, h, x, y;
+    GString *buf = g_string_new("");
+
+    gtk_window_get_size(GTK_WINDOW(uzbl.gui.main_window), &w, &h);
+    gtk_window_get_position(GTK_WINDOW(uzbl.gui.main_window), &x, &y);
+
+    g_string_printf(buf, "%dx%d+%d+%d", w, h, x, y);
+
+    if(uzbl.gui.geometry)
+        g_free(uzbl.gui.geometry);
+    uzbl.gui.geometry = g_string_free(buf, FALSE);
+}
+
 /** -- MAIN -- **/
 int
 main (int argc, char* argv[]) {
@@ -2805,6 +2858,11 @@ main (int argc, char* argv[]) {
     uzbl.gui.bar_h = gtk_range_get_adjustment((GtkRange*) uzbl.gui.scbar_h);
     gtk_widget_set_scroll_adjustments ((GtkWidget*) uzbl.gui.web_view, uzbl.gui.bar_h, uzbl.gui.bar_v);
 
+    if(uzbl.gui.geometry)
+        cmd_set_geometry();
+    else
+        retreive_geometry();
+
     settings_init ();
 
     if (!uzbl.behave.show_status)