From daa59b89b1f05cf3a2abdee9ef5ac8bffe805b13 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 12 Jan 2019 20:39:23 +0100 Subject: Fix multithreading crashes --- src/ChatWindow.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'src/ChatWindow.cpp') 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 +} -- cgit v1.2.3