reverting trunk back to stable 3.4.1 version
git-svn-id: svn://svn.code.sf.net/p/qjoypad/code/trunk@82 c05e91a0-76c8-4ec0-b377-ef19ce7cc080
This commit is contained in:
committed by
virtuoussin13
parent
1cc6e9087e
commit
17ed926cdf
705
src/Makefile
705
src/Makefile
@ -1,34 +1,37 @@
|
||||
#############################################################################
|
||||
# Makefile for building: qjoypad
|
||||
# Generated by qmake (2.01a) (Qt 4.5.1) on: Mon May 25 00:43:37 2009
|
||||
# Generated by qmake (1.07a) (Qt 3.3.6) on: Wed Nov 1 12:59:29 2006
|
||||
# Project: qjoypad.pro
|
||||
# Template: app
|
||||
# Command: /usr/bin/qmake -unix -o Makefile qjoypad.pro
|
||||
# Command: $(QMAKE) "DEVDIR=/dev/input" "PREFIX=/usr" "DEFINES += " -o Makefile qjoypad.pro
|
||||
#############################################################################
|
||||
|
||||
####### Compiler, tools and options
|
||||
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
DEFINES = -DDEVDIR="" -DICON24="/share/pixmaps/qjoypad/icon24.png" -DICON64="/share/pixmaps/qjoypad/icon64.png" -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
|
||||
CFLAGS = -pipe -march=i686 -mtune=generic -O2 -pipe -Wall -W -D_REENTRANT $(DEFINES)
|
||||
CXXFLAGS = -pipe -march=i686 -mtune=generic -O2 -pipe -Wall -W -D_REENTRANT $(DEFINES)
|
||||
INCPATH = -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I. -Itrayicon -I. -I.
|
||||
LEX = flex
|
||||
YACC = yacc
|
||||
CFLAGS = -pipe -Wall -W -O2 -D_REENTRANT -DDEVDIR='"/dev/input"' -DICON24='"/usr/share/pixmaps/qjoypad/icon24.png"' -DICON64='"/usr/share/pixmaps/qjoypad/icon64.png"' -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT
|
||||
CXXFLAGS = -pipe -Wall -W -O2 -D_REENTRANT -DDEVDIR='"/dev/input"' -DICON24='"/usr/share/pixmaps/qjoypad/icon24.png"' -DICON64='"/usr/share/pixmaps/qjoypad/icon64.png"' -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT
|
||||
LEXFLAGS =
|
||||
YACCFLAGS= -d
|
||||
INCPATH = -I/usr/share/qt3/mkspecs/default -I. -I. -Itrayicon -I/usr/include/qt3
|
||||
LINK = g++
|
||||
LFLAGS = -Wl,-O1 -Wl,-rpath,/usr/lib
|
||||
LIBS = $(SUBLIBS) -L/usr/lib -lXtst -lQtGui -L/usr/lib -L/usr/X11R6/lib -pthread -lpng -lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
|
||||
LFLAGS =
|
||||
LIBS = $(SUBLIBS) -L/usr/share/qt3/lib -L/usr/X11R6/lib -lXtst -lqt-mt -lXext -lX11 -lm -lpthread
|
||||
AR = ar cqs
|
||||
RANLIB =
|
||||
QMAKE = /usr/bin/qmake
|
||||
MOC = /usr/share/qt3/bin/moc
|
||||
UIC = /usr/share/qt3/bin/uic
|
||||
QMAKE = qmake
|
||||
TAR = tar -cf
|
||||
COMPRESS = gzip -9f
|
||||
GZIP = gzip -9f
|
||||
COPY = cp -f
|
||||
SED = sed
|
||||
COPY_FILE = $(COPY)
|
||||
COPY_FILE= $(COPY)
|
||||
COPY_DIR = $(COPY) -r
|
||||
INSTALL_FILE = install -m 644 -p
|
||||
INSTALL_FILE= $(COPY_FILE)
|
||||
INSTALL_DIR = $(COPY_DIR)
|
||||
INSTALL_PROGRAM = install -m 755 -p
|
||||
DEL_FILE = rm -f
|
||||
SYMLINK = ln -sf
|
||||
DEL_DIR = rmdir
|
||||
@ -42,6 +45,29 @@ OBJECTS_DIR = ./
|
||||
|
||||
####### Files
|
||||
|
||||
HEADERS = axis.h \
|
||||
axis_edit.h \
|
||||
axisw.h \
|
||||
button.h \
|
||||
button_edit.h \
|
||||
buttonw.h \
|
||||
component.h \
|
||||
constant.h \
|
||||
device.h \
|
||||
error.h \
|
||||
event.h \
|
||||
flash.h \
|
||||
icon.h \
|
||||
joypad.h \
|
||||
joypadw.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
layout.h \
|
||||
layout_edit.h \
|
||||
loop.h \
|
||||
quickset.h \
|
||||
timer.h \
|
||||
trayicon/trayicon.h
|
||||
SOURCES = axis.cpp \
|
||||
axis_edit.cpp \
|
||||
axisw.cpp \
|
||||
@ -57,22 +83,11 @@ SOURCES = axis.cpp \
|
||||
keycode.cpp \
|
||||
layout.cpp \
|
||||
layout_edit.cpp \
|
||||
loop.cpp \
|
||||
main.cpp \
|
||||
quickset.cpp \
|
||||
getkey.cpp \
|
||||
trayicon/trayicon.cpp \
|
||||
trayicon/trayicon_x11.cpp moc_axis.cpp \
|
||||
moc_axis_edit.cpp \
|
||||
moc_button.cpp \
|
||||
moc_button_edit.cpp \
|
||||
moc_flash.cpp \
|
||||
moc_icon.cpp \
|
||||
moc_joypad.cpp \
|
||||
moc_joypadw.cpp \
|
||||
moc_keycode.cpp \
|
||||
moc_layout.cpp \
|
||||
moc_getkey.cpp \
|
||||
moc_trayicon.cpp
|
||||
trayicon/trayicon_x11.cpp
|
||||
OBJECTS = axis.o \
|
||||
axis_edit.o \
|
||||
axisw.o \
|
||||
@ -88,43 +103,31 @@ OBJECTS = axis.o \
|
||||
keycode.o \
|
||||
layout.o \
|
||||
layout_edit.o \
|
||||
loop.o \
|
||||
main.o \
|
||||
quickset.o \
|
||||
getkey.o \
|
||||
trayicon.o \
|
||||
trayicon_x11.o \
|
||||
moc_axis.o \
|
||||
moc_axis_edit.o \
|
||||
moc_button.o \
|
||||
trayicon_x11.o
|
||||
FORMS =
|
||||
UICDECLS =
|
||||
UICIMPLS =
|
||||
SRCMOC = moc_axis_edit.cpp \
|
||||
moc_button_edit.cpp \
|
||||
moc_flash.cpp \
|
||||
moc_icon.cpp \
|
||||
moc_joypadw.cpp \
|
||||
moc_keycode.cpp \
|
||||
moc_layout.cpp \
|
||||
trayicon/moc_trayicon.cpp
|
||||
OBJMOC = moc_axis_edit.o \
|
||||
moc_button_edit.o \
|
||||
moc_flash.o \
|
||||
moc_icon.o \
|
||||
moc_joypad.o \
|
||||
moc_joypadw.o \
|
||||
moc_keycode.o \
|
||||
moc_layout.o \
|
||||
moc_getkey.o \
|
||||
moc_trayicon.o
|
||||
DIST = /usr/share/qt/mkspecs/common/g++.conf \
|
||||
/usr/share/qt/mkspecs/common/unix.conf \
|
||||
/usr/share/qt/mkspecs/common/linux.conf \
|
||||
/usr/share/qt/mkspecs/qconfig.pri \
|
||||
/usr/share/qt/mkspecs/features/qt_functions.prf \
|
||||
/usr/share/qt/mkspecs/features/qt_config.prf \
|
||||
/usr/share/qt/mkspecs/features/exclusive_builds.prf \
|
||||
/usr/share/qt/mkspecs/features/default_pre.prf \
|
||||
/usr/share/qt/mkspecs/features/release.prf \
|
||||
/usr/share/qt/mkspecs/features/default_post.prf \
|
||||
/usr/share/qt/mkspecs/features/warn_on.prf \
|
||||
/usr/share/qt/mkspecs/features/qt.prf \
|
||||
/usr/share/qt/mkspecs/features/unix/thread.prf \
|
||||
/usr/share/qt/mkspecs/features/moc.prf \
|
||||
/usr/share/qt/mkspecs/features/resources.prf \
|
||||
/usr/share/qt/mkspecs/features/uic.prf \
|
||||
/usr/share/qt/mkspecs/features/yacc.prf \
|
||||
/usr/share/qt/mkspecs/features/lex.prf \
|
||||
/usr/share/qt/mkspecs/features/include_source_dir.prf \
|
||||
qjoypad.pro
|
||||
DIST = qjoypad.pro
|
||||
QMAKE_TARGET = qjoypad
|
||||
DESTDIR =
|
||||
TARGET = qjoypad
|
||||
@ -132,82 +135,53 @@ TARGET = qjoypad
|
||||
first: all
|
||||
####### Implicit rules
|
||||
|
||||
.SUFFIXES: .o .c .cpp .cc .cxx .C
|
||||
.SUFFIXES: .c .o .cpp .cc .cxx .C
|
||||
|
||||
.cpp.o:
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
|
||||
|
||||
.cc.o:
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
|
||||
|
||||
.cxx.o:
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
|
||||
|
||||
.C.o:
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
|
||||
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
|
||||
|
||||
####### Build rules
|
||||
|
||||
all: Makefile $(TARGET)
|
||||
|
||||
$(TARGET): $(OBJECTS)
|
||||
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
|
||||
$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
|
||||
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS)
|
||||
|
||||
Makefile: qjoypad.pro /usr/share/qt/mkspecs/linux-g++/qmake.conf /usr/share/qt/mkspecs/common/g++.conf \
|
||||
/usr/share/qt/mkspecs/common/unix.conf \
|
||||
/usr/share/qt/mkspecs/common/linux.conf \
|
||||
/usr/share/qt/mkspecs/qconfig.pri \
|
||||
/usr/share/qt/mkspecs/features/qt_functions.prf \
|
||||
/usr/share/qt/mkspecs/features/qt_config.prf \
|
||||
/usr/share/qt/mkspecs/features/exclusive_builds.prf \
|
||||
/usr/share/qt/mkspecs/features/default_pre.prf \
|
||||
/usr/share/qt/mkspecs/features/release.prf \
|
||||
/usr/share/qt/mkspecs/features/default_post.prf \
|
||||
/usr/share/qt/mkspecs/features/warn_on.prf \
|
||||
/usr/share/qt/mkspecs/features/qt.prf \
|
||||
/usr/share/qt/mkspecs/features/unix/thread.prf \
|
||||
/usr/share/qt/mkspecs/features/moc.prf \
|
||||
/usr/share/qt/mkspecs/features/resources.prf \
|
||||
/usr/share/qt/mkspecs/features/uic.prf \
|
||||
/usr/share/qt/mkspecs/features/yacc.prf \
|
||||
/usr/share/qt/mkspecs/features/lex.prf \
|
||||
/usr/share/qt/mkspecs/features/include_source_dir.prf \
|
||||
/usr/lib/libQtGui.prl \
|
||||
/usr/lib/libQtCore.prl
|
||||
$(QMAKE) -unix -o Makefile qjoypad.pro
|
||||
/usr/share/qt/mkspecs/common/g++.conf:
|
||||
/usr/share/qt/mkspecs/common/unix.conf:
|
||||
/usr/share/qt/mkspecs/common/linux.conf:
|
||||
/usr/share/qt/mkspecs/qconfig.pri:
|
||||
/usr/share/qt/mkspecs/features/qt_functions.prf:
|
||||
/usr/share/qt/mkspecs/features/qt_config.prf:
|
||||
/usr/share/qt/mkspecs/features/exclusive_builds.prf:
|
||||
/usr/share/qt/mkspecs/features/default_pre.prf:
|
||||
/usr/share/qt/mkspecs/features/release.prf:
|
||||
/usr/share/qt/mkspecs/features/default_post.prf:
|
||||
/usr/share/qt/mkspecs/features/warn_on.prf:
|
||||
/usr/share/qt/mkspecs/features/qt.prf:
|
||||
/usr/share/qt/mkspecs/features/unix/thread.prf:
|
||||
/usr/share/qt/mkspecs/features/moc.prf:
|
||||
/usr/share/qt/mkspecs/features/resources.prf:
|
||||
/usr/share/qt/mkspecs/features/uic.prf:
|
||||
/usr/share/qt/mkspecs/features/yacc.prf:
|
||||
/usr/share/qt/mkspecs/features/lex.prf:
|
||||
/usr/share/qt/mkspecs/features/include_source_dir.prf:
|
||||
/usr/lib/libQtGui.prl:
|
||||
/usr/lib/libQtCore.prl:
|
||||
qmake: FORCE
|
||||
@$(QMAKE) -unix -o Makefile qjoypad.pro
|
||||
mocables: $(SRCMOC)
|
||||
uicables: $(UICDECLS) $(UICIMPLS)
|
||||
|
||||
$(MOC):
|
||||
( cd $(QTDIR)/src/moc && $(MAKE) )
|
||||
|
||||
Makefile: qjoypad.pro /usr/share/qt3/mkspecs/default/qmake.conf /usr/share/qt3/lib/libqt-mt.prl
|
||||
$(QMAKE) "DEVDIR=/dev/input" "PREFIX=/usr" "DEFINES += " -o Makefile qjoypad.pro
|
||||
qmake:
|
||||
@$(QMAKE) "DEVDIR=/dev/input" "PREFIX=/usr" "DEFINES += " -o Makefile qjoypad.pro
|
||||
|
||||
dist:
|
||||
@$(CHK_DIR_EXISTS) .tmp/qjoypad1.0.0 || $(MKDIR) .tmp/qjoypad1.0.0
|
||||
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/qjoypad1.0.0/ && $(COPY_FILE) --parents axis.h axis_edit.h axisw.h button.h button_edit.h buttonw.h constant.h device.h error.h event.h flash.h icon.h joypad.h joypadw.h joyslider.h keycode.h layout.h getkey.h layout_edit.h quickset.h trayicon/trayicon.h .tmp/qjoypad1.0.0/ && $(COPY_FILE) --parents axis.cpp axis_edit.cpp axisw.cpp button.cpp button_edit.cpp buttonw.cpp event.cpp flash.cpp icon.cpp joypad.cpp joypadw.cpp joyslider.cpp keycode.cpp layout.cpp layout_edit.cpp main.cpp quickset.cpp getkey.cpp trayicon/trayicon.cpp trayicon/trayicon_x11.cpp .tmp/qjoypad1.0.0/ && (cd `dirname .tmp/qjoypad1.0.0` && $(TAR) qjoypad1.0.0.tar qjoypad1.0.0 && $(COMPRESS) qjoypad1.0.0.tar) && $(MOVE) `dirname .tmp/qjoypad1.0.0`/qjoypad1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/qjoypad1.0.0
|
||||
@mkdir -p .tmp/qjoypad && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/qjoypad/ && ( cd `dirname .tmp/qjoypad` && $(TAR) qjoypad.tar qjoypad && $(GZIP) qjoypad.tar ) && $(MOVE) `dirname .tmp/qjoypad`/qjoypad.tar.gz . && $(DEL_FILE) -r .tmp/qjoypad
|
||||
|
||||
mocclean:
|
||||
-$(DEL_FILE) $(OBJMOC)
|
||||
-$(DEL_FILE) $(SRCMOC)
|
||||
|
||||
clean:compiler_clean
|
||||
uiclean:
|
||||
|
||||
yaccclean:
|
||||
lexclean:
|
||||
clean: mocclean
|
||||
-$(DEL_FILE) $(OBJECTS)
|
||||
-$(DEL_FILE) *~ core *.core
|
||||
|
||||
@ -215,308 +189,220 @@ clean:compiler_clean
|
||||
####### Sub-libraries
|
||||
|
||||
distclean: clean
|
||||
-$(DEL_FILE) $(TARGET)
|
||||
-$(DEL_FILE) Makefile
|
||||
-$(DEL_FILE) $(TARGET) $(TARGET)
|
||||
|
||||
|
||||
mocclean: compiler_moc_header_clean compiler_moc_source_clean
|
||||
|
||||
mocables: compiler_moc_header_make_all compiler_moc_source_make_all
|
||||
|
||||
compiler_moc_header_make_all: moc_axis.cpp moc_axis_edit.cpp moc_button.cpp moc_button_edit.cpp moc_flash.cpp moc_icon.cpp moc_joypad.cpp moc_joypadw.cpp moc_keycode.cpp moc_layout.cpp moc_getkey.cpp moc_trayicon.cpp
|
||||
compiler_moc_header_clean:
|
||||
-$(DEL_FILE) moc_axis.cpp moc_axis_edit.cpp moc_button.cpp moc_button_edit.cpp moc_flash.cpp moc_icon.cpp moc_joypad.cpp moc_joypadw.cpp moc_keycode.cpp moc_layout.cpp moc_getkey.cpp moc_trayicon.cpp
|
||||
moc_axis.cpp: constant.h \
|
||||
axis.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) axis.h -o moc_axis.cpp
|
||||
|
||||
moc_axis_edit.cpp: axis.h \
|
||||
constant.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
axis_edit.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) axis_edit.h -o moc_axis_edit.cpp
|
||||
|
||||
moc_button.cpp: keycode.h \
|
||||
constant.h \
|
||||
button.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) button.h -o moc_button.cpp
|
||||
|
||||
moc_button_edit.cpp: button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
button_edit.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) button_edit.h -o moc_button_edit.cpp
|
||||
|
||||
moc_flash.cpp: flash.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) flash.h -o moc_flash.cpp
|
||||
|
||||
moc_icon.cpp: constant.h \
|
||||
icon.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) icon.h -o moc_icon.cpp
|
||||
|
||||
moc_joypad.cpp: button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
axisw.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
joypad.h \
|
||||
error.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
joypad.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) joypad.h -o moc_joypad.cpp
|
||||
|
||||
moc_joypadw.cpp: axisw.h \
|
||||
axis.h \
|
||||
constant.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
joypadw.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h \
|
||||
joypadw.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) joypadw.h -o moc_joypadw.cpp
|
||||
|
||||
moc_keycode.cpp: constant.h \
|
||||
keycode.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) keycode.h -o moc_keycode.cpp
|
||||
|
||||
moc_layout.cpp: joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
axisw.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h \
|
||||
device.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
layout_edit.h \
|
||||
layout.h \
|
||||
layout.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) layout.h -o moc_layout.cpp
|
||||
|
||||
moc_getkey.cpp: constant.h \
|
||||
getkey.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) getkey.h -o moc_getkey.cpp
|
||||
|
||||
moc_trayicon.cpp: trayicon/trayicon.h
|
||||
/usr/bin/moc $(DEFINES) $(INCPATH) trayicon/trayicon.h -o moc_trayicon.cpp
|
||||
|
||||
compiler_rcc_make_all:
|
||||
compiler_rcc_clean:
|
||||
compiler_image_collection_make_all: qmake_image_collection.cpp
|
||||
compiler_image_collection_clean:
|
||||
-$(DEL_FILE) qmake_image_collection.cpp
|
||||
compiler_moc_source_make_all:
|
||||
compiler_moc_source_clean:
|
||||
compiler_uic_make_all:
|
||||
compiler_uic_clean:
|
||||
compiler_yacc_decl_make_all:
|
||||
compiler_yacc_decl_clean:
|
||||
compiler_yacc_impl_make_all:
|
||||
compiler_yacc_impl_clean:
|
||||
compiler_lex_make_all:
|
||||
compiler_lex_clean:
|
||||
compiler_clean: compiler_moc_header_clean
|
||||
FORCE:
|
||||
|
||||
####### Compile
|
||||
|
||||
axis.o: axis.cpp axis.h \
|
||||
constant.h \
|
||||
event.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o axis.o axis.cpp
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h \
|
||||
constant.h
|
||||
|
||||
axis_edit.o: axis_edit.cpp axis_edit.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
axis.h \
|
||||
constant.h \
|
||||
joyslider.h \
|
||||
keycode.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o axis_edit.o axis_edit.cpp
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h
|
||||
|
||||
axisw.o: axisw.cpp axisw.h \
|
||||
axis.h \
|
||||
constant.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
joyslider.h \
|
||||
keycode.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o axisw.o axisw.cpp
|
||||
|
||||
button.o: button.cpp button.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
event.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o button.o button.cpp
|
||||
event.h \
|
||||
constant.h
|
||||
|
||||
button_edit.o: button_edit.cpp button_edit.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h \
|
||||
constant.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o button_edit.o button_edit.cpp
|
||||
|
||||
buttonw.o: buttonw.cpp buttonw.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
button_edit.h \
|
||||
flash.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o buttonw.o buttonw.cpp
|
||||
flash.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h
|
||||
|
||||
event.o: event.cpp event.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o event.o event.cpp
|
||||
|
||||
flash.o: flash.cpp flash.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o flash.o flash.cpp
|
||||
|
||||
icon.o: icon.cpp icon.h \
|
||||
constant.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o icon.o icon.cpp
|
||||
|
||||
joypad.o: joypad.cpp joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
error.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o joypad.o joypad.cpp
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
joypadw.o: joypadw.cpp joypadw.h \
|
||||
axisw.h \
|
||||
axis.h \
|
||||
constant.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
error.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o joypadw.o joypadw.cpp
|
||||
quickset.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
error.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
joyslider.o: joyslider.cpp joyslider.h \
|
||||
constant.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o joyslider.o joyslider.cpp
|
||||
|
||||
keycode.o: keycode.cpp keycode.h \
|
||||
constant.h \
|
||||
getkey.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o keycode.o keycode.cpp
|
||||
constant.h
|
||||
|
||||
layout.o: layout.cpp layout.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
axisw.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h \
|
||||
device.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
layout_edit.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o layout.o layout.cpp
|
||||
|
||||
layout_edit.o: layout_edit.cpp layout_edit.h \
|
||||
flash.h \
|
||||
layout.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
axisw.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h \
|
||||
device.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o layout_edit.o layout_edit.cpp
|
||||
|
||||
main.o: main.cpp layout.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
axisw.h \
|
||||
flash.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
quickset.h \
|
||||
error.h \
|
||||
device.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
layout_edit.h \
|
||||
event.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
|
||||
|
||||
quickset.o: quickset.cpp quickset.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
layout_edit.o: layout_edit.cpp layout_edit.h \
|
||||
flash.h \
|
||||
layout.h \
|
||||
device.h \
|
||||
joypadw.h \
|
||||
joypad.h \
|
||||
error.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
axis_edit.h \
|
||||
joyslider.h \
|
||||
buttonw.h \
|
||||
button_edit.h \
|
||||
error.h \
|
||||
getkey.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o quickset.o quickset.cpp
|
||||
button_edit.h
|
||||
|
||||
getkey.o: getkey.cpp getkey.h \
|
||||
constant.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o getkey.o getkey.cpp
|
||||
loop.o: loop.cpp loop.h \
|
||||
joypad.h \
|
||||
device.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
error.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
main.o: main.cpp loop.h \
|
||||
layout.h \
|
||||
event.h \
|
||||
device.h \
|
||||
error.h \
|
||||
joypad.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
layout_edit.h
|
||||
|
||||
quickset.o: quickset.cpp quickset.h \
|
||||
keycode.h \
|
||||
joypad.h \
|
||||
constant.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
error.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
trayicon.o: trayicon/trayicon.cpp trayicon/trayicon.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o trayicon.o trayicon/trayicon.cpp
|
||||
@ -524,67 +410,116 @@ trayicon.o: trayicon/trayicon.cpp trayicon/trayicon.h
|
||||
trayicon_x11.o: trayicon/trayicon_x11.cpp trayicon/trayicon.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o trayicon_x11.o trayicon/trayicon_x11.cpp
|
||||
|
||||
moc_axis.o: moc_axis.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_axis.o moc_axis.cpp
|
||||
moc_axis_edit.o: moc_axis_edit.cpp axis_edit.h joyslider.h \
|
||||
keycode.h \
|
||||
axis.h \
|
||||
constant.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h
|
||||
|
||||
moc_axis_edit.o: moc_axis_edit.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_axis_edit.o moc_axis_edit.cpp
|
||||
moc_button_edit.o: moc_button_edit.cpp button_edit.h button.h \
|
||||
keycode.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
event.h \
|
||||
constant.h
|
||||
|
||||
moc_button.o: moc_button.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_button.o moc_button.cpp
|
||||
moc_flash.o: moc_flash.cpp flash.h
|
||||
|
||||
moc_button_edit.o: moc_button_edit.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_button_edit.o moc_button_edit.cpp
|
||||
moc_icon.o: moc_icon.cpp icon.h constant.h
|
||||
|
||||
moc_flash.o: moc_flash.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_flash.o moc_flash.cpp
|
||||
moc_joypadw.o: moc_joypadw.cpp joypadw.h joypad.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
error.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
moc_icon.o: moc_icon.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_icon.o moc_icon.cpp
|
||||
moc_keycode.o: moc_keycode.cpp keycode.h constant.h
|
||||
|
||||
moc_joypad.o: moc_joypad.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_joypad.o moc_joypad.cpp
|
||||
moc_layout.o: moc_layout.cpp layout.h joypad.h \
|
||||
error.h \
|
||||
device.h \
|
||||
trayicon/trayicon.h \
|
||||
icon.h \
|
||||
layout_edit.h \
|
||||
button.h \
|
||||
axis.h \
|
||||
joypadw.h \
|
||||
component.h \
|
||||
timer.h \
|
||||
keycode.h \
|
||||
event.h \
|
||||
constant.h \
|
||||
axisw.h \
|
||||
buttonw.h \
|
||||
quickset.h \
|
||||
axis_edit.h \
|
||||
flash.h \
|
||||
joyslider.h \
|
||||
button_edit.h
|
||||
|
||||
moc_joypadw.o: moc_joypadw.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_joypadw.o moc_joypadw.cpp
|
||||
moc_trayicon.o: trayicon/moc_trayicon.cpp trayicon/trayicon.h
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_trayicon.o trayicon/moc_trayicon.cpp
|
||||
|
||||
moc_keycode.o: moc_keycode.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_keycode.o moc_keycode.cpp
|
||||
moc_axis_edit.cpp: $(MOC) axis_edit.h
|
||||
$(MOC) axis_edit.h -o moc_axis_edit.cpp
|
||||
|
||||
moc_layout.o: moc_layout.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_layout.o moc_layout.cpp
|
||||
moc_button_edit.cpp: $(MOC) button_edit.h
|
||||
$(MOC) button_edit.h -o moc_button_edit.cpp
|
||||
|
||||
moc_getkey.o: moc_getkey.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_getkey.o moc_getkey.cpp
|
||||
moc_flash.cpp: $(MOC) flash.h
|
||||
$(MOC) flash.h -o moc_flash.cpp
|
||||
|
||||
moc_trayicon.o: moc_trayicon.cpp
|
||||
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_trayicon.o moc_trayicon.cpp
|
||||
moc_icon.cpp: $(MOC) icon.h
|
||||
$(MOC) icon.h -o moc_icon.cpp
|
||||
|
||||
moc_joypadw.cpp: $(MOC) joypadw.h
|
||||
$(MOC) joypadw.h -o moc_joypadw.cpp
|
||||
|
||||
moc_keycode.cpp: $(MOC) keycode.h
|
||||
$(MOC) keycode.h -o moc_keycode.cpp
|
||||
|
||||
moc_layout.cpp: $(MOC) layout.h
|
||||
$(MOC) layout.h -o moc_layout.cpp
|
||||
|
||||
trayicon/moc_trayicon.cpp: $(MOC) trayicon/trayicon.h
|
||||
$(MOC) trayicon/trayicon.h -o trayicon/moc_trayicon.cpp
|
||||
|
||||
####### Install
|
||||
|
||||
install_target: first FORCE
|
||||
@$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/bin/ || $(MKDIR) $(INSTALL_ROOT)/bin/
|
||||
-$(INSTALL_PROGRAM) "$(QMAKE_TARGET)" "$(INSTALL_ROOT)/bin/$(QMAKE_TARGET)"
|
||||
-strip "$(INSTALL_ROOT)/bin/$(QMAKE_TARGET)"
|
||||
install_target: all
|
||||
@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/bin/" || $(MKDIR) "$(INSTALL_ROOT)/usr/bin/"
|
||||
-$(INSTALL_FILE) "$(QMAKE_TARGET)" "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)"
|
||||
-strip "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)"
|
||||
|
||||
uninstall_target: FORCE
|
||||
-$(DEL_FILE) "$(INSTALL_ROOT)/bin/$(QMAKE_TARGET)"
|
||||
-$(DEL_DIR) $(INSTALL_ROOT)/bin/
|
||||
uninstall_target:
|
||||
-$(DEL_FILE) "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)"
|
||||
-$(DEL_DIR) "$(INSTALL_ROOT)/usr/bin/"
|
||||
|
||||
|
||||
install_icons: first FORCE
|
||||
@$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/share/pixmaps/qjoypad/ || $(MKDIR) $(INSTALL_ROOT)/share/pixmaps/qjoypad/
|
||||
cp ../icons/* /share/pixmaps/qjoypad; cd /share/pixmaps/qjoypad; ln -sf gamepad4-24x24.png icon24.png; ln -sf gamepad3-64x64.png icon64.png; chmod -R a+r /share/pixmaps/qjoypad
|
||||
install_icons: all
|
||||
@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/share/pixmaps/qjoypad/" || $(MKDIR) "$(INSTALL_ROOT)/usr/share/pixmaps/qjoypad/"
|
||||
cp ../icons/* /usr/share/pixmaps/qjoypad; cd /usr/share/pixmaps/qjoypad; ln -sf gamepad4-24x24.png icon24.png; ln -sf gamepad3-64x64.png icon64.png; chmod -R a+r /usr/share/pixmaps/qjoypad
|
||||
|
||||
|
||||
install_doc: first FORCE
|
||||
@$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/doc/qjoypad3/ || $(MKDIR) $(INSTALL_ROOT)/doc/qjoypad3/
|
||||
cp ../README.txt ../LICENSE.txt /doc/qjoypad3
|
||||
install_doc: all
|
||||
@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/doc/qjoypad3/" || $(MKDIR) "$(INSTALL_ROOT)/usr/doc/qjoypad3/"
|
||||
cp ../README.txt ../LICENSE.txt /usr/doc/qjoypad3
|
||||
|
||||
|
||||
install: install_target install_icons install_doc FORCE
|
||||
install: install_target install_icons install_doc
|
||||
|
||||
uninstall: uninstall_target FORCE
|
||||
|
||||
FORCE:
|
||||
uninstall: uninstall_target
|
||||
|
||||
|
36
src/axis.cpp
36
src/axis.cpp
@ -1,32 +1,28 @@
|
||||
#include "axis.h"
|
||||
#include "event.h"
|
||||
|
||||
#define sqr(a) ((a)*(a))
|
||||
|
||||
|
||||
Axis::Axis( int i ) {
|
||||
index = i;
|
||||
isOn = false;
|
||||
isDown = false;
|
||||
state = 0;
|
||||
//to keep toDefault from calling tossTimer without first calling takeTimer
|
||||
gradient = false;
|
||||
toDefault();
|
||||
tick = 0;
|
||||
timer = new QTimer(this);
|
||||
}
|
||||
|
||||
|
||||
Axis::~Axis() {
|
||||
release();
|
||||
delete timer;
|
||||
}
|
||||
|
||||
bool Axis::read( QTextStream* stream ) {
|
||||
// At this point, toDefault has just been called.
|
||||
|
||||
//read in a line from the stream, and split it up into individual words
|
||||
QString input = stream->readLine().toLower();
|
||||
QString input = stream->readLine().lower();
|
||||
QRegExp regex("[\\s,]+");
|
||||
QStringList words = input.split(regex);
|
||||
QStringList words = QStringList::split(regex,input);
|
||||
|
||||
//used to assure QString->int conversions worked
|
||||
bool ok;
|
||||
@ -80,6 +76,7 @@ bool Axis::read( QTextStream* stream ) {
|
||||
}
|
||||
//the rest of the options are keywords without integers
|
||||
else if (*it == "gradient") {
|
||||
if (!gradient) takeTimer( this );
|
||||
gradient = true;
|
||||
}
|
||||
else if (*it == "throttle+") {
|
||||
@ -113,10 +110,6 @@ bool Axis::read( QTextStream* stream ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void Axis::timerCalled() {
|
||||
timerTick(++tick);
|
||||
}
|
||||
|
||||
void Axis::write( QTextStream* stream ) {
|
||||
*stream << "\t" << getName() << ": ";
|
||||
if (gradient) *stream << "gradient, ";
|
||||
@ -164,20 +157,12 @@ void Axis::jsevent( int value ) {
|
||||
//if was on but now should be off:
|
||||
if (isOn && abs(state) <= dZone) {
|
||||
isOn = false;
|
||||
if (gradient) {
|
||||
release();
|
||||
timer->stop();
|
||||
tick = 0;
|
||||
}
|
||||
if (gradient) release();
|
||||
}
|
||||
//if was off but now should be on:
|
||||
else if (!isOn && abs(state) >= dZone) {
|
||||
isOn = true;
|
||||
if (gradient) {
|
||||
duration = (abs(state) * FREQ) / JOYMAX;
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(timerCalled()));
|
||||
timer->start(MSEC);
|
||||
}
|
||||
if (gradient) duration = (abs(state) * FREQ) / JOYMAX;
|
||||
}
|
||||
//otherwise, state doesn't change! Don't touch it.
|
||||
else return;
|
||||
@ -191,11 +176,12 @@ void Axis::jsevent( int value ) {
|
||||
|
||||
void Axis::toDefault() {
|
||||
release();
|
||||
|
||||
if (gradient) tossTimer( this );
|
||||
gradient = false;
|
||||
throttle = 0;
|
||||
maxSpeed = 100;
|
||||
dZone = DZONE;
|
||||
tick = 0;
|
||||
xZone = XZONE;
|
||||
mode = keybd;
|
||||
pkeycode = 0;
|
||||
@ -245,7 +231,7 @@ void Axis::setKey(bool positive, int value) {
|
||||
nkeycode = value;
|
||||
}
|
||||
|
||||
void Axis::timerTick( int tick ) {
|
||||
void Axis::timer( int tick ) {
|
||||
if (isOn) {
|
||||
if (mode == keybd) {
|
||||
if (tick % FREQ == 0) {
|
||||
@ -296,7 +282,7 @@ void Axis::move( bool press ) {
|
||||
e.value2 = 0;
|
||||
}
|
||||
//if using the mouse
|
||||
else if (press) {
|
||||
else if (press){
|
||||
int dist;
|
||||
if (gradient) {
|
||||
//calculate our mouse speed curve based on calculations made in
|
||||
|
19
src/axis.h
19
src/axis.h
@ -4,11 +4,11 @@
|
||||
//abs()
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <QTimer>
|
||||
#include <QTextStream>
|
||||
#include <QRegExp>
|
||||
#include <QStringList>
|
||||
#include "constant.h"
|
||||
//parent of Axis
|
||||
#include "component.h"
|
||||
|
||||
//to request a periodic tap on the shoulder for gradient mode
|
||||
#include "timer.h"
|
||||
|
||||
//default and arbitrary values for dZone and xZone
|
||||
#define DZONE 3000
|
||||
@ -18,8 +18,7 @@
|
||||
enum AxisMode {keybd, mousepv, mousenv, mouseph, mousenh};
|
||||
|
||||
//represents one joystick axis
|
||||
class Axis : public QObject {
|
||||
Q_OBJECT
|
||||
class Axis : public Component {
|
||||
//so AxisEdit can manipulate fields directly.
|
||||
friend class AxisEdit;
|
||||
public:
|
||||
@ -46,12 +45,11 @@ class Axis : public QObject {
|
||||
void setKey(bool positive, int value);
|
||||
//happens every MSEC milliseconds (constant.h)
|
||||
//uses tick to decide if key events should be generated
|
||||
void timerTick( int tick );
|
||||
void timer( int tick );
|
||||
//recalculates the gradient curve. This should be run every time
|
||||
//maxSpeed, xZone, or dZone are changed.
|
||||
void adjustGradient();
|
||||
protected:
|
||||
int tick;
|
||||
//This axis is logically depressed (positive or negative)
|
||||
//if the axis is gradient, this is true even if it is not
|
||||
//currently generating a keypress at the instant.
|
||||
@ -86,9 +84,6 @@ class Axis : public QObject {
|
||||
//note, the key is still clicked at the same pace no matter what,
|
||||
//this just decides how long it stays down each cycle.
|
||||
int duration;
|
||||
QTimer *timer;
|
||||
public slots:
|
||||
void timerCalled();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,12 +1,11 @@
|
||||
#include "axis_edit.h"
|
||||
|
||||
|
||||
AxisEdit::AxisEdit( Axis* ax )
|
||||
:QDialog() {
|
||||
//build the dialog, display current axis settings :)
|
||||
axis = ax;
|
||||
setWindowTitle("Set " + axis->getName());
|
||||
setWindowIcon(QPixmap(ICON24));
|
||||
setCaption("Set " + axis->getName());
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
//h, v, and v2 are all references to layouts. They are used to refer to
|
||||
//various layouts as the dialog is built and are not pointing to the same
|
||||
@ -14,42 +13,32 @@ AxisEdit::AxisEdit( Axis* ax )
|
||||
//after I have placed the widgets within them and there's no reasno to
|
||||
//keep track of them.
|
||||
|
||||
QVBoxLayout* v = new QVBoxLayout(this);
|
||||
v->setMargin(5);
|
||||
v->setSpacing(5);
|
||||
QVBoxLayout* v = new QVBoxLayout(this, 5, 5);
|
||||
|
||||
QHBoxLayout* h = new QHBoxLayout();
|
||||
QVBoxLayout* v2 = new QVBoxLayout();
|
||||
v2->setMargin(5);
|
||||
v2->setSpacing(5);
|
||||
QVBoxLayout* v2 = new QVBoxLayout(0,5,5);
|
||||
CGradient = new QCheckBox("Gradient", this);
|
||||
CGradient->setChecked(axis->gradient);
|
||||
v2->addWidget(CGradient);
|
||||
|
||||
CMode = new QComboBox(this);
|
||||
CMode->insertItem((int)keybd, QString("Keyboard"), QVariant(NULL));
|
||||
CMode->insertItem((int) mousepv,QString("Mouse (Vert.)"),QVariant(NULL));
|
||||
CMode->insertItem((int) mousenv, QString("Mouse (Vert. Rev.)"), QVariant(NULL));
|
||||
CMode->insertItem((int) mouseph, "Mouse (Hor.)", QVariant(NULL));
|
||||
CMode->insertItem((int)mousenh, QString("Mouse (Hor. Rev.)"), NULL);
|
||||
CMode->setCurrentIndex( axis->mode );
|
||||
CMode->insertItem("Keyboard",keybd);
|
||||
CMode->insertItem("Mouse (Vert.)",mousepv);
|
||||
CMode->insertItem("Mouse (Vert. Rev.)", mousenv);
|
||||
CMode->insertItem("Mouse (Hor.)", mouseph);
|
||||
CMode->insertItem("Mouse (Hor. Rev.)", mousenh);
|
||||
CMode->setCurrentItem( axis->mode );
|
||||
connect(CMode, SIGNAL(activated(int)), this, SLOT( CModeChanged( int )));
|
||||
v2->addWidget(CMode);
|
||||
h->addLayout(v2);
|
||||
|
||||
MouseBox = new QFrame(this);
|
||||
MouseBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
v2 = new QVBoxLayout(MouseBox);
|
||||
v2->setSpacing(5);
|
||||
v2->setMargin(5);
|
||||
//v2->setAutoAdd(true);
|
||||
QLabel *mouseLabel = new QLabel("Mouse Speed", MouseBox);
|
||||
v2->addWidget(mouseLabel);
|
||||
SSpeed = new QSpinBox(MouseBox);
|
||||
SSpeed->setRange(0,MAXMOUSESPEED);
|
||||
SSpeed->setSingleStep(1);
|
||||
v2 = new QVBoxLayout(MouseBox,5,5);
|
||||
v2->setAutoAdd(true);
|
||||
new QLabel("Mouse Speed", MouseBox);
|
||||
SSpeed = new QSpinBox(0,MAXMOUSESPEED,1,MouseBox);
|
||||
SSpeed->setValue(axis->maxSpeed);
|
||||
v2->addWidget(SSpeed);
|
||||
h->addWidget(MouseBox);
|
||||
v->addLayout(h);
|
||||
|
||||
@ -58,23 +47,18 @@ AxisEdit::AxisEdit( Axis* ax )
|
||||
|
||||
KeyBox = new QFrame(this);
|
||||
KeyBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
h = new QHBoxLayout(KeyBox);
|
||||
h->setSpacing(5);
|
||||
h->setMargin(5);
|
||||
//h->setAutoAdd(true);
|
||||
h = new QHBoxLayout(KeyBox, 5, 5);
|
||||
h->setAutoAdd(true);
|
||||
BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox);
|
||||
|
||||
CThrottle = new QComboBox(KeyBox);
|
||||
CThrottle->insertItem(0,"Neg. Throttle",QVariant(NULL));
|
||||
CThrottle->insertItem(1,"No Throttle",QVariant(NULL));
|
||||
CThrottle->insertItem(2,"Pos. Throttle",QVariant(NULL));
|
||||
CThrottle->setCurrentIndex(axis->throttle + 1);
|
||||
CThrottle->insertItem("Neg. Throttle",0);
|
||||
CThrottle->insertItem("No Throttle",1);
|
||||
CThrottle->insertItem("Pos. Throttle",2);
|
||||
CThrottle->setCurrentItem(axis->throttle + 1);
|
||||
connect( CThrottle, SIGNAL( activated( int )), this, SLOT( CThrottleChanged( int )));
|
||||
|
||||
BPos = new KeyButton(axis->getName(),axis->pkeycode,KeyBox);
|
||||
h->addWidget(BNeg);
|
||||
h->addWidget(CThrottle);
|
||||
h->addWidget(BPos);
|
||||
v->addWidget( KeyBox );
|
||||
|
||||
h = new QHBoxLayout();
|
||||
@ -112,16 +96,13 @@ void AxisEdit::CModeChanged( int index ) {
|
||||
|
||||
void AxisEdit::CThrottleChanged( int index ) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
BNeg->setEnabled(true);
|
||||
case 0: BNeg->setEnabled(true);
|
||||
BPos->setEnabled(false);
|
||||
break;
|
||||
case 1:
|
||||
BNeg->setEnabled(true);
|
||||
case 1: BNeg->setEnabled(true);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
case 2:
|
||||
BNeg->setEnabled(false);
|
||||
case 2: BNeg->setEnabled(false);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
}
|
||||
@ -130,18 +111,18 @@ void AxisEdit::CThrottleChanged( int index ) {
|
||||
|
||||
void AxisEdit::accept() {
|
||||
//if the gradient status has changed, either request a timer or turn it down.
|
||||
/*if (axis->gradient) {
|
||||
if (axis->gradient) {
|
||||
if (!CGradient->isChecked()) tossTimer(axis);
|
||||
}
|
||||
else {
|
||||
if (CGradient->isChecked()) takeTimer(axis);
|
||||
}*/
|
||||
}
|
||||
axis->gradient = CGradient->isChecked();
|
||||
axis->maxSpeed = SSpeed->value();
|
||||
axis->throttle = CThrottle->currentIndex() - 1;
|
||||
axis->throttle = CThrottle->currentItem() - 1;
|
||||
axis->dZone = Slider->dZone();
|
||||
axis->xZone = Slider->xZone();
|
||||
axis->mode = (AxisMode) CMode->currentIndex();
|
||||
axis->mode = (AxisMode) CMode->currentItem();
|
||||
axis->pkeycode = BPos->getValue();
|
||||
axis->nkeycode = BNeg->getValue();
|
||||
axis->adjustGradient();
|
||||
|
@ -1,16 +1,22 @@
|
||||
#ifndef AXIS_EDIT_H
|
||||
#define AXIS_EDIT_H
|
||||
//to refer to the axis we're editing
|
||||
|
||||
//for building up the dialog we need
|
||||
#include "axis.h"
|
||||
#include <QComboBox>
|
||||
#include <QSpinBox>
|
||||
#include <QCheckBox>
|
||||
#include <QLabel>
|
||||
#include <qdialog.h>
|
||||
#include <qcheckbox.h>
|
||||
#include <qcombobox.h>
|
||||
#include <qframe.h>
|
||||
#include <qspinbox.h>
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
|
||||
//for my home-brewed widgets
|
||||
#include "joyslider.h"
|
||||
#include "keycode.h"
|
||||
|
||||
//to refer to the axis we're editing
|
||||
#include "axis.h"
|
||||
|
||||
class AxisEdit : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include "axisw.h"
|
||||
|
||||
|
||||
AxisWidget::AxisWidget( Axis* a, QWidget* parent )
|
||||
: FlashButton( "",parent) {
|
||||
axis = a;
|
||||
|
@ -1,14 +1,12 @@
|
||||
#ifndef AXIS_WIDGET_H
|
||||
#define AXIS_WIDGET_H
|
||||
|
||||
#include <QMouseEvent>
|
||||
//so we can interact with the axis this refers to
|
||||
#include "axis.h"
|
||||
//for the FlashButton widget
|
||||
#include "flash.h"
|
||||
|
||||
//so we can edit this axis when the user clicks the button
|
||||
#include "axis_edit.h"
|
||||
//for the FlashButton widget
|
||||
#include "flash.h"
|
||||
|
||||
class AxisWidget : public FlashButton {
|
||||
public:
|
||||
|
@ -1,28 +1,25 @@
|
||||
#include "button.h"
|
||||
#include "event.h"
|
||||
|
||||
|
||||
Button::Button( int i ) {
|
||||
index = i;
|
||||
isButtonPressed = false;
|
||||
isDown = false;
|
||||
isOn = false;
|
||||
//to keep toDefault from calling tossTimer without first calling takeTimer
|
||||
rapidfire = false;
|
||||
timer = new QTimer(this);
|
||||
toDefault();
|
||||
tick = 0;
|
||||
}
|
||||
|
||||
Button::~Button() {
|
||||
release();
|
||||
//delete timer;
|
||||
}
|
||||
|
||||
bool Button::read( QTextStream* stream ) {
|
||||
// at this point, toDefault() has just been called.
|
||||
|
||||
//read in a line of text and break it into words
|
||||
QString input = stream->readLine().toLower();
|
||||
QString input = stream->readLine().lower();
|
||||
QRegExp regex("[\\s,]+");
|
||||
QStringList words = input.split(regex);
|
||||
QStringList words = QStringList::split(regex,input);
|
||||
|
||||
//used to assure correct conversion of QStrings -> ints
|
||||
bool ok;
|
||||
@ -52,6 +49,7 @@ bool Button::read( QTextStream* stream ) {
|
||||
else return false;
|
||||
}
|
||||
else if (*it == "rapidfire") {
|
||||
if (rapidfire == false) takeTimer( this );
|
||||
rapidfire = true;
|
||||
}
|
||||
else if (*it == "sticky") {
|
||||
@ -79,43 +77,27 @@ void Button::jsevent( int value ) {
|
||||
bool newval = (value == 1);
|
||||
if (sticky) {
|
||||
//the state of a sticky key only changes on button press, not button release.
|
||||
if (value == 1) {
|
||||
isButtonPressed = !isButtonPressed;
|
||||
}
|
||||
if (newval) isOn = !isOn;
|
||||
else return;
|
||||
}
|
||||
//if the received event indicates a change in state,
|
||||
else if (newval != isButtonPressed) {
|
||||
isButtonPressed = newval; //change state
|
||||
if (isButtonPressed && rapidfire) {
|
||||
tick = 0;
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(timerCalled()));
|
||||
timer->start(MSEC);
|
||||
}
|
||||
if (!isButtonPressed && rapidfire) {
|
||||
timer->stop();
|
||||
if(isDown) {
|
||||
click(false);
|
||||
}
|
||||
tick = 0;
|
||||
}
|
||||
else if (newval != isOn) {
|
||||
isOn = newval; //change state
|
||||
}
|
||||
//otherwise... we don't care. This shouldn't happen.
|
||||
else return;
|
||||
//if rapidfire is on, then timer() will do its job. Otherwise we must
|
||||
//manually triger the key event.
|
||||
if (!rapidfire) {
|
||||
click(isButtonPressed);
|
||||
}
|
||||
if (!rapidfire) click(isOn);
|
||||
}
|
||||
|
||||
void Button::toDefault() {
|
||||
if (rapidfire == true) tossTimer( this );
|
||||
rapidfire = false;
|
||||
sticky = false;
|
||||
useMouse = false;
|
||||
keycode = 0;
|
||||
mousecode = 0;
|
||||
timer->stop();
|
||||
}
|
||||
|
||||
bool Button::isDefault() {
|
||||
@ -146,8 +128,8 @@ void Button::setKey( bool mouse, int value ) {
|
||||
}
|
||||
}
|
||||
|
||||
void Button::timerTick( int tick ) {
|
||||
if (isButtonPressed) {
|
||||
void Button::timer( int tick ) {
|
||||
if (isOn) {
|
||||
//originally I just clicked true and then false right after, but this
|
||||
//was not recognized by some programs. I need a delay in between.
|
||||
if (tick % FREQ == 0) {
|
||||
@ -172,7 +154,3 @@ void Button::click( bool press ) {
|
||||
//and send it.
|
||||
sendevent( click );
|
||||
}
|
||||
|
||||
void Button::timerCalled() {
|
||||
timerTick(++tick);
|
||||
}
|
||||
|
18
src/button.h
18
src/button.h
@ -1,17 +1,18 @@
|
||||
#ifndef BUTTON_H
|
||||
#define BUTTON_H
|
||||
|
||||
#include <QTimer>
|
||||
#include <QTextStream>
|
||||
//parent of Button
|
||||
#include "component.h"
|
||||
|
||||
//to request a periodic tap on the shoulder for rapidfire
|
||||
#include "timer.h"
|
||||
|
||||
//for getting a key name in status()
|
||||
#include "keycode.h"
|
||||
|
||||
//note that the Button class, unlike the axis class, does not need a release
|
||||
//function because it releases the key as soon as it is pressed.
|
||||
class Button : public QObject {
|
||||
Q_OBJECT
|
||||
class Button : public Component {
|
||||
friend class ButtonEdit;
|
||||
public:
|
||||
Button( int i );
|
||||
@ -35,26 +36,23 @@ class Button : public QObject {
|
||||
//set the key code for this axis. Used by quickset.
|
||||
void setKey(bool mouse, int value);
|
||||
//happens every MSEC (constant.h) milliseconds
|
||||
void timerTick( int tick );
|
||||
void timer( int tick );
|
||||
protected:
|
||||
//true iff this button is physically depressed.
|
||||
bool isButtonPressed;
|
||||
bool isOn;
|
||||
//the index of this button on the joystick
|
||||
int index;
|
||||
//actually sends a key press/release
|
||||
virtual void click( bool press );
|
||||
//is a simulated key currently depressed?
|
||||
bool isDown;
|
||||
int tick;
|
||||
|
||||
//button settings
|
||||
bool rapidfire;
|
||||
bool sticky;
|
||||
bool useMouse;
|
||||
int keycode;
|
||||
int mousecode; //like keycode, only mousebutton ;)
|
||||
QTimer *timer;
|
||||
public slots:
|
||||
void timerCalled();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,19 +1,13 @@
|
||||
#include "button_edit.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
ButtonEdit::ButtonEdit(Button* butt)
|
||||
:QDialog(0) {
|
||||
setModal(true);
|
||||
:QDialog(0,0,true) {
|
||||
//build the dialog!
|
||||
button = butt;
|
||||
setWindowTitle("Set " + button->getName());
|
||||
setWindowIcon(QPixmap(ICON24));
|
||||
setCaption("Set " + button->getName());
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
QVBoxLayout* v = new QVBoxLayout(this);
|
||||
v->setMargin(5);
|
||||
v->setSpacing(5);
|
||||
QVBoxLayout* v = new QVBoxLayout(this, 5, 5);
|
||||
|
||||
BKKey = new KeyButton( button->getName(), button->useMouse?button->mousecode:button->keycode, this, true, button->useMouse);
|
||||
v->addWidget(BKKey);
|
||||
@ -44,12 +38,12 @@ void ButtonEdit::show() {
|
||||
|
||||
void ButtonEdit::accept() {
|
||||
//if the rapidfire status has changed, either request a timer or turn it down.
|
||||
/*if (button->rapidfire) {
|
||||
if (button->rapidfire) {
|
||||
if (!CRapid->isChecked()) tossTimer(button);
|
||||
}
|
||||
else {
|
||||
if (CRapid->isChecked()) takeTimer(button);
|
||||
}*/
|
||||
}
|
||||
button->rapidfire = CRapid->isChecked();
|
||||
button->sticky = (CSticky->isChecked());
|
||||
//if the user chose a mouse button...
|
||||
|
@ -1,13 +1,14 @@
|
||||
#ifndef BUTTON_EDIT_H
|
||||
#define BUTTON_EDIT_H
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QCheckBox>
|
||||
//used to build the dialog:
|
||||
#include <qdialog.h>
|
||||
#include <qpushbutton.h>
|
||||
#include <qcheckbox.h>
|
||||
#include <qlayout.h>
|
||||
|
||||
//we need to edit a Button
|
||||
#include "button.h"
|
||||
|
||||
|
||||
//to get a new key for the button.
|
||||
#include "keycode.h"
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include "buttonw.h"
|
||||
|
||||
|
||||
ButtonWidget::ButtonWidget( Button* b, QWidget* parent )
|
||||
: FlashButton( "", parent) {
|
||||
button = b;
|
||||
|
@ -7,11 +7,6 @@
|
||||
#include "button_edit.h"
|
||||
//this IS a FlashButton
|
||||
#include "flash.h"
|
||||
#ifdef Bool
|
||||
#undef Bool
|
||||
#endif
|
||||
|
||||
#include <QMouseEvent>
|
||||
|
||||
class ButtonWidget : public FlashButton {
|
||||
public:
|
||||
|
36
src/component.h
Normal file
36
src/component.h
Normal file
@ -0,0 +1,36 @@
|
||||
#ifndef COMPONENT_H
|
||||
#define COMPONENT_H
|
||||
|
||||
|
||||
//for parsing data from a file
|
||||
#include <qstringlist.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qregexp.h>
|
||||
|
||||
//parent of Component
|
||||
#include <qobject.h>
|
||||
|
||||
#include "event.h"
|
||||
#include "constant.h"
|
||||
|
||||
|
||||
//just a general blanket class to cover Button and Axis
|
||||
//it is completely worthless in itself.
|
||||
class Component : public QObject {
|
||||
public:
|
||||
virtual bool read( QTextStream* ) {return true; };
|
||||
virtual void write( QTextStream* ) {};
|
||||
virtual void release() {};
|
||||
virtual void jsevent( int ) {};
|
||||
virtual void toDefault() {};
|
||||
virtual bool isDefault() { return true; };
|
||||
virtual QString getName() { return ""; };
|
||||
virtual QString status() { return ""; };
|
||||
virtual void timer( int ) {};
|
||||
protected:
|
||||
bool isOn;
|
||||
bool isDown;
|
||||
int index;
|
||||
};
|
||||
|
||||
#endif
|
@ -24,6 +24,4 @@
|
||||
|
||||
#define NAME "QJoyPad 3.4"
|
||||
|
||||
#define MOUSE_OFFSET 400
|
||||
|
||||
#endif
|
||||
|
@ -1,16 +1,17 @@
|
||||
#ifndef JOY_DEVICE_H
|
||||
#define JOY_DEVICE_H
|
||||
|
||||
#include <qintdict.h>
|
||||
#include "joypad.h"
|
||||
|
||||
//the purpose of this file is to make device information available to what
|
||||
//needs it.
|
||||
|
||||
//a collection of joysticks currently available on this computer
|
||||
extern QHash<int, JoyPad*> available;
|
||||
extern QIntDict<JoyPad> available;
|
||||
|
||||
//a collection of joypad objects representing all the available joysticks
|
||||
//as well as the ones defined in a layout buy not currently plugged in.
|
||||
extern QHash<int, JoyPad*> joypads;
|
||||
extern QIntDict<JoyPad> joypads;
|
||||
|
||||
#endif
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
static void error(QString type, QString message ) {
|
||||
QMessageBox::warning(0,NAME" - " + type,
|
||||
message, QMessageBox::Ok, Qt::NoButton);
|
||||
message, QMessageBox::Ok, QMessageBox::NoButton);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -13,7 +13,7 @@ void sendevent( xevent e ) {
|
||||
if (e.type == KREL || e.type == KPRESS) {
|
||||
XTestFakeKeyEvent(display, e.value1, (e.type == KPRESS), 0);
|
||||
}
|
||||
else if (e.type == BREL || e.type == BPRESS) {
|
||||
else if (e.type == BREL | e.type == BPRESS) {
|
||||
XTestFakeButtonEvent(display, e.value1, (e.type == BPRESS), 0);
|
||||
}
|
||||
}
|
||||
|
@ -1,30 +1,26 @@
|
||||
#include "flash.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
//Modified here (and in .h) to not have default arguments for 2 and 3.
|
||||
//This caused an error with a development version of g++ on a Mandrake system
|
||||
//in Sweden.
|
||||
FlashButton::FlashButton( QString text, QWidget* parent, QString name )
|
||||
:QPushButton( text, parent )
|
||||
:QPushButton( text, parent, name )
|
||||
{
|
||||
this->setObjectName(name);
|
||||
//record the base palette for posterity.
|
||||
Normal = palette();
|
||||
|
||||
//define the palette the button will have when it flashes.
|
||||
QPalette cg = this->palette();
|
||||
cg.setCurrentColorGroup(QPalette::Inactive);
|
||||
cg.setColor(QPalette::Button, HIGHLIGHT);
|
||||
cg.setColor(QPalette::Light, HIGHLIGHT.light(150));
|
||||
cg.setColor(QPalette::Midlight, HIGHLIGHT.light(125));
|
||||
cg.setColor(QPalette::Dark, HIGHLIGHT.dark(200));
|
||||
cg.setColor(QPalette::Mid, HIGHLIGHT.dark(150));
|
||||
Flash = cg;
|
||||
QColorGroup cg = this->palette().inactive();
|
||||
cg.setColor(QColorGroup::Button, HIGHLIGHT);
|
||||
cg.setColor(QColorGroup::Light, HIGHLIGHT.light(150));
|
||||
cg.setColor(QColorGroup::Midlight, HIGHLIGHT.light(125));
|
||||
cg.setColor(QColorGroup::Dark, HIGHLIGHT.dark(200));
|
||||
cg.setColor(QColorGroup::Mid, HIGHLIGHT.dark(150));
|
||||
Flash = QPalette(cg,cg,cg);
|
||||
isflash=false;
|
||||
|
||||
setAutoDefault( false );
|
||||
setFocusPolicy(Qt::NoFocus);
|
||||
|
||||
setFocusPolicy(QWidget::NoFocus);
|
||||
}
|
||||
|
||||
void FlashButton::flash()
|
||||
@ -43,18 +39,21 @@ void FlashButton::flash()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FlashRadioArray::FlashRadioArray( int count, QString names[], bool horizontal, QWidget* parent)
|
||||
:QWidget( parent )
|
||||
{
|
||||
if (horizontal) {
|
||||
LMain = new QHBoxLayout( this);
|
||||
LMain->setMargin(5);
|
||||
LMain->setSpacing(5);
|
||||
} else {
|
||||
LMain = new QVBoxLayout( this);
|
||||
LMain->setMargin(5);
|
||||
LMain->setSpacing(5);
|
||||
}
|
||||
if (horizontal)
|
||||
LMain = new QHBoxLayout( this, 5, 5 );
|
||||
else
|
||||
LMain = new QVBoxLayout( this, 5, 5 );
|
||||
LMain->setAutoAdd( true );
|
||||
|
||||
Buttons = new FlashButton*[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
@ -62,7 +61,6 @@ FlashRadioArray::FlashRadioArray( int count, QString names[], bool horizontal, Q
|
||||
Buttons[i] = new FlashButton( names[i], this, "" );
|
||||
//when any of the buttons is clicked, it calls the same function on this.
|
||||
connect( Buttons[i], SIGNAL( clicked() ), this, SLOT( clicked() ));
|
||||
LMain->addWidget(Buttons[i]);
|
||||
}
|
||||
|
||||
Count = count;
|
||||
|
@ -15,9 +15,8 @@
|
||||
|
||||
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QPalette>
|
||||
#include <QBoxLayout>
|
||||
#include <qpushbutton.h>
|
||||
#include <qlayout.h>
|
||||
|
||||
|
||||
//A QPushButton that can flash a color
|
||||
|
15
src/icon.cpp
15
src/icon.cpp
@ -1,14 +1,11 @@
|
||||
#include "icon.h"
|
||||
|
||||
#include <qpopupmenu.h>
|
||||
|
||||
FloatingIcon::FloatingIcon( const QPixmap &icon, QMenu *popup, QWidget *parent, const char *name)
|
||||
: QDialog( parent ) {
|
||||
this->setObjectName(name);
|
||||
setWindowTitle(NAME);
|
||||
QPalette palette;
|
||||
palette.setBrush(backgroundRole(), QBrush(icon));
|
||||
setPalette(palette);
|
||||
//setPaletteBackgroundPixmap(icon);
|
||||
FloatingIcon::FloatingIcon( const QPixmap &icon, QPopupMenu *popup, QWidget *parent, const char *name)
|
||||
: QDialog( parent, name ) {
|
||||
setCaption(NAME);
|
||||
setPaletteBackgroundPixmap(icon);
|
||||
pop = popup;
|
||||
|
||||
setFixedSize(64,64);
|
||||
@ -16,7 +13,7 @@ FloatingIcon::FloatingIcon( const QPixmap &icon, QMenu *popup, QWidget *parent,
|
||||
|
||||
void FloatingIcon::mousePressEvent( QMouseEvent* e ) {
|
||||
//if it was the right mouse button,
|
||||
if (e->button() == Qt::RightButton) {
|
||||
if (e->button() == RightButton) {
|
||||
//bring up the popup menu.
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
|
16
src/icon.h
16
src/icon.h
@ -1,25 +1,27 @@
|
||||
#ifndef JOY_ICON_H
|
||||
#define JOY_ICON_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QMenu>
|
||||
#include <QPixmap>
|
||||
#include <QMouseEvent>
|
||||
#include <QCloseEvent>
|
||||
//for creating a floating icon in notray mode :)
|
||||
#include <qdialog.h>
|
||||
//the pixmap to load
|
||||
#include <qpixmap.h>
|
||||
|
||||
#include "constant.h"
|
||||
|
||||
//A quirk in QT forbids me from simply including qpopupmenu.h
|
||||
class QPopupMenu;
|
||||
|
||||
class FloatingIcon : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
FloatingIcon( const QPixmap &icon, QMenu *popup = 0, QWidget *parent = 0, const char *name = 0);
|
||||
FloatingIcon( const QPixmap &icon, QPopupMenu *popup = 0, QWidget *parent = 0, const char *name = 0);
|
||||
signals:
|
||||
void closed();
|
||||
void clicked();
|
||||
protected:
|
||||
void mousePressEvent( QMouseEvent* e );
|
||||
void closeEvent( QCloseEvent* e );
|
||||
QMenu* pop;
|
||||
QPopupMenu* pop;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
143
src/joypad.cpp
143
src/joypad.cpp
@ -1,20 +1,12 @@
|
||||
#include "unistd.h"
|
||||
|
||||
#include "joypad.h"
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <QApplication>
|
||||
JoyPad::JoyPad( int i, int dev ) {
|
||||
//remember the index,
|
||||
index = i;
|
||||
|
||||
//load data from the joystick device, if available.
|
||||
joydevFileHandle = NULL;
|
||||
if(dev > 0) {
|
||||
resetToDev(dev);
|
||||
joydevFileHandle = new QSocketNotifier(dev, QSocketNotifier::Read, this);
|
||||
connect(joydevFileHandle, SIGNAL(activated(int)), this, SLOT(handleJoyEvents(int)));
|
||||
}
|
||||
|
||||
//there is no JoyPadWidget yet.
|
||||
jpw = NULL;
|
||||
}
|
||||
@ -41,69 +33,26 @@ void JoyPad::resetToDev(int dev ) {
|
||||
for (int i = 0; i < buttons; i++) {
|
||||
if (Buttons[i] == 0) Buttons.insert(i, new Button( i ));
|
||||
}
|
||||
struct pollfd read_struct;
|
||||
read_struct.fd = joydev;
|
||||
read_struct.events = POLLIN;
|
||||
char buf[10];
|
||||
while(poll(&read_struct, 1, 2)!=0) {
|
||||
printf("reading junk data\n");
|
||||
read(joydev, buf, 10);
|
||||
}
|
||||
setupJoyDeviceListener(dev);
|
||||
}
|
||||
|
||||
void JoyPad::setupJoyDeviceListener(int dev) {
|
||||
if(joydevFileHandle != NULL) {
|
||||
delete joydevFileHandle;
|
||||
}
|
||||
joydevFileHandle = new QSocketNotifier(dev, QSocketNotifier::Read, this);
|
||||
connect(joydevFileHandle, SIGNAL(activated(int)), this, SLOT(handleJoyEvents(int)));
|
||||
}
|
||||
|
||||
void JoyPad::toDefault() {
|
||||
//to reset the whole, reset all the parts.
|
||||
do
|
||||
{
|
||||
QHashIterator<int, Axis*> it( Axes );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
it.value()->toDefault();
|
||||
}
|
||||
} while (0);
|
||||
do
|
||||
{
|
||||
QHashIterator<int, Button*> it( Buttons );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
it.value()->toDefault();
|
||||
}
|
||||
} while (0);
|
||||
for ( QIntDictIterator<Axis> it( Axes ); it.current(); ++it )
|
||||
it.current()->toDefault();
|
||||
for ( QIntDictIterator<Button> it( Buttons ); it.current(); ++it )
|
||||
it.current()->toDefault();
|
||||
}
|
||||
|
||||
bool JoyPad::isDefault() {
|
||||
//if any of the parts are not at default, then the whole isn't either.
|
||||
do {
|
||||
QHashIterator<int, Axis*> it( Axes );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
if (!it.value()->isDefault()) return false;
|
||||
}
|
||||
} while (0);
|
||||
do {
|
||||
QHashIterator<int, Button*> it( Buttons );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
if (!it.value()->isDefault()) return false;
|
||||
}
|
||||
} while (0);
|
||||
for ( QIntDictIterator<Axis> it( Axes ); it.current(); ++it )
|
||||
if (!it.current()->isDefault()) return false;
|
||||
for ( QIntDictIterator<Button> it( Buttons ); it.current(); ++it )
|
||||
if (!it.current()->isDefault()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool JoyPad::readConfig( QTextStream* stream ) {
|
||||
bool JoyPad::read( QTextStream* stream ) {
|
||||
toDefault();
|
||||
|
||||
QString word;
|
||||
@ -112,7 +61,7 @@ bool JoyPad::readConfig( QTextStream* stream ) {
|
||||
|
||||
*stream >> word;
|
||||
while (word != NULL && word != "}") {
|
||||
word = word.toLower();
|
||||
word = word.lower();
|
||||
if (word == "button") {
|
||||
*stream >> num;
|
||||
if (num > 0) {
|
||||
@ -163,23 +112,18 @@ bool JoyPad::readConfig( QTextStream* stream ) {
|
||||
void JoyPad::write( QTextStream* stream ) {
|
||||
int i = 0; //use to test if this is default or not.
|
||||
QString result;
|
||||
QTextStream* s = new QTextStream(&result, QIODevice::WriteOnly);
|
||||
QTextStream* s = new QTextStream(&result, IO_WriteOnly);
|
||||
*s << getName() << " {\n";
|
||||
do {
|
||||
QHashIterator<int, Axis*> it( Axes );
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
if (!it.value()->isDefault()) {
|
||||
it.value()->write( s );
|
||||
for ( QIntDictIterator<Axis> it( Axes ); it.current(); ++it ) {
|
||||
//only write an axis if it is not at the default settings :)
|
||||
if (!it.current()->isDefault()) {
|
||||
it.current()->write( s );
|
||||
++i;
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
QHashIterator<int, Button*> it( Buttons );
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
if (!it.value()->isDefault()) {
|
||||
it.value()->write( s );
|
||||
for ( QIntDictIterator<Button> it( Buttons ); it.current(); ++it ) {
|
||||
if (!it.current()->isDefault()) {
|
||||
it.current()->write( s );
|
||||
++i;
|
||||
}
|
||||
}
|
||||
@ -190,20 +134,12 @@ void JoyPad::write( QTextStream* stream ) {
|
||||
}
|
||||
|
||||
void JoyPad::release() {
|
||||
do {
|
||||
QHashIterator<int, Axis*> it( Axes );
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
it.value()->release();
|
||||
for ( QIntDictIterator<Axis> it( Axes ); it.current(); ++it ) {
|
||||
it.current()->release();
|
||||
}
|
||||
} while (0);
|
||||
do {
|
||||
QHashIterator<int, Button*> it( Buttons );
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
it.value()->release();
|
||||
for ( QIntDictIterator<Button> it( Buttons ); it.current(); ++it ) {
|
||||
it.current()->release();
|
||||
}
|
||||
} while (0);
|
||||
}
|
||||
|
||||
void JoyPad::jsevent( js_event msg ) {
|
||||
@ -212,7 +148,6 @@ void JoyPad::jsevent( js_event msg ) {
|
||||
//tell the dialog there was an event. It will use this to flash
|
||||
//the appropriate button, if necesary.
|
||||
jpw->jsevent(msg);
|
||||
return;
|
||||
}
|
||||
//if the dialog is open, stop here. We don't want to signal ourselves with
|
||||
//the input we generate.
|
||||
@ -221,13 +156,9 @@ void JoyPad::jsevent( js_event msg ) {
|
||||
//otherwise, lets create us a fake event! Pass on the event to whichever
|
||||
//Button or Axis was pressed and let them decide what to do with it.
|
||||
if (msg.type & JS_EVENT_AXIS) {
|
||||
printf("passing on an axis event\n");
|
||||
printf("DEBUG: %d %d\n", msg.number, msg.value);
|
||||
Axes[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
else {
|
||||
printf("passing on a button event\n");
|
||||
printf("DEBUG: %d %d\n", msg.number, msg.value);
|
||||
Buttons[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
}
|
||||
@ -238,33 +169,7 @@ JoyPadWidget* JoyPad::widget( QWidget* parent, int i) {
|
||||
return jpw;
|
||||
}
|
||||
|
||||
void JoyPad::handleJoyEvents(int fd) {
|
||||
js_event msg;
|
||||
int len;
|
||||
|
||||
len = read( joydev, &msg, sizeof(js_event));
|
||||
//if there was a real event waiting,
|
||||
if (len == (int) sizeof(js_event)) {
|
||||
//pass that event on to the joypad!
|
||||
jsevent(msg);
|
||||
} else {
|
||||
printf("NOOOOOOO\n");
|
||||
}
|
||||
|
||||
//sleep for a moment. This is just to keep us from throwing all the
|
||||
//available processer power into madly checking for new events.
|
||||
//usleep(10000);
|
||||
}
|
||||
|
||||
void JoyPad::releaseWidget() {
|
||||
//this is how we know that there is no longer a JoyPadWidget around.
|
||||
jpw = NULL;
|
||||
}
|
||||
|
||||
void JoyPad::unsetDev() {
|
||||
close(joydev);
|
||||
joydev = -1;
|
||||
if(joydevFileHandle != NULL) {
|
||||
delete joydevFileHandle;
|
||||
}
|
||||
}
|
||||
|
35
src/joypad.h
35
src/joypad.h
@ -1,6 +1,19 @@
|
||||
#ifndef JOYPAD_H
|
||||
#define JOYPAD_H
|
||||
|
||||
//to have dictionaries of buttons and axes
|
||||
#include <qintdict.h>
|
||||
//the parent of JoyPadWidget
|
||||
#include <qobject.h>
|
||||
|
||||
//for access to qApp so I can check if the application has active windows :)
|
||||
#include <qapplication.h>
|
||||
|
||||
//for actually interacting with the joystick devices
|
||||
#include <linux/joystick.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//parts of the joypad
|
||||
#include "button.h"
|
||||
#include "axis.h"
|
||||
@ -11,27 +24,16 @@
|
||||
//for raising errors
|
||||
#include "error.h"
|
||||
|
||||
//for actually interacting with the joystick devices
|
||||
#include <linux/joystick.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <QTextStream>
|
||||
#include <QHash>
|
||||
#include <QSocketNotifier>
|
||||
|
||||
|
||||
class JoyPadWidget;
|
||||
|
||||
//represents an actual joystick device
|
||||
class JoyPad : public QObject{
|
||||
Q_OBJECT
|
||||
friend class JoyPadWidget;
|
||||
friend class QuickSet;
|
||||
public:
|
||||
void setupJoyDeviceListener(int dev);
|
||||
JoyPad( int i, int dev );
|
||||
//read from a stream
|
||||
bool readConfig( QTextStream* stream );
|
||||
bool read( QTextStream* stream );
|
||||
//write to a stream
|
||||
void write( QTextStream* stream );
|
||||
//release any pushed buttons and return to a neutral state
|
||||
@ -43,7 +45,7 @@ class JoyPad : public QObject{
|
||||
//true iff this is currently at default settings
|
||||
bool isDefault();
|
||||
//release the connection to the real joystick
|
||||
void unsetDev();
|
||||
void unsetDev() {close(joydev); joydev = -1;};
|
||||
//read the dimensions on the real joystick and use them
|
||||
void resetToDev( int dev );
|
||||
//generates a name ("Joystick 1")
|
||||
@ -64,17 +66,14 @@ class JoyPad : public QObject{
|
||||
//layouts with different numbers of axes/buttons than the current
|
||||
//devices. Note that with the current layout settings, the defined
|
||||
//buttons that don't actually exist on the device may not be contiguous.
|
||||
QHash<int, Axis*> Axes;
|
||||
QHash<int, Button*> Buttons;
|
||||
QIntDict<Axis> Axes;
|
||||
QIntDict<Button> Buttons;
|
||||
//the index of this device (devicenum)
|
||||
int index;
|
||||
|
||||
//the widget that edits this. Mainly I keep track of this to know if
|
||||
//the joypad is currently being edited.
|
||||
JoyPadWidget* jpw;
|
||||
QSocketNotifier *joydevFileHandle;
|
||||
public slots:
|
||||
void handleJoyEvents(int fd);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,48 +1,39 @@
|
||||
#include "joypadw.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
JoyPadWidget::JoyPadWidget( JoyPad* jp, int i, QWidget* parent )
|
||||
: QWidget(parent) {
|
||||
//initialize things, build the dialog
|
||||
joypad = jp;
|
||||
index = i;
|
||||
/* This was in below, no idea what it does :( ...
|
||||
* (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2
|
||||
*/
|
||||
LMain = new QGridLayout(this);
|
||||
LMain->setSpacing(5);
|
||||
LMain->setMargin(5);
|
||||
LMain = new QGridLayout(this, (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2, 2, 5, 5);
|
||||
LMain->setAutoAdd( true );
|
||||
flashcount = 0;
|
||||
int insertCounter = 0;
|
||||
quickset = NULL;
|
||||
|
||||
Axes = new AxisWidget*[joypad->axes];
|
||||
for (int i = 0; i < joypad->axes; i++) {
|
||||
Axes[i] = new AxisWidget(joypad->Axes[i],this);
|
||||
connect( Axes[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
LMain->addWidget(Axes[i], insertCounter / 2, insertCounter %2);
|
||||
insertCounter++;
|
||||
}
|
||||
if (joypad->axes % 2 == 1) {
|
||||
new QWidget(this);
|
||||
}
|
||||
|
||||
Buttons = new ButtonWidget*[joypad->buttons];
|
||||
for (int i = 0; i < joypad->buttons; i++) {
|
||||
Buttons[i] = new ButtonWidget(joypad->Buttons[i],this);
|
||||
connect( Buttons[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
LMain->addWidget(Buttons[i], insertCounter/2, insertCounter%2);
|
||||
insertCounter++;
|
||||
}
|
||||
if (joypad->buttons % 2 == 1) {
|
||||
new QWidget(this);
|
||||
}
|
||||
|
||||
new QWidget(this);
|
||||
new QWidget(this);
|
||||
|
||||
if(insertCounter % 2 == 1) {
|
||||
insertCounter++;
|
||||
}
|
||||
insertCounter+=2;
|
||||
BClear = new QPushButton("Clear", this);
|
||||
connect(BClear, SIGNAL(clicked()), this, SLOT(clear()));
|
||||
LMain->addWidget(BClear, insertCounter / 2, insertCounter %2);
|
||||
insertCounter++;
|
||||
BAll = new QPushButton("Quick Set", this);
|
||||
LMain->addWidget(BAll, insertCounter /2, insertCounter%2);
|
||||
connect(BAll, SIGNAL(clicked()), this, SLOT(setAll()));
|
||||
}
|
||||
|
||||
|
@ -2,13 +2,13 @@
|
||||
#define JOYPAD_WIDGET_H
|
||||
|
||||
//parts for the widget
|
||||
//Added by qt3to4:
|
||||
#include <qpushbutton.h>
|
||||
#include <qlayout.h>
|
||||
|
||||
#include <linux/joystick.h>
|
||||
#include "axisw.h"
|
||||
//this all relates to a JoyPad
|
||||
#include "joypad.h"
|
||||
//and a JoyPadWidget is composed of AxisWidgets and ButtonWidgets
|
||||
#include "axisw.h"
|
||||
#include "buttonw.h"
|
||||
//JoyPadWidget also is what initiates the whole QuickSet procedure :)
|
||||
#include "quickset.h"
|
||||
|
@ -1,5 +1,4 @@
|
||||
#include "joyslider.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
JoySlider::JoySlider( int dz, int xz, int val, QWidget* parent )
|
||||
:QWidget( parent )
|
||||
@ -88,23 +87,23 @@ void JoySlider::drawBox( int x, int width ) {
|
||||
//widget but is defined by x-coordinate and width
|
||||
QPainter paint( this );
|
||||
|
||||
paint.setPen( (isEnabled())?Qt::white:palette().background().color() );
|
||||
paint.setBrush( (isEnabled())?Qt::white:palette().background() );
|
||||
paint.setPen( (isEnabled())?white:colorGroup().background() );
|
||||
paint.setBrush( (isEnabled())?white:colorGroup().background() );
|
||||
paint.drawRect( x, 1, width, boxheight);
|
||||
|
||||
paint.setPen( palette().dark().color() );
|
||||
paint.setPen( colorGroup().dark() );
|
||||
paint.drawLine( x, 1 + boxheight, x, 1 );
|
||||
paint.drawLine( x, 1, x + width - 1, 1);
|
||||
|
||||
paint.setPen( palette().shadow().color() );
|
||||
paint.setPen( colorGroup().shadow() );
|
||||
paint.drawLine( x + 1, 1 + boxheight - 1, x + 1, 2);
|
||||
paint.drawLine( x + 1, 2, x + width - 2, 2);
|
||||
|
||||
paint.setPen( palette().light().color() );
|
||||
paint.setPen( colorGroup().light() );
|
||||
paint.drawLine( x + 2, 1 + boxheight - 1, x + width - 1, 1 + boxheight - 1);
|
||||
paint.drawLine( x + width - 1, 1 + boxheight - 1, x + width - 1, 2);
|
||||
|
||||
paint.setPen( palette().midlight().color() );
|
||||
paint.setPen( colorGroup().midlight() );
|
||||
paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight );
|
||||
paint.drawLine( x + width, 1 + boxheight, x + width, 1 );
|
||||
}
|
||||
@ -130,9 +129,9 @@ void JoySlider::paintEvent( QPaintEvent* )
|
||||
|
||||
//prepare to draw a bar of the appropriate color
|
||||
QColor bar;
|
||||
if (abs(JoyVal) < DeadZone) bar = Qt::gray;
|
||||
else if (abs(JoyVal) < XZone) bar = Qt::blue;
|
||||
else bar = Qt::red;
|
||||
if (abs(JoyVal) < DeadZone) bar = gray;
|
||||
else if (abs(JoyVal) < XZone) bar = blue;
|
||||
else bar = red;
|
||||
paint.setPen( bar );
|
||||
paint.setBrush( bar );
|
||||
|
||||
@ -149,10 +148,10 @@ void JoySlider::paintEvent( QPaintEvent* )
|
||||
//but we need two if we're not. However, it's important to draw the right
|
||||
//set of tabs depending on the mode! Negative throttle gets negative tabs.
|
||||
int point;
|
||||
QPolygon shape;
|
||||
QPointArray shape;
|
||||
|
||||
paint.setPen( Qt::black );
|
||||
paint.setBrush( Qt::blue );
|
||||
paint.setPen( black );
|
||||
paint.setBrush( blue );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(DeadZone, false);
|
||||
shape.putPoints(0,5,
|
||||
@ -177,7 +176,7 @@ void JoySlider::paintEvent( QPaintEvent* )
|
||||
|
||||
|
||||
|
||||
paint.setBrush( Qt::red );
|
||||
paint.setBrush( red );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(XZone, false);
|
||||
shape.putPoints(0,5,
|
||||
|
@ -2,17 +2,12 @@
|
||||
#define Q_JOYSLIDER_H
|
||||
|
||||
//the parent of this
|
||||
|
||||
#include <qwidget.h>
|
||||
//for drawing the widget :)
|
||||
#include <qpainter.h>
|
||||
//for abs()
|
||||
#include <stdlib.h>
|
||||
#include <QResizeEvent>
|
||||
#include <QPaintEvent>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainter>
|
||||
#include <QFrame>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QComboBox>
|
||||
#include <QSpinBox>
|
||||
|
||||
#include "constant.h"
|
||||
|
||||
//dragging constants.
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "keycode.h"
|
||||
#include "getkey.h"
|
||||
|
||||
|
||||
const QString ktos( int keycode )
|
||||
{
|
||||
@ -21,7 +21,7 @@ const QString ktos( int keycode )
|
||||
QRegExp rx;
|
||||
rx.setPattern("^\\w$");
|
||||
//"a-z" -> "A-Z"
|
||||
if (rx.exactMatch(xname)) return xname.toUpper();
|
||||
if (rx.exactMatch(xname)) return xname.upper();
|
||||
|
||||
rx.setPattern("(.*)_(.*)");
|
||||
if (rx.exactMatch(xname)) {
|
||||
@ -78,6 +78,71 @@ const QString ktos( int keycode )
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
GetKey::GetKey( QString button, bool m )
|
||||
:QDialog( )
|
||||
{
|
||||
//prepare the dialog
|
||||
mouse = m;
|
||||
setCaption( "Choose a key" );
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
//I'd use a QLabel, but that steals x11Events!
|
||||
//So, I'll draw the text directly. That means
|
||||
//I need to resolve the size of the dialog by hand:
|
||||
Text = "Choose a new key ";
|
||||
if (mouse) Text += "or mouse button ";
|
||||
Text += "for " + button;
|
||||
QRect rect = fontMetrics().boundingRect( Text );
|
||||
//I calculate the size based on the first line of text, which is longer.
|
||||
//The fontMetrics function is dumb and would treat the string with a
|
||||
//newline in it as a continues flow of characters if I did the whole string
|
||||
//at once.
|
||||
Text += "\n(Ctrl-X for no key)";
|
||||
//now I add 20 pixels of padding and double the height to make room for
|
||||
//two lines.
|
||||
setFixedSize( QSize( rect.width() + 20, rect.height()*2 + 20 ) );
|
||||
}
|
||||
|
||||
bool GetKey::x11Event( XEvent* e )
|
||||
{
|
||||
//keep Qt from closing the dialog upon seeing Esc pressed.
|
||||
if (e->type == KeyPress) return true;
|
||||
|
||||
//On a key press, return the key and quit
|
||||
//Ctrl+X == [No Key]
|
||||
if (e->type == KeyRelease) {
|
||||
if (XKeycodeToKeysym(display,e->xkey.keycode,0) == XK_x ) {
|
||||
if (e->xkey.state & ControlMask) done( 0 );
|
||||
else done( e->xkey.keycode );
|
||||
}
|
||||
else done( e->xkey.keycode );
|
||||
return true;
|
||||
}
|
||||
//if we're accepting mouse clicks and a mouse button was clicked...
|
||||
if (mouse && e->type == ButtonRelease) {
|
||||
done ( e->xbutton.button + MOUSE_OFFSET);
|
||||
return true;
|
||||
}
|
||||
|
||||
//any other events we will pass on to the dialog. This allows for closing
|
||||
//the window and easy redrawing :)
|
||||
return false;
|
||||
}
|
||||
|
||||
void GetKey::paintEvent ( QPaintEvent * ) {
|
||||
//whenever we need to repaint, draw in our text.
|
||||
QPainter paint( this );
|
||||
paint.drawText( rect(), AlignCenter, Text );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
KeyButton::KeyButton( QString name, int val, QWidget* parent, bool m, bool nowMouse)
|
||||
:QPushButton(nowMouse?"Mouse " + QString::number(val):QString(ktos(val)), parent) {
|
||||
mouse = m;
|
||||
|
@ -2,11 +2,21 @@
|
||||
#define KEYCODE_H
|
||||
|
||||
//To create the "press a key" dialog:
|
||||
#include <QPushButton>
|
||||
#include <QDialog>
|
||||
#include <QPaintEvent>
|
||||
#include <QPainter>
|
||||
#include <qdialog.h>
|
||||
#include <qpainter.h>
|
||||
|
||||
//For the KeyButton widget
|
||||
#include <qpushbutton.h>
|
||||
|
||||
//For converting X Windows key names to something nicer.
|
||||
#include <qregexp.h>
|
||||
|
||||
//Defines constants needed for x11Event
|
||||
#include <X11/Xlib.h>
|
||||
//The KeySym for "x"
|
||||
#define XK_x 0x078
|
||||
|
||||
#define MOUSE_OFFSET 400
|
||||
|
||||
#include "constant.h"
|
||||
|
||||
@ -16,6 +26,23 @@ const QString ktos( int keycode );
|
||||
//The X11 display, taken from main.cpp
|
||||
extern Display* display;
|
||||
|
||||
//a keycode dialog box
|
||||
class GetKey : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
GetKey( QString button, bool m = false );
|
||||
protected:
|
||||
//to filter through every event this thing sees, before QT does.
|
||||
bool x11Event( XEvent* e );
|
||||
//to avoid focus issues, there is only the dialog widget, all the
|
||||
//rest is painted on. So, I need to know when to repaint.
|
||||
void paintEvent ( QPaintEvent * );
|
||||
private:
|
||||
//the dialog's message
|
||||
QString Text;
|
||||
//does this dialog accept mouse clicks?
|
||||
bool mouse;
|
||||
};
|
||||
|
||||
//a button that requests a keycode from the user when clicked.
|
||||
class KeyButton : public QPushButton {
|
||||
|
173
src/layout.cpp
173
src/layout.cpp
@ -1,5 +1,4 @@
|
||||
#include "layout.h"
|
||||
#include <errno.h>
|
||||
|
||||
//initialize things and set up an icon :)
|
||||
LayoutManager::LayoutManager( bool useTrayIcon ) {
|
||||
@ -7,9 +6,9 @@ LayoutManager::LayoutManager( bool useTrayIcon ) {
|
||||
le = NULL;
|
||||
|
||||
//prepare the popup first.
|
||||
Popup = new QMenu();
|
||||
Popup = new QPopupMenu();
|
||||
fillPopup();
|
||||
connect(Popup,SIGNAL(triggered(QAction*)),this, SLOT(trayMenu(QAction*)));
|
||||
connect(Popup,SIGNAL(activated(int)),this, SLOT(trayMenu(int)));
|
||||
|
||||
//make a tray icon
|
||||
if (useTrayIcon) {
|
||||
@ -48,8 +47,8 @@ bool LayoutManager::load(const QString& name) {
|
||||
}
|
||||
|
||||
//if the file isn't readable,
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
error("Load error","Error reading from file " + file.fileName());
|
||||
if (!file.open(IO_ReadOnly)) {
|
||||
error("Load error","Error reading from file " + file.name());
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -57,22 +56,20 @@ bool LayoutManager::load(const QString& name) {
|
||||
//note that we don't use available here, but joypads instead. This is so
|
||||
//if one layout has more joypads than this one does, this won't have the
|
||||
//extra settings left over after things are supposed to be "cleared"
|
||||
QHashIterator<int, JoyPad*> it( joypads );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
it.value()->toDefault();
|
||||
QIntDictIterator<JoyPad> it( joypads );
|
||||
for ( ; it.current(); ++it ) {
|
||||
it.current()->toDefault();
|
||||
}
|
||||
|
||||
//start reading joypads!
|
||||
QTextStream stream( &file );
|
||||
QString input = stream.readLine().toLower();
|
||||
QString input = stream.readLine().lower();
|
||||
QRegExp quoted("\"(.*)\"");
|
||||
bool okay;
|
||||
int num;
|
||||
|
||||
while (input != QString::null) {
|
||||
QStringList words = input.split(" ");
|
||||
QStringList words = QStringList::split(" ",input);
|
||||
//if this line is specifying a joystick
|
||||
if (words[0] == "joystick") {
|
||||
num = words[1].toInt(&okay);
|
||||
@ -88,7 +85,7 @@ bool LayoutManager::load(const QString& name) {
|
||||
joypads.insert(num-1, new JoyPad(num-1, 0));
|
||||
}
|
||||
//try to read the joypad, report error on fail.
|
||||
if (!joypads[num-1]->readConfig(&stream)) {
|
||||
if (!joypads[num-1]->read(&stream)) {
|
||||
error( "Load error", "Error reading definition for joystick " + QString::number(num-1));
|
||||
//if this was attempting to change to a new layout and it failed,
|
||||
//revert back to the old layout.
|
||||
@ -100,7 +97,7 @@ bool LayoutManager::load(const QString& name) {
|
||||
}
|
||||
}
|
||||
//read a new line.
|
||||
input = stream.readLine().toLower();
|
||||
input = stream.readLine().lower();
|
||||
}
|
||||
//if loading succeeded, this is our new layout.
|
||||
setLayoutName(name);
|
||||
@ -111,7 +108,7 @@ bool LayoutManager::load() {
|
||||
//try to load the file named "layout" to retrieve the last used layout name
|
||||
QFile file( settingsDir + "layout");
|
||||
QString name;
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
if (file.open(IO_ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
name = stream.readLine();
|
||||
file.close();
|
||||
@ -133,11 +130,8 @@ bool LayoutManager::reload() {
|
||||
|
||||
void LayoutManager::clear() {
|
||||
//reset all the joypads...
|
||||
QHashIterator<int, JoyPad*> it (joypads);
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
it.value()->toDefault();
|
||||
for (QIntDictIterator<JoyPad> it(joypads); it.current(); ++it) {
|
||||
it.current()->toDefault();
|
||||
}
|
||||
//and call our layout NL
|
||||
setLayoutName(NL);
|
||||
@ -153,14 +147,11 @@ void LayoutManager::save() {
|
||||
QString filename = getFileName( CurrentLayout );
|
||||
QFile file(filename);
|
||||
//if it's good, start writing the file
|
||||
if (file.open(QIODevice::WriteOnly)) {
|
||||
if (file.open(IO_WriteOnly)) {
|
||||
QTextStream stream( &file );
|
||||
stream << "# "NAME" Layout File\n\n";
|
||||
QHashIterator<int, JoyPad*> it (joypads);
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
it.value()->write( &stream );
|
||||
for (QIntDictIterator<JoyPad> it(joypads); it.current(); ++it) {
|
||||
it.current()->write( &stream );
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
@ -169,14 +160,11 @@ void LayoutManager::save() {
|
||||
error("Save error", "Could not open file " + filename + ", layout not saved.");
|
||||
}
|
||||
|
||||
|
||||
void LayoutManager::saveAs() {
|
||||
bool ok;
|
||||
//request a new name!
|
||||
QString name = QInputDialog::getText(0, NAME" - Name new layout","Enter a name for the new layout:", QLineEdit::Normal, QString::null, &ok );
|
||||
if (!ok) {
|
||||
return;
|
||||
}
|
||||
QString name = QInputDialog::getText(NAME" - Name new layout","Enter a name for the new layout:", QLineEdit::Normal, QString::null, &ok );
|
||||
if (!ok) return;
|
||||
QFile file(settingsDir + name + ".lyt");
|
||||
//don't overwrite an existing layout.
|
||||
if (file.exists()) {
|
||||
@ -195,12 +183,11 @@ void LayoutManager::saveAs() {
|
||||
if (le != NULL) {
|
||||
le->updateLayoutList();
|
||||
}
|
||||
printf("returning, user provided input\n");
|
||||
}
|
||||
|
||||
void LayoutManager::saveDefault() {
|
||||
QFile file( settingsDir + "layout");
|
||||
if (file.open(QIODevice::WriteOnly)) {
|
||||
if (file.open(IO_WriteOnly)) {
|
||||
QTextStream stream(&file);
|
||||
stream << CurrentLayout;
|
||||
file.close();
|
||||
@ -224,7 +211,7 @@ void LayoutManager::remove() {
|
||||
|
||||
QStringList LayoutManager::getLayoutNames() {
|
||||
//goes through the list of .lyt files and removes the file extensions ;)
|
||||
QStringList result = QDir(settingsDir).entryList(QStringList("*.lyt"));
|
||||
QStringList result = QDir(settingsDir).entryList("*.lyt");
|
||||
|
||||
for ( QStringList::Iterator it = result.begin(); it != result.end(); ++it ) {
|
||||
*it = (*it).left((*it).length() - 4);
|
||||
@ -244,6 +231,11 @@ void LayoutManager::setLayoutName(QString name) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void LayoutManager::trayClick() {
|
||||
//don't show the dialog if there aren't any joystick devices plugged in
|
||||
if (available.count() == 0) {
|
||||
@ -263,128 +255,47 @@ void LayoutManager::trayClick() {
|
||||
le = NULL;
|
||||
}
|
||||
|
||||
void LayoutManager::trayMenu(QAction *menuItemAction) {
|
||||
void LayoutManager::trayMenu(int id) {
|
||||
//if they clicked on a Layout name, load it!
|
||||
//note that the other options are handled with their own special functions
|
||||
printf("%s\n", qPrintable(menuItemAction->text()));
|
||||
printf("oh hi\n");
|
||||
//printf("%d\n", Popup->
|
||||
if (Popup->actions().indexOf(menuItemAction) > 1 && menuItemAction->text() != "Quit" &&
|
||||
menuItemAction->text() != "Update lyaout list" &&
|
||||
menuItemAction->text() != "Update joystick devices") {
|
||||
load(menuItemAction->text());
|
||||
if (Popup->indexOf(id) > 4 && Popup->text(id) != "Quit") {
|
||||
load(Popup->text(id));
|
||||
}
|
||||
}
|
||||
|
||||
void LayoutManager::fillPopup() {
|
||||
printf("starting fillPopup\n");
|
||||
//start with an empty slate
|
||||
Popup->clear();
|
||||
|
||||
//make a list of joystick devices
|
||||
QString devs = "Joysticks: ";
|
||||
QHashIterator<int, JoyPad*> it( available );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
devs += QString::number(it.key() + 1) + " ";
|
||||
QIntDictIterator<JoyPad> it( available );
|
||||
for ( ; it.current(); ++it ) {
|
||||
devs += QString::number(it.currentKey() + 1) + " ";
|
||||
}
|
||||
QAction *temp = Popup->addAction(devs);
|
||||
Popup->addSeparator(/*temp*/);
|
||||
Popup->insertItem(devs);
|
||||
Popup->insertSeparator();
|
||||
|
||||
//add in the Update options
|
||||
QAction *tempAdd = new QAction("Update layout list", this);
|
||||
connect(tempAdd, SIGNAL(triggered(bool)), this, SLOT(fillPopup()));
|
||||
Popup->addAction(tempAdd);
|
||||
tempAdd = new QAction("Update joystick devices", this);
|
||||
connect(tempAdd, SIGNAL(triggered(bool)), this, SLOT(updateJoyDevs()));
|
||||
Popup->addAction(tempAdd);
|
||||
Popup->addSeparator(/*temp*/);
|
||||
Popup->insertItem("Update layout list", this, SLOT(fillPopup()));
|
||||
Popup->insertItem("Update joystick devices", this, SLOT(updateJoyDevs()));
|
||||
Popup->insertSeparator();
|
||||
|
||||
//then add all the layout names
|
||||
QStringList names = getLayoutNames();
|
||||
for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) {
|
||||
temp = Popup->addAction(*it);
|
||||
temp->setCheckable(true);
|
||||
int id = Popup->insertItem(*it);
|
||||
//put a check by the current one ;)
|
||||
if (CurrentLayout == (*it)) {
|
||||
temp->setChecked(true);
|
||||
if (CurrentLayout == (*it)) Popup->setItemChecked(id,true);
|
||||
}
|
||||
}
|
||||
Popup->addSeparator();
|
||||
Popup->insertSeparator();
|
||||
|
||||
//and, at the end, quit!
|
||||
Popup->addAction("Quit",qApp,SLOT(quit()));
|
||||
printf("returning from fill popup\n");
|
||||
Popup->insertItem("Quit",qApp,SLOT(quit()));
|
||||
}
|
||||
|
||||
void LayoutManager::updateJoyDevs() {
|
||||
printf("entering update JoyDevs\n");
|
||||
QString devdir = DEVDIR;
|
||||
//reset all joydevs to sentinal value (-1)
|
||||
do {
|
||||
QHashIterator<int, JoyPad*> it( joypads );
|
||||
while (it.hasNext() ) {
|
||||
it.next();
|
||||
it.value()->unsetDev();
|
||||
}
|
||||
} while (0);
|
||||
|
||||
//clear out the list of previously available joysticks
|
||||
available.clear();
|
||||
|
||||
//set all joydevs anew (create new JoyPad's if necesary)
|
||||
QDir DeviceDir(devdir);
|
||||
QStringList devices = DeviceDir.entryList(QStringList("js*"), QDir::System );
|
||||
QRegExp devicename(".*\\js(\\d+)");
|
||||
int joydev;
|
||||
int index;
|
||||
//for every joystick device in the directory listing...
|
||||
//(note, with devfs, only available devices are listed)
|
||||
for (QStringList::Iterator it = devices.begin(); it != devices.end(); ++it) {
|
||||
//try opening the device.
|
||||
printf("%s\n", qPrintable(devdir + "/" + (*it)));
|
||||
joydev = open( qPrintable(devdir + "/" + (*it)), O_RDONLY | O_NONBLOCK);
|
||||
//if it worked, then we have a live joystick! Make sure it's properly
|
||||
//setup.
|
||||
if (joydev > 0) {
|
||||
printf("joystick found, constructing...\n");
|
||||
devicename.indexIn(*it);
|
||||
index = QString(devicename.cap(1)).toInt();
|
||||
JoyPad* joypad;
|
||||
//if we've never seen this device before, make a new one!
|
||||
if (joypads[index] == 0) {
|
||||
struct pollfd read_struct;
|
||||
read_struct.fd = joydev;
|
||||
read_struct.events = POLLIN;
|
||||
char buf[10];
|
||||
while(poll(&read_struct, 1, 2)!=0) {
|
||||
printf("reading junk data\n");
|
||||
read(joydev, buf, 10);
|
||||
}
|
||||
joypad = new JoyPad( index, joydev );
|
||||
joypads.insert(index,joypad);
|
||||
}
|
||||
else {
|
||||
printf("resetting to dev...\n");
|
||||
joypad = joypads[index];
|
||||
joypad->resetToDev(joydev);
|
||||
}
|
||||
//make this joystick device available.
|
||||
available.insert(index,joypad);
|
||||
}
|
||||
else {
|
||||
int errsv = errno;
|
||||
printf("well fuck!\n");
|
||||
printf("%s\n", strerror(errsv));
|
||||
}
|
||||
}
|
||||
printf("done rebuilding joystick devices\n");
|
||||
//when it's all done, rebuild the popup menu so it displays the correct
|
||||
//information.
|
||||
fillPopup();
|
||||
//the actual update process is handled by main.cpp, we just need to signal
|
||||
//ourselves to do it.
|
||||
//raise(SIGUSR1);
|
||||
printf("returning from rebuild function\n");
|
||||
raise(SIGUSR1);
|
||||
}
|
||||
|
30
src/layout.h
30
src/layout.h
@ -1,6 +1,22 @@
|
||||
#ifndef JOY_LAYOUT_H
|
||||
#define JOY_LAYOUT_H
|
||||
|
||||
//for file i/o
|
||||
#include <qdir.h>
|
||||
#include <qfile.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qstringlist.h>
|
||||
|
||||
//to get a name for a new layout
|
||||
#include <qinputdialog.h>
|
||||
|
||||
//qpopup is a REAL pain to include ;) This is because of some
|
||||
//odd complications and reciprocalities in QT... unfortunately, this is the
|
||||
//best way I've found to get around it.
|
||||
#ifndef MAIN
|
||||
//the layout manager is responsible for the tray icon and its popup
|
||||
#include <qpopupmenu.h>
|
||||
#endif
|
||||
|
||||
//to allow for interprocess communications (ie, signaling a running instance of
|
||||
//qjoypad by running "qjoypad layout-name", etc.) QJoyPad uses signals to
|
||||
@ -8,14 +24,6 @@
|
||||
//the joystick device list.
|
||||
#include <signal.h>
|
||||
|
||||
#include <QAction>
|
||||
#include <QDir>
|
||||
#include <QMenu>
|
||||
#include <QApplication>
|
||||
#include <QDialog>
|
||||
#include <QInputDialog>
|
||||
#include <poll.h>
|
||||
|
||||
//a layout handles several joypads
|
||||
#include "joypad.h"
|
||||
//for errors
|
||||
@ -33,7 +41,7 @@
|
||||
#define NL "[NO LAYOUT]"
|
||||
|
||||
//where QJoyPad saves its settings!
|
||||
const QString settingsDir(QDir::homePath() + "/.qjoypad3/");
|
||||
const QString settingsDir(QDir::homeDirPath() + "/.qjoypad3/");
|
||||
|
||||
//handles loading, saving, and changing of layouts
|
||||
class LayoutManager : public QObject {
|
||||
@ -66,7 +74,7 @@ class LayoutManager : public QObject {
|
||||
//when the tray icon is clicked
|
||||
void trayClick();
|
||||
//when the user selects an item on the tray's popup menu
|
||||
void trayMenu(QAction* menuItemAction);
|
||||
void trayMenu(int id);
|
||||
//rebuild the popup menu with the current information
|
||||
void fillPopup();
|
||||
//update the list of available joystick devices
|
||||
@ -79,7 +87,7 @@ class LayoutManager : public QObject {
|
||||
//the layout that is currently in use
|
||||
QString CurrentLayout;
|
||||
//the popup menu from the tray/floating icon
|
||||
QMenu* Popup;
|
||||
QPopupMenu* Popup;
|
||||
|
||||
//if there is a LayoutEdit open, this points to it. Otherwise, NULL.
|
||||
LayoutEdit* le;
|
||||
|
@ -1,24 +1,21 @@
|
||||
#include "layout_edit.h"
|
||||
|
||||
|
||||
//build the dialog
|
||||
LayoutEdit::LayoutEdit( LayoutManager* l ) {
|
||||
lm = l;
|
||||
|
||||
setWindowTitle( NAME );
|
||||
setWindowIcon(QPixmap(ICON24));
|
||||
setCaption( NAME );
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
LMain = new QVBoxLayout( this);
|
||||
LMain->setSpacing(5);
|
||||
LMain->setMargin(5);
|
||||
LMain = new QVBoxLayout( this,5,5 );
|
||||
|
||||
QFrame* frame = new QFrame(this);
|
||||
frame->setFrameStyle(QFrame::Box | QFrame::Sunken );
|
||||
QGridLayout* g = new QGridLayout(frame);
|
||||
g->setMargin(5);
|
||||
g->setSpacing(5);
|
||||
QGridLayout* g = new QGridLayout(frame,2,1,5,5);
|
||||
CLayouts = new QComboBox(frame);
|
||||
connect( CLayouts, SIGNAL(activated( const QString& )), lm, SLOT(load(const QString&)));
|
||||
g->addWidget(CLayouts,0,0,1,4);
|
||||
g->addMultiCellWidget(CLayouts,0,0,0,3);
|
||||
|
||||
//most of these buttons can link directly into slots in the LayoutManager
|
||||
BAdd = new QPushButton("Add", frame);
|
||||
@ -35,56 +32,43 @@ LayoutEdit::LayoutEdit( LayoutManager* l ) {
|
||||
g->addWidget(BRev,1,3);
|
||||
LMain->addWidget( frame );
|
||||
|
||||
//we have a WidgetStack to represent the multiple joypads
|
||||
PadStack = new QWidgetStack( this );
|
||||
PadStack->setFrameStyle(QFrame::Box | QFrame::Sunken );
|
||||
LMain->addWidget(PadStack);
|
||||
|
||||
//produce a list of names for the FlashRadioArray
|
||||
//this is only necesary since joystick devices need not always be
|
||||
//contiguous
|
||||
int padcount = available.count();
|
||||
QString names[padcount];
|
||||
int i = 0;
|
||||
do
|
||||
{
|
||||
QHashIterator<int, JoyPad*> it( available );
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
names[i] = it.value()->getName();
|
||||
QIntDictIterator<JoyPad> it( available );
|
||||
for ( ; it.current(); ++it ) {
|
||||
names[i] = it.current()->getName();
|
||||
++i;
|
||||
}
|
||||
} while (0);
|
||||
|
||||
//flash radio array
|
||||
JoyButtons = new FlashRadioArray(padcount, names, true, this );
|
||||
LMain->addWidget( JoyButtons );
|
||||
|
||||
//we have a WidgetStack to represent the multiple joypads
|
||||
PadStack = new QStackedWidget( this );
|
||||
PadStack->setFrameStyle(QFrame::Box | QFrame::Sunken );
|
||||
LMain->addWidget(PadStack);
|
||||
LMain->insertWidget( 1, JoyButtons );
|
||||
|
||||
//go through each of the available joysticks
|
||||
i = 0; // i is the current index into PadStack
|
||||
do
|
||||
{
|
||||
QHashIterator<int, JoyPad*> it(available);
|
||||
while (it.hasNext())
|
||||
{
|
||||
it.next();
|
||||
for (it.toFirst() ; it.current(); ++it ) {
|
||||
//add a new JoyPadWidget to the stack
|
||||
PadStack->insertWidget( i,it.value()->widget(PadStack,i) );
|
||||
PadStack->addWidget( it.current()->widget(PadStack,i),i );
|
||||
//every time it "flashes", flash the associated tab.
|
||||
connect( PadStack->widget(i), SIGNAL( flashed( int ) ), JoyButtons, SLOT( flash( int )));
|
||||
++i;
|
||||
}
|
||||
} while (0);
|
||||
//whenever a new tab is selected, raise the appropriate JoyPadWidget
|
||||
connect( JoyButtons, SIGNAL( changed( int ) ), PadStack, SLOT( setCurrentIndex( int )));
|
||||
connect( JoyButtons, SIGNAL( changed( int ) ), PadStack, SLOT( raiseWidget( int )));
|
||||
|
||||
updateLayoutList();
|
||||
|
||||
//add the buttons at the bottom.
|
||||
QHBoxLayout* h = new QHBoxLayout(0);
|
||||
h->setMargin(0);
|
||||
h->setSpacing(5);
|
||||
QHBoxLayout* h = new QHBoxLayout(0,0,5);
|
||||
QPushButton* close = new QPushButton( "-- Close Dialog --", this );
|
||||
connect(close, SIGNAL(clicked()), this, SLOT(close()));
|
||||
h->addWidget(close);
|
||||
@ -92,12 +76,11 @@ LayoutEdit::LayoutEdit( LayoutManager* l ) {
|
||||
connect( quit, SIGNAL( clicked() ), qApp, SLOT(quit()));
|
||||
h->addWidget(quit);
|
||||
LMain->addLayout(h);
|
||||
blockEvents = false;
|
||||
}
|
||||
|
||||
void LayoutEdit::setLayout(QString layout) {
|
||||
//change the text,
|
||||
CLayouts->setItemText(CLayouts->currentIndex(), layout);
|
||||
CLayouts->setCurrentText(layout);
|
||||
//update all the JoyPadWidgets.
|
||||
for (uint i = 0; i < available.count(); i++) {
|
||||
((JoyPadWidget*)PadStack->widget(i))->update();
|
||||
@ -110,23 +93,18 @@ void LayoutEdit::updateLayoutList() {
|
||||
QStringList layouts = lm->getLayoutNames();
|
||||
//For some reason, insertStringList doesn't want to work for me!
|
||||
for ( QStringList::Iterator it = layouts.begin(); it != layouts.end(); ++it ) {
|
||||
CLayouts->insertItem(-1,*it);
|
||||
CLayouts->insertItem(*it);
|
||||
}
|
||||
CLayouts->setItemText(CLayouts->currentIndex(), lm->CurrentLayout);
|
||||
CLayouts->setCurrentText(lm->CurrentLayout);
|
||||
}
|
||||
|
||||
void LayoutEdit::windowActivationChange( bool oldActive ) {
|
||||
if (oldActive) return;
|
||||
|
||||
//whenever the window becomes active, release all pressed buttons! This way
|
||||
//you don't get any presses without releases to confuse things.
|
||||
blockEvents = true;
|
||||
QHashIterator<int, JoyPad*> it( available );
|
||||
while (it.hasNext())
|
||||
{
|
||||
printf("iterating and releasing\n");
|
||||
it.next();
|
||||
it.value()->release();
|
||||
QIntDictIterator<JoyPad> it( available );
|
||||
for ( ; it.current(); ++it ) {
|
||||
it.current()->release();
|
||||
}
|
||||
printf("done releasing!\n");
|
||||
blockEvents = false;
|
||||
}
|
||||
|
@ -1,7 +1,11 @@
|
||||
#ifndef LAYOUT_EDIT_H
|
||||
#define LAYOUT_EDIT_H
|
||||
|
||||
#include <QStackedWidget>
|
||||
//needed to build the dialog
|
||||
#include <qdialog.h>
|
||||
#include <qlayout.h>
|
||||
#include <qcombobox.h>
|
||||
#include <qwidgetstack.h>
|
||||
|
||||
//for the tab list of joypads
|
||||
#include "flash.h"
|
||||
@ -28,13 +32,15 @@ class LayoutEdit : public QDialog {
|
||||
|
||||
//find out when the window is activated.
|
||||
virtual void windowActivationChange( bool oldActive );
|
||||
bool blockEvents;
|
||||
|
||||
//parts of the dialog:
|
||||
QVBoxLayout *LMain;
|
||||
QStackedWidget *PadStack;
|
||||
QWidgetStack *PadStack;
|
||||
FlashRadioArray *JoyButtons;
|
||||
|
||||
QComboBox* CLayouts;
|
||||
QPushButton *BAdd, *BRem, *BUpd, *BRev;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
65
src/loop.cpp
Normal file
65
src/loop.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include "loop.h"
|
||||
|
||||
JoyLoop::JoyLoop() {
|
||||
//I like to start from zero, though, in all honesty, this doesn't matter.
|
||||
tick = 0;
|
||||
}
|
||||
|
||||
bool JoyLoop::processEvents( ProcessEventsFlags ) {
|
||||
//standard event processing, except we get to throw in a few things of
|
||||
//our own!
|
||||
|
||||
int joydev;
|
||||
JoyPad* pad;
|
||||
js_event msg;
|
||||
int len;
|
||||
|
||||
//go through the currently plugged-in joysticks
|
||||
QIntDictIterator<JoyPad> it( available );
|
||||
for ( ; it.current(); ++it ) {
|
||||
pad = it.current();
|
||||
//get the file descriptor for the device
|
||||
joydev = pad->joydev;
|
||||
//and try reading an event, non-blocking
|
||||
len = read( joydev, &msg, sizeof(js_event));
|
||||
//if there was a real event waiting,
|
||||
if (len == (int) sizeof(js_event)) {
|
||||
//pass that event on to the joypad!
|
||||
pad->jsevent(msg);
|
||||
}
|
||||
}
|
||||
|
||||
//sleep for a moment. This is just to keep us from throwing all the
|
||||
//available processer power into madly checking for new events.
|
||||
usleep(1);
|
||||
|
||||
//now we can let QT process all of its events, like GUI events and timers.
|
||||
return QEventLoop::processEvents(AllEvents);
|
||||
}
|
||||
|
||||
void JoyLoop::takeTimer( Component* c ) {
|
||||
//if this is the first Component asking for a timer, then we can start
|
||||
//up the timer! It isn't running unless someone needs it.
|
||||
if (timerList.isEmpty()) startTimer( MSEC );
|
||||
//remember this Component so we can signal it.
|
||||
timerList.append( c );
|
||||
}
|
||||
|
||||
void JoyLoop::tossTimer( Component* c ) {
|
||||
//forget that Component, it doesn't NEED us any more :(
|
||||
timerList.remove( c );
|
||||
//if that means there are no longer any Components listening for timer
|
||||
//events, then we can go ahead and stop timing.
|
||||
if (timerList.isEmpty()) killTimers();
|
||||
}
|
||||
|
||||
void JoyLoop::timerEvent( QTimerEvent* ) {
|
||||
//ever MSEC miliseconds...
|
||||
|
||||
//increment the counter (used for timing in axis.cpp and button.cpp)
|
||||
++tick;
|
||||
//and notify every Component in the list.
|
||||
for ( Component* c = timerList.first(); c; c = timerList.next() ) {
|
||||
c->timer(tick);
|
||||
}
|
||||
}
|
39
src/loop.h
Normal file
39
src/loop.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef JOY_LOOP_H
|
||||
#define JOY_LOOP_H
|
||||
|
||||
//this is an event loop
|
||||
#include <qeventloop.h>
|
||||
|
||||
//for reading events from the joysticks
|
||||
#include <unistd.h>
|
||||
#include <linux/joystick.h>
|
||||
|
||||
//to pass events on to the joypads
|
||||
#include "joypad.h"
|
||||
//to know which devices need to be checked for joystick events
|
||||
#include "device.h"
|
||||
|
||||
//A Component is either an Axis or a Button
|
||||
class Component;
|
||||
|
||||
//the main event loop of QJoyPad; its main distinction from a regular event loop
|
||||
//is that it reads joystick events on every iteration and also provides a timer
|
||||
//to any Components that need it.
|
||||
class JoyLoop : public QEventLoop {
|
||||
public:
|
||||
JoyLoop();
|
||||
bool processEvents( ProcessEventsFlags );
|
||||
//provide a timer to the requesting Component
|
||||
void takeTimer( Component* c );
|
||||
//stop providing a timer to the given Component
|
||||
void tossTimer( Component* c );
|
||||
protected:
|
||||
//happens ever MSEC miliseconds :)
|
||||
virtual void timerEvent( QTimerEvent* );
|
||||
//just a counter, nothing more.
|
||||
int tick;
|
||||
//a list of the Components that need a timer
|
||||
QPtrList<Component> timerList;
|
||||
};
|
||||
|
||||
#endif
|
73
src/main.cpp
73
src/main.cpp
@ -1,13 +1,22 @@
|
||||
#define MAIN
|
||||
|
||||
//to create a qapplication
|
||||
#include <QFile>
|
||||
#include <qapplication.h>
|
||||
//for basic file i/o and argument parsing
|
||||
#include <qstring.h>
|
||||
#include <qdir.h>
|
||||
#include <qfile.h>
|
||||
#include <qstringlist.h>
|
||||
#include <qregexp.h>
|
||||
|
||||
//for ouput when there is no GUI going
|
||||
#include <stdio.h>
|
||||
|
||||
//to create and handle signals for various events
|
||||
#include <signal.h>
|
||||
|
||||
//for our custom-made event loop
|
||||
#include "loop.h"
|
||||
//to load layouts
|
||||
#include "layout.h"
|
||||
//to give event.h the current X11 display
|
||||
@ -16,14 +25,21 @@
|
||||
#include "device.h"
|
||||
//to produce errors!
|
||||
#include "error.h"
|
||||
#include <QX11Info>
|
||||
#include <poll.h>
|
||||
#include <cstdlib>
|
||||
|
||||
//for making universally available variables
|
||||
extern Display* display; //from event.h
|
||||
QHash<int, JoyPad*> available; //to device.h
|
||||
QHash<int, JoyPad*> joypads; //to device.h
|
||||
QIntDict<JoyPad> available; //to device.h
|
||||
QIntDict<JoyPad> joypads; //to device.h
|
||||
QPtrList<Component> timerList; //to timer.h
|
||||
|
||||
//to be made available in timer.h
|
||||
//they simply pass on the message to JoyLoop
|
||||
void takeTimer( Component* c ) {
|
||||
((JoyLoop*) qApp->eventLoop())->takeTimer( c );
|
||||
}
|
||||
void tossTimer( Component* c ) {
|
||||
((JoyLoop*) qApp->eventLoop())->tossTimer( c );
|
||||
}
|
||||
|
||||
//variables needed in various functions in this file
|
||||
LayoutManager* lm;
|
||||
@ -34,20 +50,17 @@ QString devdir = DEVDIR;
|
||||
//update the joystick devices!
|
||||
void buildJoyDevices() {
|
||||
//reset all joydevs to sentinal value (-1)
|
||||
do {
|
||||
QHashIterator<int, JoyPad*> it( joypads );
|
||||
while (it.hasNext() ) {
|
||||
it.next();
|
||||
it.value()->unsetDev();
|
||||
QIntDictIterator<JoyPad> it( joypads );
|
||||
for ( ; it.current(); ++it ) {
|
||||
it.current()->unsetDev();
|
||||
}
|
||||
} while (0);
|
||||
|
||||
//clear out the list of previously available joysticks
|
||||
available.clear();
|
||||
|
||||
//set all joydevs anew (create new JoyPad's if necesary)
|
||||
QDir DeviceDir(devdir);
|
||||
QStringList devices = DeviceDir.entryList(QStringList("js*"), QDir::System );
|
||||
QStringList devices = DeviceDir.entryList("js*", QDir::System );
|
||||
QRegExp devicename(".*\\js(\\d+)");
|
||||
int joydev;
|
||||
int index;
|
||||
@ -55,24 +68,15 @@ void buildJoyDevices() {
|
||||
//(note, with devfs, only available devices are listed)
|
||||
for (QStringList::Iterator it = devices.begin(); it != devices.end(); ++it) {
|
||||
//try opening the device.
|
||||
joydev = open( (devdir + "/" + (*it)).toStdString().c_str(), O_RDONLY | O_NONBLOCK);
|
||||
joydev = open( devdir + "/" + (*it), O_RDONLY | O_NONBLOCK);
|
||||
//if it worked, then we have a live joystick! Make sure it's properly
|
||||
//setup.
|
||||
if (joydev > 0) {
|
||||
|
||||
devicename.indexIn(*it);
|
||||
devicename.match(*it);
|
||||
index = QString(devicename.cap(1)).toInt();
|
||||
JoyPad* joypad;
|
||||
//if we've never seen this device before, make a new one!
|
||||
if (joypads[index] == 0) {
|
||||
struct pollfd read_struct;
|
||||
read_struct.fd = joydev;
|
||||
read_struct.events = POLLIN;
|
||||
char buf[10];
|
||||
while(poll(&read_struct, 1, 2)!=0) {
|
||||
printf("reading junk data\n");
|
||||
read(joydev, buf, 10);
|
||||
}
|
||||
joypad = new JoyPad( index, joydev );
|
||||
joypads.insert(index,joypad);
|
||||
}
|
||||
@ -84,7 +88,7 @@ void buildJoyDevices() {
|
||||
available.insert(index,joypad);
|
||||
}
|
||||
}
|
||||
printf("done rebuilding joystick devices\n");
|
||||
|
||||
//when it's all done, rebuild the popup menu so it displays the correct
|
||||
//information.
|
||||
lm->fillPopup();
|
||||
@ -106,9 +110,8 @@ void catchSIGIO( int sig )
|
||||
|
||||
//signal handler for SIGUSR1
|
||||
//SIGUSR1 means that we should update the available joystick device list.
|
||||
void catchSIGUSR1( int sig ) {
|
||||
//buildJoyDevices();
|
||||
lm->updateJoyDevs();
|
||||
void catchSIGUSR1( int sig ){
|
||||
buildJoyDevices();
|
||||
//remember to catch this signal again next time.
|
||||
signal( sig, catchSIGUSR1 );
|
||||
}
|
||||
@ -127,6 +130,7 @@ int main( int argc, char **argv )
|
||||
{
|
||||
//create a new event loop. This will be captured by the QApplication
|
||||
//when it gets created
|
||||
JoyLoop loop;
|
||||
QApplication a( argc, argv );
|
||||
|
||||
|
||||
@ -135,7 +139,7 @@ int main( int argc, char **argv )
|
||||
|
||||
//if there is no new directory and we can't make it, complain
|
||||
if (!dir.exists() && !dir.mkdir(settingsDir)) {
|
||||
printf("Couldn't create the QJoyPad save directory (%s)!", settingsDir.toStdString().c_str());
|
||||
printf("Couldn't create the QJoyPad save directory (" + settingsDir + ")!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -187,7 +191,7 @@ int main( int argc, char **argv )
|
||||
//then we try to store that layout in the last-used layout spot, to be
|
||||
//loaded by default.
|
||||
QFile file( settingsDir + "layout");
|
||||
if (file.open(QIODevice::WriteOnly))
|
||||
if (file.open(IO_WriteOnly))
|
||||
{
|
||||
QTextStream stream( &file );
|
||||
stream << layout;
|
||||
@ -205,7 +209,7 @@ int main( int argc, char **argv )
|
||||
if (pidFile.exists())
|
||||
{
|
||||
int pid;
|
||||
if (pidFile.open( QIODevice::ReadOnly ));
|
||||
if (pidFile.open( IO_ReadOnly ));
|
||||
{
|
||||
//try to get that pid...
|
||||
QTextStream( &pidFile ) >> pid;
|
||||
@ -230,7 +234,7 @@ int main( int argc, char **argv )
|
||||
}
|
||||
}
|
||||
//now we can try to create and write our pid to the lock file.
|
||||
if (pidFile.open( QIODevice::WriteOnly ))
|
||||
if (pidFile.open( IO_WriteOnly ))
|
||||
{
|
||||
QTextStream( &pidFile ) << getpid();
|
||||
pidFile.close();
|
||||
@ -248,15 +252,14 @@ int main( int argc, char **argv )
|
||||
|
||||
|
||||
//capture the current display for event.h
|
||||
display = QX11Info::display();
|
||||
display = QPaintDevice::x11AppDisplay();
|
||||
|
||||
//create a new LayoutManager with a tray icon / floating icon, depending
|
||||
//on the user's request
|
||||
lm = new LayoutManager(useTrayIcon);
|
||||
|
||||
//build the joystick device list for the first time,
|
||||
//buildJoyDevices();
|
||||
lm->updateJoyDevs();
|
||||
buildJoyDevices();
|
||||
|
||||
//load the last used layout (Or the one given as a command-line argument)
|
||||
lm->load();
|
||||
|
BIN
src/qjoypad
BIN
src/qjoypad
Binary file not shown.
@ -27,8 +27,8 @@ doc.extra = cp ../README.txt ../LICENSE.txt $${doc.path}
|
||||
##### Setup Compile #####
|
||||
|
||||
DEFINES += DEVDIR='"$$DEVDIR"'
|
||||
DEFINES += ICON24='\"$${icons.path}/icon24.png\"'
|
||||
DEFINES += ICON64='\"$${icons.path}/icon64.png\"'
|
||||
DEFINES += ICON24='"$${icons.path}/icon24.png"'
|
||||
DEFINES += ICON64='"$${icons.path}/icon64.png"'
|
||||
|
||||
TEMPLATE = app
|
||||
DEPENDPATH += trayicon
|
||||
@ -42,6 +42,7 @@ HEADERS += axis.h \
|
||||
button.h \
|
||||
button_edit.h \
|
||||
buttonw.h \
|
||||
component.h \
|
||||
constant.h \
|
||||
device.h \
|
||||
error.h \
|
||||
@ -53,9 +54,10 @@ HEADERS += axis.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
layout.h \
|
||||
getkey.h \
|
||||
layout_edit.h \
|
||||
loop.h \
|
||||
quickset.h \
|
||||
timer.h \
|
||||
trayicon/trayicon.h
|
||||
SOURCES += axis.cpp \
|
||||
axis_edit.cpp \
|
||||
@ -72,9 +74,9 @@ SOURCES += axis.cpp \
|
||||
keycode.cpp \
|
||||
layout.cpp \
|
||||
layout_edit.cpp \
|
||||
loop.cpp \
|
||||
main.cpp \
|
||||
quickset.cpp \
|
||||
getkey.cpp \
|
||||
trayicon/trayicon.cpp \
|
||||
trayicon/trayicon_x11.cpp
|
||||
|
||||
|
@ -1,16 +1,13 @@
|
||||
#include "quickset.h"
|
||||
#include "getkey.h"
|
||||
|
||||
//build the dialog
|
||||
QuickSet::QuickSet( JoyPad* jp)
|
||||
: QDialog() {
|
||||
: QDialog(){
|
||||
setting = false;
|
||||
joypad = jp;
|
||||
setWindowTitle("Set " + jp->getName());
|
||||
QVBoxLayout* LMain = new QVBoxLayout(this);
|
||||
LMain->setMargin(5);
|
||||
LMain->setSpacing(5);
|
||||
//LMain->setAutoAdd(true);
|
||||
setCaption("Quick set " + joypad->getName());
|
||||
QVBoxLayout* LMain = new QVBoxLayout(this,5,5);
|
||||
LMain->setAutoAdd(true);
|
||||
|
||||
new QLabel("Press any button or axis and\nyou will be prompted for a key.",this);
|
||||
QPushButton* button = new QPushButton("Done",this);
|
||||
|
@ -2,14 +2,12 @@
|
||||
#define QUICKSET_H
|
||||
|
||||
//for building the dialog
|
||||
#include <QLayout>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <linux/joystick.h>
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
#include <qpushbutton.h>
|
||||
|
||||
//to request new keycodes
|
||||
//#include "keycode.h"
|
||||
#include "keycode.h"
|
||||
//to actually set the joypad
|
||||
#include "joypad.h"
|
||||
|
||||
|
11
src/timer.h
Normal file
11
src/timer.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef JTIMER_H
|
||||
#define JTIMER_H
|
||||
|
||||
#include "component.h"
|
||||
|
||||
//the purpose of this file is to make a list of Components that need timer
|
||||
//notification available to JoyLoop, Axis, and Buttons
|
||||
extern void takeTimer( Component* ); //taken from main.cpp
|
||||
extern void tossTimer( Component* ); //taken from main.cpp
|
||||
|
||||
#endif
|
@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "trayicon.h"
|
||||
#include "qpopupmenu.h"
|
||||
|
||||
/*!
|
||||
\class TrayIcon qtrayicon.h
|
||||
@ -32,7 +33,7 @@
|
||||
\sa show
|
||||
*/
|
||||
TrayIcon::TrayIcon( QObject *parent, const char *name )
|
||||
: QObject(parent/*, name*/), pop(0), d(0)
|
||||
: QObject(parent, name), pop(0), d(0)
|
||||
{
|
||||
v_isWMDock = FALSE;
|
||||
}
|
||||
@ -44,8 +45,8 @@ TrayIcon::TrayIcon( QObject *parent, const char *name )
|
||||
|
||||
\sa show
|
||||
*/
|
||||
TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QMenu *popup, QObject *parent, const char *name )
|
||||
: QObject(parent/*, name*/), pop(popup), pm(icon), tip(tooltip), d(0)
|
||||
TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QPopupMenu *popup, QObject *parent, const char *name )
|
||||
: QObject(parent, name), pop(popup), pm(icon), tip(tooltip), d(0)
|
||||
{
|
||||
v_isWMDock = FALSE;
|
||||
}
|
||||
@ -62,7 +63,7 @@ TrayIcon::~TrayIcon()
|
||||
Sets the context menu to \a popup. The context menu will pop up when the
|
||||
user clicks the system tray entry with the right mouse button.
|
||||
*/
|
||||
void TrayIcon::setPopup( QMenu* popup )
|
||||
void TrayIcon::setPopup( QPopupMenu* popup )
|
||||
{
|
||||
pop = popup;
|
||||
}
|
||||
@ -72,7 +73,7 @@ void TrayIcon::setPopup( QMenu* popup )
|
||||
|
||||
\sa setPopup
|
||||
*/
|
||||
QMenu* TrayIcon::popup() const
|
||||
QPopupMenu* TrayIcon::popup() const
|
||||
{
|
||||
return pop;
|
||||
}
|
||||
@ -183,14 +184,14 @@ void TrayIcon::mousePressEvent( QMouseEvent *e )
|
||||
// This is for X11, menus appear on mouse press
|
||||
// I'm not sure whether Mac should be here or below.. Somebody check?
|
||||
switch ( e->button() ) {
|
||||
case Qt::RightButton:
|
||||
case RightButton:
|
||||
if ( pop ) {
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case Qt::LeftButton:
|
||||
case Qt::MidButton:
|
||||
case LeftButton:
|
||||
case MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
@ -215,7 +216,7 @@ void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
|
||||
#ifdef Q_WS_WIN
|
||||
// This is for Windows, where menus appear on mouse release
|
||||
switch ( e->button() ) {
|
||||
case Qt::RightButton:
|
||||
case RightButton:
|
||||
if ( pop ) {
|
||||
// Necessary to make keyboard focus
|
||||
// and menu closing work on Windows.
|
||||
@ -225,8 +226,8 @@ void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case Qt::LeftButton:
|
||||
case Qt::MidButton:
|
||||
case LeftButton:
|
||||
case MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
@ -248,7 +249,7 @@ void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
|
||||
*/
|
||||
void TrayIcon::mouseDoubleClickEvent( QMouseEvent *e )
|
||||
{
|
||||
if ( e->button() == Qt::LeftButton )
|
||||
if ( e->button() == LeftButton )
|
||||
emit doubleClicked( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
|
@ -23,12 +23,8 @@
|
||||
|
||||
#include <qobject.h>
|
||||
#include <qimage.h>
|
||||
#include <QPixmap>
|
||||
#include <QDir>
|
||||
#include <QMenu>
|
||||
#include <QMouseEvent>
|
||||
|
||||
|
||||
class QPopupMenu;
|
||||
|
||||
class TrayIcon : public QObject
|
||||
{
|
||||
@ -39,7 +35,7 @@ class TrayIcon : public QObject
|
||||
|
||||
public:
|
||||
TrayIcon( QObject *parent = 0, const char *name = 0 );
|
||||
TrayIcon( const QPixmap &, const QString &, QMenu *popup = 0, QObject *parent = 0, const char *name = 0 );
|
||||
TrayIcon( const QPixmap &, const QString &, QPopupMenu *popup = 0, QObject *parent = 0, const char *name = 0 );
|
||||
~TrayIcon();
|
||||
|
||||
// use WindowMaker dock mode. ignored on non-X11 platforms
|
||||
@ -47,8 +43,8 @@ public:
|
||||
bool isWMDock() { return v_isWMDock; }
|
||||
|
||||
// Set a popup menu to handle RMB
|
||||
void setPopup( QMenu * );
|
||||
QMenu* popup() const;
|
||||
void setPopup( QPopupMenu * );
|
||||
QPopupMenu* popup() const;
|
||||
|
||||
QPixmap icon() const;
|
||||
QString toolTip() const;
|
||||
@ -75,7 +71,7 @@ protected:
|
||||
virtual void mouseDoubleClickEvent( QMouseEvent *e );
|
||||
|
||||
private:
|
||||
QMenu *pop;
|
||||
QPopupMenu *pop;
|
||||
QPixmap pm;
|
||||
QString tip;
|
||||
bool v_isWMDock;
|
||||
|
@ -21,15 +21,18 @@
|
||||
|
||||
#include "trayicon.h"
|
||||
|
||||
#include <QX11Info>
|
||||
#include <QApplication>
|
||||
#include <QPainter>
|
||||
#include<qapplication.h>
|
||||
#include<qimage.h>
|
||||
#include<qpixmap.h>
|
||||
#include<qtooltip.h>
|
||||
#include<qpainter.h>
|
||||
|
||||
#include<X11/Xlib.h>
|
||||
#include<X11/Xutil.h>
|
||||
#include<X11/Xatom.h>
|
||||
|
||||
//#if QT_VERSION < 0x030200
|
||||
//extern Time;// qt_x_time;
|
||||
extern Time qt_x_time;
|
||||
//#endif
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -117,13 +120,13 @@ private:
|
||||
};
|
||||
|
||||
TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size)
|
||||
: QWidget(0/*, object->name(), Qt::WRepaintNoErase*/)
|
||||
: QWidget(0, object->name(), WRepaintNoErase)
|
||||
{
|
||||
iconObject = object;
|
||||
size = _size;
|
||||
setAttribute(Qt::WA_NoBackground);
|
||||
setFocusPolicy(Qt::NoFocus);
|
||||
//setBackgroundMode(X11ParentRelative);
|
||||
|
||||
setFocusPolicy(NoFocus);
|
||||
setBackgroundMode(X11ParentRelative);
|
||||
|
||||
setMinimumSize(size, size);
|
||||
setMaximumSize(size, size);
|
||||
@ -132,7 +135,7 @@ TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size)
|
||||
// This base stuff is required by both FreeDesktop specification and WindowMaker
|
||||
void TrayIcon::TrayIconPrivate::initWM(WId icon)
|
||||
{
|
||||
Display *dsp = x11Info().display();
|
||||
Display *dsp = x11Display();
|
||||
WId leader = winId();
|
||||
|
||||
// set the class hint
|
||||
@ -157,7 +160,7 @@ void TrayIcon::TrayIconPrivate::initWM(WId icon)
|
||||
void TrayIcon::TrayIconPrivate::setPixmap(const QPixmap &pm)
|
||||
{
|
||||
pix = pm;
|
||||
setWindowIcon(pix);
|
||||
setIcon(pix);
|
||||
repaint();
|
||||
}
|
||||
|
||||
@ -174,17 +177,15 @@ void TrayIcon::TrayIconPrivate::enterEvent(QEvent *e)
|
||||
//if ( !qApp->focusWidget() ) {
|
||||
XEvent ev;
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.xfocus.display = x11Info().display();//qt_xdisplay();
|
||||
ev.xfocus.display = qt_xdisplay();
|
||||
ev.xfocus.type = FocusIn;
|
||||
ev.xfocus.window = winId();
|
||||
ev.xfocus.mode = NotifyNormal;
|
||||
ev.xfocus.detail = NotifyAncestor;
|
||||
Time time = x11Info().appTime();//qt_x_time;
|
||||
//qt_x_time = 1;
|
||||
x11Info().setAppTime(1);
|
||||
Time time = qt_x_time;
|
||||
qt_x_time = 1;
|
||||
qApp->x11ProcessEvent( &ev );
|
||||
//qt_x_time = time;
|
||||
x11Info().setAppTime(time);
|
||||
qt_x_time = time;
|
||||
//}
|
||||
//#endif
|
||||
QWidget::enterEvent(e);
|
||||
@ -232,7 +233,7 @@ TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm)
|
||||
initWM( winId() );
|
||||
|
||||
// initialize NetWM
|
||||
Display *dsp = x11Info().display();//x11Display();
|
||||
Display *dsp = x11Display();
|
||||
|
||||
// dock the widget (adapted from SIM-ICQ)
|
||||
Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen
|
||||
@ -278,16 +279,16 @@ public:
|
||||
void setPixmap(const QPixmap &_pm)
|
||||
{
|
||||
QPixmap pm;
|
||||
QImage i = _pm.toImage();
|
||||
i = i.scaled(i.width() * 2, i.height() * 2);
|
||||
pm = QPixmap::fromImage(i);
|
||||
QImage i = _pm.convertToImage();
|
||||
i = i.scale(i.width() * 2, i.height() * 2);
|
||||
pm.convertFromImage(i);
|
||||
|
||||
TrayIconPrivate::setPixmap(pm);
|
||||
|
||||
// thanks to Robert Spier for this:
|
||||
// for some reason the repaint() isn't being honored, or isn't for
|
||||
// the icon. So force one on the widget behind the icon
|
||||
//erase();
|
||||
erase();
|
||||
QPaintEvent pe( rect() );
|
||||
paintEvent(&pe);
|
||||
}
|
||||
@ -364,11 +365,8 @@ void TrayIcon::sysUpdateToolTip()
|
||||
if ( !d )
|
||||
return;
|
||||
|
||||
if ( tip.isEmpty() ) {
|
||||
//QToolTip::remove(d);
|
||||
d->setToolTip(QString());
|
||||
} else {
|
||||
//QToolTip::add(d, tip);
|
||||
d->setToolTip(tip);
|
||||
}
|
||||
if ( tip.isEmpty() )
|
||||
QToolTip::remove(d);
|
||||
else
|
||||
QToolTip::add(d, tip);
|
||||
}
|
||||
|
Reference in New Issue
Block a user