Skip to content

Commit 50b809d

Browse files
pedro-wSiegeLord
authored andcommitted
Implement UNICODE for joystick
1 parent b2e6f42 commit 50b809d

File tree

2 files changed

+65
-60
lines changed

2 files changed

+65
-60
lines changed

include/allegro5/internal/aintern_wjoydxnu.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ typedef enum
4242

4343
typedef struct
4444
{
45-
bool have_x; char name_x[NAME_LEN];
46-
bool have_y; char name_y[NAME_LEN];
47-
bool have_z; char name_z[NAME_LEN];
48-
bool have_rx; char name_rx[NAME_LEN];
49-
bool have_ry; char name_ry[NAME_LEN];
50-
bool have_rz; char name_rz[NAME_LEN];
51-
int num_sliders; char name_slider[MAX_SLIDERS][NAME_LEN];
52-
int num_povs; char name_pov[MAX_POVS][NAME_LEN];
53-
int num_buttons; char name_button[MAX_BUTTONS][NAME_LEN];
45+
bool have_x; TCHAR name_x[NAME_LEN];
46+
bool have_y; TCHAR name_y[NAME_LEN];
47+
bool have_z; TCHAR name_z[NAME_LEN];
48+
bool have_rx; TCHAR name_rx[NAME_LEN];
49+
bool have_ry; TCHAR name_ry[NAME_LEN];
50+
bool have_rz; TCHAR name_rz[NAME_LEN];
51+
int num_sliders; TCHAR name_slider[MAX_SLIDERS][NAME_LEN];
52+
int num_povs; TCHAR name_pov[MAX_POVS][NAME_LEN];
53+
int num_buttons; TCHAR name_button[MAX_BUTTONS][NAME_LEN];
5454
} CAPS_AND_NAMES;
5555

5656

src/win/wjoydxnu.cpp

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ ALLEGRO_DEBUG_CHANNEL("dinput")
9696
#include "allegro5/joystick.h"
9797
#include "allegro5/internal/aintern_joystick.h"
9898
#include "allegro5/internal/aintern_wjoydxnu.h"
99-
99+
#include "allegro5/internal/aintern_wunicode.h"
100100

101101

102102

@@ -482,45 +482,45 @@ static BOOL CALLBACK object_enum_callback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVO
482482

483483
if (GUIDTYPE_EQ(__al_GUID_XAxis)) {
484484
can->have_x = true;
485-
_al_sane_strncpy(can->name_x, lpddoi->tszName, NAME_LEN);
485+
_tcsncpy(can->name_x, lpddoi->tszName, NAME_LEN);
486486
}
487487
else if (GUIDTYPE_EQ(__al_GUID_YAxis)) {
488488
can->have_y = true;
489-
_al_sane_strncpy(can->name_y, lpddoi->tszName, NAME_LEN);
489+
_tcsncpy(can->name_y, lpddoi->tszName, NAME_LEN);
490490
}
491491
else if (GUIDTYPE_EQ(__al_GUID_ZAxis)) {
492492
can->have_z = true;
493-
_al_sane_strncpy(can->name_z, lpddoi->tszName, NAME_LEN);
493+
_tcsncpy(can->name_z, lpddoi->tszName, NAME_LEN);
494494
}
495495
else if (GUIDTYPE_EQ(__al_GUID_RxAxis)) {
496496
can->have_rx = true;
497-
_al_sane_strncpy(can->name_rx, lpddoi->tszName, NAME_LEN);
497+
_tcsncpy(can->name_rx, lpddoi->tszName, NAME_LEN);
498498
}
499499
else if (GUIDTYPE_EQ(__al_GUID_RyAxis)) {
500500
can->have_ry = true;
501-
_al_sane_strncpy(can->name_ry, lpddoi->tszName, NAME_LEN);
501+
_tcsncpy(can->name_ry, lpddoi->tszName, NAME_LEN);
502502
}
503503
else if (GUIDTYPE_EQ(__al_GUID_RzAxis)) {
504504
can->have_rz = true;
505-
_al_sane_strncpy(can->name_rz, lpddoi->tszName, NAME_LEN);
505+
_tcsncpy(can->name_rz, lpddoi->tszName, NAME_LEN);
506506
}
507507
else if (GUIDTYPE_EQ(__al_GUID_Slider)) {
508508
if (can->num_sliders < MAX_SLIDERS) {
509-
_al_sane_strncpy(can->name_slider[can->num_sliders], lpddoi->tszName,
509+
_tcsncpy(can->name_slider[can->num_sliders], lpddoi->tszName,
510510
NAME_LEN);
511511
can->num_sliders++;
512512
}
513513
}
514514
else if (GUIDTYPE_EQ(__al_GUID_POV)) {
515515
if (can->num_povs < MAX_POVS) {
516-
_al_sane_strncpy(can->name_pov[can->num_povs], lpddoi->tszName,
516+
_tcsncpy(can->name_pov[can->num_povs], lpddoi->tszName,
517517
NAME_LEN);
518518
can->num_povs++;
519519
}
520520
}
521521
else if (GUIDTYPE_EQ(__al_GUID_Button)) {
522522
if (can->num_buttons < MAX_BUTTONS) {
523-
_al_sane_strncpy(can->name_button[can->num_buttons], lpddoi->tszName,
523+
_tcsncpy(can->name_button[can->num_buttons], lpddoi->tszName,
524524
NAME_LEN);
525525
can->num_buttons++;
526526
}
@@ -532,13 +532,14 @@ static BOOL CALLBACK object_enum_callback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVO
532532
}
533533

534534

535-
static char *add_string(char *buf, const char *src, int *pos, int bufsize)
535+
static char *add_string(char *buf, const TCHAR *src, int *pos, int bufsize, const char* dfl)
536536
{
537-
char *dest = buf + *pos;
538-
537+
char *dest;
538+
539+
dest = buf + *pos;
539540
if (*pos >= bufsize - 1) {
540541
/* Out of space. */
541-
ASSERT(dest[0] == '\0');
542+
ALLEGRO_ASSERT(dest[0] == '\0');
542543
return dest;
543544
}
544545

@@ -547,11 +548,16 @@ static char *add_string(char *buf, const char *src, int *pos, int bufsize)
547548
dest++;
548549
(*pos)++;
549550
}
550-
551-
_al_sane_strncpy(dest, src, bufsize - *pos);
552-
(*pos) += strlen(dest);
553-
ASSERT(*pos < bufsize);
554-
551+
if (src) {
552+
dest = _twin_copy_tchar_to_utf8(dest, src, bufsize - *pos);
553+
} else {
554+
dest = _al_sane_strncpy(dest, dfl, bufsize - *pos);
555+
}
556+
ALLEGRO_ASSERT(dest != 0);
557+
if (dest) {
558+
(*pos) += strlen(dest);
559+
ALLEGRO_ASSERT(*pos < bufsize);
560+
}
555561
return dest;
556562
}
557563

@@ -569,76 +575,75 @@ static void fill_joystick_info_using_caps_and_names(ALLEGRO_JOYSTICK_DIRECTX *jo
569575

570576
#define N_STICK (info->num_sticks)
571577
#define N_AXIS (info->stick[N_STICK].num_axes)
572-
#define OR(A, B) ((A) ? ADD_STRING(A) : ADD_STRING(B))
573-
#define ADD_STRING(s) add_string(joy->all_names, (s), &pos, \
574-
sizeof(joy->all_names))
578+
#define ADD_STRING(A, dfl) (add_string(joy->all_names, (A), &pos, \
579+
sizeof(joy->all_names), (dfl)))
575580

576581
/* the X, Y, Z axes make up the first stick */
577582
if (can->have_x || can->have_y || can->have_z) {
578583
if (can->have_x) {
579584
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
580-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_x, default_name_x);
585+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_x, default_name_x);
581586
joy->x_mapping.stick = N_STICK;
582587
joy->x_mapping.axis = N_AXIS;
583588
N_AXIS++;
584589
}
585590

586591
if (can->have_y) {
587592
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
588-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_y, default_name_y);
593+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_y, default_name_y);
589594
joy->y_mapping.stick = N_STICK;
590595
joy->y_mapping.axis = N_AXIS;
591596
N_AXIS++;
592597
}
593598

594599
if (can->have_z) {
595600
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
596-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_z, default_name_z);
601+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_z, default_name_z);
597602
joy->z_mapping.stick = N_STICK;
598603
joy->z_mapping.axis = N_AXIS;
599604
N_AXIS++;
600605
}
601606

602-
info->stick[N_STICK].name = ADD_STRING(default_name_stick);
607+
info->stick[N_STICK].name = ADD_STRING(0, default_name_stick);
603608
N_STICK++;
604609
}
605610

606611
/* the Rx, Ry, Rz axes make up the next stick */
607612
if (can->have_rx || can->have_ry || can->have_rz) {
608613
if (can->have_rx) {
609614
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
610-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_rx, default_name_rx);
615+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_rx, default_name_rx);
611616
joy->rx_mapping.stick = N_STICK;
612617
joy->rx_mapping.axis = N_AXIS;
613618
N_AXIS++;
614619
}
615620

616621
if (can->have_ry) {
617622
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
618-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_ry, default_name_ry);
623+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_ry, default_name_ry);
619624
joy->ry_mapping.stick = N_STICK;
620625
joy->ry_mapping.axis = N_AXIS;
621626
N_AXIS++;
622627
}
623628

624629
if (can->have_rz) {
625630
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
626-
info->stick[N_STICK].axis[N_AXIS].name = OR(can->name_rz, default_name_rz);
631+
info->stick[N_STICK].axis[N_AXIS].name = ADD_STRING(can->name_rz, default_name_rz);
627632
joy->rz_mapping.stick = N_STICK;
628633
joy->rz_mapping.axis = N_AXIS;
629634
N_AXIS++;
630635
}
631636

632-
info->stick[N_STICK].name = ADD_STRING(default_name_stick);
637+
info->stick[N_STICK].name = ADD_STRING(0, default_name_stick);
633638
N_STICK++;
634639
}
635640

636641
/* sliders are assigned to one stick each */
637642
for (i = 0; i < can->num_sliders; i++) {
638643
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL | ALLEGRO_JOYFLAG_ANALOGUE;
639644
info->stick[N_STICK].num_axes = 1;
640-
info->stick[N_STICK].axis[0].name = ADD_STRING("axis");
641-
info->stick[N_STICK].name = OR(can->name_slider[i], default_name_slider);
645+
info->stick[N_STICK].axis[0].name = ADD_STRING(0, "axis");
646+
info->stick[N_STICK].name = ADD_STRING(can->name_slider[i], default_name_slider);
642647
joy->slider_mapping[i].stick = N_STICK;
643648
joy->slider_mapping[i].axis = 0;
644649
N_STICK++;
@@ -648,16 +653,16 @@ static void fill_joystick_info_using_caps_and_names(ALLEGRO_JOYSTICK_DIRECTX *jo
648653
for (i = 0; i < can->num_povs; i++) {
649654
info->stick[N_STICK].flags = ALLEGRO_JOYFLAG_DIGITAL;
650655
info->stick[N_STICK].num_axes = 2;
651-
info->stick[N_STICK].axis[0].name = ADD_STRING("left/right");
652-
info->stick[N_STICK].axis[1].name = ADD_STRING("up/down");
653-
info->stick[N_STICK].name = OR(can->name_pov[i], default_name_hat);
656+
info->stick[N_STICK].axis[0].name = ADD_STRING(0, "left/right");
657+
info->stick[N_STICK].axis[1].name = ADD_STRING(0, "up/down");
658+
info->stick[N_STICK].name = ADD_STRING(can->name_pov[i], default_name_hat);
654659
joy->pov_mapping_stick[i] = N_STICK;
655660
N_STICK++;
656661
}
657662

658663
/* buttons */
659664
for (i = 0; i < can->num_buttons; i++) {
660-
info->button[i].name = OR(can->name_button[i], default_name_button[i]);
665+
info->button[i].name = ADD_STRING(can->name_button[i], default_name_button[i]);
661666
}
662667

663668
info->num_buttons = can->num_buttons;
@@ -681,20 +686,20 @@ static void fill_joystick_info_using_caps_and_names(ALLEGRO_JOYSTICK_DIRECTX *jo
681686
info->stick[2].axis[1].name = info->stick[1].axis[1].name = info->stick[0].axis[1].name;
682687

683688
/* first four button names contained junk; replace with valid strings */
684-
info->button[ 0].name = ADD_STRING("Triangle");
685-
info->button[ 1].name = ADD_STRING("Circle");
686-
info->button[ 2].name = ADD_STRING("X");
687-
info->button[ 3].name = ADD_STRING("Square");
689+
info->button[ 0].name = ADD_STRING(0, "Triangle");
690+
info->button[ 1].name = ADD_STRING(0, "Circle");
691+
info->button[ 2].name = ADD_STRING(0, "X");
692+
info->button[ 3].name = ADD_STRING(0, "Square");
688693

689694
/* while we're at it, give these controls more sensible names, too */
690-
info->stick[0].name = ADD_STRING("[L-stick] or D-pad");
691-
info->stick[1].name = ADD_STRING("[R-stick]");
692-
info->stick[2].name = ADD_STRING("[D-pad]");
695+
info->stick[0].name = ADD_STRING(0, "[L-stick] or D-pad");
696+
info->stick[1].name = ADD_STRING(0, "[R-stick]");
697+
info->stick[2].name = ADD_STRING(0, "[D-pad]");
693698
}
694699

695700
#undef N_AXIS
696701
#undef N_STICK
697-
#undef OR
702+
#undef ADD_STRING
698703
#undef ADD_STRING
699704
}
700705

@@ -925,7 +930,7 @@ static BOOL CALLBACK joystick_enum_callback(LPCDIDEVICEINSTANCE lpddi, LPVOID pv
925930
memcpy(&joy->guid, &lpddi->guidInstance, sizeof(GUID));
926931
memcpy(&joy->product_guid, &lpddi->guidProduct, sizeof(GUID));
927932

928-
_al_sane_strncpy(joy->name, lpddi->tszInstanceName, sizeof(joy->name));
933+
_twin_copy_tchar_to_utf8(joy->name, lpddi->tszInstanceName, sizeof(joy->name));
929934

930935
/* fill in the joystick structure */
931936
fill_joystick_info_using_caps_and_names(joy, &caps_and_names);
@@ -1127,10 +1132,10 @@ static bool joydx_init_joystick(void)
11271132

11281133
MAKE_UNION(&joystick_dinput, LPDIRECTINPUT *);
11291134

1130-
ASSERT(!joystick_dinput);
1131-
ASSERT(!joydx_num_joysticks);
1132-
ASSERT(!joydx_thread);
1133-
ASSERT(!STOP_EVENT);
1135+
ALLEGRO_ASSERT(!joystick_dinput);
1136+
ALLEGRO_ASSERT(!joydx_num_joysticks);
1137+
ALLEGRO_ASSERT(!joydx_thread);
1138+
ALLEGRO_ASSERT(!STOP_EVENT);
11341139

11351140
/* load DirectInput module */
11361141
_al_dinput_module = _al_win_safe_load_library(_al_dinput_module_name);
@@ -1200,7 +1205,7 @@ static void joydx_exit_joystick(void)
12001205

12011206
ALLEGRO_DEBUG("Entering joydx_exit_joystick\n");
12021207

1203-
ASSERT(joydx_thread);
1208+
ALLEGRO_ASSERT(joydx_thread);
12041209

12051210
/* stop the thread */
12061211
SetEvent(STOP_EVENT);
@@ -1288,7 +1293,7 @@ static ALLEGRO_JOYSTICK *joydx_get_joystick(int num)
12881293
{
12891294
ALLEGRO_JOYSTICK *ret = NULL;
12901295
unsigned i;
1291-
ASSERT(num >= 0);
1296+
ALLEGRO_ASSERT(num >= 0);
12921297

12931298
EnterCriticalSection(&joydx_thread_cs);
12941299

0 commit comments

Comments
 (0)