-
Notifications
You must be signed in to change notification settings - Fork 0
/
padexec.c
129 lines (107 loc) · 2.89 KB
/
padexec.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <SDL2/SDL.h>
/*
This program simply executes programs, when a key gets pressed
from a game pad (or whatever SDL2 detects as joystick).
License: GPLv2
Dependencies:
- SDL2
- Very little C/programming knowledge
HOWTO:
- Compile this program (run make)
- Attach your device
- start it to get the device name
- copy paste the device name from the terminal to the
configuration variable below
- rebuild the program, run it again
- press keys to get the button IDs
- adjust the button_action function to run commands
that you like, when a certain key gets pressed. Don't
forget the return in switch...case!
- make again, test if it works as desired
- you can do the same thing for configuring axis actions
HINTS:
- simulating keypresses and other sick X11 stuff should
be possible with xdotool and similar programs
*/
//
// CONFIG START
//
#define CONFIG_JOYSTICK_NAME "YuanChen Game Controller"
void button_action(int id)
{
switch(id)
{
case 9:
system("mpc toggle");
return;
case 5:
system("mpc next");
return;
case 4:
system("mpc prev");
return;
case 2:
system("mpc stop");
return;
}
}
void axis_action(int id, int value)
{
/*
if(id == 0 && value > 1000)
{
system("echo trololo");
return;
}
*/
}
//
// CONFIG END
//
int main(int argc, char* argv[])
{
// Initialize SDL2
if(SDL_Init(SDL_INIT_GAMECONTROLLER) < 0)
return printf("ERROR from SDL: %s\n", SDL_GetError());
// List the config all available joysticks
int pad_count = SDL_NumJoysticks();
int found = -1;
printf("To make any use of this program, you'll need to hack up the source for your needs.\n\n");
printf("CONFIG_JOYSTICK_NAME: %s\n\n", CONFIG_JOYSTICK_NAME);
printf("Here's a list of attached joystick(s) (%i total):\n", pad_count);
for(int i=0;i<pad_count;i++)
{
printf("\t#%i: %s\n", i, SDL_JoystickNameForIndex(i));
if(!strcmp(SDL_JoystickNameForIndex(i), CONFIG_JOYSTICK_NAME))
found = i;
}
printf("\n");
// Quit if it wasn't found
if(found == -1)
exit(printf("ERROR: Couldn't find the joystick that is configured. Exiting.\n"));
// On success, print some details
printf("Yay, found the pad we were looking for \\o/\n");
SDL_Joystick* joy = SDL_JoystickOpen(found);
if(!joy) exit(printf("...but opening it has failed. Exiting.\n"));
printf("Number of Axes: %d\n", SDL_JoystickNumAxes(joy));
printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(joy));
// Wait for keypresses
while(1)
{
SDL_Event e;
SDL_WaitEvent(&e);
if(e.type == SDL_QUIT) exit(0);
if(e.type == SDL_JOYBUTTONDOWN)
{
printf("Button: %i\n", e.jbutton.button);
button_action(e.jbutton.button);
}
if(e.type == SDL_JOYAXISMOTION)
{
// if this goes off all the time, you should define a treshhold here!
printf("Axis: %i, value: %i\n", e.jaxis.axis, e.jaxis.value);
axis_action(e.jaxis.axis, e.jaxis.value);
}
}
}