Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Switch to GitLab Next
Sign in / Register
Toggle navigation
Open sidebar
LordTermor
Pamac tray icon for plasma
Commits
a99d0983
Commit
a99d0983
authored
Aug 25, 2020
by
LordTermor
Browse files
Added run guard to prevent tray from opening multiple instances
parent
7ad01642
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
120 additions
and
0 deletions
+120
-0
CMakeLists.txt
CMakeLists.txt
+2
-0
main.cpp
main.cpp
+6
-0
run_guard.cpp
run_guard.cpp
+80
-0
run_guard.h
run_guard.h
+32
-0
No files found.
CMakeLists.txt
View file @
a99d0983
...
...
@@ -23,6 +23,8 @@ add_executable(pamac-tray-plasma
main.cpp
pamac_tray.cpp
pamac_tray.h
run_guard.cpp
run_guard.h
)
target_include_directories
(
pamac-tray-plasma PUBLIC
${
DEPS_INCLUDE_DIRS
}
)
...
...
main.cpp
View file @
a99d0983
#include <QApplication>
#include <libnotify/notify.h>
#include <pamac_tray.h>
#include <run_guard.h>
int
main
(
int
argc
,
char
*
argv
[])
{
RunGuard
guard
(
"org.manjaro.pamac.tray-plasma"
);
if
(
!
guard
.
tryToRun
()){
return
0
;
}
QApplication
a
(
argc
,
argv
);
notify_init
(
"Package Manager"
);
...
...
run_guard.cpp
0 → 100644
View file @
a99d0983
#include "run_guard.h"
#include <QCryptographicHash>
namespace
{
QString
generateKeyHash
(
const
QString
&
key
,
const
QString
&
salt
)
{
QByteArray
data
;
data
.
append
(
key
.
toUtf8
()
);
data
.
append
(
salt
.
toUtf8
()
);
data
=
QCryptographicHash
::
hash
(
data
,
QCryptographicHash
::
Sha1
).
toHex
();
return
data
;
}
}
RunGuard
::
RunGuard
(
const
QString
&
key
)
:
key
(
key
)
,
memLockKey
(
generateKeyHash
(
key
,
"_memLockKey"
)
)
,
sharedmemKey
(
generateKeyHash
(
key
,
"_sharedmemKey"
)
)
,
sharedMem
(
sharedmemKey
)
,
memLock
(
memLockKey
,
1
)
{
memLock
.
acquire
();
{
QSharedMemory
fix
(
sharedmemKey
);
// Fix for *nix: http://habrahabr.ru/post/173281/
fix
.
attach
();
}
memLock
.
release
();
}
RunGuard
::~
RunGuard
()
{
release
();
}
bool
RunGuard
::
isAnotherRunning
()
{
if
(
sharedMem
.
isAttached
()
)
return
false
;
memLock
.
acquire
();
const
bool
isRunning
=
sharedMem
.
attach
();
if
(
isRunning
)
sharedMem
.
detach
();
memLock
.
release
();
return
isRunning
;
}
bool
RunGuard
::
tryToRun
()
{
if
(
isAnotherRunning
()
)
// Extra check
return
false
;
memLock
.
acquire
();
const
bool
result
=
sharedMem
.
create
(
sizeof
(
quint64
)
);
memLock
.
release
();
if
(
!
result
)
{
release
();
return
false
;
}
return
true
;
}
void
RunGuard
::
release
()
{
memLock
.
acquire
();
if
(
sharedMem
.
isAttached
()
)
sharedMem
.
detach
();
memLock
.
release
();
}
run_guard.h
0 → 100644
View file @
a99d0983
#ifndef RUNGUARD_H
#define RUNGUARD_H
#include <QObject>
#include <QSharedMemory>
#include <QSystemSemaphore>
class
RunGuard
{
public:
RunGuard
(
const
QString
&
key
);
~
RunGuard
();
bool
isAnotherRunning
();
bool
tryToRun
();
void
release
();
private:
const
QString
key
;
const
QString
memLockKey
;
const
QString
sharedmemKey
;
QSharedMemory
sharedMem
;
QSystemSemaphore
memLock
;
Q_DISABLE_COPY
(
RunGuard
)
};
#endif // RUNGUARD_H
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment