diff options
-rw-r--r-- | pjsip-apps/src/vidgui/vidgui.cpp | 45 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidgui.h | 18 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidwin.cpp | 45 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidwin.h | 2 |
4 files changed, 66 insertions, 44 deletions
diff --git a/pjsip-apps/src/vidgui/vidgui.cpp b/pjsip-apps/src/vidgui/vidgui.cpp index f59911b4..5a1e5903 100644 --- a/pjsip-apps/src/vidgui/vidgui.cpp +++ b/pjsip-apps/src/vidgui/vidgui.cpp @@ -50,7 +50,7 @@ MainWin::MainWin(QWidget *parent) theInstance_ = this; initLayout(); - onCallReleased(); + emit signalCallReleased(); } MainWin::~MainWin() @@ -101,13 +101,20 @@ void MainWin::initLayout() connect(hangupButton_, SIGNAL(clicked()), this, SLOT(hangup())); connect(quitButton_, SIGNAL(clicked()), this, SLOT(quit())); //connect(this, SIGNAL(close()), this, SLOT(quit())); + + // UI updates must be done in the UI thread! + connect(this, SIGNAL(signalNewCall(int, bool)), + this, SLOT(onNewCall(int, bool))); + connect(this, SIGNAL(signalCallReleased()), + this, SLOT(onCallReleased())); + connect(this, SIGNAL(signalInitVideoWindow()), + this, SLOT(initVideoWindow())); + connect(this, SIGNAL(signalShowStatus(const QString&)), + this, SLOT(doShowStatus(const QString&))); } void MainWin::quit() { - //if (preview_on) - //preview(); - delete video_prev_; video_prev_ = NULL; delete video_; @@ -119,9 +126,16 @@ void MainWin::quit() void MainWin::showStatus(const char *msg) { + PJ_LOG(3,(THIS_FILE, "%s", msg)); + + QString msg_ = QString::fromUtf8(msg); + emit signalShowStatus(msg_); +} + +void MainWin::doShowStatus(const QString& msg) +{ //statusBar_->showMessage(msg); statusBar_->setText(msg); - PJ_LOG(3,(THIS_FILE, "%s", msg)); } void MainWin::showError(const char *title, pj_status_t status) @@ -134,7 +148,7 @@ void MainWin::showError(const char *title, pj_status_t status) showStatus(errline); } -void MainWin::onNewCall(pjsua_call_id cid, bool incoming) +void MainWin::onNewCall(int cid, bool incoming) { pjsua_call_info ci; @@ -205,7 +219,8 @@ void MainWin::preview() //screen sometimes, probably because it's using different //X11 Display //status = pjsua_vid_win_set_show(wid, PJ_TRUE); - video_prev_->show(); + //This is handled by VidWin now + //video_prev_->show(); showStatus("Preview started"); previewButton_->setText(tr("Stop &Preview")); @@ -223,7 +238,9 @@ void MainWin::call() } else { pj_status_t status; QString dst = url_->text(); - const char *uri = dst.toAscii().data(); + char uri[256]; + + pj_ansi_strncpy(uri, dst.toAscii().data(), sizeof(uri)); pj_str_t uri2 = pj_str((char*)uri); pj_assert(currentCall_ == -1); @@ -242,11 +259,11 @@ void MainWin::hangup() pj_assert(currentCall_ != -1); //pjsua_call_hangup(currentCall_, PJSIP_SC_BUSY_HERE, NULL, NULL); pjsua_call_hangup_all(); - onCallReleased(); + emit signalCallReleased(); } -void MainWin::init_video_window() +void MainWin::initVideoWindow() { pjsua_call_info ci; unsigned i; @@ -310,7 +327,7 @@ void MainWin::on_call_state(pjsua_call_id call_id, pjsip_event *e) pjsua_call_get_info(call_id, &ci); if (currentCall_ == -1 && ci.state < PJSIP_INV_STATE_DISCONNECTED) { - onNewCall(call_id, false); + emit signalNewCall(call_id, false); } char status[80]; @@ -319,7 +336,7 @@ void MainWin::on_call_state(pjsua_call_id call_id, pjsip_event *e) ci.state_text.ptr, ci.last_status_text.ptr); showStatus(status); - onCallReleased(); + emit signalCallReleased(); } else { snprintf(status, sizeof(status), "Call is %s", pjsip_inv_state_name(ci.state)); showStatus(status); @@ -337,7 +354,7 @@ void MainWin::on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, return; } - onNewCall(call_id, true); + emit signalNewCall(call_id, true); pjsua_call_info ci; char status[80]; @@ -365,7 +382,7 @@ void MainWin::on_call_media_state(pjsua_call_id call_id) break; } } else if (ci.media[i].type == PJMEDIA_TYPE_VIDEO) { - init_video_window(); + emit signalInitVideoWindow(); } } } diff --git a/pjsip-apps/src/vidgui/vidgui.h b/pjsip-apps/src/vidgui/vidgui.h index 7d53e18a..a7c2a507 100644 --- a/pjsip-apps/src/vidgui/vidgui.h +++ b/pjsip-apps/src/vidgui/vidgui.h @@ -47,29 +47,36 @@ public: bool initStack(); void showError(const char *title, pj_status_t status); - void showStatus(const char *); + void showStatus(const char *msg); -public: void on_reg_state(pjsua_acc_id acc_id); void on_call_state(pjsua_call_id call_id, pjsip_event *e); void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata); void on_call_media_state(pjsua_call_id call_id); +signals: + void signalNewCall(int, bool); + void signalCallReleased(); + void signalInitVideoWindow(); + void signalShowStatus(const QString&); + public slots: void preview(); void call(); void hangup(); void quit(); + void onNewCall(int cid, bool incoming); + void onCallReleased(); + void initVideoWindow(); + void doShowStatus(const QString& msg); + private: static MainWin *theInstance_; pjsua_acc_id accountId_; pjsua_call_id currentCall_; bool preview_on; - void onNewCall(pjsua_call_id cid, bool incoming); - void onCallReleased(); - private: QPushButton *callButton_, *hangupButton_, @@ -85,7 +92,6 @@ private: QVBoxLayout *vbox_left; void initLayout(); - void init_video_window(); }; diff --git a/pjsip-apps/src/vidgui/vidwin.cpp b/pjsip-apps/src/vidgui/vidwin.cpp index cc97b821..fd941415 100644 --- a/pjsip-apps/src/vidgui/vidwin.cpp +++ b/pjsip-apps/src/vidgui/vidwin.cpp @@ -46,41 +46,41 @@ VidWin::VidWin(const pjmedia_vid_dev_hwnd *hwnd_, VidWin::~VidWin() { + show(false); detach(); - pj_bzero(&hwnd, sizeof(hwnd)); - size_hint = QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - destroy(true, false); } bool VidWin::event(QEvent *e) { switch(e->type()) { + case QEvent::Resize: - { - // revert to default size hint, make it resizable - setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - // resize now - set_size(); - } - break; - case QEvent::ParentAboutToChange: - get_size(); - setFixedSize(size_hint); + set_size(); break; + case QEvent::ParentChange: - { - get_size(); - /* + get_size(); + if (0) { QRect qr = rect(); if (qr.width() > size_hint.width()) size_hint.setWidth(qr.width()); if (qr.height() > size_hint.height()) size_hint.setWidth(qr.height()); - */ - setFixedSize(size_hint); - attach(); } + setFixedSize(size_hint); + attach(); break; + + case QEvent::Show: + show(true); + // revert to default size hint, make it resizable + setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + break; + + case QEvent::Hide: + show(false); + break; + default: break; } @@ -102,9 +102,8 @@ void VidWin::attach() HWND new_parent = (HWND)winId(); orig_parent = GetParent(w); - SetParent(w, new_parent); SetWindowLong(w, GWL_STYLE, WS_CHILD); - ShowWindow(w, SW_SHOWNOACTIVATE); + SetParent(w, new_parent); TRACE_("%p new parent handle = %p", w, new_parent); } @@ -113,7 +112,6 @@ void VidWin::detach() if (!hwnd.info.win.hwnd) return; HWND w = (HWND)hwnd.info.win.hwnd; - ShowWindow(w, SW_HIDE); SetParent(w, (HWND)orig_parent); TRACE_("%p revert parent handle to %p", w, orig_parent); } @@ -144,7 +142,8 @@ void VidWin::show(bool visible) { if (!hwnd.info.win.hwnd) return; - ShowWindow(hwnd.info.win.hwnd, visible ? SW_SHOW : SW_HIDE); + HWND w = (HWND)hwnd.info.win.hwnd; + ShowWindow(w, visible ? SW_SHOW : SW_HIDE); } #elif defined(__APPLE__) diff --git a/pjsip-apps/src/vidgui/vidwin.h b/pjsip-apps/src/vidgui/vidwin.h index 8a18785f..3602da94 100644 --- a/pjsip-apps/src/vidgui/vidwin.h +++ b/pjsip-apps/src/vidgui/vidwin.h @@ -32,7 +32,6 @@ public: Qt::WindowFlags f = 0); virtual ~VidWin(); QSize sizeHint() const { return size_hint; } - void show(bool visible=true); protected: virtual bool event(QEvent *e); @@ -46,6 +45,7 @@ private: void detach(); void set_size(); void get_size(); + void show(bool visible=true); }; #endif |