1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/src/widget/loginscreen.h
tux3 c75ee8a661
fix: Various IPC event handling and related bugs on startup
Fixes #1926 : When an IPC event was processed locally, if the window was closed before the core could start, the event handler would be forever stuck in the background waiting for the core to start. We fix this by substituting QApplication::quit() by a Nexus::quit() function and a Nexus::isRunning() function, which gives us a condition for exiting blocking processEvents() loops. We cannot simply use QApplication::quit(), because this function has no effect before the start of the event loop.

The problem was further exacerbated by the Tox URI event handler being (incorrectly) blocking. The IPC owner would block in this event handler, and the sender of the event would give up waiting and process the event itself a second time, potentially triggering the first bug. We fix the event handlers accordingly to be (mostly) non-blocking.

Also fixes a related deadlock between ~Core and ~Profile in the case of an early exit
2017-02-17 17:18:52 +01:00

74 lines
1.8 KiB
C++

/*
Copyright © 2015 by The qTox Project Contributors
This file is part of qTox, a Qt-based graphical interface for Tox.
qTox is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
qTox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qTox. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LOGINSCREEN_H
#define LOGINSCREEN_H
#include <QWidget>
#include <QShortcut>
#include <QToolButton>
namespace Ui {
class LoginScreen;
}
class LoginScreen : public QWidget
{
Q_OBJECT
public:
explicit LoginScreen(QWidget* parent = 0);
~LoginScreen();
void reset();
bool event(QEvent* event) final override;
signals:
void windowStateChanged(Qt::WindowStates states);
void closed();
protected:
virtual void closeEvent(QCloseEvent *event) final override;
private slots:
void onAutoLoginToggled(int state);
void onLoginUsernameSelected(const QString& name);
void onPasswordEdited();
// Buttons to change page
void onNewProfilePageClicked();
void onLoginPageClicked();
// Buttons to submit form
void onCreateNewProfile();
void onLogin();
void onImportProfile();
private:
void retranslateUi();
void showCapsIndicator();
void hideCapsIndicator();
void checkCapsLock();
private:
Ui::LoginScreen *ui;
QShortcut quitShortcut;
};
#endif // LOGINSCREEN_H