Imported /gui/ from mercurial.
This commit is contained in:
parent
6a86d3a1e4
commit
81227b8fab
|
@ -0,0 +1,283 @@
|
||||||
|
QSynergy is free software and published under the following
|
||||||
|
license:
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
|
@ -0,0 +1,45 @@
|
||||||
|
QSynergy for Unix build instructions
|
||||||
|
====================================
|
||||||
|
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
-------------
|
||||||
|
Qt 4.3 or newer. QSynergy can not be built or used with earlier versions. Get
|
||||||
|
it from http://trolltech.com/downloads/opensource
|
||||||
|
|
||||||
|
If you install from your distributions's package repository, don't forget to
|
||||||
|
install the development packages as well.
|
||||||
|
|
||||||
|
|
||||||
|
Compilation:
|
||||||
|
------------
|
||||||
|
1. Unpack the sources to a directory.
|
||||||
|
|
||||||
|
2. Run qmake for your Qt4 installtion in that directory (make sure you do not
|
||||||
|
accidentally run the Qt3-qmake if your Linux distribution installs both, like
|
||||||
|
Ubuntu seems to do). See the qmake documentation for available command line
|
||||||
|
options. You might want to enable a release build by passing CONFIG="-debug
|
||||||
|
+release" to qmake.
|
||||||
|
|
||||||
|
3. qmake will have generated a Makefile now, so just run make in that directory
|
||||||
|
and wait for the build to finish.
|
||||||
|
|
||||||
|
|
||||||
|
Installation:
|
||||||
|
-------------
|
||||||
|
There is no installation required. Just copy the qsynergy binary to somewhere
|
||||||
|
in your path. The binary does not depend on any other files.
|
||||||
|
|
||||||
|
|
||||||
|
Building a Debian package
|
||||||
|
-------------------------
|
||||||
|
The source tarball comes with a fully configured debian subdir, so it's easy to
|
||||||
|
build a Debian package. A script is available in the dist subdir, deb.sh, that
|
||||||
|
will do this automatically. Just run this script. If you have all the tools and
|
||||||
|
helper programs installed to build a Debian package, you should get a package
|
||||||
|
for your platform in tmp/debian.
|
||||||
|
|
||||||
|
Please contact QSynergy's author to contribute your newly built package for
|
||||||
|
download on the QSynergy website: vl@fidra.de
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
QSynergy
|
||||||
|
========
|
||||||
|
|
||||||
|
Version 0.9.0
|
||||||
|
http://www.volker-lanz.de/en/software/qsynergy/
|
||||||
|
|
||||||
|
|
||||||
|
About QSynergy
|
||||||
|
--------------
|
||||||
|
QSynergy is a graphical front end for Synergy. Synergy lets a user control more
|
||||||
|
than one computer with a single mouse and keyboard (and has lots and lots of
|
||||||
|
extra features on top of that). Learn more about Synergy itself or get it from:
|
||||||
|
http://synergy2.sourceforge.net
|
||||||
|
|
||||||
|
Synergy only has a GUI for MS Windows. QSynergy was written to step in and fill
|
||||||
|
this gap for users on Mac and Unix platforms. Of course, QSynergy can also be
|
||||||
|
used on MS Windows.
|
||||||
|
|
||||||
|
|
||||||
|
Running and using QSynergy
|
||||||
|
--------------------------
|
||||||
|
- Because QSynergy is a graphical frontend for Synergy, it does not make much
|
||||||
|
sense to run it without having Synergy installed. So if you have not done so
|
||||||
|
already, get it from http://synergy2.sourceforge.net and install it.
|
||||||
|
|
||||||
|
- See the Synergy documentation (http://synergy2.sourceforge.net/) for all
|
||||||
|
topics concerning what you can do with Synergy.
|
||||||
|
|
||||||
|
- In QSynergy, first, go to Edit -> Settings and check if the path names for
|
||||||
|
synergys (the Synergy server binary) and synergyc (the client) are correct.
|
||||||
|
If they are not, set them by hand or browse to their locations.
|
||||||
|
|
||||||
|
- QSynergy knows three modes:
|
||||||
|
|
||||||
|
1. Run Synergy as a client (so the computer QSynergy runs on will be
|
||||||
|
controlled from another computer).
|
||||||
|
|
||||||
|
2. Run Synergy as a server with an existing configuration you have written
|
||||||
|
already (that's just like running Synergy from the command line with the "-c"
|
||||||
|
option).
|
||||||
|
|
||||||
|
3. Interactively and graphically create a server configuration and run
|
||||||
|
Synergy with this configuration. Herein lies the main benefit of using
|
||||||
|
QSynergy instead of the command line Synergy version for Unix and Mac.
|
||||||
|
|
||||||
|
- Running as a client: Simply tick the "be a client" checkbox, enter the name
|
||||||
|
of the computer to connect to and push the "Start" button.
|
||||||
|
|
||||||
|
- Running as a server with an existing configuration: Tick the "be a server"
|
||||||
|
checkbox and the radio button that says you would like to use your own
|
||||||
|
configuration file. Then enter the path to this configuration file (or browse
|
||||||
|
for it). Finally, push the "Start" button.
|
||||||
|
|
||||||
|
- Using QSynergy to configure the Synergy server: Tick the "be a server"
|
||||||
|
checkbox and the radio button that says you would like to interactively
|
||||||
|
configure Synergy. Then push the "Configure server" button. After you have
|
||||||
|
finished setting up your configuration, push the "Start" button. QSynergy
|
||||||
|
will remember your configuration across restarts, so there is no need to
|
||||||
|
configure again the next time you run QSynergy -- unless you change your
|
||||||
|
computer setup, of course.
|
||||||
|
|
||||||
|
- On MS Windows and X11, QSynergy will minimize to the tray if you close the
|
||||||
|
main window or pick the Window -> Minimize menu entry. Double click on the
|
||||||
|
icon in the tray or right click on this icon and pick Restore to restore the
|
||||||
|
window.
|
||||||
|
|
||||||
|
- On X11, QSynergy will be restarted with X11 if your X11 server correctly
|
||||||
|
implements session handling. On MS Windows, you will have to add QSynergy to
|
||||||
|
your Autostart folder. On the Mac, set it to automatically run when the
|
||||||
|
Finder starts.
|
||||||
|
|
||||||
|
|
||||||
|
Known bugs and limitations
|
||||||
|
--------------------------
|
||||||
|
- It is not possible to configure partial links (e.g., only 50% of a screen's
|
||||||
|
edge linking to another screen)
|
||||||
|
|
||||||
|
- If you configure a hotkey for a specific screen and later delete this screen,
|
||||||
|
QSynergy does not warn you that this will lead to an invalid configuration.
|
||||||
|
|
||||||
|
- Importing existing synery server configuration files is not possible.
|
||||||
|
|
||||||
|
- There is no true communication channel between Synergy itself and QSynergy.
|
||||||
|
This means that QSynergy cannot really know if Synergy itself is working or
|
||||||
|
has encountered any problems. QSynergy only knows "Synergy is running" or
|
||||||
|
"Synergy has quit with an error".
|
||||||
|
|
||||||
|
- Mac OS X only: The look and feel of QSynergy is not quite right for the
|
||||||
|
platform. This is due to limitations in Qt.
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
QSynergy is written using the Qt Toolkit. It is free software released under
|
||||||
|
the GPLv2.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Make sure to adjust the QTDIR variable to where you have Qt's libraries installed.
|
||||||
|
# install_name_tool will _silently_ fail if the path is incorrect. Also, it will
|
||||||
|
# _not_ normalize double slashes.
|
||||||
|
APPNAME=QSynergy
|
||||||
|
QTDIR=$HOME/sw/qt/lib
|
||||||
|
TMPBUNDLE=tmpbundledir
|
||||||
|
PLATFORMS="ppc x86"
|
||||||
|
|
||||||
|
cd $(dirname $0)/..
|
||||||
|
|
||||||
|
rm -rf ${APPNAME}.app
|
||||||
|
make distclean
|
||||||
|
qmake -spec macx-g++ "CONFIG+=release" "CONFIG-=debug" "CONFIG+=${PLATFORMS}" "QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.4u.sdk"
|
||||||
|
make
|
||||||
|
mkdir ${APPNAME}.app/Contents/Frameworks
|
||||||
|
|
||||||
|
cp -R ${QTDIR}/QtCore.framework ${APPNAME}.app/Contents/Frameworks
|
||||||
|
cp -R ${QTDIR}/QtGui.framework ${APPNAME}.app/Contents/Frameworks
|
||||||
|
cp -R ${QTDIR}/QtNetwork.framework ${APPNAME}.app/Contents/Frameworks
|
||||||
|
|
||||||
|
rm -rf ${APPNAME}.app/Contents/Frameworks/Qt*.framework/Versions/4/Qt*_debug
|
||||||
|
rm -rf ${APPNAME}.app/Contents/Frameworks/Qt*.framework/Versions/4/Headers
|
||||||
|
|
||||||
|
install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ${APPNAME}.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
|
||||||
|
install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui ${APPNAME}.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui
|
||||||
|
install_name_tool -id @executable_path/../Frameworks/QtNetwork.framework/Versions/4/QtNetwork ${APPNAME}.app/Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork
|
||||||
|
|
||||||
|
install_name_tool -change ${QTDIR}/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ${APPNAME}.app/Contents/MacOs/$APPNAME
|
||||||
|
install_name_tool -change ${QTDIR}/QtGui.framework/Versions/4/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui ${APPNAME}.app/Contents/MacOs/$APPNAME
|
||||||
|
install_name_tool -change ${QTDIR}/QtNetwork.framework/Versions/4/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/4/QtNetwork ${APPNAME}.app/Contents/MacOs/$APPNAME
|
||||||
|
|
||||||
|
install_name_tool -change ${QTDIR}/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ${APPNAME}.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui
|
||||||
|
install_name_tool -change ${QTDIR}/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ${APPNAME}.app/Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork
|
||||||
|
|
||||||
|
mkdir ${TMPBUNDLE}
|
||||||
|
mv ${APPNAME}.app ${TMPBUNDLE}
|
||||||
|
cp COPYING README ${TMPBUNDLE}
|
||||||
|
hdiutil create -ov -srcfolder ${TMPBUNDLE} -format UDBZ -volname "$APPNAME" "${APPNAME}.dmg"
|
||||||
|
hdiutil internet-enable -yes "${APPNAME}.dmg"
|
||||||
|
mv ${TMPBUNDLE}/${APPNAME}.app .
|
||||||
|
rm -rf ${TMPBUNDLE}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd $(dirname $0)/..
|
||||||
|
|
||||||
|
dist/tarball.sh
|
||||||
|
|
||||||
|
rm -rf tmp/debian
|
||||||
|
mkdir tmp/debian
|
||||||
|
cd tmp/debian
|
||||||
|
tar xfz ../../qsynergy*.tar.gz
|
||||||
|
cd qsynergy*
|
||||||
|
ln -s dist/debian debian
|
||||||
|
dpkg-buildpackage -sgpg -rfakeroot
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
qsynergy (0.9.0-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Initial release.
|
||||||
|
|
||||||
|
-- Volker Lanz <vl@fidra.de> Fri, 27 Jun 2008 17:08:49 +0200
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
5
|
|
@ -0,0 +1,16 @@
|
||||||
|
Source: qsynergy
|
||||||
|
Section: net
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Volker Lanz <vl@fidra.de>
|
||||||
|
Build-Depends: debhelper (>= 5), qt4-dev-tools (>= 4.3.0), libqt4-dev (>= 4.3.0)
|
||||||
|
Standards-Version: 3.7.2
|
||||||
|
|
||||||
|
Package: qsynergy
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, synergy (>= 1.3.1)
|
||||||
|
Description: A comprehensive and easy to use graphical front end for synergy.
|
||||||
|
QSynergy is a comprehensive and easy to use graphical front end for synergy.
|
||||||
|
It allows you to configure synergy as a client or server and gives you
|
||||||
|
complete and painless access to all of synergy's options. Visit
|
||||||
|
http://www.volker-lanz.de/en/software/qsynergy/ for more information about
|
||||||
|
this program.
|
|
@ -0,0 +1,20 @@
|
||||||
|
This package was debianized by Volker Lanz <vl@fidra.de> on
|
||||||
|
Fri, 27 Jun 2008 17:08:49 +0200.
|
||||||
|
|
||||||
|
It was downloaded from http://www.volker-lanz.de/en/software/qsynergy/
|
||||||
|
|
||||||
|
Upstream Author: Volker Lanz <vl@fidra.de>
|
||||||
|
|
||||||
|
Copyright: Copyright (C) 2008 Volker Lanz, Fidra Software Entwicklung.
|
||||||
|
|
||||||
|
License:
|
||||||
|
|
||||||
|
This software is copyright (c) 2008 Volker Lanz, Fidra Software Entwicklung.
|
||||||
|
|
||||||
|
You are free to distribute this software under the terms of the GNU General
|
||||||
|
Public License version 2. On Debian systems, the complete text of the GNU
|
||||||
|
General Public License can be found in the file
|
||||||
|
`/usr/share/common-licenses/GPL-2'.
|
||||||
|
|
||||||
|
The Debian packaging is (C) 2008, Volker Lanz <vl@fidra.de> and is licensed
|
||||||
|
under the GPL, see `/usr/share/common-licenses/GPL'.
|
|
@ -0,0 +1,3 @@
|
||||||
|
usr/bin
|
||||||
|
usr/share/pixmaps
|
||||||
|
usr/share/applications
|
|
@ -0,0 +1 @@
|
||||||
|
README
|
|
@ -0,0 +1,2 @@
|
||||||
|
debian/qsynergy.desktop usr/share/applications
|
||||||
|
dist/qsynergy.xpm usr/share/pixmaps
|
|
@ -0,0 +1,4 @@
|
||||||
|
?package(qsynergy):needs="X11" section="Applications/System/Administration" \
|
||||||
|
title="QSynergy" command="/usr/bin/qsynergy" \
|
||||||
|
longtitle="Graphical interface to configure and run Synergy" \
|
||||||
|
icon="/usr/share/pixmaps/qsynergy.xpm"
|
|
@ -0,0 +1,9 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Name=QSynergy
|
||||||
|
Comment=A graphical user interface for synergy.
|
||||||
|
Exec=qsynergy
|
||||||
|
Icon=qsynergy
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Categories=Utility
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
# export DH_VERBOSE=1
|
||||||
|
|
||||||
|
configure: configure-stamp
|
||||||
|
|
||||||
|
configure-stamp:
|
||||||
|
dh_testdir
|
||||||
|
-$(MAKE) distclean
|
||||||
|
qmake-qt4 CONFIG-="debug" CONFIG+="release" DESTDIR=$(CURDIR)/debian/qsynergy/usr/bin/
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
build: build-stamp
|
||||||
|
|
||||||
|
build-stamp: configure-stamp
|
||||||
|
dh_testdir
|
||||||
|
$(MAKE)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
rm -f build-stamp configure-stamp
|
||||||
|
qmake-qt4 CONFIG-="debug" CONFIG+="release"
|
||||||
|
$(MAKE) distclean
|
||||||
|
dh_clean
|
||||||
|
|
||||||
|
install: build
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_clean -k
|
||||||
|
dh_install
|
||||||
|
dh_installdirs
|
||||||
|
$(MAKE)
|
||||||
|
|
||||||
|
binary-indep: build install
|
||||||
|
binary-arch: build install
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_installchangelogs
|
||||||
|
dh_installdocs
|
||||||
|
dh_installmenu
|
||||||
|
dh_strip
|
||||||
|
dh_compress
|
||||||
|
dh_desktop
|
||||||
|
dh_fixperms
|
||||||
|
dh_installdeb
|
||||||
|
dh_shlibdeps
|
||||||
|
dh_gencontrol
|
||||||
|
dh_md5sums
|
||||||
|
dh_builddeb
|
||||||
|
|
||||||
|
binary: binary-indep binary-arch
|
||||||
|
.PHONY: build clean binary-indep binary-arch binary install configure
|
||||||
|
|
|
@ -0,0 +1,180 @@
|
||||||
|
!include "MUI.nsh"
|
||||||
|
|
||||||
|
!define MUI_ABORTWARNING
|
||||||
|
!define MUI_COMPONENTSPAGE_SMALLDESC
|
||||||
|
|
||||||
|
!define MUI_HEADERIMAGE
|
||||||
|
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
|
||||||
|
|
||||||
|
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
|
||||||
|
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
|
||||||
|
|
||||||
|
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
|
||||||
|
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
|
||||||
|
|
||||||
|
!define VERSION "0.9.0"
|
||||||
|
!define PRODUCT_VERSION "0.9.0.0"
|
||||||
|
|
||||||
|
Name "QSynergy ${VERSION}"
|
||||||
|
OutFile "qsynergy-${VERSION}-setup.exe"
|
||||||
|
InstallDir "$PROGRAMFILES\QSynergy\"
|
||||||
|
|
||||||
|
BrandingText " "
|
||||||
|
|
||||||
|
SetCompressor /FINAL bzip2
|
||||||
|
|
||||||
|
; Registry key to check for directory (so if you install again, it will
|
||||||
|
; overwrite the old one automatically)
|
||||||
|
InstallDirRegKey HKLM "Software\Fidra\QSynergy" "Install_Dir"
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Pages
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
|
!insertmacro MUI_PAGE_LICENSE "..\COPYING"
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_COMPONENTS
|
||||||
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
|
!insertmacro MUI_PAGE_FINISH
|
||||||
|
|
||||||
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
|
!insertmacro MUI_UNPAGE_FINISH
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Languages
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
|
|
||||||
|
LangString qsynergy ${LANG_ENGLISH} "QSynergy program files"
|
||||||
|
LangString DESC_qsynergy ${LANG_ENGLISH} "The program files required for QSynergy."
|
||||||
|
|
||||||
|
LangString qt_dlls ${LANG_ENGLISH} "Qt libraries QSynergy needs to run"
|
||||||
|
LangString DESC_qt_dlls ${LANG_ENGLISH} "If you have Qt 4.3 or newer installed, you don't need to install this."
|
||||||
|
|
||||||
|
LangString startmenu ${LANG_ENGLISH} "Start menu entry"
|
||||||
|
LangString DESC_startmenu ${LANG_ENGLISH} "Create a start menu entry for QSynergy."
|
||||||
|
|
||||||
|
LangString desktopicon ${LANG_ENGLISH} "Desktop icon"
|
||||||
|
LangString DESC_desktopicon ${LANG_ENGLISH} "Create an icon on the desktop for QSynergy."
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Environment PATH manipulation
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
; !include "path_manip.nsh"
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Version stuff
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
VIProductVersion "${PRODUCT_VERSION}"
|
||||||
|
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "QSynergy ${VERSION} Setup"
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "Installs QSynergy ${VERSION} on your computer."
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fidra Software Entwicklung, Volker Lanz"
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" ""
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "2008 Fidra Software Entwicklung, Volker Lanz"
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "QSynergy ${VERSION} Setup"
|
||||||
|
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${VERSION}"
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Callbacks
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
Function .onInit
|
||||||
|
!insertmacro MUI_LANGDLL_DISPLAY
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
Function un.onInit
|
||||||
|
!insertmacro MUI_LANGDLL_DISPLAY
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; The stuff to install
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
Section $(qsynergy) section_qsynergy
|
||||||
|
SectionIn RO
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
File "..\release\qsynergy.exe"
|
||||||
|
File "..\README"
|
||||||
|
File "..\COPYING"
|
||||||
|
|
||||||
|
; Write the installation path into the registry
|
||||||
|
WriteRegStr HKLM "Software\Fidra\QSynergy" "Install_Dir" "$INSTDIR"
|
||||||
|
|
||||||
|
; Write the uninstall keys for Windows
|
||||||
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QSynergy" "DisplayName" "QSynergy ${VERSION}"
|
||||||
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QSynergy" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||||
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QSynergy" "NoModify" 1
|
||||||
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QSynergy" "NoRepair" 1
|
||||||
|
WriteUninstaller "uninstall.exe"
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
Section $(qt_dlls) section_qt_dlls
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
File "..\..\..\..\sw\qt\lib\qtcore4.dll"
|
||||||
|
File "..\..\..\..\sw\qt\lib\qtgui4.dll"
|
||||||
|
File "..\..\..\..\sw\qt\lib\qtnetwork4.dll"
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
Section $(startmenu) section_startmenu
|
||||||
|
CreateDirectory "$SMPROGRAMS\QSynergy"
|
||||||
|
CreateShortCut "$SMPROGRAMS\QSynergy\QSynergy.lnk" "$INSTDIR\qsynergy.exe" "" "$INSTDIR\qsynergy.exe" 0
|
||||||
|
CreateShortCut "$SMPROGRAMS\QSynergy\README.lnk" "$INSTDIR\README" "" "$INSTDIR\README" 0
|
||||||
|
CreateShortCut "$SMPROGRAMS\QSynergy\COPYING.lnk" "$INSTDIR\COPYING" "" "$INSTDIR\COPYING" 0
|
||||||
|
CreateShortCut "$SMPROGRAMS\QSynergy\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
Section $(desktopicon) section_desktopicon
|
||||||
|
CreateShortCut "$DESKTOP\QSynergy.lnk" "$INSTDIR\qsynergy.exe" "" "$INSTDIR\qsynergy.exe" 0
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Uninstaller
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
Section "Uninstall"
|
||||||
|
; Remove registry keys
|
||||||
|
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QSynergy"
|
||||||
|
DeleteRegKey HKLM SOFTWARE\Fidra\QSynergy
|
||||||
|
|
||||||
|
; Remove files and uninstaller
|
||||||
|
Delete "$INSTDIR\uninstall.exe"
|
||||||
|
|
||||||
|
Delete "$INSTDIR\*.exe"
|
||||||
|
Delete "$INSTDIR\README"
|
||||||
|
Delete "$INSTDIR\COPYING"
|
||||||
|
Delete "$INSTDIR\*.dll"
|
||||||
|
|
||||||
|
; startmenu and desktop icon
|
||||||
|
Delete "$SMPROGRAMS\QSynergy\*.*"
|
||||||
|
Delete "$DESKTOP\QSynergy.lnk"
|
||||||
|
|
||||||
|
; Remove directories used
|
||||||
|
RMDir "$SMPROGRAMS\QSynergy"
|
||||||
|
RMDir "$INSTDIR"
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------
|
||||||
|
; Section descriptions
|
||||||
|
; ---------------------------
|
||||||
|
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${section_qsynergy} $(DESC_qsynergy)
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${section_qt_dlls} $(DESC_qt_dlls)
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${section_startmenu} $(DESC_startmenu)
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${section_desktopicon} $(DESC_desktopicon)
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *qsynergy[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"32 32 6 1",
|
||||||
|
" c #010000",
|
||||||
|
". c #336666",
|
||||||
|
"X c #3399CC",
|
||||||
|
"o c #6699FF",
|
||||||
|
"O c #99CC33",
|
||||||
|
"+ c None",
|
||||||
|
/* pixels */
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++oooo....++++++++++++",
|
||||||
|
"+++++++++ooooooo.......+++++++++",
|
||||||
|
"++++++++oooooooo........++++++++",
|
||||||
|
"++++++oooooooooo..........++++++",
|
||||||
|
"+++++ooooooooooo...........+++++",
|
||||||
|
"++++oooooooooooo............++++",
|
||||||
|
"++++oooooooooooo............++++",
|
||||||
|
"+++oooooooooo++++++..........+++",
|
||||||
|
"++ooooooooo++++++++++.........++",
|
||||||
|
"++oooooooo++++++++++++........++",
|
||||||
|
"++ooooooo++++++++++++++.......++",
|
||||||
|
"+oooooooo++++++++++++++........+",
|
||||||
|
"+ooooooo++++++++++++++++.......+",
|
||||||
|
"+ooooooo++++++++++++++++.......+",
|
||||||
|
"+ooooooo++++++++++++++++.......+",
|
||||||
|
"+OOOOOOO++++++++++++++++XXXXXXX+",
|
||||||
|
"+OOOOOOO++++++++++++++++XXXXXXX+",
|
||||||
|
"+OOOOOOO++++++++++++++++XXXXXXX+",
|
||||||
|
"+OOOOOOOO++++++++++++++XXXXXXXX+",
|
||||||
|
"++OOOOOOO++++++++++++++XXXXXXX++",
|
||||||
|
"++OOOOOOOO++++++++++++XXXXXXXX++",
|
||||||
|
"++OOOOOOOOO++++++++++XXXXXXXXX++",
|
||||||
|
"+++OOOOOOOOOO++++++XXXXXXXXXX+++",
|
||||||
|
"++++OOOOOOOOOOOOXXXXXXXXXXXX++++",
|
||||||
|
"++++OOOOOOOOOOOOXXXXXXXXXXXX++++",
|
||||||
|
"+++++OOOOOOOOOOOXXXXXXXXXXX+++++",
|
||||||
|
"++++++OOOOOOOOOOXXXXXXXXXX++++++",
|
||||||
|
"++++++++OOOOOOOOXXXXXXXX++++++++",
|
||||||
|
"+++++++++OOOOOOOXXXXXXX+++++++++",
|
||||||
|
"++++++++++++OOOOXXXX++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++"
|
||||||
|
};
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APPNAME=qsynergy
|
||||||
|
VERSION=0.9.0
|
||||||
|
TMPBASE=/tmp
|
||||||
|
TMPDIR=${TMPBASE}/${APPNAME}-${VERSION}
|
||||||
|
|
||||||
|
cd $(dirname $0)/..
|
||||||
|
[ -e Makefile ] && make distclean
|
||||||
|
mkdir -p ${TMPDIR}
|
||||||
|
cp -a src/ ${TMPDIR}
|
||||||
|
cp -a res/ ${TMPDIR}
|
||||||
|
cp -a dist/ ${TMPDIR}
|
||||||
|
cp qsynergy.pro COPYING INSTALL README ${TMPDIR}
|
||||||
|
tar cCfz ${TMPBASE} ${APPNAME}-${VERSION}.tar.gz --exclude=.svn ${APPNAME}-${VERSION}
|
||||||
|
rm -rf ${TMPDIR}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,85 @@
|
||||||
|
QT += network
|
||||||
|
|
||||||
|
TEMPLATE = app
|
||||||
|
TARGET = qsynergy
|
||||||
|
DEPENDPATH += . res
|
||||||
|
INCLUDEPATH += . src
|
||||||
|
|
||||||
|
FORMS += \
|
||||||
|
res/MainWindowBase.ui \
|
||||||
|
res/AboutDialogBase.ui \
|
||||||
|
res/ServerConfigDialogBase.ui \
|
||||||
|
res/ScreenSettingsDialogBase.ui \
|
||||||
|
res/ActionDialogBase.ui \
|
||||||
|
res/HotkeyDialogBase.ui \
|
||||||
|
res/SettingsDialogBase.ui \
|
||||||
|
res/LogDialogBase.ui
|
||||||
|
SOURCES += \
|
||||||
|
src/main.cpp \
|
||||||
|
src/MainWindow.cpp \
|
||||||
|
src/AboutDialog.cpp \
|
||||||
|
src/ServerConfig.cpp \
|
||||||
|
src/ServerConfigDialog.cpp \
|
||||||
|
src/ScreenSetupView.cpp \
|
||||||
|
src/Screen.cpp \
|
||||||
|
src/ScreenSetupModel.cpp \
|
||||||
|
src/NewScreenWidget.cpp \
|
||||||
|
src/TrashScreenWidget.cpp \
|
||||||
|
src/ScreenSettingsDialog.cpp \
|
||||||
|
src/BaseConfig.cpp \
|
||||||
|
src/HotkeyDialog.cpp \
|
||||||
|
src/ActionDialog.cpp \
|
||||||
|
src/Hotkey.cpp \
|
||||||
|
src/Action.cpp \
|
||||||
|
src/KeySequence.cpp \
|
||||||
|
src/KeySequenceWidget.cpp \
|
||||||
|
src/LogDialog.cpp \
|
||||||
|
src/SettingsDialog.cpp \
|
||||||
|
src/AppConfig.cpp \
|
||||||
|
src/QSynergyApplication.cpp
|
||||||
|
HEADERS += \
|
||||||
|
src/MainWindow.h \
|
||||||
|
src/AboutDialog.h \
|
||||||
|
src/ServerConfig.h \
|
||||||
|
src/ServerConfigDialog.h \
|
||||||
|
src/ScreenSetupView.h \
|
||||||
|
src/Screen.h \
|
||||||
|
src/ScreenSetupModel.h \
|
||||||
|
src/NewScreenWidget.h \
|
||||||
|
src/TrashScreenWidget.h \
|
||||||
|
src/ScreenSettingsDialog.h \
|
||||||
|
src/BaseConfig.h \
|
||||||
|
src/HotkeyDialog.h \
|
||||||
|
src/ActionDialog.h \
|
||||||
|
src/Hotkey.h \
|
||||||
|
src/Action.h \
|
||||||
|
src/KeySequence.h \
|
||||||
|
src/KeySequenceWidget.h \
|
||||||
|
src/LogDialog.h \
|
||||||
|
src/SettingsDialog.h \
|
||||||
|
src/AppConfig.h \
|
||||||
|
src/QSynergyApplication.h
|
||||||
|
RESOURCES += res/QSynergy.qrc
|
||||||
|
RC_FILE = res/win/QSynergy.rc
|
||||||
|
|
||||||
|
macx {
|
||||||
|
QMAKE_INFO_PLIST = res/mac/QSynergy.plist
|
||||||
|
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4
|
||||||
|
TARGET = QSynergy
|
||||||
|
QSYNERGY_ICON.files = res/mac/QSynergy.icns
|
||||||
|
QSYNERGY_ICON.path = Contents/Resources
|
||||||
|
QMAKE_BUNDLE_DATA += QSYNERGY_ICON
|
||||||
|
}
|
||||||
|
|
||||||
|
debug {
|
||||||
|
OBJECTS_DIR = tmp/debug
|
||||||
|
MOC_DIR = tmp/debug
|
||||||
|
RCC_DIR = tmp/debug
|
||||||
|
}
|
||||||
|
|
||||||
|
release {
|
||||||
|
OBJECTS_DIR = tmp/release
|
||||||
|
MOC_DIR = tmp/release
|
||||||
|
RCC_DIR = tmp/release
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>AboutDialogBase</class>
|
||||||
|
<widget class="QDialog" name="AboutDialogBase" >
|
||||||
|
<property name="windowModality" >
|
||||||
|
<enum>Qt::ApplicationModal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>368</width>
|
||||||
|
<height>350</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize" >
|
||||||
|
<size>
|
||||||
|
<width>368</width>
|
||||||
|
<height>350</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>About QSynergy</string>
|
||||||
|
</property>
|
||||||
|
<property name="modal" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="2" >
|
||||||
|
<widget class="QLabel" name="label_2" >
|
||||||
|
<property name="text" >
|
||||||
|
<string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
|
p, li { white-space: pre-wrap; }
|
||||||
|
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:x-large; font-weight:600;"><span style=" font-size:x-large;">QSynergy</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="openExternalLinks" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags" >
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::NoTextInteraction|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2" >
|
||||||
|
<widget class="QLabel" name="label_3" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Version 0.9.0
|
||||||
|
|
||||||
|
Copyright 2008 Volker Lanz (vl@fidra.de)
|
||||||
|
|
||||||
|
QSynergy is open source and released under the GNU Public License (GPL) Version 2.
|
||||||
|
|
||||||
|
Synergy and the synergy icon: Copyright (C) 2002 Chris Schoeneman.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2" >
|
||||||
|
<widget class="Line" name="line" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" colspan="2" >
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="label" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Synergy Version:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QLabel" name="m_pLabelSynergyVersion" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>-</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QLabel" name="label_6" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Hostname:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QLabel" name="m_pLabelHostname" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>-</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QLabel" name="label_8" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>IP-Address:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QLabel" name="m_pLabelIPAddress" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>-</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>78</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>131</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1" >
|
||||||
|
<widget class="QPushButton" name="buttonOk" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Ok</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonOk</sender>
|
||||||
|
<signal>clicked()</signal>
|
||||||
|
<receiver>AboutDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>315</x>
|
||||||
|
<y>374</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>301</x>
|
||||||
|
<y>3</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,580 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>ActionDialogBase</class>
|
||||||
|
<widget class="QDialog" name="ActionDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>372</width>
|
||||||
|
<height>484</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Configure action</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupType" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>Choose the action to perform</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioPress" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Press a hotkey</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioRelease" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Release a hotkey</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioPressAndRelease" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Press and release a hotkey</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="KeySequenceWidget" name="m_pKeySequenceWidgetHotkey" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize" >
|
||||||
|
<size>
|
||||||
|
<width>256</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>dfgsfgsdfgsdfgsd</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupBoxScreens" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>only on these screens</string>
|
||||||
|
</property>
|
||||||
|
<property name="flat" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checkable" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="m_pListScreens" >
|
||||||
|
<property name="minimumSize" >
|
||||||
|
<size>
|
||||||
|
<width>128</width>
|
||||||
|
<height>64</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode" >
|
||||||
|
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioSwitchToScreen" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Switch to screen</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="m_pComboSwitchToScreen" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioSwitchInDirection" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Switch in direction</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="m_pComboSwitchInDirection" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>left</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>right</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>up</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>down</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioLockCursorToScreen" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Lock cursor to screen</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="m_pComboLockCursorToScreen" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>toggle</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>on</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>off</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>This action is performed when</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioHotkeyPressed" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>the hotkey is pressed</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioHotkeyReleased" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>the hotkey is released</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons" >
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>KeySequenceWidget</class>
|
||||||
|
<extends>QLineEdit</extends>
|
||||||
|
<header>KeySequenceWidget.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>ActionDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>245</x>
|
||||||
|
<y>474</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ActionDialogBase</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>313</x>
|
||||||
|
<y>474</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pGroupType</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>104</x>
|
||||||
|
<y>194</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>132</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchInDirection</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>118</x>
|
||||||
|
<y>322</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>81</x>
|
||||||
|
<y>129</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioLockCursorToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>101</x>
|
||||||
|
<y>353</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>68</x>
|
||||||
|
<y>126</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioPress</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>48</x>
|
||||||
|
<y>48</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>45</x>
|
||||||
|
<y>129</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioRelease</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>135</x>
|
||||||
|
<y>70</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>148</x>
|
||||||
|
<y>125</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioPressAndRelease</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>194</x>
|
||||||
|
<y>100</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>201</x>
|
||||||
|
<y>125</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pComboSwitchToScreen</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>148</x>
|
||||||
|
<y>291</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>350</x>
|
||||||
|
<y>290</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchInDirection</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pComboSwitchInDirection</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>158</x>
|
||||||
|
<y>322</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>350</x>
|
||||||
|
<y>321</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioLockCursorToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pComboLockCursorToScreen</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>180</x>
|
||||||
|
<y>353</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>350</x>
|
||||||
|
<y>352</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioPress</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>25</x>
|
||||||
|
<y>47</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>33</x>
|
||||||
|
<y>155</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>48</x>
|
||||||
|
<y>278</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>98</x>
|
||||||
|
<y>153</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioRelease</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>264</x>
|
||||||
|
<y>67</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>241</x>
|
||||||
|
<y>158</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioPressAndRelease</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>286</x>
|
||||||
|
<y>98</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>290</x>
|
||||||
|
<y>156</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchInDirection</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>38</x>
|
||||||
|
<y>313</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>64</x>
|
||||||
|
<y>195</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioLockCursorToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pGroupBoxScreens</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>48</x>
|
||||||
|
<y>339</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>79</x>
|
||||||
|
<y>234</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioSwitchToScreen</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pKeySequenceWidgetHotkey</receiver>
|
||||||
|
<slot>setDisabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>84</x>
|
||||||
|
<y>280</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>185</x>
|
||||||
|
<y>123</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,81 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>HotkeyDialogBase</class>
|
||||||
|
<widget class="QDialog" name="HotkeyDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>344</width>
|
||||||
|
<height>106</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Hotkey</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Enter the specification for the hotkey:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="KeySequenceWidget" name="m_pKeySequenceWidgetHotkey" >
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons" >
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>KeySequenceWidget</class>
|
||||||
|
<extends>QPushButton</extends>
|
||||||
|
<header>KeySequenceWidget.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>HotkeyDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>HotkeyDialogBase</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,98 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>LogDialogBase</class>
|
||||||
|
<widget class="QDialog" name="LogDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>761</width>
|
||||||
|
<height>395</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Log Output</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="3" >
|
||||||
|
<widget class="QTextEdit" name="m_pLogOutput" >
|
||||||
|
<property name="font" >
|
||||||
|
<font>
|
||||||
|
<family>Courier</family>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="undoRedoEnabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="lineWrapMode" >
|
||||||
|
<enum>QTextEdit::NoWrap</enum>
|
||||||
|
</property>
|
||||||
|
<property name="readOnly" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonClearLog" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>C&lear</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>441</width>
|
||||||
|
<height>27</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" >
|
||||||
|
<widget class="QPushButton" name="pushButton" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Close</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonClearLog</sender>
|
||||||
|
<signal>clicked()</signal>
|
||||||
|
<receiver>m_pLogOutput</receiver>
|
||||||
|
<slot>clear()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>27</x>
|
||||||
|
<y>368</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>335</x>
|
||||||
|
<y>262</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>pushButton</sender>
|
||||||
|
<signal>clicked()</signal>
|
||||||
|
<receiver>LogDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>706</x>
|
||||||
|
<y>370</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>525</x>
|
||||||
|
<y>366</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,318 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>MainWindowBase</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindowBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>397</width>
|
||||||
|
<height>306</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>QSynergy</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget" >
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupClient" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>Control &this computer from another one (be a client)</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_2" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Name of the server:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditHostname</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditHostname" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupServer" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>Use this computer to control &others (be a server)</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioExternalConfig" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Start synergy with an &existing configuration</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="m_pLabel_4" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Configuration file:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditConfigFile</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditConfigFile" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="m_pButtonBrowseConfigFile" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Browse...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="m_pRadioInternalConfig" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Interactively configure synergy</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="m_pButtonConfigureServer" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Configure Server...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonStart" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Start</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<action name="m_pActionAbout" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&About QSynergy...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionQuit" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Quit</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Quit QSynergy.</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut" >
|
||||||
|
<string>Ctrl+Q</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionStartSynergy" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Start Synergy</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Run synergy program.</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut" >
|
||||||
|
<string>Ctrl+S</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionStopSynergy" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>S&top Synergy</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Stop Synergy program.</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut" >
|
||||||
|
<string>Ctrl+T</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionShowStatus" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>S&how Status</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut" >
|
||||||
|
<string>Ctrl+H</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionMinimize" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Minimize</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionRestore" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Restore</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionSave" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Save configuration &as...</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Save the interactively generated server configuration to a file.</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut" >
|
||||||
|
<string>Ctrl+Alt+S</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionSettings" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Settings</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Edit settings for QSynergy and synergy itself</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_pActionLogOutput" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Log output</string>
|
||||||
|
</property>
|
||||||
|
<property name="statusTip" >
|
||||||
|
<string>Open a window with synergy's output</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonStart</sender>
|
||||||
|
<signal>clicked()</signal>
|
||||||
|
<receiver>m_pActionStartSynergy</receiver>
|
||||||
|
<slot>trigger()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>361</x>
|
||||||
|
<y>404</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>-1</x>
|
||||||
|
<y>-1</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioInternalConfig</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pButtonConfigureServer</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>204</x>
|
||||||
|
<y>244</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>212</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioExternalConfig</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pLineEditConfigFile</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>156</x>
|
||||||
|
<y>179</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>169</x>
|
||||||
|
<y>209</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pRadioExternalConfig</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pButtonBrowseConfigFile</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>353</x>
|
||||||
|
<y>182</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>356</x>
|
||||||
|
<y>211</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE RCC>
|
||||||
|
|
||||||
|
<RCC version="1.0">
|
||||||
|
<qresource prefix="/res">
|
||||||
|
<file>icons/16x16/synergy-connected.png</file>
|
||||||
|
<file>icons/16x16/synergy-disconnected.png</file>
|
||||||
|
<file>icons/64x64/video-display.png</file>
|
||||||
|
<file>icons/64x64/user-trash.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
|
@ -0,0 +1,542 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>ScreenSettingsDialogBase</class>
|
||||||
|
<widget class="QDialog" name="ScreenSettingsDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>434</width>
|
||||||
|
<height>484</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Screen settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_7" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Screen &name:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditName</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditName" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupAliases" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title" >
|
||||||
|
<string>A&liases</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditAlias" />
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonAddAlias" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Add</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item rowspan="2" row="1" column="0" >
|
||||||
|
<widget class="QListWidget" name="m_pListAliases" >
|
||||||
|
<property name="selectionMode" >
|
||||||
|
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonRemoveAlias" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Remove</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>126</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupModifiers" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Modifier keys</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="label_2" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Shift:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboBoxShift</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboBoxShift" >
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Shift</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ctrl</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Alt</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Meta</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Super</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QLabel" name="label_3" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Ctrl:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboBoxCtrl</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboBoxCtrl" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Shift</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ctrl</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Alt</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Meta</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Super</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QLabel" name="label_4" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Al&t:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboBoxAlt</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboBoxAlt" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Shift</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ctrl</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Alt</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Meta</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Super</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" >
|
||||||
|
<widget class="QLabel" name="label_5" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>M&eta:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboBoxMeta</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboBoxMeta" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Shift</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ctrl</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Alt</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Meta</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Super</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" >
|
||||||
|
<widget class="QLabel" name="label_6" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>S&uper:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboBoxSuper</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboBoxSuper" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Shift</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ctrl</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Alt</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Meta</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Super</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupSwitchCorners" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Dead corners</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerTopLeft" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Top-left</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerTopRight" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Top-right</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerBottomLeft" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Bottom-left</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerBottomRight" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Bottom-right</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2" >
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Corner Si&ze:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pSpinBoxSwitchCornerSize</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxSwitchCornerSize" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="m_pGroupFixes" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Fixes</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCapsLock" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Fix CAPS LOCK key</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxNumLock" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Fix NUM LOCK key</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxScrollLock" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Fix SCROLL LOCK key</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxXTest" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Fix XTest for Xinerama</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="m_pButtonBox" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons" >
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>ScreenSettingsDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>222</x>
|
||||||
|
<y>502</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ScreenSettingsDialogBase</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>290</x>
|
||||||
|
<y>508</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,756 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>ServerConfigDialogBase</class>
|
||||||
|
<widget class="QDialog" name="ServerConfigDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>740</width>
|
||||||
|
<height>514</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Server Configuration</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="m_pTabWidget" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="m_pTabScreens" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>Screens and links</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="TrashScreenWidget" name="m_pTrashScreenWidget" >
|
||||||
|
<property name="acceptDrops" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip" >
|
||||||
|
<string>Drag a screen from the grid to the trashcan to remove it.</string>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape" >
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow" >
|
||||||
|
<enum>QFrame::Raised</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap" >
|
||||||
|
<pixmap resource="QSynergy.qrc" >:/res/icons/64x64/user-trash.png</pixmap>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Configure the layout of your synergy server configuration.</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="NewScreenWidget" name="m_pLabelNewScreenWidget" >
|
||||||
|
<property name="toolTip" >
|
||||||
|
<string>Drag this button to the grid to add a new screen.</string>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape" >
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow" >
|
||||||
|
<enum>QFrame::Raised</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap" >
|
||||||
|
<pixmap resource="QSynergy.qrc" >:/res/icons/64x64/video-display.png</pixmap>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="ScreenSetupView" name="m_pScreenSetupView" >
|
||||||
|
<property name="minimumSize" >
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>273</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize" >
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>273</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="acceptDrops" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape" >
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow" >
|
||||||
|
<enum>QFrame::Sunken</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_3" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Drag new screens to the grid or move existing ones around.
|
||||||
|
Drag a screen to the trashcan to delete it.
|
||||||
|
Double click on a screen to edit its settings.</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="m_pTabHotkeys" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>Hotkeys</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Hotkeys</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item rowspan="4" row="0" column="0" >
|
||||||
|
<widget class="QListWidget" name="m_pListHotkeys" />
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonNewHotkey" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&New</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonEditHotkey" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Edit</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonRemoveHotkey" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Remove</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>75</width>
|
||||||
|
<height>161</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>A&ctions</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item rowspan="4" row="0" column="0" >
|
||||||
|
<widget class="QListWidget" name="m_pListActions" />
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonNewAction" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Ne&w</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonEditAction" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>E&dit</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonRemoveAction" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Re&move</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="m_pTabAdvanced" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>Advanced server settings</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupSwitch" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Switch</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxSwitchDelay" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Switch &after waiting</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxSwitchDelay" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimum" >
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum" >
|
||||||
|
<number>10000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep" >
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="value" >
|
||||||
|
<number>250</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="m_pLabel_14" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>ms</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxSwitchDoubleTap" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Switch on double &tap within</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxSwitchDoubleTap" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimum" >
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum" >
|
||||||
|
<number>10000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep" >
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="value" >
|
||||||
|
<number>250</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="m_pLabel_15" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>ms</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupOptions" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Options</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxHeartbeat" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Check clients every</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxHeartbeat" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimum" >
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum" >
|
||||||
|
<number>30000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep" >
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
<property name="value" >
|
||||||
|
<number>5000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="m_pLabel_16" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>ms</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxRelativeMouseMoves" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Use &relative mouse moves</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxScreenSaverSync" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>S&ynchronize screen savers</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxWin32KeepForeground" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Don't take &foreground window on Windows servers</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupSwitchCorners" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Dead corners</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="2" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerTopLeft" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>To&p-left</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2" colspan="2" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerTopRight" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Top-rig&ht</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerBottomLeft" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Bottom-left</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" colspan="2" >
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxCornerBottomRight" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Bottom-ri&ght</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" colspan="2" >
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Cor&ner Size:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pSpinBoxSwitchCornerSize</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxSwitchCornerSize" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="3" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="m_pButtonBox" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons" >
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>ScreenSetupView</class>
|
||||||
|
<extends>QTableView</extends>
|
||||||
|
<header>ScreenSetupView.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>NewScreenWidget</class>
|
||||||
|
<extends>QLabel</extends>
|
||||||
|
<header>NewScreenWidget.h</header>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>TrashScreenWidget</class>
|
||||||
|
<extends>QLabel</extends>
|
||||||
|
<header>TrashScreenWidget.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources>
|
||||||
|
<include location="QSynergy.qrc" />
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>ServerConfigDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>572</x>
|
||||||
|
<y>424</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>377</x>
|
||||||
|
<y>-8</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pButtonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ServerConfigDialogBase</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>641</x>
|
||||||
|
<y>424</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>595</x>
|
||||||
|
<y>1</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pCheckBoxSwitchDelay</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pSpinBoxSwitchDelay</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pCheckBoxSwitchDoubleTap</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pSpinBoxSwitchDoubleTap</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pCheckBoxHeartbeat</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>m_pSpinBoxHeartbeat</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>110</x>
|
||||||
|
<y>63</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pListHotkeys</sender>
|
||||||
|
<signal>itemDoubleClicked(QListWidgetItem*)</signal>
|
||||||
|
<receiver>m_pButtonEditHotkey</receiver>
|
||||||
|
<slot>click()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>197</x>
|
||||||
|
<y>115</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>304</x>
|
||||||
|
<y>115</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>m_pListActions</sender>
|
||||||
|
<signal>itemDoubleClicked(QListWidgetItem*)</signal>
|
||||||
|
<receiver>m_pButtonEditAction</receiver>
|
||||||
|
<slot>click()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>505</x>
|
||||||
|
<y>120</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>677</x>
|
||||||
|
<y>118</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -0,0 +1,252 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>SettingsDialogBase</class>
|
||||||
|
<widget class="QDialog" name="SettingsDialogBase" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>372</width>
|
||||||
|
<height>390</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupBox_2" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Programs</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_17" >
|
||||||
|
<property name="whatsThis" >
|
||||||
|
<string>This is the synergy client program, usually called synergyc or synergyc.exe.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Client:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditSynergyc</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditSynergyc" />
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonBrowseSynergyc" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Browse...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_18" >
|
||||||
|
<property name="toolTip" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="whatsThis" >
|
||||||
|
<string>This is the synergy server program, usually called synergys or synergys.exe.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>S&erver:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditSynergys</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditSynergys" />
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" >
|
||||||
|
<widget class="QPushButton" name="m_pButtonBrowseSynergys" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Bro&wse...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupBox_3" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Advanced</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_19" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Sc&reen name:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditScreenName</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditScreenName" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_20" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>P&ort:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pSpinBoxPort</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QSpinBox" name="m_pSpinBoxPort" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="maximum" >
|
||||||
|
<number>65535</number>
|
||||||
|
</property>
|
||||||
|
<property name="value" >
|
||||||
|
<number>24800</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_21" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Interface:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pLineEditInterface</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QLineEdit" name="m_pLineEditInterface" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2" >
|
||||||
|
<widget class="QGroupBox" name="m_pGroupRunOptions" >
|
||||||
|
<property name="title" >
|
||||||
|
<string>&Start</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_pCheckBoxAutoConnect" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>A&utomatically start synergy when QSynergy starts</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" >
|
||||||
|
<widget class="QLabel" name="m_pLabel_3" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Logging level:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>m_pComboLogLevel</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1" >
|
||||||
|
<widget class="QComboBox" name="m_pComboLogLevel" >
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Error</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Warning</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Note</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Info</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Debug</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Debug1</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Debug2</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" colspan="2" >
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons" >
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>SettingsDialogBase</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>257</x>
|
||||||
|
<y>380</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>SettingsDialogBase</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>325</x>
|
||||||
|
<y>380</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
Binary file not shown.
After Width: | Height: | Size: 283 B |
Binary file not shown.
After Width: | Height: | Size: 263 B |
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||||
|
<plist version="0.9">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>QSynergy.icns</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>0.9.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>QSynergy</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
Binary file not shown.
After Width: | Height: | Size: 8.3 KiB |
|
@ -0,0 +1 @@
|
||||||
|
IDI_ICON1 ICON DISCARDABLE "res\win\QSynergy.ico"
|
|
@ -0,0 +1,48 @@
|
||||||
|
#include "AboutDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
#include <QtNetwork>
|
||||||
|
|
||||||
|
static QString getSynergyVersion(const QString& app)
|
||||||
|
{
|
||||||
|
#if !defined(Q_OS_WIN)
|
||||||
|
QProcess process;
|
||||||
|
process.start(app, QStringList() << "--version");
|
||||||
|
|
||||||
|
process.setReadChannel(QProcess::StandardError);
|
||||||
|
if (!process.waitForStarted() || !process.waitForFinished())
|
||||||
|
return QObject::tr("(unknown)");
|
||||||
|
|
||||||
|
QRegExp rx("synergy[cs] ([\\d\\.]+)");
|
||||||
|
if (rx.indexIn(QString(process.readLine())) != -1)
|
||||||
|
return rx.cap(1);
|
||||||
|
#else
|
||||||
|
Q_UNUSED(app);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return QObject::tr("(unknown)");
|
||||||
|
}
|
||||||
|
|
||||||
|
static QString getIPAddress()
|
||||||
|
{
|
||||||
|
QList<QHostAddress> addresses = QNetworkInterface::allAddresses();
|
||||||
|
|
||||||
|
for (int i = 0; i < addresses.size(); i++)
|
||||||
|
if (addresses[i].protocol() == QAbstractSocket::IPv4Protocol && addresses[i] != QHostAddress(QHostAddress::LocalHost))
|
||||||
|
return addresses[i].toString();
|
||||||
|
|
||||||
|
return QObject::tr("(unknown)");
|
||||||
|
}
|
||||||
|
|
||||||
|
AboutDialog::AboutDialog(QWidget* parent, const QString& synergyApp) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::AboutDialogBase()
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
m_pLabelSynergyVersion->setText(getSynergyVersion(synergyApp));
|
||||||
|
m_pLabelHostname->setText(QHostInfo::localHostName());
|
||||||
|
m_pLabelIPAddress->setText(getIPAddress());
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#if !defined(ABOUTDIALOG__H)
|
||||||
|
|
||||||
|
#define ABOUTDIALOG__H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_AboutDialogBase.h"
|
||||||
|
|
||||||
|
class QWidget;
|
||||||
|
class QString;
|
||||||
|
|
||||||
|
class AboutDialog : public QDialog, public Ui::AboutDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
AboutDialog(QWidget* parent, const QString& synergyApp = QString());
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
#include "Action.h"
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
const char* Action::m_ActionTypeNames[] =
|
||||||
|
{
|
||||||
|
"keyDown", "keyUp", "keystroke",
|
||||||
|
"switchToScreen", "switchInDirection", "lockCursorToScreen",
|
||||||
|
"mouseDown", "mouseUp", "mousebutton"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* Action::m_SwitchDirectionNames[] = { "left", "right", "up", "down" };
|
||||||
|
const char* Action::m_LockCursorModeNames[] = { "toggle", "on", "off" };
|
||||||
|
|
||||||
|
Action::Action() :
|
||||||
|
m_KeySequence(),
|
||||||
|
m_Type(keystroke),
|
||||||
|
m_TypeScreenNames(),
|
||||||
|
m_SwitchScreenName(),
|
||||||
|
m_SwitchDirection(switchLeft),
|
||||||
|
m_LockCursorMode(lockCursorToggle),
|
||||||
|
m_ActiveOnRelease(false),
|
||||||
|
m_HasScreens(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Action::text() const
|
||||||
|
{
|
||||||
|
QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]) + "(";
|
||||||
|
|
||||||
|
switch (type())
|
||||||
|
{
|
||||||
|
case keyDown:
|
||||||
|
case keyUp:
|
||||||
|
case keystroke:
|
||||||
|
{
|
||||||
|
text += keySequence().toString();
|
||||||
|
|
||||||
|
if (!keySequence().isMouseButton())
|
||||||
|
{
|
||||||
|
const QStringList& screens = typeScreenNames();
|
||||||
|
if (haveScreens() && !screens.isEmpty())
|
||||||
|
{
|
||||||
|
text += ",";
|
||||||
|
|
||||||
|
for (int i = 0; i < screens.size(); i++)
|
||||||
|
{
|
||||||
|
text += screens[i];
|
||||||
|
if (i != screens.size() - 1)
|
||||||
|
text += ":";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
text += ",*";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case switchToScreen:
|
||||||
|
text += switchScreenName();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case switchInDirection:
|
||||||
|
text += m_SwitchDirectionNames[m_SwitchDirection];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case lockCursorToScreen:
|
||||||
|
text += m_LockCursorModeNames[m_LockCursorMode];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Q_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
text += ")";
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Action::loadSettings(QSettings& settings)
|
||||||
|
{
|
||||||
|
keySequence().loadSettings(settings);
|
||||||
|
setType(settings.value("type", keyDown).toInt());
|
||||||
|
|
||||||
|
typeScreenNames().clear();
|
||||||
|
int numTypeScreens = settings.beginReadArray("typeScreenNames");
|
||||||
|
for (int i = 0; i < numTypeScreens; i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
typeScreenNames().append(settings.value("typeScreenName").toString());
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
|
||||||
|
setSwitchScreenName(settings.value("switchScreenName").toString());
|
||||||
|
setSwitchDirection(settings.value("switchInDirection", switchLeft).toInt());
|
||||||
|
setLockCursorMode(settings.value("lockCursorToScreen", lockCursorToggle).toInt());
|
||||||
|
setActiveOnRelease(settings.value("activeOnRelease", false).toBool());
|
||||||
|
setHaveScreens(settings.value("hasScreens", false).toBool());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Action::saveSettings(QSettings& settings) const
|
||||||
|
{
|
||||||
|
keySequence().saveSettings(settings);
|
||||||
|
settings.setValue("type", type());
|
||||||
|
|
||||||
|
settings.beginWriteArray("typeScreenNames");
|
||||||
|
for (int i = 0; i < typeScreenNames().size(); i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
settings.setValue("typeScreenName", typeScreenNames()[i]);
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
|
||||||
|
settings.setValue("switchScreenName", switchScreenName());
|
||||||
|
settings.setValue("switchInDirection", switchDirection());
|
||||||
|
settings.setValue("lockCursorToScreen", lockCursorMode());
|
||||||
|
settings.setValue("activeOnRelease", activeOnRelease());
|
||||||
|
settings.setValue("hasScreens", haveScreens());
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const Action& action)
|
||||||
|
{
|
||||||
|
if (action.activeOnRelease())
|
||||||
|
outStream << ";";
|
||||||
|
|
||||||
|
outStream << action.text();
|
||||||
|
|
||||||
|
return outStream;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
#if !defined(ACTION_H)
|
||||||
|
|
||||||
|
#define ACTION_H
|
||||||
|
|
||||||
|
#include "KeySequence.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
class ActionDialog;
|
||||||
|
class QSettings;
|
||||||
|
class QTextStream;
|
||||||
|
|
||||||
|
class Action
|
||||||
|
{
|
||||||
|
friend class ActionDialog;
|
||||||
|
friend QTextStream& operator<<(QTextStream& outStream, const Action& action);
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum ActionType { keyDown, keyUp, keystroke, switchToScreen, switchInDirection, lockCursorToScreen, mouseDown, mouseUp, mousebutton };
|
||||||
|
enum SwitchDirection { switchLeft, switchRight, switchUp, switchDown };
|
||||||
|
enum LockCursorMode { lockCursorToggle, lockCursonOn, lockCursorOff };
|
||||||
|
|
||||||
|
public:
|
||||||
|
Action();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QString text() const;
|
||||||
|
const KeySequence& keySequence() const { return m_KeySequence; }
|
||||||
|
void loadSettings(QSettings& settings);
|
||||||
|
void saveSettings(QSettings& settings) const;
|
||||||
|
int type() const { return m_Type; }
|
||||||
|
const QStringList& typeScreenNames() const { return m_TypeScreenNames; }
|
||||||
|
const QString& switchScreenName() const { return m_SwitchScreenName; }
|
||||||
|
int switchDirection() const { return m_SwitchDirection; }
|
||||||
|
int lockCursorMode() const { return m_LockCursorMode; }
|
||||||
|
bool activeOnRelease() const { return m_ActiveOnRelease; }
|
||||||
|
bool haveScreens() const { return m_HasScreens; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
KeySequence& keySequence() { return m_KeySequence; }
|
||||||
|
void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; }
|
||||||
|
void setType(int t) { m_Type = t; }
|
||||||
|
QStringList& typeScreenNames() { return m_TypeScreenNames; }
|
||||||
|
void setSwitchScreenName(const QString& n) { m_SwitchScreenName = n; }
|
||||||
|
void setSwitchDirection(int d) { m_SwitchDirection = d; }
|
||||||
|
void setLockCursorMode(int m) { m_LockCursorMode = m; }
|
||||||
|
void setActiveOnRelease(bool b) { m_ActiveOnRelease = b; }
|
||||||
|
void setHaveScreens(bool b) { m_HasScreens = b; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
KeySequence m_KeySequence;
|
||||||
|
int m_Type;
|
||||||
|
QStringList m_TypeScreenNames;
|
||||||
|
QString m_SwitchScreenName;
|
||||||
|
int m_SwitchDirection;
|
||||||
|
int m_LockCursorMode;
|
||||||
|
bool m_ActiveOnRelease;
|
||||||
|
bool m_HasScreens;
|
||||||
|
|
||||||
|
static const char* m_ActionTypeNames[];
|
||||||
|
static const char* m_SwitchDirectionNames[];
|
||||||
|
static const char* m_LockCursorModeNames[];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef QList<Action> ActionList;
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const Action& action);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,91 @@
|
||||||
|
#include "ActionDialog.h"
|
||||||
|
|
||||||
|
#include "Hotkey.h"
|
||||||
|
#include "Action.h"
|
||||||
|
#include "ServerConfig.h"
|
||||||
|
#include "KeySequence.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
ActionDialog::ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::ActionDialogBase(),
|
||||||
|
m_ServerConfig(config),
|
||||||
|
m_Hotkey(hotkey),
|
||||||
|
m_Action(action),
|
||||||
|
m_pButtonGroupType(new QButtonGroup(this))
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
// work around Qt Designer's lack of a QButtonGroup; we need it to get
|
||||||
|
// at the button id of the checked radio button
|
||||||
|
QRadioButton* const typeButtons[] = { m_pRadioPress, m_pRadioRelease, m_pRadioPressAndRelease, m_pRadioSwitchToScreen, m_pRadioSwitchInDirection, m_pRadioLockCursorToScreen };
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < sizeof(typeButtons) / sizeof(typeButtons[0]); i++)
|
||||||
|
m_pButtonGroupType->addButton(typeButtons[i], i);
|
||||||
|
|
||||||
|
m_pKeySequenceWidgetHotkey->setText(m_Action.keySequence().toString());
|
||||||
|
m_pKeySequenceWidgetHotkey->setKeySequence(m_Action.keySequence());
|
||||||
|
m_pButtonGroupType->button(m_Action.type())->setChecked(true);
|
||||||
|
m_pComboSwitchInDirection->setCurrentIndex(m_Action.switchDirection());
|
||||||
|
m_pComboLockCursorToScreen->setCurrentIndex(m_Action.lockCursorMode());
|
||||||
|
|
||||||
|
if (m_Action.activeOnRelease())
|
||||||
|
m_pRadioHotkeyReleased->setChecked(true);
|
||||||
|
else
|
||||||
|
m_pRadioHotkeyPressed->setChecked(true);
|
||||||
|
|
||||||
|
m_pGroupBoxScreens->setChecked(m_Action.haveScreens());
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
foreach(const Screen& screen, serverConfig().screens())
|
||||||
|
if (!screen.isNull())
|
||||||
|
{
|
||||||
|
QListWidgetItem *pListItem = new QListWidgetItem(screen.name());
|
||||||
|
m_pListScreens->addItem(pListItem);
|
||||||
|
if (m_Action.typeScreenNames().indexOf(screen.name()) != -1)
|
||||||
|
m_pListScreens->setCurrentItem(pListItem);
|
||||||
|
|
||||||
|
m_pComboSwitchToScreen->addItem(screen.name());
|
||||||
|
if (screen.name() == m_Action.switchScreenName())
|
||||||
|
m_pComboSwitchToScreen->setCurrentIndex(idx);
|
||||||
|
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionDialog::accept()
|
||||||
|
{
|
||||||
|
if (!sequenceWidget()->valid() && m_pButtonGroupType->checkedId() >= 0 && m_pButtonGroupType->checkedId() < 3)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_Action.setKeySequence(sequenceWidget()->keySequence());
|
||||||
|
m_Action.setType(m_pButtonGroupType->checkedId());
|
||||||
|
m_Action.setHaveScreens(m_pGroupBoxScreens->isChecked());
|
||||||
|
|
||||||
|
m_Action.typeScreenNames().clear();
|
||||||
|
foreach(const QListWidgetItem* pItem, m_pListScreens->selectedItems())
|
||||||
|
m_Action.typeScreenNames().append(pItem->text());
|
||||||
|
|
||||||
|
m_Action.setSwitchScreenName(m_pComboSwitchToScreen->currentText());
|
||||||
|
m_Action.setSwitchDirection(m_pComboSwitchInDirection->currentIndex());
|
||||||
|
m_Action.setLockCursorMode(m_pComboLockCursorToScreen->currentIndex());
|
||||||
|
m_Action.setActiveOnRelease(m_pRadioHotkeyReleased->isChecked());
|
||||||
|
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionDialog::on_m_pKeySequenceWidgetHotkey_keySequenceChanged()
|
||||||
|
{
|
||||||
|
if (sequenceWidget()->keySequence().isMouseButton())
|
||||||
|
{
|
||||||
|
m_pGroupBoxScreens->setEnabled(false);
|
||||||
|
m_pListScreens->setEnabled(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_pGroupBoxScreens->setEnabled(true);
|
||||||
|
m_pListScreens->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
#if !defined(ACTIONDIALOG_H)
|
||||||
|
|
||||||
|
#define ACTIONDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_ActionDialogBase.h"
|
||||||
|
|
||||||
|
class Hotkey;
|
||||||
|
class Action;
|
||||||
|
class QRadioButton;
|
||||||
|
class QButtonGroup;
|
||||||
|
class ServerConfig;
|
||||||
|
|
||||||
|
class ActionDialog : public QDialog, public Ui::ActionDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action);
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void accept();
|
||||||
|
void on_m_pKeySequenceWidgetHotkey_keySequenceChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; }
|
||||||
|
const ServerConfig& serverConfig() const { return m_ServerConfig; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ServerConfig& m_ServerConfig;
|
||||||
|
Hotkey& m_Hotkey;
|
||||||
|
Action& m_Action;
|
||||||
|
|
||||||
|
QButtonGroup* m_pButtonGroupType;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtNetwork>
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
const char AppConfig::m_SynergysName[] = "synergys.exe";
|
||||||
|
const char AppConfig::m_SynergycName[] = "synergyc.exe";
|
||||||
|
const char AppConfig::m_SynergyProgramDir[] = "c:/program files/synergy/";
|
||||||
|
#else
|
||||||
|
const char AppConfig::m_SynergysName[] = "synergys";
|
||||||
|
const char AppConfig::m_SynergycName[] = "synergyc";
|
||||||
|
const char AppConfig::m_SynergyProgramDir[] = "/usr/bin/";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
AppConfig::AppConfig(QSettings* settings) :
|
||||||
|
m_pSettings(settings),
|
||||||
|
m_AutoConnect(false),
|
||||||
|
m_Synergyc(),
|
||||||
|
m_Synergys(),
|
||||||
|
m_ScreenName(),
|
||||||
|
m_Port(24800),
|
||||||
|
m_Interface(),
|
||||||
|
m_LogLevel(0)
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_pSettings);
|
||||||
|
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
AppConfig::~AppConfig()
|
||||||
|
{
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppConfig::loadSettings()
|
||||||
|
{
|
||||||
|
m_AutoConnect = settings().value("autoConnectChecked", false).toBool();
|
||||||
|
m_Synergyc = settings().value("synergyc", QString(synergyProgramDir()) + synergycName()).toString();
|
||||||
|
m_Synergys = settings().value("synergys", QString(synergyProgramDir()) + synergysName()).toString();
|
||||||
|
m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString();
|
||||||
|
m_Port = settings().value("port", 24800).toInt();
|
||||||
|
m_Interface = settings().value("interface").toString();
|
||||||
|
m_LogLevel = settings().value("logLevelIndex", 0).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppConfig::saveSettings()
|
||||||
|
{
|
||||||
|
settings().setValue("autoConnectChecked", m_AutoConnect);
|
||||||
|
settings().setValue("synergyc", m_Synergyc);
|
||||||
|
settings().setValue("synergys", m_Synergys);
|
||||||
|
settings().setValue("screenName", m_ScreenName);
|
||||||
|
settings().setValue("port", m_Port);
|
||||||
|
settings().setValue("interface", m_Interface);
|
||||||
|
settings().setValue("logLevelIndex", m_LogLevel);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#if !defined(APPCONFIG_H)
|
||||||
|
|
||||||
|
#define APPCONFIG_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class QSettings;
|
||||||
|
class SettingsDialog;
|
||||||
|
|
||||||
|
class AppConfig
|
||||||
|
{
|
||||||
|
friend class SettingsDialog;
|
||||||
|
friend class MainWindow;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AppConfig(QSettings* settings);
|
||||||
|
~AppConfig();
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool autoConnect() const { return m_AutoConnect; }
|
||||||
|
const QString& synergyc() const { return m_Synergyc; }
|
||||||
|
const QString& synergys() const { return m_Synergys; }
|
||||||
|
const QString& screenName() const { return m_ScreenName; }
|
||||||
|
int port() const { return m_Port; }
|
||||||
|
const QString& interface() const { return m_Interface; }
|
||||||
|
int logLevel() const { return m_LogLevel; }
|
||||||
|
|
||||||
|
QString synergysName() const { return m_SynergysName; }
|
||||||
|
QString synergycName() const { return m_SynergycName; }
|
||||||
|
QString synergyProgramDir() const { return m_SynergyProgramDir; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QSettings& settings() { return *m_pSettings; }
|
||||||
|
void setAutoConnect(bool b) { m_AutoConnect = b; }
|
||||||
|
void setSynergyc(const QString& s) { m_Synergyc = s; }
|
||||||
|
void setSynergys(const QString& s) { m_Synergys = s; }
|
||||||
|
void setScreenName(const QString& s) { m_ScreenName = s; }
|
||||||
|
void setPort(int i) { m_Port = i; }
|
||||||
|
void setInterface(const QString& s) { m_Interface = s; }
|
||||||
|
void setLogLevel(int i) { m_LogLevel = i; }
|
||||||
|
|
||||||
|
void loadSettings();
|
||||||
|
void saveSettings();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSettings* m_pSettings;
|
||||||
|
bool m_AutoConnect;
|
||||||
|
QString m_Synergyc;
|
||||||
|
QString m_Synergys;
|
||||||
|
QString m_ScreenName;
|
||||||
|
int m_Port;
|
||||||
|
QString m_Interface;
|
||||||
|
int m_LogLevel;
|
||||||
|
|
||||||
|
static const char m_SynergysName[];
|
||||||
|
static const char m_SynergycName[];
|
||||||
|
static const char m_SynergyProgramDir[];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "BaseConfig.h"
|
||||||
|
|
||||||
|
const char* BaseConfig::m_ModifierNames[] =
|
||||||
|
{
|
||||||
|
"shift",
|
||||||
|
"ctrl",
|
||||||
|
"alt",
|
||||||
|
"meta",
|
||||||
|
"super",
|
||||||
|
"none"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* BaseConfig::m_FixNames[] =
|
||||||
|
{
|
||||||
|
"halfDuplexCapsLock",
|
||||||
|
"halfDuplexNumLock",
|
||||||
|
"halfDuplexScrollLock",
|
||||||
|
"xtestIsXineramaUnaware"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* BaseConfig::m_SwitchCornerNames[] =
|
||||||
|
{
|
||||||
|
"top-left",
|
||||||
|
"top-right",
|
||||||
|
"bottom-left",
|
||||||
|
"bottom-right"
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
#if !defined(BASECONFIG_H)
|
||||||
|
|
||||||
|
#define BASECONFIG_H
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QString>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
class BaseConfig
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Modifier { DefaultMod = -1, Shift, Ctrl, Alt, Meta, Super, None, NumModifiers };
|
||||||
|
enum SwitchCorner { TopLeft, TopRight, BottomLeft, BottomRight, NumSwitchCorners };
|
||||||
|
enum Fix { CapsLock, NumLock, ScrollLock, XTest, NumFixes };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BaseConfig() {}
|
||||||
|
virtual ~BaseConfig() {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt)
|
||||||
|
{
|
||||||
|
int entries = settings.beginReadArray(arrayName + "Array");
|
||||||
|
array.clear();
|
||||||
|
for (int i = 0; i < entries; i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
QVariant v = settings.value(arrayName, deflt);
|
||||||
|
array.append(v.value<T2>());
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt, int entries)
|
||||||
|
{
|
||||||
|
Q_ASSERT(array.size() >= entries);
|
||||||
|
settings.beginReadArray(arrayName + "Array");
|
||||||
|
for (int i = 0; i < entries; i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
QVariant v = settings.value(arrayName, deflt);
|
||||||
|
array[i] = v.value<T2>();
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void writeSettings(QSettings& settings, const T& array, const QString& arrayName) const
|
||||||
|
{
|
||||||
|
settings.beginWriteArray(arrayName + "Array");
|
||||||
|
for (int i = 0; i < array.size(); i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
settings.setValue(arrayName, array[i]);
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const char* modifierName(int idx) { return m_ModifierNames[idx]; }
|
||||||
|
static const char* fixName(int idx) { return m_FixNames[idx]; }
|
||||||
|
static const char* switchCornerName(int idx) { return m_SwitchCornerNames[idx]; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const char* m_ModifierNames[];
|
||||||
|
static const char* m_FixNames[];
|
||||||
|
static const char* m_SwitchCornerNames[];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,57 @@
|
||||||
|
#include "Hotkey.h"
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
Hotkey::Hotkey() :
|
||||||
|
m_KeySequence(),
|
||||||
|
m_Actions()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Hotkey::text() const
|
||||||
|
{
|
||||||
|
QString text = keySequence().toString();
|
||||||
|
|
||||||
|
if (keySequence().isMouseButton())
|
||||||
|
return "mousebutton(" + text + ")";
|
||||||
|
|
||||||
|
return "keystroke(" + text + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hotkey::loadSettings(QSettings& settings)
|
||||||
|
{
|
||||||
|
keySequence().loadSettings(settings);
|
||||||
|
|
||||||
|
actions().clear();
|
||||||
|
int num = settings.beginReadArray("actions");
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
Action a;
|
||||||
|
a.loadSettings(settings);
|
||||||
|
actions().append(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hotkey::saveSettings(QSettings& settings) const
|
||||||
|
{
|
||||||
|
keySequence().saveSettings(settings);
|
||||||
|
|
||||||
|
settings.beginWriteArray("actions");
|
||||||
|
for (int i = 0; i < actions().size(); i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
actions()[i].saveSettings(settings);
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < hotkey.actions().size(); i++)
|
||||||
|
outStream << "\t" << hotkey.text() << " = " << hotkey.actions()[i] << endl;
|
||||||
|
|
||||||
|
return outStream;
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
#if !defined(HOTKEY_H)
|
||||||
|
|
||||||
|
#define HOTKEY_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QList>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include "Action.h"
|
||||||
|
#include "KeySequence.h"
|
||||||
|
|
||||||
|
class HotkeyDialog;
|
||||||
|
class ServerConfigDialog;
|
||||||
|
class QSettings;
|
||||||
|
|
||||||
|
class Hotkey
|
||||||
|
{
|
||||||
|
friend class HotkeyDialog;
|
||||||
|
friend class ServerConfigDialog;
|
||||||
|
friend QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Hotkey();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QString text() const;
|
||||||
|
const KeySequence& keySequence() const { return m_KeySequence; }
|
||||||
|
const ActionList& actions() const { return m_Actions; }
|
||||||
|
|
||||||
|
void loadSettings(QSettings& settings);
|
||||||
|
void saveSettings(QSettings& settings) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
KeySequence& keySequence() { return m_KeySequence; }
|
||||||
|
void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; }
|
||||||
|
ActionList& actions() { return m_Actions; }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
KeySequence m_KeySequence;
|
||||||
|
ActionList m_Actions;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef QList<Hotkey> HotkeyList;
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,23 @@
|
||||||
|
#include "HotkeyDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
HotkeyDialog::HotkeyDialog (QWidget* parent, Hotkey& hotkey) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::HotkeyDialogBase(),
|
||||||
|
m_Hotkey(hotkey)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
m_pKeySequenceWidgetHotkey->setText(m_Hotkey.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
void HotkeyDialog::accept()
|
||||||
|
{
|
||||||
|
if (!sequenceWidget()->valid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
hotkey().setKeySequence(sequenceWidget()->keySequence());
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
#if !defined(HOTKEYDIALOG_H)
|
||||||
|
|
||||||
|
#define HOTKEYDIALOG_H
|
||||||
|
|
||||||
|
#include "ui_HotkeyDialogBase.h"
|
||||||
|
#include "Hotkey.h"
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
class HotkeyDialog : public QDialog, public Ui::HotkeyDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
HotkeyDialog(QWidget* parent, Hotkey& hotkey);
|
||||||
|
|
||||||
|
public:
|
||||||
|
const Hotkey& hotkey() const { return m_Hotkey; }
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void accept();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; }
|
||||||
|
Hotkey& hotkey() { return m_Hotkey; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Hotkey& m_Hotkey;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,219 @@
|
||||||
|
#include "KeySequence.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
// this table originally comes from Qt sources (gui/kernel/qkeysequence.cpp)
|
||||||
|
// and is heavily modified for QSynergy
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
int key;
|
||||||
|
const char* name;
|
||||||
|
} keyname[] =
|
||||||
|
{
|
||||||
|
{ Qt::Key_Space, "Space" },
|
||||||
|
{ Qt::Key_Escape, "Escape" },
|
||||||
|
{ Qt::Key_Tab, "Tab" },
|
||||||
|
{ Qt::Key_Backtab, "LeftTab" },
|
||||||
|
{ Qt::Key_Backspace, "BackSpace" },
|
||||||
|
{ Qt::Key_Return, "Return" },
|
||||||
|
{ Qt::Key_Insert, "Insert" },
|
||||||
|
{ Qt::Key_Delete, "Delete" },
|
||||||
|
{ Qt::Key_Pause, "Pause" },
|
||||||
|
{ Qt::Key_Print, "Print" },
|
||||||
|
{ Qt::Key_SysReq, "SysReq" },
|
||||||
|
{ Qt::Key_Home, "Home" },
|
||||||
|
{ Qt::Key_End, "End" },
|
||||||
|
{ Qt::Key_Left, "Left" },
|
||||||
|
{ Qt::Key_Up, "Up" },
|
||||||
|
{ Qt::Key_Right, "Right" },
|
||||||
|
{ Qt::Key_Down, "Down" },
|
||||||
|
{ Qt::Key_PageUp, "PageUp" },
|
||||||
|
{ Qt::Key_PageDown, "PageDown" },
|
||||||
|
{ Qt::Key_CapsLock, "CapsLock" },
|
||||||
|
{ Qt::Key_NumLock, "NumLock" },
|
||||||
|
{ Qt::Key_ScrollLock, "ScrollLock" },
|
||||||
|
{ Qt::Key_Menu, "Menu" },
|
||||||
|
{ Qt::Key_Help, "Help" },
|
||||||
|
{ Qt::Key_Enter, "KP_Enter" },
|
||||||
|
{ Qt::Key_Clear, "Clear" },
|
||||||
|
|
||||||
|
{ Qt::Key_Back, "WWWBack" },
|
||||||
|
{ Qt::Key_Forward, "WWWForward" },
|
||||||
|
{ Qt::Key_Stop, "WWWStop" },
|
||||||
|
{ Qt::Key_Refresh, "WWWRefresh" },
|
||||||
|
{ Qt::Key_VolumeDown, "AudioDown" },
|
||||||
|
{ Qt::Key_VolumeMute, "AudioMute" },
|
||||||
|
{ Qt::Key_VolumeUp, "AudioUp" },
|
||||||
|
{ Qt::Key_MediaPlay, "AudioPlay" },
|
||||||
|
{ Qt::Key_MediaStop, "AudioStop" },
|
||||||
|
{ Qt::Key_MediaPrevious,"AudioPrev" },
|
||||||
|
{ Qt::Key_MediaNext, "AudioNext" },
|
||||||
|
{ Qt::Key_HomePage, "WWWHome" },
|
||||||
|
{ Qt::Key_Favorites, "WWWFavorites" },
|
||||||
|
{ Qt::Key_Search, "WWWSearch" },
|
||||||
|
{ Qt::Key_Standby, "Sleep" },
|
||||||
|
{ Qt::Key_LaunchMail, "AppMail" },
|
||||||
|
{ Qt::Key_LaunchMedia, "AppMedia" },
|
||||||
|
{ Qt::Key_Launch0, "AppUser1" },
|
||||||
|
{ Qt::Key_Launch1, "AppUser2" },
|
||||||
|
{ Qt::Key_Select, "Select" },
|
||||||
|
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
KeySequence::KeySequence() :
|
||||||
|
m_Sequence(),
|
||||||
|
m_Modifiers(0),
|
||||||
|
m_IsValid(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeySequence::isMouseButton() const
|
||||||
|
{
|
||||||
|
return !m_Sequence.isEmpty() && m_Sequence.last() < Qt::Key_Space;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString KeySequence::toString() const
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
|
||||||
|
for (int i = 0; i < m_Sequence.size(); i++)
|
||||||
|
{
|
||||||
|
result += keyToString(m_Sequence[i]);
|
||||||
|
|
||||||
|
if (i != m_Sequence.size() - 1)
|
||||||
|
result += "+";
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeySequence::appendMouseButton(int button)
|
||||||
|
{
|
||||||
|
return appendKey(button, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeySequence::appendKey(int key, int modifiers)
|
||||||
|
{
|
||||||
|
if (m_Sequence.size() == 4)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch(key)
|
||||||
|
{
|
||||||
|
case Qt::Key_AltGr:
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case Qt::Key_Control:
|
||||||
|
case Qt::Key_Alt:
|
||||||
|
case Qt::Key_Shift:
|
||||||
|
case Qt::Key_Meta:
|
||||||
|
case Qt::Key_Menu:
|
||||||
|
{
|
||||||
|
int mod = modifiers & (~m_Modifiers);
|
||||||
|
if (mod)
|
||||||
|
{
|
||||||
|
m_Sequence.append(mod);
|
||||||
|
m_Modifiers |= mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// see if we can handle this key, if not, don't accept it
|
||||||
|
if (keyToString(key).isEmpty())
|
||||||
|
break;
|
||||||
|
|
||||||
|
m_Sequence.append(key);
|
||||||
|
setValid(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequence::loadSettings(QSettings& settings)
|
||||||
|
{
|
||||||
|
sequence().clear();
|
||||||
|
int num = settings.beginReadArray("keys");
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
sequence().append(settings.value("key", 0).toInt());
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
|
||||||
|
setModifiers(0);
|
||||||
|
setValid(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequence::saveSettings(QSettings& settings) const
|
||||||
|
{
|
||||||
|
settings.beginWriteArray("keys");
|
||||||
|
for (int i = 0; i < sequence().size(); i++)
|
||||||
|
{
|
||||||
|
settings.setArrayIndex(i);
|
||||||
|
settings.setValue("key", sequence()[i]);
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString KeySequence::keyToString(int key)
|
||||||
|
{
|
||||||
|
// nothing there?
|
||||||
|
if (key == 0)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
// a hack to handle mouse buttons as if they were keys
|
||||||
|
if (key < Qt::Key_Space)
|
||||||
|
{
|
||||||
|
switch(key)
|
||||||
|
{
|
||||||
|
case Qt::LeftButton: return "1";
|
||||||
|
case Qt::RightButton: return "2";
|
||||||
|
case Qt::MidButton: return "3";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "4"; // qt only knows three mouse buttons, so assume it's an unknown fourth one
|
||||||
|
}
|
||||||
|
|
||||||
|
// modifiers?
|
||||||
|
if (key & Qt::ShiftModifier)
|
||||||
|
return "Shift";
|
||||||
|
|
||||||
|
if (key & Qt::ControlModifier)
|
||||||
|
return "Control";
|
||||||
|
|
||||||
|
if (key & Qt::AltModifier)
|
||||||
|
return "Alt";
|
||||||
|
|
||||||
|
if (key & Qt::MetaModifier)
|
||||||
|
return "Meta";
|
||||||
|
|
||||||
|
// treat key pad like normal keys (FIXME: we should have another lookup table for keypad keys instead)
|
||||||
|
key &= ~Qt::KeypadModifier;
|
||||||
|
|
||||||
|
// a printable 7 bit character?
|
||||||
|
if (key < 0x80 && key != Qt::Key_Space)
|
||||||
|
return QChar(key & 0x7f).toLower();
|
||||||
|
|
||||||
|
// a function key?
|
||||||
|
if (key >= Qt::Key_F1 && key <= Qt::Key_F35)
|
||||||
|
return QString::fromUtf8("F%1").arg(key - Qt::Key_F1 + 1);
|
||||||
|
|
||||||
|
// a special key?
|
||||||
|
int i=0;
|
||||||
|
while (keyname[i].name)
|
||||||
|
{
|
||||||
|
if (key == keyname[i].key)
|
||||||
|
return QString::fromUtf8(keyname[i].name);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// representable in ucs2?
|
||||||
|
if (key < 0x10000)
|
||||||
|
return QString("\\u%1").arg(QChar(key).toLower().unicode(), 4, 16, QChar('0'));
|
||||||
|
|
||||||
|
// give up, synergy probably won't handle this
|
||||||
|
return "";
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
#if !defined(KEYSEQUENCE_H)
|
||||||
|
|
||||||
|
#define KEYSEQUENCE_H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class QSettings;
|
||||||
|
|
||||||
|
class KeySequence
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
KeySequence();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QString toString() const;
|
||||||
|
bool appendKey(int modifiers, int key);
|
||||||
|
bool appendMouseButton(int button);
|
||||||
|
bool isMouseButton() const;
|
||||||
|
bool valid() const { return m_IsValid; }
|
||||||
|
int modifiers() const { return m_Modifiers; }
|
||||||
|
void saveSettings(QSettings& settings) const;
|
||||||
|
void loadSettings(QSettings& settings);
|
||||||
|
const QList<int>& sequence() const { return m_Sequence; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setValid(bool b) { m_IsValid = b; }
|
||||||
|
void setModifiers(int i) { m_Modifiers = i; }
|
||||||
|
QList<int>& sequence() { return m_Sequence; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<int> m_Sequence;
|
||||||
|
int m_Modifiers;
|
||||||
|
bool m_IsValid;
|
||||||
|
|
||||||
|
static QString keyToString(int key);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
#include "KeySequenceWidget.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
KeySequenceWidget::KeySequenceWidget(QWidget* parent, const KeySequence& seq) :
|
||||||
|
QPushButton(parent),
|
||||||
|
m_KeySequence(seq),
|
||||||
|
m_BackupSequence(seq),
|
||||||
|
m_Status(Stopped),
|
||||||
|
m_MousePrefix("mousebutton("),
|
||||||
|
m_MousePostfix(")"),
|
||||||
|
m_KeyPrefix("keystroke("),
|
||||||
|
m_KeyPostfix(")")
|
||||||
|
{
|
||||||
|
setFocusPolicy(Qt::NoFocus);
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::setKeySequence(const KeySequence& seq)
|
||||||
|
{
|
||||||
|
keySequence() = seq;
|
||||||
|
backupSequence() = seq;
|
||||||
|
|
||||||
|
setStatus(Stopped);
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::mousePressEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
event->accept();
|
||||||
|
|
||||||
|
if (status() == Stopped)
|
||||||
|
{
|
||||||
|
startRecording();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_KeySequence.appendMouseButton(event->button()))
|
||||||
|
stopRecording();
|
||||||
|
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::startRecording()
|
||||||
|
{
|
||||||
|
keySequence() = KeySequence();
|
||||||
|
setDown(true);
|
||||||
|
setFocus();
|
||||||
|
grabKeyboard();
|
||||||
|
setStatus(Recording);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::stopRecording()
|
||||||
|
{
|
||||||
|
if (!keySequence().valid())
|
||||||
|
{
|
||||||
|
keySequence() = backupSequence();
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
setDown(false);
|
||||||
|
focusNextChild();
|
||||||
|
releaseKeyboard();
|
||||||
|
setStatus(Stopped);
|
||||||
|
emit keySequenceChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeySequenceWidget::event(QEvent* event)
|
||||||
|
{
|
||||||
|
if (status() == Recording)
|
||||||
|
{
|
||||||
|
switch(event->type())
|
||||||
|
{
|
||||||
|
case QEvent::KeyPress:
|
||||||
|
keyPressEvent(static_cast<QKeyEvent*>(event));
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case QEvent::MouseButtonRelease:
|
||||||
|
event->accept();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case QEvent::ShortcutOverride:
|
||||||
|
event->accept();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case QEvent::FocusOut:
|
||||||
|
stopRecording();
|
||||||
|
if (!valid())
|
||||||
|
{
|
||||||
|
keySequence() = backupSequence();
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QPushButton::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::keyPressEvent(QKeyEvent* event)
|
||||||
|
{
|
||||||
|
event->accept();
|
||||||
|
|
||||||
|
if (status() == Stopped)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_KeySequence.appendKey(event->key(), event->modifiers()))
|
||||||
|
stopRecording();
|
||||||
|
|
||||||
|
updateOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeySequenceWidget::updateOutput()
|
||||||
|
{
|
||||||
|
QString s;
|
||||||
|
|
||||||
|
if (m_KeySequence.isMouseButton())
|
||||||
|
s = mousePrefix() + m_KeySequence.toString() + mousePostfix();
|
||||||
|
else
|
||||||
|
s = keyPrefix() + m_KeySequence.toString() + keyPostfix();
|
||||||
|
|
||||||
|
setText(s);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
#if !defined(KEYSEQUENCEWIDGET__H)
|
||||||
|
|
||||||
|
#define KEYSEQUENCEWIDGET__H
|
||||||
|
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
#include "KeySequence.h"
|
||||||
|
|
||||||
|
class KeySequenceWidget : public QPushButton
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
KeySequenceWidget(QWidget* parent, const KeySequence& seq = KeySequence());
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void keySequenceChanged();
|
||||||
|
|
||||||
|
public:
|
||||||
|
const QString& mousePrefix() const { return m_MousePrefix; }
|
||||||
|
const QString& mousePostfix() const { return m_MousePostfix; }
|
||||||
|
const QString& keyPrefix() const { return m_KeyPrefix; }
|
||||||
|
const QString& keyPostfix() const { return m_KeyPostfix; }
|
||||||
|
|
||||||
|
void setMousePrefix(const QString& s) { m_MousePrefix = s; }
|
||||||
|
void setMousePostfix(const QString& s) { m_MousePostfix = s; }
|
||||||
|
void setKeyPrefix(const QString& s) { m_KeyPrefix = s; }
|
||||||
|
void setKeyPostfix(const QString& s) { m_KeyPostfix = s; }
|
||||||
|
|
||||||
|
const KeySequence& keySequence() const { return m_KeySequence; }
|
||||||
|
const KeySequence& backupSequence() const { return m_BackupSequence; }
|
||||||
|
void setKeySequence(const KeySequence& seq);
|
||||||
|
|
||||||
|
bool valid() const { return keySequence().valid(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent*);
|
||||||
|
void keyPressEvent(QKeyEvent*);
|
||||||
|
bool event(QEvent* event);
|
||||||
|
void appendToSequence(int key);
|
||||||
|
void updateOutput();
|
||||||
|
void startRecording();
|
||||||
|
void stopRecording();
|
||||||
|
KeySequence& keySequence() { return m_KeySequence; }
|
||||||
|
KeySequence& backupSequence() { return m_BackupSequence; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum Status { Stopped, Recording };
|
||||||
|
void setStatus(Status s) { m_Status = s; }
|
||||||
|
Status status() const { return m_Status; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
KeySequence m_KeySequence;
|
||||||
|
KeySequence m_BackupSequence;
|
||||||
|
Status m_Status;
|
||||||
|
QString m_MousePrefix;
|
||||||
|
QString m_MousePostfix;
|
||||||
|
QString m_KeyPrefix;
|
||||||
|
QString m_KeyPostfix;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include "LogDialog.h"
|
||||||
|
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
|
LogDialog::LogDialog (QWidget* parent, QProcess*& synergy) :
|
||||||
|
QDialog (parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::LogDialogBase(),
|
||||||
|
m_pSynergy(synergy)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogDialog::append(const QString& s)
|
||||||
|
{
|
||||||
|
m_pLogOutput->append(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogDialog::readSynergyOutput()
|
||||||
|
{
|
||||||
|
if (m_pSynergy)
|
||||||
|
{
|
||||||
|
QByteArray log;
|
||||||
|
log += m_pSynergy->readAllStandardOutput();
|
||||||
|
log += m_pSynergy->readAllStandardError();
|
||||||
|
|
||||||
|
append(QString(log));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#if !defined(LOGDIALOG_H)
|
||||||
|
|
||||||
|
#define LOGDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_LogDialogBase.h"
|
||||||
|
|
||||||
|
class QProcess;
|
||||||
|
|
||||||
|
class LogDialog : public QDialog, public Ui::LogDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
LogDialog(QWidget* parent, QProcess*& synergy);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void append(const QString& s);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void readSynergyOutput();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QProcess*& m_pSynergy;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,450 @@
|
||||||
|
#include "MainWindow.h"
|
||||||
|
#include "AboutDialog.h"
|
||||||
|
#include "ServerConfigDialog.h"
|
||||||
|
#include "SettingsDialog.h"
|
||||||
|
#include "LogDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
#include <QtNetwork>
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
static const char synergyConfigName[] = "synergy.sgc";
|
||||||
|
static const QString synergyConfigFilter(QObject::tr("Synergy Configurations (*.sgc);;All files (*.*)"));
|
||||||
|
#else
|
||||||
|
static const char synergyConfigName[] = "synergy.conf";
|
||||||
|
static const QString synergyConfigFilter(QObject::tr("Synergy Configurations (*.conf);;All files (*.*)"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const char* synergyIconFiles[] =
|
||||||
|
{
|
||||||
|
":/res/icons/16x16/synergy-disconnected.png",
|
||||||
|
":/res/icons/16x16/synergy-connected.png"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* logLevelNames[] =
|
||||||
|
{
|
||||||
|
"ERROR",
|
||||||
|
"WARNING",
|
||||||
|
"NOTE",
|
||||||
|
"INFO",
|
||||||
|
"DEBUG",
|
||||||
|
"DEBUG1",
|
||||||
|
"DEBUG2"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget* parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
MainWindowBase(),
|
||||||
|
m_Settings(),
|
||||||
|
m_AppConfig(&m_Settings),
|
||||||
|
m_pSynergy(NULL),
|
||||||
|
m_SynergyState(synergyDisconnected),
|
||||||
|
m_ServerConfig(&m_Settings, 5, 3),
|
||||||
|
m_pTempConfigFile(NULL),
|
||||||
|
m_pLogDialog(new LogDialog(this, synergyProcess())),
|
||||||
|
m_pLabelStatusBar(NULL),
|
||||||
|
m_pTrayIcon(NULL),
|
||||||
|
m_pTrayIconMenu(NULL)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
createTrayIcon();
|
||||||
|
createMenuBar();
|
||||||
|
createStatusBar();
|
||||||
|
loadSettings();
|
||||||
|
initConnections();
|
||||||
|
|
||||||
|
if (appConfig().autoConnect())
|
||||||
|
startSynergy();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
stopSynergy();
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::createTrayIcon()
|
||||||
|
{
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
m_pTrayIconMenu = new QMenu(this);
|
||||||
|
|
||||||
|
m_pTrayIconMenu->addAction(m_pActionStartSynergy);
|
||||||
|
m_pTrayIconMenu->addAction(m_pActionStopSynergy);
|
||||||
|
m_pTrayIconMenu->addSeparator();
|
||||||
|
|
||||||
|
m_pTrayIconMenu->addAction(m_pActionMinimize);
|
||||||
|
m_pTrayIconMenu->addAction(m_pActionRestore);
|
||||||
|
m_pTrayIconMenu->addSeparator();
|
||||||
|
m_pTrayIconMenu->addAction(m_pActionQuit);
|
||||||
|
|
||||||
|
m_pTrayIcon = new QSystemTrayIcon(this);
|
||||||
|
m_pTrayIcon->setContextMenu(m_pTrayIconMenu);
|
||||||
|
|
||||||
|
setIcon(synergyDisconnected);
|
||||||
|
|
||||||
|
m_pTrayIcon->show();
|
||||||
|
#else
|
||||||
|
setIcon(synergyDisconnected);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::createMenuBar()
|
||||||
|
{
|
||||||
|
QMenuBar* menubar = new QMenuBar(this);
|
||||||
|
QMenu* pMenuFile = new QMenu(tr("&File"), menubar);
|
||||||
|
QMenu* pMenuEdit = new QMenu(tr("&Edit"), menubar);
|
||||||
|
QMenu* pMenuView = new QMenu(tr("&View"), menubar);
|
||||||
|
QMenu* pMenuWindow = new QMenu(tr("&Window"), menubar);
|
||||||
|
QMenu* pMenuHelp = new QMenu(tr("&Help"), menubar);
|
||||||
|
|
||||||
|
menubar->addAction(pMenuFile->menuAction());
|
||||||
|
menubar->addAction(pMenuEdit->menuAction());
|
||||||
|
menubar->addAction(pMenuView->menuAction());
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
menubar->addAction(pMenuWindow->menuAction());
|
||||||
|
#endif
|
||||||
|
menubar->addAction(pMenuHelp->menuAction());
|
||||||
|
|
||||||
|
pMenuFile->addAction(m_pActionStartSynergy);
|
||||||
|
pMenuFile->addAction(m_pActionStopSynergy);
|
||||||
|
pMenuFile->addSeparator();
|
||||||
|
pMenuFile->addAction(m_pActionSave);
|
||||||
|
pMenuFile->addSeparator();
|
||||||
|
pMenuFile->addAction(m_pActionQuit);
|
||||||
|
pMenuEdit->addAction(m_pActionSettings);
|
||||||
|
pMenuView->addAction(m_pActionLogOutput);
|
||||||
|
pMenuWindow->addAction(m_pActionMinimize);
|
||||||
|
pMenuWindow->addAction(m_pActionRestore);
|
||||||
|
pMenuHelp->addAction(m_pActionAbout);
|
||||||
|
|
||||||
|
setMenuBar(menubar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::createStatusBar()
|
||||||
|
{
|
||||||
|
m_pLabelStatusBar = new QLabel(tr("Synergy is not running."));
|
||||||
|
statusBar()->addPermanentWidget(m_pLabelStatusBar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::loadSettings()
|
||||||
|
{
|
||||||
|
// gui
|
||||||
|
QRect rect = settings().value("windowGeometry", geometry()).toRect();
|
||||||
|
move(rect.x(), rect.y());
|
||||||
|
resize(rect.width(), rect.height());
|
||||||
|
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
setVisible(settings().value("windowVisible", true).toBool());
|
||||||
|
#else
|
||||||
|
setVisible(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// program settings
|
||||||
|
|
||||||
|
// the next two must come BEFORE loading groupServerChecked and groupClientChecked or
|
||||||
|
// disabling and/or enabling the right widgets won't automatically work
|
||||||
|
m_pRadioExternalConfig->setChecked(settings().value("externalConfig", false).toBool());
|
||||||
|
m_pRadioInternalConfig->setChecked(settings().value("internalConfig", true).toBool());
|
||||||
|
|
||||||
|
m_pGroupServer->setChecked(settings().value("groupServerChecked", false).toBool());
|
||||||
|
m_pLineEditConfigFile->setText(settings().value("configFile", QDir::homePath() + "/" + synergyConfigName).toString());
|
||||||
|
m_pGroupClient->setChecked(settings().value("groupClientChecked", true).toBool());
|
||||||
|
m_pLineEditHostname->setText(settings().value("serverHostname").toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initConnections()
|
||||||
|
{
|
||||||
|
connect(m_pActionMinimize, SIGNAL(triggered()), this, SLOT(hide()));
|
||||||
|
connect(m_pActionRestore, SIGNAL(triggered()), this, SLOT(showNormal()));
|
||||||
|
connect(m_pActionStartSynergy, SIGNAL(triggered()), this, SLOT(startSynergy()));
|
||||||
|
connect(m_pActionStopSynergy, SIGNAL(triggered()), this, SLOT(stopSynergy()));
|
||||||
|
connect(m_pActionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
|
||||||
|
|
||||||
|
if (m_pTrayIcon)
|
||||||
|
connect(m_pTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::saveSettings()
|
||||||
|
{
|
||||||
|
// gui
|
||||||
|
settings().setValue("windowGeometry", geometry());
|
||||||
|
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
settings().setValue("windowVisible", isVisible());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// program settings
|
||||||
|
settings().setValue("groupServerChecked", m_pGroupServer->isChecked());
|
||||||
|
settings().setValue("externalConfig", m_pRadioExternalConfig->isChecked());
|
||||||
|
settings().setValue("configFile", m_pLineEditConfigFile->text());
|
||||||
|
settings().setValue("internalConfig", m_pRadioInternalConfig->isChecked());
|
||||||
|
settings().setValue("groupClientChecked", m_pGroupClient->isChecked());
|
||||||
|
settings().setValue("serverHostname", m_pLineEditHostname->text());
|
||||||
|
|
||||||
|
settings().sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setIcon(qSynergyState state)
|
||||||
|
{
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
setVisible(state == synergyDisconnected);
|
||||||
|
m_pTrayIcon->setVisible(state == synergyDisconnected);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QIcon icon;
|
||||||
|
icon.addFile(synergyIconFiles[state]);
|
||||||
|
|
||||||
|
if (m_pTrayIcon)
|
||||||
|
m_pTrayIcon->setIcon(icon);
|
||||||
|
|
||||||
|
setWindowIcon(icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
|
||||||
|
{
|
||||||
|
if (reason == QSystemTrayIcon::DoubleClick)
|
||||||
|
setVisible(!isVisible());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::startSynergy()
|
||||||
|
{
|
||||||
|
stopSynergy();
|
||||||
|
|
||||||
|
QString app;
|
||||||
|
QStringList args;
|
||||||
|
|
||||||
|
args << "-f" << "--debug" << logLevelNames[appConfig().logLevel()];
|
||||||
|
|
||||||
|
if (!appConfig().screenName().isEmpty())
|
||||||
|
args << "--name" << appConfig().screenName();
|
||||||
|
|
||||||
|
setSynergyProcess(new QProcess(this));
|
||||||
|
|
||||||
|
if ((synergyType() == synergyClient && !clientArgs(args, app))
|
||||||
|
|| synergyType() == synergyServer && !serverArgs(args, app))
|
||||||
|
{
|
||||||
|
stopSynergy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(synergyProcess(), SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(synergyFinished(int, QProcess::ExitStatus)));
|
||||||
|
connect(synergyProcess(), SIGNAL(readyReadStandardOutput()), m_pLogDialog, SLOT(readSynergyOutput()));
|
||||||
|
connect(synergyProcess(), SIGNAL(readyReadStandardError()), m_pLogDialog, SLOT(readSynergyOutput()));
|
||||||
|
|
||||||
|
m_pLogDialog->append(tr("\n\nRunning synergy: %1 %2\n\n").arg(app).arg(args.join(" ")));
|
||||||
|
|
||||||
|
synergyProcess()->start(app, args);
|
||||||
|
if (!synergyProcess()->waitForStarted())
|
||||||
|
{
|
||||||
|
stopSynergy();
|
||||||
|
QMessageBox::warning(this, tr("Program can not be started"), QString(tr("The executable<br><br>%1<br><br>could not be successfully started, although it does exist. Please check if you have sufficient permissions to run this program.").arg(app)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setSynergyState(synergyConnected);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainWindow::clientArgs(QStringList& args, QString& app)
|
||||||
|
{
|
||||||
|
app = appConfig().synergyc();
|
||||||
|
|
||||||
|
if (!QFile::exists(app))
|
||||||
|
{
|
||||||
|
if (QMessageBox::warning(this, tr("Synergy client not found"), tr("The executable for the synergy client does not exist. Do you want to browse for the synergy client now?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
app = SettingsDialog::browseForSynergyc(this, appConfig().synergyProgramDir(), appConfig().synergycName());
|
||||||
|
|
||||||
|
if (app.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
appConfig().setSynergyc(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pLineEditHostname->text().isEmpty())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, tr("Hostname is empty"), tr("Please fill in a hostname for the synergy client to connect to."));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
args << m_pLineEditHostname->text() + ":" + QString::number(appConfig().port());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainWindow::serverArgs(QStringList& args, QString& app)
|
||||||
|
{
|
||||||
|
app = appConfig().synergys();
|
||||||
|
|
||||||
|
if (!QFile::exists(app))
|
||||||
|
{
|
||||||
|
if (QMessageBox::warning(this, tr("Synergy server not found"), tr("The executable for the synergy server does not exist. Do you want to browse for the synergy server now?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
app = SettingsDialog::browseForSynergys(this, appConfig().synergyProgramDir(), appConfig().synergysName());
|
||||||
|
|
||||||
|
if (app.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
appConfig().setSynergys(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pRadioInternalConfig->isChecked())
|
||||||
|
{
|
||||||
|
m_pTempConfigFile = new QTemporaryFile();
|
||||||
|
if (!m_pTempConfigFile->open())
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this, tr("Cannot write configuration file"), tr("The temporary configuration file required to start synergy can not be written."));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
serverConfig().save(*m_pTempConfigFile);
|
||||||
|
args << "-c" << m_pTempConfigFile->fileName();
|
||||||
|
|
||||||
|
m_pTempConfigFile->close();
|
||||||
|
// the file will be removed from disk when the object is deleted; this happens in stopSynergy()
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!QFile::exists(m_pLineEditConfigFile->text()))
|
||||||
|
{
|
||||||
|
if (QMessageBox::warning(this, tr("Configuration filename invalid"),
|
||||||
|
tr("You have not filled in a valid configuration file for the synergy server. "
|
||||||
|
"Do you want to browse for the configuration file now?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes
|
||||||
|
|| !on_m_pButtonBrowseConfigFile_clicked())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
args << "-c" << m_pLineEditConfigFile->text();
|
||||||
|
}
|
||||||
|
|
||||||
|
args << "--address" << (!appConfig().interface().isEmpty() ? appConfig().interface() : "") + ":" + QString::number(appConfig().port());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::stopSynergy()
|
||||||
|
{
|
||||||
|
if (synergyProcess())
|
||||||
|
{
|
||||||
|
if (synergyProcess()->isOpen())
|
||||||
|
synergyProcess()->close();
|
||||||
|
delete synergyProcess();
|
||||||
|
setSynergyProcess(NULL);
|
||||||
|
|
||||||
|
setSynergyState(synergyDisconnected);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete m_pTempConfigFile;
|
||||||
|
m_pTempConfigFile = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::synergyFinished(int exitCode, QProcess::ExitStatus)
|
||||||
|
{
|
||||||
|
// on Windows, we always seem to have an exit code != 0.
|
||||||
|
#if !defined(Q_OS_WIN)
|
||||||
|
if (exitCode != 0)
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this, tr("Synergy terminated with an error"), QString(tr("Synergy terminated unexpectedly with an exit code of %1.<br><br>Please see the log output for details.")).arg(exitCode));
|
||||||
|
stopSynergy();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
Q_UNUSED(exitCode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setSynergyState(synergyDisconnected);
|
||||||
|
|
||||||
|
// do not call stopSynergy() in case of clean synergy shutdown, because this must have (well, should have...)
|
||||||
|
// come from our own delete synergyProcess() in stopSynergy(), so we would do a double-delete...
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setSynergyState(qSynergyState state)
|
||||||
|
{
|
||||||
|
if (synergyState() == state)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (state == synergyConnected)
|
||||||
|
{
|
||||||
|
disconnect (m_pButtonStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger()));
|
||||||
|
connect (m_pButtonStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger()));
|
||||||
|
m_pButtonStart->setText(tr("&Stop"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disconnect (m_pButtonStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger()));
|
||||||
|
connect (m_pButtonStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger()));
|
||||||
|
m_pButtonStart->setText(tr("&Start"));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pGroupClient->setEnabled(state == synergyDisconnected);
|
||||||
|
m_pGroupServer->setEnabled(state == synergyDisconnected);
|
||||||
|
m_pActionStartSynergy->setEnabled(state == synergyDisconnected);
|
||||||
|
m_pActionStopSynergy->setEnabled(state == synergyConnected);
|
||||||
|
m_pLabelStatusBar->setText(state == synergyConnected ? QString(tr("Synergy %1 is running.")).arg(synergyType() == synergyServer ? tr("server") : tr("client")) : tr("Synergy is not running."));
|
||||||
|
setIcon(state);
|
||||||
|
m_SynergyState = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setVisible(bool visible)
|
||||||
|
{
|
||||||
|
m_pActionMinimize->setEnabled(visible);
|
||||||
|
m_pActionRestore->setEnabled(!visible);
|
||||||
|
QMainWindow::setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainWindow::on_m_pButtonBrowseConfigFile_clicked()
|
||||||
|
{
|
||||||
|
QString fileName = QFileDialog::getOpenFileName(this, tr("Browse for a synergys config file"), QString(), synergyConfigFilter);
|
||||||
|
|
||||||
|
if (!fileName.isEmpty())
|
||||||
|
{
|
||||||
|
m_pLineEditConfigFile->setText(fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainWindow::on_m_pActionSave_triggered()
|
||||||
|
{
|
||||||
|
QString fileName = QFileDialog::getSaveFileName(this, tr("Save configuration as..."));
|
||||||
|
|
||||||
|
if (!fileName.isEmpty() && !serverConfig().save(fileName))
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, tr("Save failed"), tr("Could not save configuration to file."));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_m_pActionAbout_triggered()
|
||||||
|
{
|
||||||
|
AboutDialog dlg(this, appConfig().synergyc());
|
||||||
|
dlg.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_m_pActionSettings_triggered()
|
||||||
|
{
|
||||||
|
SettingsDialog dlg(this, appConfig());
|
||||||
|
dlg.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_m_pActionLogOutput_triggered()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_pLogDialog);
|
||||||
|
|
||||||
|
m_pLogDialog->show();
|
||||||
|
m_pLogDialog->raise();
|
||||||
|
m_pLogDialog->activateWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_m_pButtonConfigureServer_clicked()
|
||||||
|
{
|
||||||
|
ServerConfigDialog dlg(this, serverConfig(), appConfig().screenName());
|
||||||
|
dlg.exec();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
#if !defined(MAINWINDOW__H)
|
||||||
|
|
||||||
|
#define MAINWINDOW__H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
|
#include "ui_MainWindowBase.h"
|
||||||
|
|
||||||
|
#include "ServerConfig.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
|
class QAction;
|
||||||
|
class QMenu;
|
||||||
|
class QLineEdit;
|
||||||
|
class QGroupBox;
|
||||||
|
class QPushButton;
|
||||||
|
class QTextEdit;
|
||||||
|
class QComboBox;
|
||||||
|
class QTabWidget;
|
||||||
|
class QCheckBox;
|
||||||
|
class QRadioButton;
|
||||||
|
class QTemporaryFile;
|
||||||
|
|
||||||
|
class LogDialog;
|
||||||
|
class QSynergyApplication;
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow, public Ui::MainWindowBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
friend class QSynergyApplication;
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum qSynergyState
|
||||||
|
{
|
||||||
|
synergyDisconnected,
|
||||||
|
synergyConnected
|
||||||
|
};
|
||||||
|
|
||||||
|
enum qSynergyType
|
||||||
|
{
|
||||||
|
synergyClient,
|
||||||
|
synergyServer
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
MainWindow(QWidget* parent);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setVisible(bool visible);
|
||||||
|
int synergyType() const { return m_pGroupClient->isChecked() ? synergyClient : synergyServer; }
|
||||||
|
int synergyState() const { return m_SynergyState; }
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void on_m_pGroupClient_toggled(bool on) { m_pGroupServer->setChecked(!on); }
|
||||||
|
void on_m_pGroupServer_toggled(bool on) { m_pGroupClient->setChecked(!on); }
|
||||||
|
bool on_m_pButtonBrowseConfigFile_clicked();
|
||||||
|
void on_m_pButtonConfigureServer_clicked();
|
||||||
|
bool on_m_pActionSave_triggered();
|
||||||
|
void on_m_pActionAbout_triggered();
|
||||||
|
void on_m_pActionSettings_triggered();
|
||||||
|
void on_m_pActionLogOutput_triggered();
|
||||||
|
void synergyFinished(int exitCode, QProcess::ExitStatus);
|
||||||
|
void iconActivated(QSystemTrayIcon::ActivationReason reason);
|
||||||
|
void startSynergy();
|
||||||
|
void stopSynergy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QSettings& settings() { return m_Settings; }
|
||||||
|
AppConfig& appConfig() { return m_AppConfig; }
|
||||||
|
QProcess*& synergyProcess() { return m_pSynergy; }
|
||||||
|
void setSynergyProcess(QProcess* p) { m_pSynergy = p; }
|
||||||
|
ServerConfig& serverConfig() { return m_ServerConfig; }
|
||||||
|
void initConnections();
|
||||||
|
void createMenuBar();
|
||||||
|
void createStatusBar();
|
||||||
|
void createTrayIcon();
|
||||||
|
void loadSettings();
|
||||||
|
void saveSettings();
|
||||||
|
void setIcon(qSynergyState state);
|
||||||
|
void setSynergyState(qSynergyState state);
|
||||||
|
bool checkForApp(int which, QString& app);
|
||||||
|
bool clientArgs(QStringList& args, QString& app);
|
||||||
|
bool serverArgs(QStringList& args, QString& app);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSettings m_Settings;
|
||||||
|
AppConfig m_AppConfig;
|
||||||
|
QProcess* m_pSynergy;
|
||||||
|
int m_SynergyState;
|
||||||
|
ServerConfig m_ServerConfig;
|
||||||
|
QTemporaryFile* m_pTempConfigFile;
|
||||||
|
LogDialog* m_pLogDialog;
|
||||||
|
|
||||||
|
QLabel* m_pLabelStatusBar;
|
||||||
|
QSystemTrayIcon* m_pTrayIcon;
|
||||||
|
QMenu* m_pTrayIconMenu;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include "NewScreenWidget.h"
|
||||||
|
#include "ScreenSetupModel.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
NewScreenWidget::NewScreenWidget(QWidget* parent) :
|
||||||
|
QLabel(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewScreenWidget::mousePressEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
Screen newScreen(tr("Unnamed"));
|
||||||
|
|
||||||
|
QByteArray itemData;
|
||||||
|
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
|
||||||
|
dataStream << -1 << -1 << newScreen;
|
||||||
|
|
||||||
|
QMimeData* pMimeData = new QMimeData;
|
||||||
|
pMimeData->setData(ScreenSetupModel::mimeType(), itemData);
|
||||||
|
|
||||||
|
QDrag* pDrag = new QDrag(this);
|
||||||
|
pDrag->setMimeData(pMimeData);
|
||||||
|
pDrag->setPixmap(*pixmap());
|
||||||
|
pDrag->setHotSpot(event->pos());
|
||||||
|
|
||||||
|
pDrag->exec(Qt::CopyAction, Qt::CopyAction);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#if !defined(NEWSCREENWIDGET__H)
|
||||||
|
|
||||||
|
#define NEWSCREENWIDGET__H
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
class QMouseEvent;
|
||||||
|
class QWidget;
|
||||||
|
|
||||||
|
class NewScreenWidget : public QLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
NewScreenWidget(QWidget* parent);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent* event);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "QSynergyApplication.h"
|
||||||
|
#include "MainWindow.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
QSynergyApplication::QSynergyApplication(int& argc, char** argv) :
|
||||||
|
QApplication(argc, argv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void QSynergyApplication::commitData(QSessionManager&)
|
||||||
|
{
|
||||||
|
foreach(QWidget* widget, topLevelWidgets())
|
||||||
|
{
|
||||||
|
MainWindow* mainWindow = qobject_cast<MainWindow*>(widget);
|
||||||
|
if (mainWindow)
|
||||||
|
mainWindow->saveSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
#if !defined(QSYNERGYAPPLICATION__H)
|
||||||
|
|
||||||
|
#define QSYNERGYAPPLICATION__H
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
class QSessionManager;
|
||||||
|
|
||||||
|
class QSynergyApplication : public QApplication
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QSynergyApplication(int& argc, char** argv);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void commitData(QSessionManager& manager);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
#include "Screen.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
Screen::Screen() :
|
||||||
|
m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")),
|
||||||
|
m_Swapped(false)
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
Screen::Screen(const QString& name) :
|
||||||
|
m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")),
|
||||||
|
m_Swapped(false)
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
setName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Screen::init()
|
||||||
|
{
|
||||||
|
name().clear();
|
||||||
|
aliases().clear();
|
||||||
|
modifiers().clear();
|
||||||
|
switchCorners().clear();
|
||||||
|
fixes().clear();
|
||||||
|
setSwitchCornerSize(0);
|
||||||
|
|
||||||
|
// m_Modifiers, m_SwitchCorners and m_Fixes are QLists we use like fixed-size arrays,
|
||||||
|
// thus we need to make sure to fill them with the required number of elements.
|
||||||
|
for (int i = 0; i < NumModifiers; i++)
|
||||||
|
modifiers() << i;
|
||||||
|
|
||||||
|
for (int i = 0; i < NumSwitchCorners; i++)
|
||||||
|
switchCorners() << false;
|
||||||
|
|
||||||
|
for (int i = 0; i < NumFixes; i++)
|
||||||
|
fixes() << false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Screen::loadSettings(QSettings& settings)
|
||||||
|
{
|
||||||
|
setName(settings.value("name").toString());
|
||||||
|
|
||||||
|
if (name().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
setSwitchCornerSize(settings.value("switchCornerSize").toInt());
|
||||||
|
|
||||||
|
readSettings(settings, aliases(), "alias", QString(""));
|
||||||
|
readSettings(settings, modifiers(), "modifier", static_cast<int>(DefaultMod), NumModifiers);
|
||||||
|
readSettings(settings, switchCorners(), "switchCorner", false, NumSwitchCorners);
|
||||||
|
readSettings(settings, fixes(), "fix", false, NumFixes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Screen::saveSettings(QSettings& settings) const
|
||||||
|
{
|
||||||
|
settings.setValue("name", name());
|
||||||
|
|
||||||
|
if (name().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
settings.setValue("switchCornerSize", switchCornerSize());
|
||||||
|
|
||||||
|
writeSettings(settings, aliases(), "alias");
|
||||||
|
writeSettings(settings, modifiers(), "modifier");
|
||||||
|
writeSettings(settings, switchCorners(), "switchCorner");
|
||||||
|
writeSettings(settings, fixes(), "fix");
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& Screen::writeScreensSection(QTextStream& outStream) const
|
||||||
|
{
|
||||||
|
outStream << "\t" << name() << ":" << endl;
|
||||||
|
|
||||||
|
for (int i = 0; i < modifiers().size(); i++)
|
||||||
|
if (modifier(i) != i)
|
||||||
|
outStream << "\t\t" << modifierName(i) << " = " << modifierName(modifier(i)) << endl;
|
||||||
|
|
||||||
|
for (int i = 0; i < fixes().size(); i++)
|
||||||
|
outStream << "\t\t" << fixName(i) << " = " << (fixes()[i] ? "true" : "false") << endl;
|
||||||
|
|
||||||
|
outStream << "\t\t" << "switchCorners = none ";
|
||||||
|
for (int i = 0; i < switchCorners().size(); i++)
|
||||||
|
if (switchCorners()[i])
|
||||||
|
outStream << "+" << switchCornerName(i) << " ";
|
||||||
|
outStream << endl;
|
||||||
|
|
||||||
|
outStream << "\t\t" << "switchCornerSize = " << switchCornerSize() << endl;
|
||||||
|
|
||||||
|
return outStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& Screen::writeAliasesSection(QTextStream& outStream) const
|
||||||
|
{
|
||||||
|
if (!aliases().isEmpty())
|
||||||
|
{
|
||||||
|
outStream << "\t" << name() << ":" << endl;
|
||||||
|
|
||||||
|
foreach (const QString& alias, aliases())
|
||||||
|
outStream << "\t\t" << alias << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return outStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream& operator<<(QDataStream& outStream, const Screen& screen)
|
||||||
|
{
|
||||||
|
return outStream
|
||||||
|
<< screen.name()
|
||||||
|
<< screen.switchCornerSize()
|
||||||
|
<< screen.aliases()
|
||||||
|
<< screen.modifiers()
|
||||||
|
<< screen.switchCorners()
|
||||||
|
<< screen.fixes()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream& operator>>(QDataStream& inStream, Screen& screen)
|
||||||
|
{
|
||||||
|
return inStream
|
||||||
|
>> screen.m_Name
|
||||||
|
>> screen.m_SwitchCornerSize
|
||||||
|
>> screen.m_Aliases
|
||||||
|
>> screen.m_Modifiers
|
||||||
|
>> screen.m_SwitchCorners
|
||||||
|
>> screen.m_Fixes
|
||||||
|
;
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
#if !defined(SCREEN__H)
|
||||||
|
|
||||||
|
#define SCREEN__H
|
||||||
|
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QString>
|
||||||
|
#include <QList>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
#include "BaseConfig.h"
|
||||||
|
|
||||||
|
class QSettings;
|
||||||
|
class QTextStream;
|
||||||
|
|
||||||
|
class ScreenSettingsDialog;
|
||||||
|
|
||||||
|
class Screen : public BaseConfig
|
||||||
|
{
|
||||||
|
friend QDataStream& operator<<(QDataStream& outStream, const Screen& screen);
|
||||||
|
friend QDataStream& operator>>(QDataStream& inStream, Screen& screen);
|
||||||
|
friend class ScreenSettingsDialog;
|
||||||
|
friend class ScreenSetupModel;
|
||||||
|
friend class ScreenSetupView;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Screen();
|
||||||
|
Screen(const QString& name);
|
||||||
|
|
||||||
|
public:
|
||||||
|
const QPixmap* pixmap() const { return &m_Pixmap; }
|
||||||
|
const QString& name() const { return m_Name; }
|
||||||
|
const QStringList& aliases() const { return m_Aliases; }
|
||||||
|
|
||||||
|
bool isNull() const { return m_Name.isEmpty(); }
|
||||||
|
int modifier(int m) const { return m_Modifiers[m] == DefaultMod ? m : m_Modifiers[m]; }
|
||||||
|
const QList<int>& modifiers() const { return m_Modifiers; }
|
||||||
|
bool switchCorner(int c) const { return m_SwitchCorners[c]; }
|
||||||
|
const QList<bool>& switchCorners() const { return m_SwitchCorners; }
|
||||||
|
int switchCornerSize() const { return m_SwitchCornerSize; }
|
||||||
|
bool fix(Fix f) const { return m_Fixes[f]; }
|
||||||
|
const QList<bool>& fixes() const { return m_Fixes; }
|
||||||
|
|
||||||
|
void loadSettings(QSettings& settings);
|
||||||
|
void saveSettings(QSettings& settings) const;
|
||||||
|
QTextStream& writeScreensSection(QTextStream& outStream) const;
|
||||||
|
QTextStream& writeAliasesSection(QTextStream& outStream) const;
|
||||||
|
|
||||||
|
bool swapped() const { return m_Swapped; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void init();
|
||||||
|
void setName(const QString& name) { m_Name = name; }
|
||||||
|
QPixmap* pixmap() { return &m_Pixmap; }
|
||||||
|
QString& name() { return m_Name; }
|
||||||
|
|
||||||
|
void setPixmap(const QPixmap& pixmap) { m_Pixmap = pixmap; }
|
||||||
|
QStringList& aliases() { return m_Aliases; }
|
||||||
|
void setModifier(int m, int n) { m_Modifiers[m] = n; }
|
||||||
|
QList<int>& modifiers() { return m_Modifiers; }
|
||||||
|
void addAlias(const QString& alias) { m_Aliases.append(alias); }
|
||||||
|
void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; }
|
||||||
|
QList<bool>& switchCorners() { return m_SwitchCorners; }
|
||||||
|
void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; }
|
||||||
|
void setFix(int f, bool on) { m_Fixes[f] = on; }
|
||||||
|
QList<bool>& fixes() { return m_Fixes; }
|
||||||
|
void setSwapped(bool on) { m_Swapped = on; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPixmap m_Pixmap;
|
||||||
|
QString m_Name;
|
||||||
|
|
||||||
|
QStringList m_Aliases;
|
||||||
|
QList<int> m_Modifiers;
|
||||||
|
QList<bool> m_SwitchCorners;
|
||||||
|
int m_SwitchCornerSize;
|
||||||
|
QList<bool> m_Fixes;
|
||||||
|
|
||||||
|
bool m_Swapped;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef QList<Screen> ScreenList;
|
||||||
|
|
||||||
|
QDataStream& operator<<(QDataStream& outStream, const Screen& screen);
|
||||||
|
QDataStream& operator>>(QDataStream& inStream, Screen& screen);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
#include "ScreenSettingsDialog.h"
|
||||||
|
#include "Screen.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
ScreenSettingsDialog::ScreenSettingsDialog(QWidget* parent, Screen* pScreen) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::ScreenSettingsDialogBase(),
|
||||||
|
m_pScreen(pScreen)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
QRegExp validScreenName("[a-z_][a-z0-9\\._-]{,31}", Qt::CaseInsensitive);
|
||||||
|
|
||||||
|
m_pLineEditName->setText(m_pScreen->name());
|
||||||
|
m_pLineEditName->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName));
|
||||||
|
m_pLineEditName->selectAll();
|
||||||
|
|
||||||
|
m_pLineEditAlias->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName));
|
||||||
|
|
||||||
|
for (int i = 0; i < m_pScreen->aliases().count(); i++)
|
||||||
|
new QListWidgetItem(m_pScreen->aliases()[i], m_pListAliases);
|
||||||
|
|
||||||
|
m_pComboBoxShift->setCurrentIndex(m_pScreen->modifier(Screen::Shift));
|
||||||
|
m_pComboBoxCtrl->setCurrentIndex(m_pScreen->modifier(Screen::Ctrl));
|
||||||
|
m_pComboBoxAlt->setCurrentIndex(m_pScreen->modifier(Screen::Alt));
|
||||||
|
m_pComboBoxMeta->setCurrentIndex(m_pScreen->modifier(Screen::Meta));
|
||||||
|
m_pComboBoxSuper->setCurrentIndex(m_pScreen->modifier(Screen::Super));
|
||||||
|
|
||||||
|
m_pCheckBoxCornerTopLeft->setChecked(m_pScreen->switchCorner(Screen::TopLeft));
|
||||||
|
m_pCheckBoxCornerTopRight->setChecked(m_pScreen->switchCorner(Screen::TopRight));
|
||||||
|
m_pCheckBoxCornerBottomLeft->setChecked(m_pScreen->switchCorner(Screen::BottomLeft));
|
||||||
|
m_pCheckBoxCornerBottomRight->setChecked(m_pScreen->switchCorner(Screen::BottomRight));
|
||||||
|
m_pSpinBoxSwitchCornerSize->setValue(m_pScreen->switchCornerSize());
|
||||||
|
|
||||||
|
m_pCheckBoxCapsLock->setChecked(m_pScreen->fix(Screen::CapsLock));
|
||||||
|
m_pCheckBoxNumLock->setChecked(m_pScreen->fix(Screen::NumLock));
|
||||||
|
m_pCheckBoxScrollLock->setChecked(m_pScreen->fix(Screen::ScrollLock));
|
||||||
|
m_pCheckBoxXTest->setChecked(m_pScreen->fix(Screen::XTest));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSettingsDialog::accept()
|
||||||
|
{
|
||||||
|
if (m_pLineEditName->text().isEmpty())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, tr("Screen name is empty"), tr("The name for a screen can not be empty. Please fill in a name or cancel the dialog."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pScreen->init();
|
||||||
|
|
||||||
|
m_pScreen->setName(m_pLineEditName->text());
|
||||||
|
|
||||||
|
for (int i = 0; i < m_pListAliases->count(); i++)
|
||||||
|
m_pScreen->addAlias(m_pListAliases->item(i)->text());
|
||||||
|
|
||||||
|
m_pScreen->setModifier(Screen::Shift, m_pComboBoxShift->currentIndex());
|
||||||
|
m_pScreen->setModifier(Screen::Ctrl, m_pComboBoxCtrl->currentIndex());
|
||||||
|
m_pScreen->setModifier(Screen::Alt, m_pComboBoxAlt->currentIndex());
|
||||||
|
m_pScreen->setModifier(Screen::Meta, m_pComboBoxMeta->currentIndex());
|
||||||
|
m_pScreen->setModifier(Screen::Super, m_pComboBoxSuper->currentIndex());
|
||||||
|
|
||||||
|
m_pScreen->setSwitchCorner(Screen::TopLeft, m_pCheckBoxCornerTopLeft->isChecked());
|
||||||
|
m_pScreen->setSwitchCorner(Screen::TopRight, m_pCheckBoxCornerTopRight->isChecked());
|
||||||
|
m_pScreen->setSwitchCorner(Screen::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked());
|
||||||
|
m_pScreen->setSwitchCorner(Screen::BottomRight, m_pCheckBoxCornerBottomRight->isChecked());
|
||||||
|
m_pScreen->setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value());
|
||||||
|
|
||||||
|
m_pScreen->setFix(Screen::CapsLock, m_pCheckBoxCapsLock->isChecked());
|
||||||
|
m_pScreen->setFix(Screen::NumLock, m_pCheckBoxNumLock->isChecked());
|
||||||
|
m_pScreen->setFix(Screen::ScrollLock, m_pCheckBoxScrollLock->isChecked());
|
||||||
|
m_pScreen->setFix(Screen::XTest, m_pCheckBoxXTest->isChecked());
|
||||||
|
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSettingsDialog::on_m_pButtonAddAlias_clicked()
|
||||||
|
{
|
||||||
|
if (!m_pLineEditAlias->text().isEmpty() && m_pListAliases->findItems(m_pLineEditAlias->text(), Qt::MatchFixedString).isEmpty())
|
||||||
|
{
|
||||||
|
new QListWidgetItem(m_pLineEditAlias->text(), m_pListAliases);
|
||||||
|
m_pLineEditAlias->clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSettingsDialog::on_m_pLineEditAlias_textChanged(const QString& text)
|
||||||
|
{
|
||||||
|
m_pButtonAddAlias->setEnabled(!text.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSettingsDialog::on_m_pButtonRemoveAlias_clicked()
|
||||||
|
{
|
||||||
|
QList<QListWidgetItem*> items = m_pListAliases->selectedItems();
|
||||||
|
|
||||||
|
for (int i = 0; i < items.count(); i++)
|
||||||
|
delete items[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSettingsDialog::on_m_pListAliases_itemSelectionChanged()
|
||||||
|
{
|
||||||
|
m_pButtonRemoveAlias->setEnabled(!m_pListAliases->selectedItems().isEmpty());
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#if !defined(SCREENSETTINGSDIALOG__H)
|
||||||
|
|
||||||
|
#define SCREENSETTINGSDIALOG__H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_ScreenSettingsDialogBase.h"
|
||||||
|
|
||||||
|
class QWidget;
|
||||||
|
class QString;
|
||||||
|
|
||||||
|
class Screen;
|
||||||
|
|
||||||
|
class ScreenSettingsDialog : public QDialog, public Ui::ScreenSettingsDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScreenSettingsDialog(QWidget* parent, Screen* pScreen = NULL);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void accept();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_m_pButtonAddAlias_clicked();
|
||||||
|
void on_m_pButtonRemoveAlias_clicked();
|
||||||
|
void on_m_pLineEditAlias_textChanged(const QString& text);
|
||||||
|
void on_m_pListAliases_itemSelectionChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Screen* m_pScreen;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
#include "ScreenSetupModel.h"
|
||||||
|
#include "Screen.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
const QString ScreenSetupModel::m_MimeType = "application/x-qsynergy-screen";
|
||||||
|
|
||||||
|
ScreenSetupModel::ScreenSetupModel(ScreenList& screens, int numColumns, int numRows) :
|
||||||
|
QAbstractTableModel(NULL),
|
||||||
|
m_Screens(screens),
|
||||||
|
m_NumColumns(numColumns),
|
||||||
|
m_NumRows(numRows)
|
||||||
|
{
|
||||||
|
if (m_NumColumns * m_NumRows > screens.size())
|
||||||
|
qFatal("Not enough elements (%u) in screens QList for %d columns and %d rows", screens.size(), m_NumColumns, m_NumRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant ScreenSetupModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
if (index.isValid() && index.row() < m_NumRows && index.column() < m_NumColumns)
|
||||||
|
{
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DecorationRole:
|
||||||
|
if (screen(index).isNull())
|
||||||
|
break;
|
||||||
|
return QIcon(*screen(index).pixmap());
|
||||||
|
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
if (screen(index).isNull())
|
||||||
|
break;
|
||||||
|
return QString(tr(
|
||||||
|
"<center>Screen: <b>%1</b></center>"
|
||||||
|
"<br>Double click to edit settings"
|
||||||
|
"<br>Drag screen to the trashcan to remove it")).arg(screen(index).name());
|
||||||
|
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
if (screen(index).isNull())
|
||||||
|
break;
|
||||||
|
return screen(index).name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::ItemFlags ScreenSetupModel::flags(const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() >= m_NumRows || index.column() >= m_NumColumns)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!screen(index).isNull())
|
||||||
|
return Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
|
||||||
|
|
||||||
|
return Qt::ItemIsDropEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::DropActions ScreenSetupModel::supportedDropActions() const
|
||||||
|
{
|
||||||
|
return Qt::MoveAction | Qt::CopyAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ScreenSetupModel::mimeTypes() const
|
||||||
|
{
|
||||||
|
return QStringList() << m_MimeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMimeData* ScreenSetupModel::mimeData(const QModelIndexList& indexes) const
|
||||||
|
{
|
||||||
|
QMimeData* pMimeData = new QMimeData();
|
||||||
|
QByteArray encodedData;
|
||||||
|
|
||||||
|
QDataStream stream(&encodedData, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
foreach (const QModelIndex& index, indexes)
|
||||||
|
if (index.isValid())
|
||||||
|
stream << index.column() << index.row() << screen(index);
|
||||||
|
|
||||||
|
pMimeData->setData(m_MimeType, encodedData);
|
||||||
|
|
||||||
|
return pMimeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScreenSetupModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent)
|
||||||
|
{
|
||||||
|
if (action == Qt::IgnoreAction)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!data->hasFormat(m_MimeType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!parent.isValid() || row != -1 || column != -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QByteArray encodedData = data->data(m_MimeType);
|
||||||
|
QDataStream stream(&encodedData, QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
int sourceColumn = -1;
|
||||||
|
int sourceRow = -1;
|
||||||
|
|
||||||
|
stream >> sourceColumn;
|
||||||
|
stream >> sourceRow;
|
||||||
|
|
||||||
|
// don't drop screen onto itself
|
||||||
|
if (sourceColumn == parent.column() && sourceRow == parent.row())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Screen droppedScreen;
|
||||||
|
stream >> droppedScreen;
|
||||||
|
|
||||||
|
Screen oldScreen = screen(parent.column(), parent.row());
|
||||||
|
if (!oldScreen.isNull() && sourceColumn != -1 && sourceRow != -1)
|
||||||
|
{
|
||||||
|
// mark the screen so it isn't deleted after the dragndrop succeeded
|
||||||
|
// see ScreenSetupView::startDrag()
|
||||||
|
oldScreen.setSwapped(true);
|
||||||
|
screen(sourceColumn, sourceRow) = oldScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen(parent.column(), parent.row()) = droppedScreen;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
#if !defined(SCREENSETUPMODEL__H)
|
||||||
|
|
||||||
|
#define SCREENSETUPMODEL__H
|
||||||
|
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
#include "Screen.h"
|
||||||
|
|
||||||
|
class ScreenSetupView;
|
||||||
|
class ServerConfigDialog;
|
||||||
|
|
||||||
|
class ScreenSetupModel : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
friend class ScreenSetupView;
|
||||||
|
friend class ServerConfigDialog;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScreenSetupModel(ScreenList& screens, int numColumns, int numRows);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const QString& mimeType() { return m_MimeType; }
|
||||||
|
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
|
||||||
|
int rowCount() const { return m_NumRows; }
|
||||||
|
int columnCount() const { return m_NumColumns; }
|
||||||
|
int rowCount(const QModelIndex&) const { return rowCount(); }
|
||||||
|
int columnCount(const QModelIndex&) const { return columnCount(); }
|
||||||
|
Qt::DropActions supportedDropActions() const;
|
||||||
|
Qt::ItemFlags flags(const QModelIndex& index) const;
|
||||||
|
QStringList mimeTypes() const;
|
||||||
|
QMimeData* mimeData(const QModelIndexList& indexes) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent);
|
||||||
|
const Screen& screen(const QModelIndex& index) const { return screen(index.column(), index.row()); }
|
||||||
|
Screen& screen(const QModelIndex& index) { return screen(index.column(), index.row()); }
|
||||||
|
const Screen& screen(int column, int row) const { return m_Screens[row * m_NumColumns + column]; }
|
||||||
|
Screen& screen(int column, int row) { return m_Screens[row * m_NumColumns + column]; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ScreenList& m_Screens;
|
||||||
|
const int m_NumColumns;
|
||||||
|
const int m_NumRows;
|
||||||
|
|
||||||
|
static const QString m_MimeType;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,143 @@
|
||||||
|
#include "ScreenSetupView.h"
|
||||||
|
#include "ScreenSetupModel.h"
|
||||||
|
#include "ScreenSettingsDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
ScreenSetupView::ScreenSetupView(QWidget* parent) :
|
||||||
|
QTableView(parent)
|
||||||
|
{
|
||||||
|
setDropIndicatorShown(true);
|
||||||
|
setDragDropMode(DragDrop);
|
||||||
|
setSelectionMode(SingleSelection);
|
||||||
|
|
||||||
|
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
|
||||||
|
setIconSize(QSize(64, 64));
|
||||||
|
horizontalHeader()->hide();
|
||||||
|
verticalHeader()->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::setModel(ScreenSetupModel* model)
|
||||||
|
{
|
||||||
|
QTableView::setModel(model);
|
||||||
|
setTableSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
ScreenSetupModel* ScreenSetupView::model() const
|
||||||
|
{
|
||||||
|
return qobject_cast<ScreenSetupModel*>(QTableView::model());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::setTableSize()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < model()->columnCount(); i++)
|
||||||
|
setColumnWidth(i, width() / model()->columnCount());
|
||||||
|
|
||||||
|
for (int i = 0; i < model()->rowCount(); i++)
|
||||||
|
setRowHeight(i, height() / model()->rowCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::resizeEvent(QResizeEvent* event)
|
||||||
|
{
|
||||||
|
setTableSize();
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (event->buttons() & Qt::LeftButton)
|
||||||
|
{
|
||||||
|
int col = columnAt(event->pos().x());
|
||||||
|
int row = rowAt(event->pos().y());
|
||||||
|
|
||||||
|
if (!model()->screen(col, row).isNull())
|
||||||
|
{
|
||||||
|
ScreenSettingsDialog dlg(this, &model()->screen(col, row));
|
||||||
|
dlg.exec();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::dragEnterEvent(QDragEnterEvent* event)
|
||||||
|
{
|
||||||
|
// we accept anything that enters us by a drag as long as the
|
||||||
|
// mime type is okay. anything else is dealt with in dragMoveEvent()
|
||||||
|
if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType()))
|
||||||
|
event->accept();
|
||||||
|
else
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenSetupView::dragMoveEvent(QDragMoveEvent* event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType()))
|
||||||
|
{
|
||||||
|
// where does the event come from? myself or someone else?
|
||||||
|
if (event->source() == this)
|
||||||
|
{
|
||||||
|
// myself is ok, but then it must be a move action, never a copy
|
||||||
|
event->setDropAction(Qt::MoveAction);
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int col = columnAt(event->pos().x());
|
||||||
|
int row = rowAt(event->pos().y());
|
||||||
|
|
||||||
|
// a drop from outside is not allowed if there's a screen already there.
|
||||||
|
if (!model()->screen(col, row).isNull())
|
||||||
|
event->ignore();
|
||||||
|
else
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is reimplemented from QAbstractItemView::startDrag()
|
||||||
|
void ScreenSetupView::startDrag(Qt::DropActions)
|
||||||
|
{
|
||||||
|
QModelIndexList indexes = selectedIndexes();
|
||||||
|
|
||||||
|
if (indexes.count() != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QMimeData* pData = model()->mimeData(indexes);
|
||||||
|
if (pData == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QPixmap pixmap = *model()->screen(indexes[0]).pixmap();
|
||||||
|
QDrag* pDrag = new QDrag(this);
|
||||||
|
pDrag->setPixmap(pixmap);
|
||||||
|
pDrag->setMimeData(pData);
|
||||||
|
pDrag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
|
||||||
|
|
||||||
|
if (pDrag->exec(Qt::MoveAction, Qt::MoveAction) == Qt::MoveAction)
|
||||||
|
{
|
||||||
|
selectionModel()->clear();
|
||||||
|
|
||||||
|
// make sure to only delete the drag source if screens weren't swapped
|
||||||
|
// see ScreenSetupModel::dropMimeData
|
||||||
|
if (!model()->screen(indexes[0]).swapped())
|
||||||
|
model()->screen(indexes[0]) = Screen();
|
||||||
|
else
|
||||||
|
model()->screen(indexes[0]).setSwapped(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStyleOptionViewItem ScreenSetupView::viewOptions() const
|
||||||
|
{
|
||||||
|
QStyleOptionViewItem option = QTableView::viewOptions();
|
||||||
|
option.showDecorationSelected = true;
|
||||||
|
option.decorationPosition = QStyleOptionViewItem::Top;
|
||||||
|
option.displayAlignment = Qt::AlignCenter;
|
||||||
|
option.textElideMode = Qt::ElideMiddle;
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
#if !defined(SCREENSETUPVIEW__H)
|
||||||
|
|
||||||
|
#define SCREENSETUPVIEW__H
|
||||||
|
|
||||||
|
#include <QTableView>
|
||||||
|
#include <QFlags>
|
||||||
|
|
||||||
|
#include "Screen.h"
|
||||||
|
|
||||||
|
class QWidget;
|
||||||
|
class QMouseEvent;
|
||||||
|
class QResizeEvent;
|
||||||
|
class QDragEnterEvent;
|
||||||
|
class ScreenSetupModel;
|
||||||
|
|
||||||
|
class ScreenSetupView : public QTableView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScreenSetupView(QWidget* parent);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setModel(ScreenSetupModel* model);
|
||||||
|
ScreenSetupModel* model() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent*);
|
||||||
|
void setTableSize();
|
||||||
|
void resizeEvent(QResizeEvent*);
|
||||||
|
void dragEnterEvent(QDragEnterEvent* event);
|
||||||
|
void dragMoveEvent(QDragMoveEvent* event);
|
||||||
|
void startDrag(Qt::DropActions supportedActions);
|
||||||
|
QStyleOptionViewItem viewOptions() const;
|
||||||
|
void scrollTo(const QModelIndex&, ScrollHint) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
#include "ServerConfig.h"
|
||||||
|
#include "Hotkey.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
const char* name;
|
||||||
|
} neighbourDirs[] =
|
||||||
|
{
|
||||||
|
{ 0, -1, "up" },
|
||||||
|
{ 1, 0, "right" },
|
||||||
|
{ 0, 1, "down" },
|
||||||
|
{ -1, 0, "left" },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ServerConfig::ServerConfig(QSettings* settings, int numColumns, int numRows) :
|
||||||
|
m_pSettings(settings),
|
||||||
|
m_Screens(),
|
||||||
|
m_NumColumns(numColumns),
|
||||||
|
m_NumRows(numRows)
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_pSettings);
|
||||||
|
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerConfig::~ServerConfig()
|
||||||
|
{
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ServerConfig::save(const QString& fileName) const
|
||||||
|
{
|
||||||
|
QFile file(fileName);
|
||||||
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
save(file);
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfig::save(QFile& file) const
|
||||||
|
{
|
||||||
|
QTextStream outStream(&file);
|
||||||
|
outStream << *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfig::init()
|
||||||
|
{
|
||||||
|
switchCorners().clear();
|
||||||
|
screens().clear();
|
||||||
|
|
||||||
|
// m_NumSwitchCorners is used as a fixed size array. See Screen::init()
|
||||||
|
for (int i = 0; i < NumSwitchCorners; i++)
|
||||||
|
switchCorners() << false;
|
||||||
|
|
||||||
|
// There must always be screen objects for each cell in the screens QList. Unused screens
|
||||||
|
// are identified by having an empty name.
|
||||||
|
for (int i = 0; i < numColumns() * numRows(); i++)
|
||||||
|
addScreen(Screen());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfig::saveSettings()
|
||||||
|
{
|
||||||
|
settings().beginGroup("internalConfig");
|
||||||
|
settings().remove("");
|
||||||
|
|
||||||
|
settings().setValue("numColumns", numColumns());
|
||||||
|
settings().setValue("numRows", numRows());
|
||||||
|
|
||||||
|
settings().setValue("hasHeartbeat", hasHeartbeat());
|
||||||
|
settings().setValue("heartbeat", heartbeat());
|
||||||
|
settings().setValue("relativeMouseMoves", relativeMouseMoves());
|
||||||
|
settings().setValue("screenSaverSync", screenSaverSync());
|
||||||
|
settings().setValue("win32KeepForeground", win32KeepForeground());
|
||||||
|
settings().setValue("hasSwitchDelay", hasSwitchDelay());
|
||||||
|
settings().setValue("switchDelay", switchDelay());
|
||||||
|
settings().setValue("hasSwitchDoubleTap", hasSwitchDoubleTap());
|
||||||
|
settings().setValue("switchDoubleTap", switchDoubleTap());
|
||||||
|
settings().setValue("switchCornerSize", switchCornerSize());
|
||||||
|
|
||||||
|
writeSettings(settings(), switchCorners(), "switchCorner");
|
||||||
|
|
||||||
|
settings().beginWriteArray("screens");
|
||||||
|
for (int i = 0; i < screens().size(); i++)
|
||||||
|
{
|
||||||
|
settings().setArrayIndex(i);
|
||||||
|
screens()[i].saveSettings(settings());
|
||||||
|
}
|
||||||
|
settings().endArray();
|
||||||
|
|
||||||
|
settings().beginWriteArray("hotkeys");
|
||||||
|
for (int i = 0; i < hotkeys().size(); i++)
|
||||||
|
{
|
||||||
|
settings().setArrayIndex(i);
|
||||||
|
hotkeys()[i].saveSettings(settings());
|
||||||
|
}
|
||||||
|
settings().endArray();
|
||||||
|
|
||||||
|
settings().endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfig::loadSettings()
|
||||||
|
{
|
||||||
|
settings().beginGroup("internalConfig");
|
||||||
|
|
||||||
|
setNumColumns(settings().value("numColumns", 5).toInt());
|
||||||
|
setNumRows(settings().value("numRows", 3).toInt());
|
||||||
|
|
||||||
|
// we need to know the number of columns and rows before we can set up ourselves
|
||||||
|
init();
|
||||||
|
|
||||||
|
haveHeartbeat(settings().value("hasHeartbeat", false).toBool());
|
||||||
|
setHeartbeat(settings().value("heartbeat", 5000).toInt());
|
||||||
|
setRelativeMouseMoves(settings().value("relativeMouseMoves", false).toBool());
|
||||||
|
setScreenSaverSync(settings().value("screenSaverSync", true).toBool());
|
||||||
|
setWin32KeepForeground(settings().value("win32KeepForeground", false).toBool());
|
||||||
|
haveSwitchDelay(settings().value("hasSwitchDelay", false).toBool());
|
||||||
|
setSwitchDelay(settings().value("switchDelay", 250).toInt());
|
||||||
|
haveSwitchDoubleTap(settings().value("hasSwitchDoubleTap", false).toBool());
|
||||||
|
setSwitchDoubleTap(settings().value("switchDoubleTap", 250).toInt());
|
||||||
|
setSwitchCornerSize(settings().value("switchCornerSize").toInt());
|
||||||
|
|
||||||
|
readSettings(settings(), switchCorners(), "switchCorner", false, NumSwitchCorners);
|
||||||
|
|
||||||
|
int numScreens = settings().beginReadArray("screens");
|
||||||
|
Q_ASSERT(numScreens <= screens().size());
|
||||||
|
for (int i = 0; i < numScreens; i++)
|
||||||
|
{
|
||||||
|
settings().setArrayIndex(i);
|
||||||
|
screens()[i].loadSettings(settings());
|
||||||
|
}
|
||||||
|
settings().endArray();
|
||||||
|
|
||||||
|
int numHotkeys = settings().beginReadArray("hotkeys");
|
||||||
|
for (int i = 0; i < numHotkeys; i++)
|
||||||
|
{
|
||||||
|
settings().setArrayIndex(i);
|
||||||
|
Hotkey h;
|
||||||
|
h.loadSettings(settings());
|
||||||
|
hotkeys().append(h);
|
||||||
|
}
|
||||||
|
settings().endArray();
|
||||||
|
|
||||||
|
settings().endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ServerConfig::adjacentScreenIndex(int idx, int deltaColumn, int deltaRow) const
|
||||||
|
{
|
||||||
|
if (screens()[idx].isNull())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// if we're at the left or right end of the table, don't find results going further left or right
|
||||||
|
if ((deltaColumn > 0 && (idx+1) % numColumns() == 0)
|
||||||
|
|| (deltaColumn < 0 && idx % numColumns() == 0))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int arrayPos = idx + deltaColumn + deltaRow * numColumns();
|
||||||
|
|
||||||
|
if (arrayPos >= screens().size() || arrayPos < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return arrayPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config)
|
||||||
|
{
|
||||||
|
outStream << "section: screens" << endl;
|
||||||
|
|
||||||
|
foreach (const Screen& s, config.screens())
|
||||||
|
if (!s.isNull())
|
||||||
|
s.writeScreensSection(outStream);
|
||||||
|
|
||||||
|
outStream << "end" << endl << endl;
|
||||||
|
|
||||||
|
outStream << "section: aliases" << endl;
|
||||||
|
|
||||||
|
foreach (const Screen& s, config.screens())
|
||||||
|
if (!s.isNull())
|
||||||
|
s.writeAliasesSection(outStream);
|
||||||
|
|
||||||
|
outStream << "end" << endl << endl;
|
||||||
|
|
||||||
|
outStream << "section: links" << endl;
|
||||||
|
|
||||||
|
for (int i = 0; i < config.screens().size(); i++)
|
||||||
|
if (!config.screens()[i].isNull())
|
||||||
|
{
|
||||||
|
outStream << "\t" << config.screens()[i].name() << ":" << endl;
|
||||||
|
|
||||||
|
for (unsigned int j = 0; j < sizeof(neighbourDirs) / sizeof(neighbourDirs[0]); j++)
|
||||||
|
{
|
||||||
|
int idx = config.adjacentScreenIndex(i, neighbourDirs[j].x, neighbourDirs[j].y);
|
||||||
|
if (idx != -1 && !config.screens()[idx].isNull())
|
||||||
|
outStream << "\t\t" << neighbourDirs[j].name << " = " << config.screens()[idx].name() << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outStream << "end" << endl << endl;
|
||||||
|
|
||||||
|
outStream << "section: options" << endl;
|
||||||
|
|
||||||
|
if (config.hasHeartbeat())
|
||||||
|
outStream << "\t" << "heartbeat = " << config.heartbeat() << endl;
|
||||||
|
|
||||||
|
outStream << "\t" << "relativeMouseMoves = " << (config.relativeMouseMoves() ? "true" : "false") << endl;
|
||||||
|
outStream << "\t" << "screenSaverSync = " << (config.screenSaverSync() ? "true" : "false") << endl;
|
||||||
|
outStream << "\t" << "win32KeepForeground = " << (config.win32KeepForeground() ? "true" : "false") << endl;
|
||||||
|
|
||||||
|
if (config.hasSwitchDelay())
|
||||||
|
outStream << "\t" << "switchDelay = " << config.switchDelay() << endl;
|
||||||
|
|
||||||
|
if (config.hasSwitchDoubleTap())
|
||||||
|
outStream << "\t" << "switchDoubleTap = " << config.switchDoubleTap() << endl;
|
||||||
|
|
||||||
|
outStream << "\t" << "switchCorners = none ";
|
||||||
|
for (int i = 0; i < config.switchCorners().size(); i++)
|
||||||
|
if (config.switchCorners()[i])
|
||||||
|
outStream << "+" << config.switchCornerName(i) << " ";
|
||||||
|
outStream << endl;
|
||||||
|
|
||||||
|
outStream << "\t" << "switchCornerSize = " << config.switchCornerSize() << endl;
|
||||||
|
|
||||||
|
foreach(const Hotkey& hotkey, config.hotkeys())
|
||||||
|
outStream << hotkey;
|
||||||
|
|
||||||
|
outStream << "end" << endl << endl;
|
||||||
|
|
||||||
|
return outStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ServerConfig::numScreens() const
|
||||||
|
{
|
||||||
|
int rval = 0;
|
||||||
|
|
||||||
|
foreach(const Screen& s, screens())
|
||||||
|
if (!s.isNull())
|
||||||
|
rval++;
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
#if !defined(SERVERCONFIG__H)
|
||||||
|
|
||||||
|
#define SERVERCONFIG__H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
#include "Screen.h"
|
||||||
|
#include "BaseConfig.h"
|
||||||
|
#include "Hotkey.h"
|
||||||
|
|
||||||
|
class QTextStream;
|
||||||
|
class QSettings;
|
||||||
|
class QString;
|
||||||
|
class QFile;
|
||||||
|
class ServerConfigDialog;
|
||||||
|
|
||||||
|
class ServerConfig : public BaseConfig
|
||||||
|
{
|
||||||
|
friend class ServerConfigDialog;
|
||||||
|
friend QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config);
|
||||||
|
|
||||||
|
public:
|
||||||
|
ServerConfig(QSettings* settings, int numColumns, int numRows);
|
||||||
|
~ServerConfig();
|
||||||
|
|
||||||
|
public:
|
||||||
|
const ScreenList& screens() const { return m_Screens; }
|
||||||
|
int numColumns() const { return m_NumColumns; }
|
||||||
|
int numRows() const { return m_NumRows; }
|
||||||
|
bool hasHeartbeat() const { return m_HasHeartbeat; }
|
||||||
|
int heartbeat() const { return m_Heartbeat; }
|
||||||
|
bool relativeMouseMoves() const { return m_RelativeMouseMoves; }
|
||||||
|
bool screenSaverSync() const { return m_ScreenSaverSync; }
|
||||||
|
bool win32KeepForeground() const { return m_Win32KeepForeground; }
|
||||||
|
bool hasSwitchDelay() const { return m_HasSwitchDelay; }
|
||||||
|
int switchDelay() const { return m_SwitchDelay; }
|
||||||
|
bool hasSwitchDoubleTap() const { return m_HasSwitchDoubleTap; }
|
||||||
|
int switchDoubleTap() const { return m_SwitchDoubleTap; }
|
||||||
|
bool switchCorner(int c) const { return m_SwitchCorners[c]; }
|
||||||
|
int switchCornerSize() const { return m_SwitchCornerSize; }
|
||||||
|
const QList<bool>& switchCorners() const { return m_SwitchCorners; }
|
||||||
|
const HotkeyList& hotkeys() const { return m_Hotkeys; }
|
||||||
|
|
||||||
|
void saveSettings();
|
||||||
|
void loadSettings();
|
||||||
|
bool save(const QString& fileName) const;
|
||||||
|
void save(QFile& file) const;
|
||||||
|
int numScreens() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QSettings& settings() { return *m_pSettings; }
|
||||||
|
ScreenList& screens() { return m_Screens; }
|
||||||
|
void setScreens(const ScreenList& screens) { m_Screens = screens; }
|
||||||
|
void addScreen(const Screen& screen) { m_Screens.append(screen); }
|
||||||
|
void setNumColumns(int n) { m_NumColumns = n; }
|
||||||
|
void setNumRows(int n) { m_NumRows = n; }
|
||||||
|
void haveHeartbeat(bool on) { m_HasHeartbeat = on; }
|
||||||
|
void setHeartbeat(int val) { m_Heartbeat = val; }
|
||||||
|
void setRelativeMouseMoves(bool on) { m_RelativeMouseMoves = on; }
|
||||||
|
void setScreenSaverSync(bool on) { m_ScreenSaverSync = on; }
|
||||||
|
void setWin32KeepForeground(bool on) { m_Win32KeepForeground = on; }
|
||||||
|
void haveSwitchDelay(bool on) { m_HasSwitchDelay = on; }
|
||||||
|
void setSwitchDelay(int val) { m_SwitchDelay = val; }
|
||||||
|
void haveSwitchDoubleTap(bool on) { m_HasSwitchDoubleTap = on; }
|
||||||
|
void setSwitchDoubleTap(int val) { m_SwitchDoubleTap = val; }
|
||||||
|
void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; }
|
||||||
|
void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; }
|
||||||
|
QList<bool>& switchCorners() { return m_SwitchCorners; }
|
||||||
|
HotkeyList& hotkeys() { return m_Hotkeys; }
|
||||||
|
|
||||||
|
void init();
|
||||||
|
int adjacentScreenIndex(int idx, int deltaColumn, int deltaRow) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSettings* m_pSettings;
|
||||||
|
ScreenList m_Screens;
|
||||||
|
int m_NumColumns;
|
||||||
|
int m_NumRows;
|
||||||
|
bool m_HasHeartbeat;
|
||||||
|
int m_Heartbeat;
|
||||||
|
bool m_RelativeMouseMoves;
|
||||||
|
bool m_ScreenSaverSync;
|
||||||
|
bool m_Win32KeepForeground;
|
||||||
|
bool m_HasSwitchDelay;
|
||||||
|
int m_SwitchDelay;
|
||||||
|
bool m_HasSwitchDoubleTap;
|
||||||
|
int m_SwitchDoubleTap;
|
||||||
|
int m_SwitchCornerSize;
|
||||||
|
QList<bool> m_SwitchCorners;
|
||||||
|
HotkeyList m_Hotkeys;
|
||||||
|
};
|
||||||
|
|
||||||
|
QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
#include "ServerConfigDialog.h"
|
||||||
|
#include "ServerConfig.h"
|
||||||
|
#include "HotkeyDialog.h"
|
||||||
|
#include "ActionDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
ServerConfigDialog::ServerConfigDialog(QWidget* parent, ServerConfig& config, const QString& defaultScreenName) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::ServerConfigDialogBase(),
|
||||||
|
m_OrigServerConfig(config),
|
||||||
|
m_ServerConfig(config),
|
||||||
|
m_ScreenSetupModel(serverConfig().screens(), serverConfig().numColumns(), serverConfig().numRows())
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
m_pCheckBoxHeartbeat->setChecked(serverConfig().hasHeartbeat());
|
||||||
|
m_pSpinBoxHeartbeat->setValue(serverConfig().heartbeat());
|
||||||
|
|
||||||
|
m_pCheckBoxRelativeMouseMoves->setChecked(serverConfig().relativeMouseMoves());
|
||||||
|
m_pCheckBoxScreenSaverSync->setChecked(serverConfig().screenSaverSync());
|
||||||
|
m_pCheckBoxWin32KeepForeground->setChecked(serverConfig().win32KeepForeground());
|
||||||
|
|
||||||
|
m_pCheckBoxSwitchDelay->setChecked(serverConfig().hasSwitchDelay());
|
||||||
|
m_pSpinBoxSwitchDelay->setValue(serverConfig().switchDelay());
|
||||||
|
|
||||||
|
m_pCheckBoxSwitchDoubleTap->setChecked(serverConfig().hasSwitchDoubleTap());
|
||||||
|
m_pSpinBoxSwitchDoubleTap->setValue(serverConfig().switchDoubleTap());
|
||||||
|
|
||||||
|
m_pCheckBoxCornerTopLeft->setChecked(serverConfig().switchCorner(BaseConfig::TopLeft));
|
||||||
|
m_pCheckBoxCornerTopRight->setChecked(serverConfig().switchCorner(BaseConfig::TopRight));
|
||||||
|
m_pCheckBoxCornerBottomLeft->setChecked(serverConfig().switchCorner(BaseConfig::BottomLeft));
|
||||||
|
m_pCheckBoxCornerBottomRight->setChecked(serverConfig().switchCorner(BaseConfig::BottomRight));
|
||||||
|
m_pSpinBoxSwitchCornerSize->setValue(serverConfig().switchCornerSize());
|
||||||
|
|
||||||
|
foreach(const Hotkey& hotkey, serverConfig().hotkeys())
|
||||||
|
m_pListHotkeys->addItem(hotkey.text());
|
||||||
|
|
||||||
|
m_pScreenSetupView->setModel(&m_ScreenSetupModel);
|
||||||
|
|
||||||
|
if (serverConfig().numScreens() == 0)
|
||||||
|
model().screen(serverConfig().numColumns() / 2, serverConfig().numRows() / 2) = Screen(defaultScreenName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::accept()
|
||||||
|
{
|
||||||
|
serverConfig().haveHeartbeat(m_pCheckBoxHeartbeat->isChecked());
|
||||||
|
serverConfig().setHeartbeat(m_pSpinBoxHeartbeat->value());
|
||||||
|
|
||||||
|
serverConfig().setRelativeMouseMoves(m_pCheckBoxRelativeMouseMoves->isChecked());
|
||||||
|
serverConfig().setScreenSaverSync(m_pCheckBoxScreenSaverSync->isChecked());
|
||||||
|
serverConfig().setWin32KeepForeground(m_pCheckBoxWin32KeepForeground->isChecked());
|
||||||
|
|
||||||
|
serverConfig().haveSwitchDelay(m_pCheckBoxSwitchDelay->isChecked());
|
||||||
|
serverConfig().setSwitchDelay(m_pSpinBoxSwitchDelay->value());
|
||||||
|
|
||||||
|
serverConfig().haveSwitchDoubleTap(m_pCheckBoxSwitchDoubleTap->isChecked());
|
||||||
|
serverConfig().setSwitchDoubleTap(m_pSpinBoxSwitchDoubleTap->value());
|
||||||
|
|
||||||
|
serverConfig().setSwitchCorner(BaseConfig::TopLeft, m_pCheckBoxCornerTopLeft->isChecked());
|
||||||
|
serverConfig().setSwitchCorner(BaseConfig::TopRight, m_pCheckBoxCornerTopRight->isChecked());
|
||||||
|
serverConfig().setSwitchCorner(BaseConfig::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked());
|
||||||
|
serverConfig().setSwitchCorner(BaseConfig::BottomRight, m_pCheckBoxCornerBottomRight->isChecked());
|
||||||
|
serverConfig().setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value());
|
||||||
|
|
||||||
|
// now that the dialog has been accepted, copy the new server config to the original one,
|
||||||
|
// which is a reference to the one in MainWindow.
|
||||||
|
setOrigServerConfig(serverConfig());
|
||||||
|
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonNewHotkey_clicked()
|
||||||
|
{
|
||||||
|
Hotkey hotkey;
|
||||||
|
HotkeyDialog dlg(this, hotkey);
|
||||||
|
if (dlg.exec() == QDialog::Accepted)
|
||||||
|
{
|
||||||
|
serverConfig().hotkeys().append(hotkey);
|
||||||
|
m_pListHotkeys->addItem(hotkey.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonEditHotkey_clicked()
|
||||||
|
{
|
||||||
|
int idx = m_pListHotkeys->currentRow();
|
||||||
|
Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size());
|
||||||
|
Hotkey& hotkey = serverConfig().hotkeys()[idx];
|
||||||
|
HotkeyDialog dlg(this, hotkey);
|
||||||
|
if (dlg.exec() == QDialog::Accepted)
|
||||||
|
m_pListHotkeys->currentItem()->setText(hotkey.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonRemoveHotkey_clicked()
|
||||||
|
{
|
||||||
|
int idx = m_pListHotkeys->currentRow();
|
||||||
|
Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size());
|
||||||
|
serverConfig().hotkeys().removeAt(idx);
|
||||||
|
m_pListActions->clear();
|
||||||
|
delete m_pListHotkeys->item(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pListHotkeys_itemSelectionChanged()
|
||||||
|
{
|
||||||
|
bool itemsSelected = !m_pListHotkeys->selectedItems().isEmpty();
|
||||||
|
m_pButtonEditHotkey->setEnabled(itemsSelected);
|
||||||
|
m_pButtonRemoveHotkey->setEnabled(itemsSelected);
|
||||||
|
m_pButtonNewAction->setEnabled(itemsSelected);
|
||||||
|
|
||||||
|
if (itemsSelected && serverConfig().hotkeys().size() > 0)
|
||||||
|
{
|
||||||
|
m_pListActions->clear();
|
||||||
|
|
||||||
|
int idx = m_pListHotkeys->row(m_pListHotkeys->selectedItems()[0]);
|
||||||
|
|
||||||
|
// There's a bug somewhere around here: We get idx == 1 right after we deleted the next to last item, so idx can
|
||||||
|
// only possibly be 0. GDB shows we got called indirectly from the delete line in
|
||||||
|
// on_m_pButtonRemoveHotkey_clicked() above, but the delete is of course necessary and seems correct.
|
||||||
|
// The while() is a generalized workaround for all that and shouldn't be required.
|
||||||
|
while (idx >= 0 && idx >= serverConfig().hotkeys().size())
|
||||||
|
idx--;
|
||||||
|
|
||||||
|
Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size());
|
||||||
|
|
||||||
|
const Hotkey& hotkey = serverConfig().hotkeys()[idx];
|
||||||
|
foreach(const Action& action, hotkey.actions())
|
||||||
|
m_pListActions->addItem(action.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonNewAction_clicked()
|
||||||
|
{
|
||||||
|
int idx = m_pListHotkeys->currentRow();
|
||||||
|
Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size());
|
||||||
|
Hotkey& hotkey = serverConfig().hotkeys()[idx];
|
||||||
|
|
||||||
|
Action action;
|
||||||
|
ActionDialog dlg(this, serverConfig(), hotkey, action);
|
||||||
|
if (dlg.exec() == QDialog::Accepted)
|
||||||
|
{
|
||||||
|
hotkey.actions().append(action);
|
||||||
|
m_pListActions->addItem(action.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonEditAction_clicked()
|
||||||
|
{
|
||||||
|
int idxHotkey = m_pListHotkeys->currentRow();
|
||||||
|
Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size());
|
||||||
|
Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey];
|
||||||
|
|
||||||
|
int idxAction = m_pListActions->currentRow();
|
||||||
|
Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size());
|
||||||
|
Action& action = hotkey.actions()[idxAction];
|
||||||
|
|
||||||
|
ActionDialog dlg(this, serverConfig(), hotkey, action);
|
||||||
|
if (dlg.exec() == QDialog::Accepted)
|
||||||
|
m_pListActions->currentItem()->setText(action.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pButtonRemoveAction_clicked()
|
||||||
|
{
|
||||||
|
int idxHotkey = m_pListHotkeys->currentRow();
|
||||||
|
Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size());
|
||||||
|
Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey];
|
||||||
|
|
||||||
|
int idxAction = m_pListActions->currentRow();
|
||||||
|
Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size());
|
||||||
|
|
||||||
|
hotkey.actions().removeAt(idxAction);
|
||||||
|
delete m_pListActions->currentItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerConfigDialog::on_m_pListActions_itemSelectionChanged()
|
||||||
|
{
|
||||||
|
m_pButtonEditAction->setEnabled(!m_pListActions->selectedItems().isEmpty());
|
||||||
|
m_pButtonRemoveAction->setEnabled(!m_pListActions->selectedItems().isEmpty());
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
#if !defined(SERVERCONFIGDIALOG__H)
|
||||||
|
|
||||||
|
#define SERVERCONFIGDIALOG__H
|
||||||
|
|
||||||
|
#include "ScreenSetupModel.h"
|
||||||
|
#include "ServerConfig.h"
|
||||||
|
|
||||||
|
#include "ui_ServerConfigDialogBase.h"
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
class ServerConfigDialog : public QDialog, public Ui::ServerConfigDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ServerConfigDialog(QWidget* parent, ServerConfig& config, const QString& defaultScreenName);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void accept();
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void on_m_pButtonNewHotkey_clicked();
|
||||||
|
void on_m_pListHotkeys_itemSelectionChanged();
|
||||||
|
void on_m_pButtonEditHotkey_clicked();
|
||||||
|
void on_m_pButtonRemoveHotkey_clicked();
|
||||||
|
|
||||||
|
void on_m_pButtonNewAction_clicked();
|
||||||
|
void on_m_pListActions_itemSelectionChanged();
|
||||||
|
void on_m_pButtonEditAction_clicked();
|
||||||
|
void on_m_pButtonRemoveAction_clicked();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ServerConfig& serverConfig() { return m_ServerConfig; }
|
||||||
|
void setOrigServerConfig(const ServerConfig& s) { m_OrigServerConfig = s; }
|
||||||
|
ScreenSetupModel& model() { return m_ScreenSetupModel; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ServerConfig& m_OrigServerConfig;
|
||||||
|
ServerConfig m_ServerConfig;
|
||||||
|
ScreenSetupModel m_ScreenSetupModel;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
#include "SettingsDialog.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
|
SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) :
|
||||||
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
|
||||||
|
Ui::SettingsDialogBase(),
|
||||||
|
m_AppConfig(config)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
m_pCheckBoxAutoConnect->setChecked(appConfig().autoConnect());
|
||||||
|
m_pLineEditSynergyc->setText(appConfig().synergyc());
|
||||||
|
m_pLineEditSynergys->setText(appConfig().synergys());
|
||||||
|
m_pLineEditScreenName->setText(appConfig().screenName());
|
||||||
|
m_pSpinBoxPort->setValue(appConfig().port());
|
||||||
|
m_pLineEditInterface->setText(appConfig().interface());
|
||||||
|
m_pComboLogLevel->setCurrentIndex(appConfig().logLevel());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString SettingsDialog::browseForSynergyc(QWidget* parent, const QString& programDir, const QString& synergycName)
|
||||||
|
{
|
||||||
|
return QFileDialog::getOpenFileName(parent, tr("Browse for synergyc executable"), programDir, synergycName);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString SettingsDialog::browseForSynergys(QWidget* parent, const QString& programDir, const QString& synergysName)
|
||||||
|
{
|
||||||
|
return QFileDialog::getOpenFileName(parent, tr("Browse for synergys executable"), programDir, synergysName);
|
||||||
|
}
|
||||||
|
bool SettingsDialog::on_m_pButtonBrowseSynergys_clicked()
|
||||||
|
{
|
||||||
|
QString fileName = browseForSynergys(this, appConfig().synergyProgramDir(), appConfig().synergysName());
|
||||||
|
|
||||||
|
if (!fileName.isEmpty())
|
||||||
|
{
|
||||||
|
m_pLineEditSynergys->setText(fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SettingsDialog::on_m_pButtonBrowseSynergyc_clicked()
|
||||||
|
{
|
||||||
|
QString fileName = browseForSynergyc(this, appConfig().synergyProgramDir(), appConfig().synergycName());
|
||||||
|
|
||||||
|
if (!fileName.isEmpty())
|
||||||
|
{
|
||||||
|
m_pLineEditSynergyc->setText(fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingsDialog::accept()
|
||||||
|
{
|
||||||
|
appConfig().setAutoConnect(m_pCheckBoxAutoConnect->isChecked());
|
||||||
|
appConfig().setSynergyc(m_pLineEditSynergyc->text());
|
||||||
|
appConfig().setSynergys(m_pLineEditSynergys->text());
|
||||||
|
appConfig().setScreenName(m_pLineEditScreenName->text());
|
||||||
|
appConfig().setPort(m_pSpinBoxPort->value());
|
||||||
|
appConfig().setInterface(m_pLineEditInterface->text());
|
||||||
|
appConfig().setLogLevel(m_pComboLogLevel->currentIndex());
|
||||||
|
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#if !defined(SETTINGSDIALOG_H)
|
||||||
|
|
||||||
|
#define SETTINGSDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include "ui_SettingsDialogBase.h"
|
||||||
|
|
||||||
|
class AppConfig;
|
||||||
|
|
||||||
|
class SettingsDialog : public QDialog, public Ui::SettingsDialogBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SettingsDialog(QWidget* parent, AppConfig& config);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static QString browseForSynergyc(QWidget* parent, const QString& programDir, const QString& synergycName);
|
||||||
|
static QString browseForSynergys(QWidget* parent, const QString& programDir, const QString& synergysName);
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
bool on_m_pButtonBrowseSynergys_clicked();
|
||||||
|
bool on_m_pButtonBrowseSynergyc_clicked();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void accept();
|
||||||
|
AppConfig& appConfig() { return m_AppConfig; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
AppConfig& m_AppConfig;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,25 @@
|
||||||
|
#include "TrashScreenWidget.h"
|
||||||
|
#include "ScreenSetupModel.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
void TrashScreenWidget::dragEnterEvent(QDragEnterEvent* event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType()))
|
||||||
|
{
|
||||||
|
event->setDropAction(Qt::MoveAction);
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrashScreenWidget::dropEvent(QDropEvent* event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType()))
|
||||||
|
event->acceptProposedAction();
|
||||||
|
else
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
#if !defined(TRASHSCREENWIDGET__H)
|
||||||
|
|
||||||
|
#define TRASHSCREENWIDGET__H
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
class QWidget;
|
||||||
|
class QDragEnterEvent;
|
||||||
|
class QDropEvent;
|
||||||
|
|
||||||
|
class TrashScreenWidget : public QLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
TrashScreenWidget(QWidget* parent) : QLabel(parent) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void dragEnterEvent(QDragEnterEvent* event);
|
||||||
|
void dropEvent(QDropEvent* event);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include "QSynergyApplication.h"
|
||||||
|
#include "MainWindow.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QCoreApplication::setOrganizationName("Fidra");
|
||||||
|
QCoreApplication::setOrganizationDomain("www.fidra.de");
|
||||||
|
QCoreApplication::setApplicationName("QSynergy");
|
||||||
|
|
||||||
|
QSynergyApplication app(argc, argv);
|
||||||
|
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
if (!QSystemTrayIcon::isSystemTrayAvailable())
|
||||||
|
{
|
||||||
|
QMessageBox::critical(NULL, "QSynergy", QObject::tr("There doesn't seem to be a system tray available. Quitting."));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QApplication::setQuitOnLastWindowClosed(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QTranslator qtTranslator;
|
||||||
|
qtTranslator.load("qt_" + QLocale::system().name());
|
||||||
|
app.installTranslator(&qtTranslator);
|
||||||
|
|
||||||
|
QTranslator myappTranslator;
|
||||||
|
myappTranslator.load("res/lang/QSynergy_" + QLocale::system().name());
|
||||||
|
app.installTranslator(&myappTranslator);
|
||||||
|
|
||||||
|
MainWindow mainWindow(NULL);
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue