]> www.infradead.org Git - pidgin-chime.git/log
pidgin-chime.git
8 years agoDecode RT messages, extract audio
David Woodhouse [Thu, 14 Sep 2017 13:40:25 +0000 (06:40 -0700)]
Decode RT messages, extract audio

We really need to work out how to get this hooked up to Pidgin now;
we *have* the audio data and if we #define AUDIO_HACKS we can play it
back.

It still kicks us off as we're not sending any but the first message,
but once we have audio data to send that'll be fixed. Need to set up
a periodic empty message even if we're muted though.

8 years agoExplicitly make chime-call-audio.c depend on the generated headers
David Woodhouse [Thu, 14 Sep 2017 12:32:30 +0000 (05:32 -0700)]
Explicitly make chime-call-audio.c depend on the generated headers

Should it be chime-call-audio.c? It's actually chime-call-audio.o but
that has a complex constructed filename...

8 years agoCheck for protoc-c and try to fix Makefile rules
David Woodhouse [Thu, 14 Sep 2017 12:22:40 +0000 (05:22 -0700)]
Check for protoc-c and try to fix Makefile rules

8 years agoMerge pull request #6 from michaelgataws/groupconv-naming
David Woodhouse [Wed, 13 Sep 2017 22:02:42 +0000 (23:02 +0100)]
Merge pull request #6 from michaelgataws/groupconv-naming

Improve group conversation naming

8 years agoAudio calls actually connecting
David Woodhouse [Wed, 13 Sep 2017 21:59:30 +0000 (14:59 -0700)]
Audio calls actually connecting

Needs cleanup and object lifetime handling taken into account, but
progress nonetheless. Someone needs to work out how to use
fsrawconference (presumably) to allow us to actually pass the audio
to Pidgin to be heard, instead of just spewing it to stdout.

8 years agoSome more audio fixes
David Woodhouse [Tue, 12 Sep 2017 04:03:54 +0000 (21:03 -0700)]
Some more audio fixes

I can at least establish the websocket connection now, although it
doesn't seem to like my auth message.

8 years agoUnbreak websocket connect
David Woodhouse [Tue, 12 Sep 2017 02:54:40 +0000 (19:54 -0700)]
Unbreak websocket connect

And make it slightly easier to submit requests with the session_token,
which we'll need for screen shares AFAICT.

8 years agoLink the right protobuf library
David Woodhouse [Tue, 12 Sep 2017 02:54:01 +0000 (19:54 -0700)]
Link the right protobuf library

8 years agoFirst attempt at data messages
David Woodhouse [Mon, 11 Sep 2017 23:16:05 +0000 (16:16 -0700)]
First attempt at data messages

Odds of this working first time are fairly near zero...

8 years agoFirst attempt to send/receive auth messages
David Woodhouse [Mon, 11 Sep 2017 22:29:36 +0000 (15:29 -0700)]
First attempt to send/receive auth messages

There's probably only so far I can get with this while I'm on a plane
and can't test it...

8 years agoBuild protobuf files
David Woodhouse [Mon, 11 Sep 2017 21:27:42 +0000 (14:27 -0700)]
Build protobuf files

8 years agoImport tincan protobuf definitions
David Woodhouse [Mon, 11 Sep 2017 21:12:20 +0000 (14:12 -0700)]
Import tincan protobuf definitions

We will probably end up doing this differently — partly because we might
be able to use a GLib-based protobuf encoder/decoder which fits more
neatly, and partly because we don't *want* to be lifting things from
internal code even if it's just the protocol definitions in a standard
form. But this is the easy option for now....

8 years agoStart adding audio connection support
David Woodhouse [Mon, 11 Sep 2017 21:10:08 +0000 (14:10 -0700)]
Start adding audio connection support

8 years agoUse soup_session_websocket_connect_async() again
David Woodhouse [Mon, 11 Sep 2017 20:03:10 +0000 (13:03 -0700)]
Use soup_session_websocket_connect_async() again

This mostly reverts commit b767104a2a1 ("Open-code replacement for
soup_session_websocket_connect_async()"). That was reasonable enough
when we only had one websocket. Now we're going to have more, so lift
the original one and hack it to work with our ChimeWebsocketConnection
too.

8 years agoImprove group conversation naming
Michael Gruenewald [Mon, 11 Sep 2017 13:34:11 +0000 (15:34 +0200)]
Improve group conversation naming

Before, group conversations were named by concatenating member names
using just `,`. With our peculiar member names that resulted in
conversation names like

    Last1, First1,Last2, First2

which hurts the typographical part of my brain. With semicolons and an
extra space it looks like that:

    Last1, First1; Last2, First2

8 years agoFix conversation create again
David Woodhouse [Sat, 9 Sep 2017 00:52:10 +0000 (01:52 +0100)]
Fix conversation create again

8 years agoAttempt to find a conversation before creating it
David Woodhouse [Sat, 9 Sep 2017 00:39:33 +0000 (01:39 +0100)]
Attempt to find a conversation before creating it

8 years agoTry to improve chat room handling in buddy list / room list
David Woodhouse [Fri, 8 Sep 2017 20:42:47 +0000 (21:42 +0100)]
Try to improve chat room handling in buddy list / room list

Attempt to keep names up to date and use RoomId instead of name to be
unambiguous where we can. Not entirely sure I like this but I didn't
much like it before, either...

8 years agoAllow access to existing group chats
David Woodhouse [Thu, 7 Sep 2017 22:17:44 +0000 (23:17 +0100)]
Allow access to existing group chats

8 years agoUpdate room names
David Woodhouse [Thu, 7 Sep 2017 14:29:18 +0000 (15:29 +0100)]
Update room names

We only get told of the name change on the room channel itself, which we don't
subscribe to unless we have it open — and even then it only tells us that it's
been updated; not what the change was. So we have to refetch it. But it's
better than nothing.

We should probably trigger a fetch_rooms() when the roomlist is brought up
in the UI, to make sure they're up to date.

8 years agoFix meeting scheduling for people with no vanity URL
David Woodhouse [Thu, 7 Sep 2017 08:50:16 +0000 (09:50 +0100)]
Fix meeting scheduling for people with no vanity URL

8 years agoStart to add ChimeCall object support
David Woodhouse [Thu, 7 Sep 2017 00:28:49 +0000 (01:28 +0100)]
Start to add ChimeCall object support

8 years agoAttempt to reduce error-prone duplication in property parsing/handling
David Woodhouse [Mon, 4 Sep 2017 20:29:08 +0000 (21:29 +0100)]
Attempt to reduce error-prone duplication in property parsing/handling

It is entirely possible that the cure here is worse than the disease,
but I wanted to at least have a go at it before I press on with adding
yet more of this crap, with the rest of the ChimeMeeting fields and also
ChimeCall etc...

8 years agoFix fetching of room messages
David Woodhouse [Wed, 6 Sep 2017 14:00:54 +0000 (15:00 +0100)]
Fix fetching of room messages

We can't rely on having a current LastSent for Rooms, so always fetch
from our last known message, just in case.

It would be nice if Chime always sent us a 'PreviousMessageId' with
each message, which would allow us to ditch this when we're opening
the room due to a mention. And would help in a few other cases too.

8 years agoFix reason reporting for failed send
David Woodhouse [Sat, 2 Sep 2017 20:50:38 +0000 (21:50 +0100)]
Fix reason reporting for failed send

8 years agoMerge pull request #5 from michaelgataws/empty-conversations
David Woodhouse [Tue, 5 Sep 2017 12:51:07 +0000 (13:51 +0100)]
Merge pull request #5 from michaelgataws/empty-conversations

Stop showing empty group conversations

8 years agoStop showing empty group conversations
Michael Gruenewald [Tue, 5 Sep 2017 12:35:50 +0000 (14:35 +0200)]
Stop showing empty group conversations

There are some group conversations that apparently exist, yet are empty
somehow. All of them show a `last_sent` of unix epoch 0.

8 years agoTrigger refetch of messages on notify::last-sent
David Woodhouse [Sat, 2 Sep 2017 19:58:53 +0000 (20:58 +0100)]
Trigger refetch of messages on notify::last-sent

8 years agoroom: add missing g_task_return_boolean
Ignacio Casal Quinteiro [Thu, 31 Aug 2017 08:46:55 +0000 (10:46 +0200)]
room: add missing g_task_return_boolean

8 years agoFix typos
Ignacio Casal Quinteiro [Thu, 31 Aug 2017 08:41:47 +0000 (10:41 +0200)]
Fix typos

8 years agomeeting: fix compile warning
Ignacio Casal Quinteiro [Thu, 31 Aug 2017 08:37:58 +0000 (10:37 +0200)]
meeting: fix compile warning

8 years agoRevamp notification of joinable meetings, make it possible to join them
David Woodhouse [Thu, 31 Aug 2017 01:13:28 +0000 (02:13 +0100)]
Revamp notification of joinable meetings, make it possible to join them

8 years agoMerge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime
David Woodhouse [Wed, 30 Aug 2017 22:10:45 +0000 (23:10 +0100)]
Merge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime

8 years agoStart to tie meeting join to chat room
David Woodhouse [Wed, 30 Aug 2017 22:10:32 +0000 (23:10 +0100)]
Start to tie meeting join to chat room

8 years agoRename method to async instead of sync
Ignacio Casal Quinteiro [Tue, 29 Aug 2017 07:03:23 +0000 (09:03 +0200)]
Rename method to async instead of sync

And add a FIXME about a missing call to the finish method.

8 years agoFix profile subscriptions
David Woodhouse [Tue, 29 Aug 2017 06:16:02 +0000 (07:16 +0100)]
Fix profile subscriptions

8 years agoAttempt to get personal passcode for meetings
David Woodhouse [Mon, 28 Aug 2017 23:26:32 +0000 (00:26 +0100)]
Attempt to get personal passcode for meetings

8 years agoFlesh out more meeting support
David Woodhouse [Mon, 28 Aug 2017 23:17:59 +0000 (00:17 +0100)]
Flesh out more meeting support

It would be really useful to automate some of the JSON parsing, GParamSpec
and property handling/update stuff.

8 years agoDon't unref meeting in new_meeting signal
David Woodhouse [Mon, 28 Aug 2017 20:00:04 +0000 (21:00 +0100)]
Don't unref meeting in new_meeting signal

8 years agoStart supporting join by PIN
David Woodhouse [Mon, 28 Aug 2017 17:57:55 +0000 (18:57 +0100)]
Start supporting join by PIN

We don't actually implement "join" yet, so we're only really adding
it to the list of joinable meetings. Joining them comes next...

8 years agoAdd UI support for scheduling meetings
David Woodhouse [Mon, 28 Aug 2017 16:18:26 +0000 (17:18 +0100)]
Add UI support for scheduling meetings

8 years agoStart processing meetings...
David Woodhouse [Fri, 25 Aug 2017 23:35:31 +0000 (00:35 +0100)]
Start processing meetings...

8 years agoFix double-free on closing rooms
David Woodhouse [Fri, 25 Aug 2017 22:11:29 +0000 (23:11 +0100)]
Fix double-free on closing rooms

8 years agoFix stack overflow when padding option array in fetch_room_memberships.
Doyle, Jordan [Sat, 19 Aug 2017 19:30:20 +0000 (19:30 +0000)]
Fix stack overflow when padding option array in fetch_room_memberships.

While-loop condition was "<= 4" meaning we actually ended up trying to
pad the array with 5 array values rather than 4 which lead to a stack
overflow and client crash. Initializing the array with NULL makes the
code agnostic to how many values it needs to pad preventing this from
happening again in the future.

8 years agoUse g_clear_error() when it might not be set
David Woodhouse [Wed, 23 Aug 2017 10:09:52 +0000 (11:09 +0100)]
Use g_clear_error() when it might not be set

8 years agoDon't crash on rejoining no-longer-existing room
David Woodhouse [Tue, 22 Aug 2017 16:04:35 +0000 (17:04 +0100)]
Don't crash on rejoining no-longer-existing room

8 years agoKill final use of ChimeConnectionPrivate from messages.c
David Woodhouse [Tue, 22 Aug 2017 14:50:04 +0000 (15:50 +0100)]
Kill final use of ChimeConnectionPrivate from messages.c

8 years agoHeader cleanups
David Woodhouse [Tue, 22 Aug 2017 14:37:33 +0000 (15:37 +0100)]
Header cleanups

8 years agoAdd implementation of room member removal
David Woodhouse [Thu, 17 Aug 2017 23:38:37 +0000 (00:38 +0100)]
Add implementation of room member removal

Need to find a way to expose this to the Pidgin UI.

8 years agoAdd room members
David Woodhouse [Thu, 17 Aug 2017 23:25:10 +0000 (00:25 +0100)]
Add room members

8 years agoRemove second json_builder_new()
David Woodhouse [Thu, 17 Aug 2017 22:46:55 +0000 (23:46 +0100)]
Remove second json_builder_new()

8 years agoPut a fixme where I've proved we're actually missing messages. Maybe later...
David Woodhouse [Thu, 17 Aug 2017 20:21:26 +0000 (21:21 +0100)]
Put a fixme where I've proved we're actually missing messages. Maybe later...

8 years agoEmit message signal for sent messages
David Woodhouse [Thu, 17 Aug 2017 19:46:33 +0000 (20:46 +0100)]
Emit message signal for sent messages

I caught it earlier when the juggernaut disconnected just as I was sending
a message. Perhaps unsurprisingly, when you reconnect they don't bother
to replay your *own* messages to you, so my own message didn't appear in
the chat.

It occurs to me as I type this commit message that we might not see messages
which were sent by our *other* clients, during a period of disconnection.
Will need to check that. We should definitely be monitoring for LastSent
and triggering a message refetch if we notice that we're out of date.

8 years agoHook message signal for group convs at startup
David Woodhouse [Thu, 17 Aug 2017 11:58:19 +0000 (12:58 +0100)]
Hook message signal for group convs at startup

8 years agoGenerate conversation names
David Woodhouse [Thu, 17 Aug 2017 10:30:44 +0000 (11:30 +0100)]
Generate conversation names

8 years agoStart to support group conversations
David Woodhouse [Wed, 16 Aug 2017 23:57:16 +0000 (00:57 +0100)]
Start to support group conversations

Needs work especially on names, and there's no way to open them except to
receive an incoming message. But it's a start...

8 years agoSlight cleanup for conv msg delivery
David Woodhouse [Wed, 16 Aug 2017 21:54:23 +0000 (22:54 +0100)]
Slight cleanup for conv msg delivery

8 years agoFix fetch_room_memberships arg handling
David Woodhouse [Wed, 16 Aug 2017 21:54:12 +0000 (22:54 +0100)]
Fix fetch_room_memberships arg handling

8 years agoFinally get Room and Conversation message handling into some form of sanity
David Woodhouse [Wed, 16 Aug 2017 21:33:57 +0000 (22:33 +0100)]
Finally get Room and Conversation message handling into some form of sanity

8 years agooptimise outbound mentions slightly
David Woodhouse [Wed, 16 Aug 2017 15:48:51 +0000 (16:48 +0100)]
optimise outbound mentions slightly

8 years agoMove mention_regex to pc
David Woodhouse [Wed, 16 Aug 2017 15:38:57 +0000 (16:38 +0100)]
Move mention_regex to pc

8 years agoFix spelling of 'Available'
David Woodhouse [Wed, 16 Aug 2017 11:32:25 +0000 (12:32 +0100)]
Fix spelling of 'Available'

8 years agoKill raw printf in Pidgin code too
David Woodhouse [Wed, 16 Aug 2017 09:53:42 +0000 (10:53 +0100)]
Kill raw printf in Pidgin code too

8 years agoAdd chime_debug() macro to use instead of printf
David Woodhouse [Wed, 16 Aug 2017 09:26:05 +0000 (10:26 +0100)]
Add chime_debug() macro to use instead of printf

This makes finch slightly more readable. Still some printf to clean
up in the Pidgin-side code though.

8 years agoSwitch chat.c over to using chime_connection_open_room()
David Woodhouse [Wed, 16 Aug 2017 01:20:54 +0000 (02:20 +0100)]
Switch chat.c over to using chime_connection_open_room()

Now using proper signals for incoming messages and memberships. Just need
to fix up the message queue handling to match conversations.c now.

Then we can look at supporting group conversations.

8 years agoUse room-mention signal to join chats
David Woodhouse [Wed, 16 Aug 2017 00:17:03 +0000 (01:17 +0100)]
Use room-mention signal to join chats

8 years agoStart adding functionality to chime-room.c
David Woodhouse [Tue, 15 Aug 2017 00:28:00 +0000 (01:28 +0100)]
Start adding functionality to chime-room.c

This mostly duplicates what's already in chat.c, cleaning it up and making it
"pure" Chime code.

8 years agoMerge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime
David Woodhouse [Sun, 13 Aug 2017 00:05:39 +0000 (01:05 +0100)]
Merge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime

8 years agoStart obsoleting messages.c
David Woodhouse [Sat, 12 Aug 2017 23:47:42 +0000 (00:47 +0100)]
Start obsoleting messages.c

Make conversations.c use chime_connection_fetch_messages_async().
Reproduce some of the message-gathering and replay-in-order bits from
messages.c, which can be de-duplicated again once Room chats have caught
up. And implement a 'last ten seen messages' queue for simple message
reply avoidance. Change to only show outbound messages when they come
back to us, not before they're sent.

8 years agoAdd chime_connection_fetch_messages_async()
David Woodhouse [Sat, 12 Aug 2017 22:38:06 +0000 (23:38 +0100)]
Add chime_connection_fetch_messages_async()

It just emits them with "message" signals on the parent
ChimeRoom/ChimeConversation object.

8 years agoAutomatically send the consent form
Isaac Jurado [Sat, 12 Aug 2017 18:10:39 +0000 (20:10 +0200)]
Automatically send the consent form

To reduce some code and also minimize potential user confusion, go over the
first Sign In consent form automatically.

See discusion at #2.

8 years agoUpdate the README
Isaac Jurado [Sat, 12 Aug 2017 17:54:54 +0000 (19:54 +0200)]
Update the README

8 years agoKill more ChimeConnectionPrivate usage in chat.c
David Woodhouse [Fri, 11 Aug 2017 23:20:38 +0000 (00:20 +0100)]
Kill more ChimeConnectionPrivate usage in chat.c

8 years agoRemove last users of ChimeConnectionPrivate from conversations.c
David Woodhouse [Fri, 11 Aug 2017 22:39:17 +0000 (23:39 +0100)]
Remove last users of ChimeConnectionPrivate from conversations.c

Almost clean now; just that we still use parse_string() et al.

And the messages gathering wants cleaning up too, of course...

8 years agoAdd chime_connection_get_profile_id()
David Woodhouse [Fri, 11 Aug 2017 22:39:01 +0000 (23:39 +0100)]
Add chime_connection_get_profile_id()

8 years agoAdd chime_connection_contact_by_id()
David Woodhouse [Fri, 11 Aug 2017 22:26:46 +0000 (23:26 +0100)]
Add chime_connection_contact_by_id()

8 years agoUse Chime send_message for chat.c
David Woodhouse [Fri, 11 Aug 2017 22:23:52 +0000 (23:23 +0100)]
Use Chime send_message for chat.c

8 years agoUse Chime send_message for conversations.c
David Woodhouse [Fri, 11 Aug 2017 22:07:00 +0000 (23:07 +0100)]
Use Chime send_message for conversations.c

8 years agoAdd generic Chime send_message functionality
David Woodhouse [Fri, 11 Aug 2017 22:06:41 +0000 (23:06 +0100)]
Add generic Chime send_message functionality

8 years agoRemove stray newline
David Woodhouse [Fri, 11 Aug 2017 22:06:24 +0000 (23:06 +0100)]
Remove stray newline

8 years agoAdd conversation create functionality
David Woodhouse [Fri, 11 Aug 2017 14:53:17 +0000 (15:53 +0100)]
Add conversation create functionality

8 years agoUse autocomplete for finding contact for new IM
David Woodhouse [Fri, 11 Aug 2017 13:56:32 +0000 (14:56 +0100)]
Use autocomplete for finding contact for new IM

8 years agoAdd user search UI
David Woodhouse [Fri, 11 Aug 2017 13:29:58 +0000 (14:29 +0100)]
Add user search UI

8 years agoAdd contact search/autocomplete functionality
David Woodhouse [Fri, 11 Aug 2017 13:27:35 +0000 (14:27 +0100)]
Add contact search/autocomplete functionality

8 years agoDon't emit notification for availability when it didn't change
David Woodhouse [Fri, 11 Aug 2017 13:25:47 +0000 (14:25 +0100)]
Don't emit notification for availability when it didn't change

8 years agoKill another ->prpl_conn use
David Woodhouse [Fri, 11 Aug 2017 09:07:56 +0000 (10:07 +0100)]
Kill another ->prpl_conn use

Admittedly we're going to be chasing usage of ChimeConnectionPrivate soon too,
but this is a step in the right direction at least.

8 years agoMore chime_read_last_msg() cleanup
David Woodhouse [Fri, 11 Aug 2017 01:15:11 +0000 (02:15 +0100)]
More chime_read_last_msg() cleanup

We were calling it twice in a row from on_chime_new_conversation() now, which
is silly. And pass the ChimeRoom/ChimeConversation into it, instead of a boolean
to indicate the type and the ID as a string. Which will make it closer to
chime_update_last_msg() when we eventually get round to making it a signal
on the same objects. Which won't be tonight...

8 years agoMove a bunch of chat bits into struct purple_chime
David Woodhouse [Fri, 11 Aug 2017 00:54:46 +0000 (01:54 +0100)]
Move a bunch of chat bits into struct purple_chime

Still some nastiness with directly subscribing to RoomMessages which wants
handling inside Chime code instead...

8 years agoHash purple IM conversations by email not profile ID
David Woodhouse [Fri, 11 Aug 2017 00:04:12 +0000 (01:04 +0100)]
Hash purple IM conversations by email not profile ID

It's mostly what we want anyway, and saves a lookup

8 years agoMore im_conversations_by_peer_id to struct purple_chime
David Woodhouse [Thu, 10 Aug 2017 23:53:37 +0000 (00:53 +0100)]
More im_conversations_by_peer_id to struct purple_chime

8 years agoCreate struct purple_chime to hold purple-specific connection data
David Woodhouse [Thu, 10 Aug 2017 23:29:29 +0000 (00:29 +0100)]
Create struct purple_chime to hold purple-specific connection data

8 years agoKill more ->prpl_conn
David Woodhouse [Thu, 10 Aug 2017 23:10:18 +0000 (00:10 +0100)]
Kill more ->prpl_conn

8 years agoClean up presence status handling
David Woodhouse [Thu, 10 Aug 2017 21:01:26 +0000 (22:01 +0100)]
Clean up presence status handling

8 years agoMake declaration of chime_statuses extern
David Woodhouse [Thu, 10 Aug 2017 08:28:10 +0000 (09:28 +0100)]
Make declaration of chime_statuses extern

8 years agoSeparate out chime_conversation_send_typing()
David Woodhouse [Wed, 9 Aug 2017 21:51:34 +0000 (22:51 +0100)]
Separate out chime_conversation_send_typing()

8 years agoMore ->prpl_conn elimination
David Woodhouse [Wed, 9 Aug 2017 21:25:19 +0000 (22:25 +0100)]
More ->prpl_conn elimination

8 years agoMerge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime
David Woodhouse [Wed, 9 Aug 2017 14:28:14 +0000 (15:28 +0100)]
Merge branch 'master' of ssh://kaos-source.amazon.com//kaos/git/stash/dwmw2/chime

8 years agoAdd a fallback mechanism to get user input.
Isaac Jurado [Wed, 9 Aug 2017 13:31:24 +0000 (15:31 +0200)]
Add a fallback mechanism to get user input.

Not all libpurple users implement request fields.  Therefore, implement an
alternative way of obtaining credentials by using simpler UI operations.

Fixes #1.

8 years agoEliminate some more use of cxn->prpl_conn
David Woodhouse [Tue, 8 Aug 2017 17:30:30 +0000 (18:30 +0100)]
Eliminate some more use of cxn->prpl_conn

8 years agoStart to make sense of conversations.c vs. chime-conversation.c
David Woodhouse [Tue, 8 Aug 2017 01:26:17 +0000 (02:26 +0100)]
Start to make sense of conversations.c vs. chime-conversation.c

Use ChimeConversation objects, handle actual messages using a hacked
variant of the original code. Next up, a sane ChimeMessages object
for collecting messages for ChimeRooms and ChimeConversations, and
fixing up some of the remaining incest between Purple bits and Chime
bits. This is kind of ugly but it basically works and can be cleaned
up piecemeal from here... and it's been sitting around half-complete
for a week or so, so it's about time it got pushed.