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:
John Toman
2009-05-26 00:57:02 +00:00
committed by virtuoussin13
parent 1cc6e9087e
commit 17ed926cdf
45 changed files with 2674 additions and 2784 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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:

View File

@ -1,6 +1,5 @@
#include "axisw.h"
AxisWidget::AxisWidget( Axis* a, QWidget* parent )
: FlashButton( "",parent) {
axis = a;

View File

@ -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:

View File

@ -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);
}

View File

@ -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

View File

@ -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...

View File

@ -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"

View File

@ -1,6 +1,5 @@
#include "buttonw.h"
ButtonWidget::ButtonWidget( Button* b, QWidget* parent )
: FlashButton( "", parent) {
button = b;

View File

@ -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
View 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

View File

@ -24,6 +24,4 @@
#define NAME "QJoyPad 3.4"
#define MOUSE_OFFSET 400
#endif

View File

@ -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

View File

@ -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

View File

@ -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);
}
}

View File

@ -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;

View File

@ -15,9 +15,8 @@
#include <QPushButton>
#include <QPalette>
#include <QBoxLayout>
#include <qpushbutton.h>
#include <qlayout.h>
//A QPushButton that can flash a color

View File

@ -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();

View File

@ -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

View File

@ -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;
}
}

View File

@ -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

View File

@ -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()));
}

View File

@ -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"

View File

@ -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,

View File

@ -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.

View File

@ -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;

View File

@ -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 {

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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
View 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
View 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

View File

@ -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();

Binary file not shown.

View File

@ -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

View File

@ -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);

View File

@ -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
View 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

View File

@ -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();
}

View File

@ -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;

View File

@ -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);
}