void KviMainWindow::windowActivated(KviWindow * wnd, bool bForce) { if(!wnd) return; // this can happen? // ASSERT(m_pWinList->findRef(wnd)) // unless we want to bForce the active window to be re-activated if(g_pActiveWindow == wnd && !bForce) return; if(g_pActiveWindow != wnd) { if(g_pActiveWindow) g_pActiveWindow->lostUserFocus(); g_pActiveWindow = wnd; } updateWindowTitle(wnd); m_pWindowList->setActiveItem(wnd->windowListItem()); bool bActiveContextChanged = (m_pActiveContext != wnd->context()); m_pActiveContext = wnd->context(); if(g_pActiveWindow->view()) g_pActiveWindow->view()->clearUnreaded(); emit activeWindowChanged(); if(bActiveContextChanged) emit activeContextChanged(); KVS_TRIGGER_EVENT_0(KviEvent_OnWindowActivated, wnd); }
void KviMdiChild::updateSystemPopup() { if(!m_pClient) return ; if(!m_pClient->inherits("KviWindow")) return; systemMenu()->clear(); //FIXME this is an hack KVS_TRIGGER_EVENT_0(KviEvent_OnWindowPopupRequest, ((KviWindow*) m_pClient)); }
void KviWindow::contextPopup() { KVS_TRIGGER_EVENT_0(KviEvent_OnWindowPopupRequest, this); }
void KviIrcContext::terminateConnectionRequest(bool bForce, const QString & szQuitMsg, bool bSimulateUnexpectedDisconnect) { if(!connection()) return; // hm ? connection()->stateData()->setSimulateUnexpectedDisconnect(bSimulateUnexpectedDisconnect); switch(m_eState) { case Connected: { // was connected : send a quit and abort the connection bool bQuitSentJustNow = false; if(!connection()->stateData()->sentQuit()) { KVS_TRIGGER_EVENT_0(KviEvent_OnDisconnectRequest, m_pConsole); QString szQuit = szQuitMsg; if(szQuit.isEmpty()) szQuit = KVI_OPTION_STRING(KviOption_stringQuitMessage); KviQString::escapeKvs(&szQuit, KviQString::PermitVariables | KviQString::PermitFunctions); QString buffer; KviKvsVariant ret; if(KviKvsScript::evaluate(szQuit, console(), nullptr, &ret)) ret.asString(buffer); else buffer = szQuit; QByteArray dat = connection()->encodeText(buffer); connection()->stateData()->setSentQuit(); connection()->sendFmtData("QUIT :%s", dat.data() ? dat.data() : ""); // here theoretically we COULD get disconnected bQuitSentJustNow = true; } // else it was already sent anyway if(KVI_OPTION_BOOL(KviOption_boolForceBrutalQuit) || bForce || (!bQuitSentJustNow)) { if(!bQuitSentJustNow) { // idle for some milliseconds in order to allow the quit message to reach // the remote end without breaking the connection KviThread::msleep(100); } // and brutally abort the connection (if it still exists!!!) if(connection()) connection()->abort(); } else { if(bQuitSentJustNow) m_pConsole->outputNoFmt(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Sent QUIT, waiting for the server to close the connection...")); } } break; case PendingReconnection: case Connecting: case LoggingIn: // was waiting for connection or login, just abort it: it will trigger an error anyway // though act as if we sent the quit message, so we'll not treat the disconnection as "unexpected". connection()->stateData()->setSentQuit(); connection()->abort(); break; default: // should never end here! KVI_ASSERT(false); break; } }
void KviMainWindow::closeWindow(KviWindow * wnd) { if(wnd->inherits("KviConsoleWindow")) { if(consoleCount() <= 1) { KVS_TRIGGER_EVENT_0(KviEvent_OnFrameWindowDestroyed, wnd); KVS_TRIGGER_EVENT_0(KviEvent_OnKVIrcShutdown, wnd); } } // notify the destruction wnd->triggerDestructionEvents(); // save it's properties if(KVI_OPTION_BOOL(KviOption_boolWindowsRememberProperties)) // && (wnd->type() == KviWindow::Channel)) { QString group; wnd->getConfigGroupName(group); // not uses default settings : store it always saveWindowProperties(wnd, group); } // forget it... m_pWinList->removeRef(wnd); #if 0 // hide it if(wnd->parentWidget()) wnd->mdiParent()->hide(); else wnd->hide(); #endif if(wnd == g_pActiveWindow) { if(!g_pApp->kviClosingDown()) { qDebug("Have no active window: trying to pick one"); // this happens when there are only minimized windows in the Mdi area // just pick another window to be the active one bool bGotIt = false; for(KviWindow * pOther = m_pWinList->first(); pOther; pOther = m_pWinList->next()) { if(wnd != pOther) { windowActivated(pOther); bGotIt = true; break; } } if(!bGotIt) { // :/ g_pActiveWindow = nullptr; m_pActiveContext = nullptr; } } else { g_pActiveWindow = nullptr; m_pActiveContext = nullptr; } } // and shut it down... // KviWindow will call childWindowDestroyed() here if(wnd->isDocked()) { //this deletes the wnd, too m_pWindowStack->destroyWindow(wnd); } else { delete wnd; } }
void KviQueryWindow::textViewRightClicked() { KVS_TRIGGER_EVENT_0(KviEvent_OnQueryPopupRequest, this); }
void KviQueryWindow::triggerCreationEvents() { KVS_TRIGGER_EVENT_0(KviEvent_OnQueryWindowCreated, this); }
void KviIrcView::triggerMouseRelatedKvsEvents(QMouseEvent *e) { QString linkCmd; QString linkText; getLinkUnderMouse(e->pos().x(),e->pos().y(),0,&linkCmd,&linkText); QString szCmd(linkCmd); szCmd.remove(0,1); KviKvsVariantList * pParams = new KviKvsVariantList(); if(!szCmd.isEmpty()) pParams->append(szCmd); // <-- FIXME: why we do this ? else pParams->append(linkText); // <-- FIXME: why we do this ? pParams->append(linkText); pParams->append(szCmd); if(!(e->modifiers() & Qt::ControlModifier))//(e->button() & Qt::RightButton) && ( { if(!linkCmd.isEmpty()) { switch(linkCmd[0].unicode()) { case 'n': { bool bTrigger = false; switch(m_pKviWindow->type()) { case KviWindow::Channel: if(((KviChannelWindow *)m_pKviWindow)->isOn(linkText)) { if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnChannelNickPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) { KVS_TRIGGER_EVENT(KviEvent_OnChannelNickLinkClick,m_pKviWindow,pParams); } } else bTrigger = true; break; case KviWindow::Query: if(KviQString::equalCI(((KviQueryWindow *)m_pKviWindow)->windowName(),linkText)) { if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnQueryNickPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) KVS_TRIGGER_EVENT(KviEvent_OnQueryNickLinkClick,m_pKviWindow,pParams); } else bTrigger = true; break; default: bTrigger = true; break; } if(bTrigger) { if(console()) { if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnNickLinkPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) KVS_TRIGGER_EVENT(KviEvent_OnConsoleNickLinkClick,m_pKviWindow,pParams); } else emit rightClicked(); } } break; case 'h': if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnHostLinkPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) KVS_TRIGGER_EVENT(KviEvent_OnHostLinkClick,m_pKviWindow,pParams); break; case 'u': if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnURLLinkPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton && KVI_OPTION_UINT(KviOption_uintUrlMouseClickNum) == 1) KVS_TRIGGER_EVENT(KviEvent_OnURLLinkClick,m_pKviWindow,pParams); break; case 'c': if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnChannelLinkPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) KVS_TRIGGER_EVENT(KviEvent_OnChannelLinkClick,m_pKviWindow,pParams); break; case 's': if(e->button() & Qt::RightButton) KVS_TRIGGER_EVENT(KviEvent_OnServerLinkPopupRequest,m_pKviWindow,pParams); if(e->button() & Qt::LeftButton) KVS_TRIGGER_EVENT(KviEvent_OnServerLinkClick,m_pKviWindow,pParams); break; default: { if(e->button() & Qt::RightButton) { QString tmp; getLinkEscapeCommand(tmp,linkCmd,"[!rbt]"); if(!tmp.isEmpty()) { KviKvsScript::run(tmp,m_pKviWindow,pParams); } else emit rightClicked(); } } break; } } else if(e->button() & Qt::RightButton) emit rightClicked(); } else if((e->button() & Qt::MidButton) || ((e->button() & Qt::RightButton) && (e->modifiers() & Qt::ControlModifier))) { QString tmp; getLinkEscapeCommand(tmp,linkCmd,QString("[!mbt]")); if(!tmp.isEmpty()) { KviKvsScript::run(tmp,m_pKviWindow,pParams); } else { KVS_TRIGGER_EVENT_0(KviEvent_OnWindowPopupRequest,m_pKviWindow); } } delete pParams; }
//mouse events void KviIrcView::mouseDoubleClickEvent(QMouseEvent *e) { QString szKvsCommand; QString szLinkCommandPart; QString szLinkTextPart; if(m_iMouseTimer) { killTimer(m_iMouseTimer); m_iMouseTimer=0; delete m_pLastEvent; m_pLastEvent = 0; } getLinkUnderMouse(e->pos().x(),e->pos().y(),0,&szLinkCommandPart,&szLinkTextPart); if(szLinkCommandPart.isEmpty()) { KVS_TRIGGER_EVENT_0(KviEvent_OnTextViewDoubleClicked,m_pKviWindow); return; } KviKvsVariantList lParams; lParams.append(szLinkTextPart); switch(szLinkCommandPart[0].unicode()) { case 'n': { switch(m_pKviWindow->type()) { case KviWindow::Channel: if(((KviChannelWindow *)m_pKviWindow)->isOn(szLinkTextPart)) { KVS_TRIGGER_EVENT(KviEvent_OnChannelNickDefaultActionRequest,m_pKviWindow,&lParams); return; } break; case KviWindow::Query: if(KviQString::equalCI(((KviQueryWindow *)m_pKviWindow)->windowName(),szLinkTextPart)) { KVS_TRIGGER_EVENT(KviEvent_OnQueryNickDefaultActionRequest,m_pKviWindow,&lParams); return; } break; default: return; // unhandled window type (FIXME: Let it go anyway ?) break; } if(console()) KVS_TRIGGER_EVENT(KviEvent_OnNickLinkDefaultActionRequest,m_pKviWindow,&lParams); return; } break; case 'm': // m+X[ param] / m-X[ param] (used to quickly undo mode changes) { // Syntax is // m<plus_or_minus><mode_char>[ <parameter>] if(szLinkCommandPart.length() < 3) return; // malformed if(m_pKviWindow->type() != KviWindow::Channel) return; // must be on a channel to apply it if(!(((KviChannelWindow *)m_pKviWindow)->isMeOp())) return; // i'm not op, can't do mode changes QString szPart = szLinkCommandPart.mid(1); szKvsCommand = QString("mode $chan.name %1").arg(szPart); } break; case 'h': m_pKviWindow->output(KVI_OUT_HOSTLOOKUP,__tr2qs("Looking up host %Q..."),&szLinkTextPart); szKvsCommand = "host -a $0"; break; case 'u': if(KVI_OPTION_UINT(KviOption_uintUrlMouseClickNum) == 2) // <-- ?????????? { KVS_TRIGGER_EVENT(KviEvent_OnURLLinkClick,m_pKviWindow,&lParams); return; } break; case 'c': { if(!console()) return; if(!console()->connection()) return; // If there is a channel after the c flag, join that instead (as the text part may contain control codes) if(szLinkCommandPart.length() > 1) szLinkTextPart = szLinkCommandPart.mid(1); if(KviChannelWindow * c = console()->connection()->findChannel(szLinkTextPart)) { // already there g_pMainWindow->setActiveWindow(c); return; } szKvsCommand = "join $0"; } break; case 's': szKvsCommand = "motd $0"; break; default: { // extract the user-supplied double click command getLinkEscapeCommand(szKvsCommand,szLinkCommandPart,"[!dbl]"); if(szKvsCommand.isEmpty()) { KVS_TRIGGER_EVENT_0(KviEvent_OnTextViewDoubleClicked,m_pKviWindow); return; } } break; } if(!szKvsCommand.isEmpty()) KviKvsScript::run(szKvsCommand,m_pKviWindow,&lParams); }