diff options
author | dec05eba <dec05eba@protonmail.com> | 2019-01-12 20:39:23 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2019-01-12 20:39:26 +0100 |
commit | daa59b89b1f05cf3a2abdee9ef5ac8bffe805b13 (patch) | |
tree | 4b027770beec143d9e514819b6ca30d4a9695eab /src/ChatWindow.cpp | |
parent | fe4199dace73ee38262528f7ae88cbfba99120dd (diff) |
Fix multithreading crashes
Diffstat (limited to 'src/ChatWindow.cpp')
-rw-r--r-- | src/ChatWindow.cpp | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/src/ChatWindow.cpp b/src/ChatWindow.cpp index 9cc4ff1..9fc810b 100644 --- a/src/ChatWindow.cpp +++ b/src/ChatWindow.cpp @@ -184,8 +184,7 @@ namespace dchat window->windowNotification->show("Room name has to be between 1 and 32 characters"); else { - auto room = window->rooms->createRoom(roomName); - setCurrentRoom(room); + window->rooms->createRoom(roomName); } break; } @@ -384,7 +383,9 @@ namespace dchat leftPanelChannels.attach(*roomButton, 0, roomCount, 1, 1); ++roomCount; - RoomData *roomData = new RoomData { leftPanelUsersLayout, messageAreaLayout, roomButton }; + uint numMessages = 0; + uint numUsers = 0; + RoomData *roomData = new RoomData { leftPanelUsersLayout, messageAreaLayout, numMessages, numUsers, roomButton }; roomDataById[*room->id] = roomData; if(!currentRoom) { @@ -407,6 +408,7 @@ namespace dchat messageAreaStack.set_visible_child(roomIdStr); topbar->setTitle(room->name); currentRoom = room; + assert(roomDataById.find(*room->id) != roomDataById.end()); currentRoomData = roomDataById[*room->id]; if(room->localUser) { @@ -433,20 +435,15 @@ namespace dchat void ChatWindow::addMessage(const RoomAddMessageRequest &request) { - auto roomMessages = request.room->messages; - RoomMessage *lastMessage = nullptr; - if(!roomMessages.empty()) - lastMessage = &roomMessages.back(); - - if(lastMessage && lastMessage->creator->publicKey == request.message.creator->publicKey) + if(request.prevMessage && request.prevMessage->creator->publicKey == request.message->creator->publicKey) { - int64_t msgTimeDiff = (int64_t)request.message.timestampSeconds - (int64_t)lastMessage->timestampSeconds; + int64_t msgTimeDiff = (int64_t)request.message->timestampSeconds - (int64_t)request.prevMessage->timestampSeconds; if(msgTimeDiff <= MERGE_MESSAGE_TIMESTAMP_DIFF_SEC) { - auto message = messageById[lastMessage->id]; - message->text.set_text(message->text.get_text() + "\n" + request.message.text); + auto message = messageById[request.prevMessage->id]; + message->text.set_text(message->text.get_text() + "\n" + request.message->text); // Since messages that are sent withing a timeframe are combined, several message ids can refer to the same message - messageById[request.message.id] = message; + messageById[request.message->id] = message; if(!request.loadedFromCache && *request.room->id == *currentRoom->id) { currentRoomData->messageAreaLayout->queue_draw(); @@ -456,20 +453,20 @@ namespace dchat } } - std::string userNickname = request.message.creator->nickname; + std::string userNickname = request.message->creator->nickname; if(userNickname.empty()) userNickname = "Anonymous"; - ChatMessage *message = Gtk::manage(new ChatMessage(userNickname, request.message.text, request.message.timestampSeconds)); - if(request.message.creator->avatarUrl.empty()) + ChatMessage *message = Gtk::manage(new ChatMessage(userNickname, request.message->text, request.message->timestampSeconds)); + if(request.message->creator->avatarUrl.empty()) message->avatar.url = "https://discordemoji.com/assets/emoji/PeepoHide.png"; else - message->avatar.url = request.message.creator->avatarUrl; + message->avatar.url = request.message->creator->avatarUrl; message->set_valign(Gtk::Align::ALIGN_START); message->set_hexpand(true); message->show_all(); - messageById[request.message.id] = message; + messageById[request.message->id] = message; RoomData *roomData = roomDataById[*request.room->id]; - roomData->messageAreaLayout->attach(*message, 0, roomMessages.size(), 1, 1); + roomData->messageAreaLayout->attach(*message, 0, roomData->numMessages++, 1, 1); // TODO: When we get a message in the current room we scroll to the bottom, but this should only be done if we are not manually scrolling to view old messages if(!request.loadedFromCache && *request.room->id == *currentRoom->id) @@ -487,7 +484,7 @@ namespace dchat username->get_style_context()->add_class("username-list-username"); request.user->userdata = username; RoomData *roomData = roomDataById[*request.room->id]; - roomData->leftPanelUsersLayout->attach(*username, 0, request.room->userByPublicKey.size() - 1, 1, 1); + roomData->leftPanelUsersLayout->attach(*username, 0, roomData->numUsers++, 1, 1); fprintf(stderr, "Added user %s\n", request.user->publicKey.toString().c_str()); if(roomData == currentRoomData) @@ -555,4 +552,4 @@ namespace dchat auto adj = messageArea.get_vadjustment(); adj->set_value(adj->get_upper()); } -}
\ No newline at end of file +} |