Another week of evenings and weekend worth of progress on the next weblin generation (OVW). I am now working on browser tracking, support for multiple tabs and the multiple views for the same scene.
1. Firefox Add-on
Unfortunately, the rather simple weblin way of tracking browsers is not sufficient anymore. We want tabs (more about
tabs and windows at the OVW blog).
Reliable information about visible tabs is only available inside the browser. So I need real browser addons. I started with Firefox some time ago. The addon
keeps track of all tabs, when they
open/close, become
visible and when they
navigate. It sends all the information over a local TCP connection to the client (using a
simple remote procedure call protocol). This sounds complicated and it is, because the
socket implementation in Firefox has its quirks. I could tell
stories. But the beauty of a TCP connection is, that if the browser crashes or disappears, then the client will notice when the TCP connection goes down. It will then leave all rooms automatically, even if the browser addon does not say goodbye.
2. Tracking Browser Coordinates
Unfortunately, I don't get a real window handle (HWND) inside the browser. I need a native component to get a HWND for the tab. Why HWND? because I want to track the coordinates of the tab: resize and move events. I could add a native DLL to the addon, but then the addon is not cross-platform. Since I have a native part anyway (the client), I rather make the platform dependent processing in the client.
I implemented a
BrowserInfo-module which finds the tab's HWND in the window list and does
GetWindowRect() to get coordinates. The module also arranges the window stacking order with
SetWindowPos() so that the avatar display is always directly on top of it's browser. That's good old Win32 coding. While most of the code is cross-platform, this part must be adapted to other operating systems, i.e. MacOS.
3. Model View Controller
I am very happy with the Model-View-Controller architecture. The "view" is only responsible for showing avatars. It can be
closed and
opened and re-creates everything from the model. The view uses the
WebKit and
JavaScript heavily.
The
virtual presence module manages entering and leaving chat rooms, participants and chat lines. This is the "model". The view gets events from the model when participants
enter/
leave/
chat. The view can always
query the model. The model has only data structures. The view creates visible avatars.
And best of all: there can be multiple views for the same model. This means, that 2 browser windows can show the same scene.
_happy_modeling()