Send call window actions through the owned bridge API

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent 4b4f48963e
commit 299c1b86f8
2 files changed
+17 -19

No files matched your search

+13 -16
View File
@@ -25,8 +25,6 @@
#include <cstring>
extern "C" {
#include "call/call.h"
#include "../../lib/mem.h"
#include "../../lib/debug_config.h"
}
@@ -311,7 +309,9 @@ CallWindow::CallWindow(QWidget* parent)
connect(m_continueBtn, &QPushButton::clicked, this, [this] {
if (m_state != WaitDecision) return;
DEBUG_INFO(DEBUG_CATEGORY_CALL, "desktop caller overrides phone busy id=%016llx", (unsigned long long)m_callId);
postCallFn(call_continue_trampoline, m_callId);
if (gui_bridge_call_action(GUI_CALL_CONTINUE, m_callId) < 0) {
m_statusLabel->setText(callText("Could not send the call command")); return;
}
setState(Outgoing);
SoundManager::instance()->playLoop("call_connecting");
});
@@ -578,26 +578,22 @@ void CallWindow::applyVideo() {
m_video->setVideo(enabled, m_camera->currentData().toByteArray(), size.width(), size.height(), m_codec->currentData().toInt(), fps ? fps : 30);
}
void CallWindow::postCallFn(void (*fn)(void*), uint64_t callId) {
struct call_id_arg* a = (struct call_id_arg*)u_malloc(sizeof(*a));
if (!a) return;
a->inst = gui_bridge_get_inst();
a->call_id = callId;
gui_bridge_post_uasync_fn(fn, a);
}
void CallWindow::onAccept() {
if (gui_bridge_call_action(GUI_CALL_ACCEPT, m_callId) < 0) {
m_statusLabel->setText(callText("Could not send the call command")); return;
}
SoundManager::instance()->stopLoop();
setState(Active);
postCallFn(call_accept_trampoline, m_callId);
}
void CallWindow::onDecline() {
postCallFn(call_decline_trampoline, m_callId);
if (gui_bridge_call_action(GUI_CALL_DECLINE, m_callId) < 0)
m_statusLabel->setText(callText("Could not send the call command"));
}
void CallWindow::onHangup() {
postCallFn(call_hangup_trampoline, m_callId);
if (gui_bridge_call_action(GUI_CALL_HANGUP, m_callId) < 0)
m_statusLabel->setText(callText("Could not send the call command"));
}
void CallWindow::onMuteToggled(bool checked) {
@@ -615,8 +611,9 @@ void CallWindow::onDeviceChanged(int index) {
void CallWindow::closeEvent(QCloseEvent* event) {
m_video->stop(); m_videoCall = 0;
if (m_state == Outgoing || m_state == Ringing || m_state == Active || m_state == WaitDecision)
postCallFn(call_hangup_trampoline, m_callId);
if ((m_state == Outgoing || m_state == Ringing || m_state == Active || m_state == WaitDecision)
&& gui_bridge_call_action(GUI_CALL_HANGUP, m_callId) < 0)
DEBUG_WARN(DEBUG_CATEGORY_CALL, "call window closed without queued hangup id=%llu", (unsigned long long)m_callId);
emit closed(m_callId);
event->accept();
}
+4 -3
View File
@@ -13,8 +13,10 @@ class QSpinBox;
class CallVideoEngine;
class CallVideoWindow;
/* Окно звонка: состояния Outgoing (пытаемся связаться), Ringing (звоним),
* Incoming (принять/отклонить), Active (идёт разговор, таймер), Ended (завершён). */
/* GUI-окно звонка: Outgoing (соединение), Ringing (доставлен вызов), Incoming (принять/отклонить),
* Active (разговор/таймер), Ended (завершён), WaitDecision (явное разрешение звонить занятому телефону).
* Команды передаются через typed API моста без заимствованного instance/heap payload в GUI.
* Отказ постановки сохраняет состояние и показывает ошибку; видео принадлежит окну, аудио — общему CallAudioEngine. */
class CallWindow : public QWidget {
Q_OBJECT
public:
@@ -50,7 +52,6 @@ private slots:
private:
void updateButtons();
void populateDeviceCombo();
void postCallFn(void (*fn)(void*), uint64_t callId);
void applyVideo();
void updateVideoPresentation();
CallVideoEngine* m_video;