aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xbin/uzbl-tabbed47
-rw-r--r--src/uzbl-core.c8
-rw-r--r--src/uzbl-core.h1
3 files changed, 39 insertions, 17 deletions
diff --git a/bin/uzbl-tabbed b/bin/uzbl-tabbed
index a15967a..d63d6de 100755
--- a/bin/uzbl-tabbed
+++ b/bin/uzbl-tabbed
@@ -303,12 +303,13 @@ class SocketClient:
# List of UzblInstance objects not already linked with a SocketClient
instances_queue = {}
- def __init__(self, socket):
+ def __init__(self, socket, uzbl_tabbed):
self._buffer = ""
self._socket = socket
self._watchers = [io_add_watch(socket, IO_IN, self._socket_recv),\
io_add_watch(socket, IO_HUP, self._socket_closed)]
self.uzbl = None
+ self.uzbl_tabbed = uzbl_tabbed
def _socket_recv(self, fd, condition):
@@ -341,13 +342,17 @@ class SocketClient:
if cmd:
self.uzbl.parse_command(cmd)
else:
- name = re.findall('^EVENT \[(\d+-\d+)\] INSTANCE_START \d+$', self._buffer, re.M)
+ name = re.findall('^EVENT \[([^]]+)\] INSTANCE_START \d+$', self._buffer, re.M)
uzbl = self.instances_queue.get(name[0])
if uzbl:
+ # we've found the uzbl we were waiting for
del self.instances_queue[name[0]]
- self.uzbl = uzbl
- self.uzbl.got_socket(self)
- self._feed("")
+ else:
+ # an unsolicited uzbl has connected, how exciting!
+ uzbl = UzblInstance(self.uzbl_tabbed, None, '', '', False)
+ self.uzbl = uzbl
+ self.uzbl.got_socket(self)
+ self._feed("")
def send(self, data):
'''Child socket send function.'''
@@ -376,6 +381,12 @@ class EventDispatcher:
return method(*args)
+ def plug_created(self, plug_id):
+ if not self.uzbl.tab:
+ tab = self.parent.create_tab()
+ tab.add_id(int(plug_id))
+ self.uzbl.set_tab(tab)
+
def title_changed(self, title):
self.uzbl.title = title.strip()
self.uzbl.title_changed(False)
@@ -477,10 +488,10 @@ class EventDispatcher:
class UzblInstance:
'''Uzbl instance meta-data/meta-action object.'''
- def __init__(self, parent, tab, name, uri, title, switch):
+ def __init__(self, parent, name, uri, title, switch):
self.parent = parent
- self.tab = tab
+ self.tab = None
self.dispatcher = EventDispatcher(self)
self.name = name
@@ -490,8 +501,11 @@ class UzblInstance:
self._client = None
self._switch = switch # Switch to tab after loading ?
- self.title_changed()
+ def set_tab(self, tab):
+ self.tab = tab
+ self.title_changed()
+ self.parent.tabs[self.tab] = self
def got_socket(self, client):
'''Uzbl instance is now connected'''
@@ -763,7 +777,7 @@ class UzblTabbed:
'''A new uzbl instance was created'''
client, _ = sock.accept()
- self.clients[client] = SocketClient(client)
+ self.clients[client] = SocketClient(client, self)
return True
@@ -1045,6 +1059,12 @@ class UzblTabbed:
return False
+ def create_tab(self, next = False):
+ tab = gtk.Socket()
+ tab.show()
+ self.notebook.insert_page(tab, position=next and self.notebook.get_current_page() + 1 or -1)
+ self.notebook.set_tab_reorderable(tab, True)
+ return tab
def new_tab(self, uri='', title='', switch=None, next=False):
'''Add a new tab to the notebook and start a new instance of uzbl.
@@ -1052,10 +1072,7 @@ class UzblTabbed:
when you need to load multiple tabs at a time (I.e. like when
restoring a session from a file).'''
- tab = gtk.Socket()
- tab.show()
- self.notebook.insert_page(tab, position=next and self.notebook.get_current_page() + 1 or -1)
- self.notebook.set_tab_reorderable(tab, True)
+ tab = self.create_tab(next)
sid = tab.get_id()
uri = uri.strip()
name = "%d-%d" % (os.getpid(), self.next_pid())
@@ -1070,9 +1087,9 @@ class UzblTabbed:
'--connect-socket', self.socket_path, '--uri', str(uri)]
gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
- uzbl = UzblInstance(self, tab, name, uri, title, switch)
+ uzbl = UzblInstance(self, name, uri, title, switch)
+ uzbl.set_tab(tab)
SocketClient.instances_queue[name] = uzbl
- self.tabs[tab] = uzbl
def clean_slate(self):
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index c095a7f..e461a4c 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -51,8 +51,11 @@ GOptionEntry entries[] = {
"Name of the current instance (defaults to Xorg window id or random for GtkSocket mode)", "NAME" },
{ "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
"Path to config file or '-' for stdin", "FILE" },
+ /* TODO: explain the difference between these two options */
{ "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
- "Xembed Socket ID", "SOCKET" },
+ "Xembed socket ID, this window should embed itself", "SOCKET" },
+ { "embed", 'e', 0, G_OPTION_ARG_NONE, &uzbl.state.embed,
+ "Whether this window should expect to be embedded", NULL },
{ "connect-socket", 0, 0, G_OPTION_ARG_STRING_ARRAY, &uzbl.state.connect_socket_names,
"Connect to server socket for event managing", "CSOCKET" },
{ "print-events", 'p', 0, G_OPTION_ARG_NONE, &uzbl.state.events_stdout,
@@ -1540,6 +1543,7 @@ create_window() {
GtkPlug*
create_plug() {
+ if(uzbl.state.embed) uzbl.state.socket_id = 0;
GtkPlug* plug = GTK_PLUG (gtk_plug_new (uzbl.state.socket_id));
g_signal_connect (G_OBJECT (plug), "destroy", G_CALLBACK (destroy_cb), NULL);
g_signal_connect (G_OBJECT (plug), "key-press-event", G_CALLBACK (key_press_cb), NULL);
@@ -1746,7 +1750,7 @@ initialize(int argc, char** argv) {
}
/* Embedded mode */
- if (uzbl.state.socket_id)
+ if (uzbl.state.socket_id || uzbl.state.embed)
uzbl.state.plug_mode = TRUE;
if (!g_thread_supported())
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index be8fccd..07b6f99 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -109,6 +109,7 @@ typedef struct {
gchar* executable_path;
gchar* searchtx;
gboolean verbose;
+ gboolean embed;
GdkEventButton* last_button;
gchar* last_result;
gboolean plug_mode;