Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
60e0566d
You need to sign in or sign up before continuing.
Unverified
Commit
60e0566d
authored
Jan 05, 2020
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'uli42-pr/fix_keyconv_on_reconnect' into 3.6.x
Attributes GH PR #887:
https://github.com/ArcticaProject/nx-libs/pull/887
parents
cf24c658
6f390f82
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
205 additions
and
181 deletions
+205
-181
Args.c
nx-X11/programs/Xserver/hw/nxagent/Args.c
+61
-15
Keyboard.c
nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
+122
-140
Reconnect.c
nx-X11/programs/Xserver/hw/nxagent/Reconnect.c
+22
-26
No files found.
nx-X11/programs/Xserver/hw/nxagent/Args.c
View file @
60e0566d
...
...
@@ -687,7 +687,20 @@ int ddxProcessArgument(int argc, char *argv[], int i)
{
SAFE_free
(
nxagentKeyboard
);
nxagentKeyboard
=
strdup
(
argv
[
i
]);
if
(
nxagentX2go
&&
strcmp
(
argv
[
i
],
"null/null"
)
==
0
)
{
#ifdef TEST
fprintf
(
stderr
,
"%s: changing nxagentKeyboard from [null/null] to [clone].
\n
"
,
__func__
);
#endif
SAFE_free
(
nxagentKeyboard
);
nxagentKeyboard
=
strdup
(
"clone"
);
}
else
{
nxagentKeyboard
=
strdup
(
argv
[
i
]);
}
if
(
nxagentKeyboard
==
NULL
)
{
FatalError
(
"malloc failed"
);
...
...
@@ -1489,27 +1502,36 @@ static void nxagentParseOptionString(char *string)
char
*
option
=
NULL
;
/*
* we must not modify string, but strtok will insert \0. So let's
* work with a copy
*/
char
*
dup
=
strdup
(
string
);
/*
* Remove the port specification.
*/
char
*
delimiter
=
rindex
(
string
,
':'
);
char
*
delimiter
=
rindex
(
dup
,
':'
);
if
(
delimiter
)
{
*
delimiter
=
0
;
#ifdef DEBUG
fprintf
(
stderr
,
"%s: stripping port specification [%s]
\n
"
,
__func__
,
delimiter
);
#endif
*
delimiter
=
'\0'
;
}
else
{
fprintf
(
stderr
,
"Warning: Option file doesn't contain a port specification.
\n
"
);
}
while
((
option
=
strtok
(
option
?
NULL
:
string
,
","
)))
while
((
option
=
strtok
(
option
?
NULL
:
dup
,
","
)))
{
delimiter
=
rindex
(
option
,
'='
);
if
(
delimiter
)
{
*
delimiter
=
0
;
*
delimiter
=
'\0'
;
value
=
delimiter
+
1
;
}
else
...
...
@@ -1519,6 +1541,31 @@ static void nxagentParseOptionString(char *string)
nxagentParseSingleOption
(
option
,
value
);
}
SAFE_free
(
dup
);
}
char
*
nxagentSkipNXMarker
(
char
*
string
)
{
if
(
strncasecmp
(
string
,
"nx/nx,"
,
6
)
==
0
||
strncasecmp
(
string
,
"nx/nx:"
,
6
)
==
0
)
{
#ifdef DEBUG
fprintf
(
stderr
,
"%s: skipping [%6.6s]
\n
"
,
__func__
,
string
);
#endif
return
string
+
6
;
}
else
if
(
strncasecmp
(
string
,
"nx,"
,
3
)
==
0
||
strncasecmp
(
string
,
"nx:"
,
3
)
==
0
)
{
#ifdef DEBUG
fprintf
(
stderr
,
"%s: skipping [%3.3s]
\n
"
,
__func__
,
string
);
#endif
return
string
+
3
;
}
else
{
return
string
;
}
}
void
nxagentProcessOptions
(
char
*
string
)
...
...
@@ -1533,15 +1580,10 @@ void nxagentProcessOptions(char * string)
/* if the "filename" starts with an nx marker treat it
as an option _string_ instead of a filename */
if
(
strncasecmp
(
string
,
"nx/nx,"
,
6
)
==
0
||
strncasecmp
(
string
,
"nx/nx:"
,
6
)
==
0
)
{
nxagentParseOptionString
(
string
+
6
);
}
else
if
(
strncasecmp
(
string
,
"nx,"
,
3
)
==
0
||
strncasecmp
(
string
,
"nx:"
,
3
)
==
0
)
char
*
skipped
=
nxagentSkipNXMarker
(
string
);
if
(
skipped
!=
string
)
{
nxagentParseOptionString
(
s
tring
+
3
);
nxagentParseOptionString
(
s
kipped
);
}
else
{
...
...
@@ -1650,9 +1692,13 @@ void nxagentProcessOptionsFile(char * filename)
for
(
offset
=
0
;
(
offset
<
sizeOfFile
)
&&
(
data
[
offset
]
!=
'\n'
);
offset
++
);
data
[
offset
]
=
0
;
data
[
offset
]
=
'\0'
;
#ifdef DEBUG
fprintf
(
stderr
,
"%s: first line of options file [%s]
\n
"
,
__func__
,
data
);
#endif
nxagentParseOptionString
(
data
);
nxagentParseOptionString
(
nxagentSkipNXMarker
(
data
)
);
nxagentProcessOptionsFileExit:
...
...
nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
View file @
60e0566d
...
...
@@ -250,7 +250,7 @@ CARD8 nxagentConvertKeycode(CARD8 k)
{
#ifdef DEBUG
if
(
k
!=
nxagentConvertedKeycodes
[
k
])
fprintf
(
stderr
,
"
nxagentConvertKeycode: converting keycode [%d] to [%d]
\n
"
,
k
,
nxagentConvertedKeycodes
[
k
]);
fprintf
(
stderr
,
"
%s: converting keycode [%d] to [%d]
\n
"
,
__func__
,
k
,
nxagentConvertedKeycodes
[
k
]);
#endif
return
nxagentConvertedKeycodes
[
k
];
...
...
@@ -276,13 +276,10 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
{
#ifdef XKB
XkbSrvInfoPtr
xkbi
;
XkbControlsPtr
xkbc
;
if
(
!
noXkbExtension
)
{
xkbi
=
pDev
->
key
->
xkbInfo
;
xkbc
=
xkbi
->
desc
->
ctrls
;
XkbSrvInfoPtr
xkbi
=
pDev
->
key
->
xkbInfo
;
XkbControlsPtr
xkbc
=
xkbi
->
desc
->
ctrls
;
/*
* We want to prevent agent generating auto-repeated
...
...
@@ -292,7 +289,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
*/
#ifdef TEST
fprintf
(
stderr
,
"
nxagentChangeKeyboardControl: Repeat delay was [%d] interval was [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: Repeat delay was [%d] interval was [%d].
\n
"
,
__func__
,
xkbc
->
repeat_delay
,
xkbc
->
repeat_interval
);
#endif
...
...
@@ -300,7 +297,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
xkbc
->
repeat_interval
=
~
0
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentChangeKeyboardControl: Repeat delay is now [%d] interval is now [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: Repeat delay is now [%d] interval is now [%d].
\n
"
,
__func__
,
xkbc
->
repeat_delay
,
xkbc
->
repeat_interval
);
#endif
}
...
...
@@ -314,22 +311,21 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
if
(
nxagentOption
(
DeviceControl
))
{
unsigned
long
value_mask
;
XKeyboardControl
values
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentChangeKeyboardControl: WARNING! Propagating changes to keyboard settings.
\n
"
);
fprintf
(
stderr
,
"
%s: WARNING! Propagating changes to keyboard settings.
\n
"
,
__func__
);
#endif
value_mask
=
KBKeyClickPercent
|
KBBellPercent
|
KBBellPitch
|
KBBellDuration
;
unsigned
long
value_mask
=
KBKeyClickPercent
|
KBBellPercent
|
KBBellPitch
|
KBBellDuration
;
values
.
key_click_percent
=
ctrl
->
click
;
values
.
bell_percent
=
ctrl
->
bell
;
values
.
bell_pitch
=
ctrl
->
bell_pitch
;
values
.
bell_duration
=
ctrl
->
bell_duration
;
XKeyboardControl
values
=
{
.
key_click_percent
=
ctrl
->
click
,
.
bell_percent
=
ctrl
->
bell
,
.
bell_pitch
=
ctrl
->
bell_pitch
,
.
bell_duration
=
ctrl
->
bell_duration
,
};
/*
* Don't propagate the auto repeat mode. It is forced to be
...
...
@@ -363,19 +359,16 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
}
#ifdef TEST
fprintf
(
stderr
,
"
nxagentChangeKeyboardControl: WARNING! Not propagating changes to keyboard settings.
\n
"
);
fprintf
(
stderr
,
"
%s: WARNING! Not propagating changes to keyboard settings.
\n
"
,
__func__
);
#endif
}
int
nxagentKeyboardProc
(
DeviceIntPtr
pDev
,
int
onoff
)
{
XModifierKeymap
*
modifier_keymap
;
KeySym
*
keymap
;
int
mapWidth
;
int
min_keycode
,
max_keycode
;
KeySymsRec
keySyms
;
CARD8
modmap
[
MAP_LENGTH
];
int
i
,
j
;
XKeyboardState
values
;
#ifdef XKB
char
*
model
=
NULL
,
*
layout
=
NULL
;
...
...
@@ -387,7 +380,7 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff)
case
DEVICE_INIT
:
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Called for [DEVICE_INIT].
\n
"
);
fprintf
(
stderr
,
"
%s: Called for [DEVICE_INIT].
\n
"
,
__func__
);
#endif
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
...
...
@@ -397,7 +390,7 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff)
#ifdef WATCH
fprintf
(
stderr
,
"
nxagentKeyboardProc: Watchpoint 9.
\n
"
);
fprintf
(
stderr
,
"
%s: Watchpoint 9.
\n
"
,
__func__
);
/*
Reply Total Cached Bits In Bits Out Bits/Reply Ratio
...
...
@@ -421,11 +414,11 @@ N/A
XkbDfltRepeatInterval
=
~
0
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Set repeat delay to [%d] interval to [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: Set repeat delay to [%d] interval to [%d].
\n
"
,
__func__
,
XkbDfltRepeatDelay
,
XkbDfltRepeatInterval
);
#endif
modifier_keymap
=
XGetModifierMapping
(
nxagentDisplay
);
XModifierKeymap
*
modifier_keymap
=
XGetModifierMapping
(
nxagentDisplay
);
if
(
modifier_keymap
==
NULL
)
{
...
...
@@ -435,9 +428,7 @@ N/A
XDisplayKeycodes
(
nxagentDisplay
,
&
min_keycode
,
&
max_keycode
);
#ifdef _XSERVER64
{
KeySym64
*
keymap64
;
int
len
;
keymap64
=
XGetKeyboardMapping
(
nxagentDisplay
,
KeySym64
*
keymap64
=
XGetKeyboardMapping
(
nxagentDisplay
,
min_keycode
,
max_keycode
-
min_keycode
+
1
,
&
mapWidth
);
...
...
@@ -448,9 +439,9 @@ N/A
return
-
1
;
}
len
=
(
max_keycode
-
min_keycode
+
1
)
*
mapWidth
;
int
len
=
(
max_keycode
-
min_keycode
+
1
)
*
mapWidth
;
keymap
=
(
KeySym
*
)
malloc
(
len
*
sizeof
(
KeySym
));
for
(
i
=
0
;
i
<
len
;
++
i
)
for
(
i
nt
i
=
0
;
i
<
len
;
++
i
)
{
keymap
[
i
]
=
keymap64
[
i
];
}
...
...
@@ -479,9 +470,9 @@ N/A
nxagentNumlockMask
=
0
;
memset
(
modmap
,
0
,
sizeof
(
modmap
));
for
(
j
=
0
;
j
<
8
;
j
++
)
for
(
int
j
=
0
;
j
<
8
;
j
++
)
{
for
(
i
=
0
;
i
<
modifier_keymap
->
max_keypermod
;
i
++
)
for
(
i
nt
i
=
0
;
i
<
modifier_keymap
->
max_keypermod
;
i
++
)
{
CARD8
keycode
;
if
((
keycode
=
...
...
@@ -503,10 +494,12 @@ N/A
nxagentCheckRemoteKeycodes
();
keySyms
.
minKeyCode
=
min_keycode
;
keySyms
.
maxKeyCode
=
max_keycode
;
keySyms
.
mapWidth
=
mapWidth
;
keySyms
.
map
=
keymap
;
KeySymsRec
keySyms
=
{
.
minKeyCode
=
min_keycode
,
.
maxKeyCode
=
max_keycode
,
.
mapWidth
=
mapWidth
,
.
map
=
keymap
,
};
#ifdef XKB
if
(
!
nxagentGetRemoteXkbExtension
())
...
...
@@ -517,13 +510,13 @@ N/A
if
(
noXkbExtension
)
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: No XKB extension.
\n
"
);
fprintf
(
stderr
,
"
%s: No XKB extension.
\n
"
,
__func__
);
#endif
XkbError:
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: XKB error.
\n
"
);
fprintf
(
stderr
,
"
%s: XKB error.
\n
"
,
__func__
);
#endif
#endif
...
...
@@ -540,7 +533,7 @@ XkbError:
nxagentBell
,
nxagentChangeKeyboardControl
);
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: InitKeyboardDeviceStruct returns [%d].
\n
"
,
ret
);
fprintf
(
stderr
,
"
%s: InitKeyboardDeviceStruct returns [%d].
\n
"
,
__func__
,
ret
);
}
#endif
...
...
@@ -549,19 +542,17 @@ XkbError:
XkbComponentNamesRec
names
=
{
0
};
char
*
rules
=
NULL
,
*
variant
=
NULL
,
*
options
=
NULL
;
/* use xkb default */
/* handle empty string like the NULL pointer */
if
(
nxagentKeyboard
&&
nxagentKeyboard
[
0
]
==
'\0'
)
{
SAFE_free
(
nxagentKeyboard
);
}
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Using XKB extension.
\n
"
);
fprintf
(
stderr
,
"
nxagentKeyboardProc: nxagentKeyboard is [%s].
\n
"
,
nxagentKeyboard
?
nxagentKeyboard
:
"NULL"
);
fprintf
(
stderr
,
"
%s: Using XKB extension.
\n
"
,
__func__
);
fprintf
(
stderr
,
"
%s: nxagentKeyboard is [%s].
\n
"
,
__func__
,
validateString
(
nxagentKeyboard
)
);
#endif
if
(
nxagentX2go
&&
nxagentKeyboard
&&
(
strcmp
(
nxagentKeyboard
,
"null/null"
)
==
0
))
{
#ifdef TEST
fprintf
(
stderr
,
"%s: changing nxagentKeyboard from [null/null] to [clone].
\n
"
,
__func__
);
#endif
SAFE_free
(
nxagentKeyboard
);
nxagentKeyboard
=
strdup
(
"clone"
);
}
/*
from nxagent changelog:
...
...
@@ -578,9 +569,10 @@ XkbError:
(
strcmp
(
nxagentKeyboard
,
"query"
)
!=
0
)
&&
(
strcmp
(
nxagentKeyboard
,
"clone"
)
!=
0
))
{
for
(
i
=
0
;
nxagentKeyboard
[
i
]
!=
'/'
&&
nxagentKeyboard
[
i
]
!=
0
;
i
++
);
int
i
;
for
(
i
=
0
;
nxagentKeyboard
[
i
]
!=
'/'
&&
nxagentKeyboard
[
i
]
!=
'\0'
;
i
++
);
if
(
nxagentKeyboard
[
i
]
==
0
||
nxagentKeyboard
[
i
+
1
]
==
0
||
i
==
0
)
if
(
nxagentKeyboard
[
i
]
==
'\0'
||
nxagentKeyboard
[
i
+
1
]
==
'\0'
||
i
==
0
)
{
ErrorF
(
"Warning: Wrong keyboard type: %s.
\n
"
,
nxagentKeyboard
);
goto
XkbError
;
...
...
@@ -629,8 +621,8 @@ XkbError:
if
(
strcmp
(
model
,
"pc105"
)
==
0
)
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: WARNING! Keyboard model 'pc105' unsupported on Solaris.
\n
"
);
fprintf
(
stderr
,
"
nxagentKeyboardProc: WARNING! Forcing keyboard model to 'pc104'.
\n
"
);
fprintf
(
stderr
,
"
%s: WARNING! Keyboard model 'pc105' unsupported on Solaris.
\n
"
,
__func__
);
fprintf
(
stderr
,
"
%s: WARNING! Forcing keyboard model to 'pc104'.
\n
"
,
__func__
);
#endif
strcpy
(
model
,
"pc104"
);
...
...
@@ -641,13 +633,13 @@ XkbError:
else
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Using default keyboard: model [%s] layout [%s].
\n
"
,
fprintf
(
stderr
,
"
%s: Using default keyboard: model [%s] layout [%s].
\n
"
,
__func__
,
model
?
model
:
"(default)"
,
layout
?
layout
:
"(default)"
);
#endif
}
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Init XKB extension.
\n
"
);
fprintf
(
stderr
,
"
%s: Init XKB extension.
\n
"
,
__func__
);
#endif
if
(
nxagentRemoteRules
&&
nxagentRemoteModel
)
...
...
@@ -657,8 +649,6 @@ XkbError:
__func__
,
nxagentRemoteRules
,
nxagentRemoteModel
,
nxagentRemoteLayout
,
nxagentRemoteVariant
,
nxagentRemoteOptions
);
#endif
/* Only setup keycode conversion if we are NOT in clone mode */
if
(
nxagentKeyboard
&&
(
strcmp
(
nxagentKeyboard
,
"clone"
)
==
0
))
{
SAFE_free
(
rules
);
rules
=
strdup
(
nxagentRemoteRules
);
...
...
@@ -666,7 +656,15 @@ XkbError:
SAFE_free
(
layout
);
layout
=
strdup
(
nxagentRemoteLayout
);
SAFE_free
(
variant
);
variant
=
strdup
(
nxagentRemoteVariant
);
SAFE_free
(
options
);
options
=
strdup
(
nxagentRemoteOptions
);
/*
/* Only setup keycode conversion if we are NOT in clone mode */
#ifdef DEBUG
fprintf
(
stderr
,
"%s: nxagentKeyboard is [%s] - disabling keycode conversion.
\n
"
,
__func__
,
nxagentKeyboard
);
#endif
nxagentChangeOption
(
KeycodeConversion
,
KeycodeConversionOff
);
/*
* when cloning we do not want X2Go to set the keyboard
* via a keyboard file generated by nxagent. The defined
* method for switching that off is the creation of a dir
...
...
@@ -679,7 +677,6 @@ XkbError:
}
else
{
nxagentKeycodeConversionSetup
();
/*
* Keyboard has always been tricky with nxagent. For that
* reason X2Go offers "auto" keyboard configuration. You can
...
...
@@ -697,6 +694,7 @@ XkbError:
nxagentWriteKeyboardFile
(
nxagentRemoteRules
,
nxagentRemoteModel
,
nxagentRemoteLayout
,
nxagentRemoteVariant
,
nxagentRemoteOptions
);
}
}
nxagentKeycodeConversionSetup
();
}
#ifdef DEBUG
else
...
...
@@ -714,13 +712,13 @@ XkbError:
#ifdef TEST
else
{
fprintf
(
stderr
,
"
nxagentKeyboardProc: No current keyboard.
\n
"
);
fprintf
(
stderr
,
"
%s: No current keyboard.
\n
"
,
__func__
);
}
#endif
#ifdef DEBUG
fprintf
(
stderr
,
"
nxagentKeyboardProc
: Going to set rules and init device: "
"[rules='%s',model='%s',layout='%s',variant='%s',options='%s'].
\n
"
,
fprintf
(
stderr
,
"
%s
: Going to set rules and init device: "
"[rules='%s',model='%s',layout='%s',variant='%s',options='%s'].
\n
"
,
__func__
,
rules
?
rules
:
"(default)"
,
model
?
model
:
"(default)"
,
layout
?
layout
:
"(default)"
,
variant
?
variant
:
"(default)"
,
options
?
options
:
"(default)"
);
#endif
...
...
@@ -761,7 +759,7 @@ XkbError:
#ifdef WATCH
fprintf
(
stderr
,
"
nxagentKeyboardProc: Watchpoint 10.
\n
"
);
fprintf
(
stderr
,
"
%s: Watchpoint 10.
\n
"
,
__func__
);
/*
Reply Total Cached Bits In Bits Out Bits/Reply Ratio
...
...
@@ -785,7 +783,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
case
DEVICE_ON
:
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Called for [DEVICE_ON].
\n
"
);
fprintf
(
stderr
,
"
%s: Called for [DEVICE_ON].
\n
"
,
__func__
);
#endif
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
...
...
@@ -795,7 +793,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
#ifdef WATCH
fprintf
(
stderr
,
"
nxagentKeyboardProc: Watchpoint 11.
\n
"
);
fprintf
(
stderr
,
"
%s: Watchpoint 11.
\n
"
,
__func__
);
/*
Reply Total Cached Bits In Bits Out Bits/Reply Ratio
...
...
@@ -814,7 +812,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
case
DEVICE_OFF
:
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Called for [DEVICE_OFF].
\n
"
);
fprintf
(
stderr
,
"
%s: Called for [DEVICE_OFF].
\n
"
,
__func__
);
#endif
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
...
...
@@ -828,7 +826,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
case
DEVICE_CLOSE
:
#ifdef TEST
fprintf
(
stderr
,
"
nxagentKeyboardProc: Called for [DEVICE_CLOSE].
\n
"
);
fprintf
(
stderr
,
"
%s: Called for [DEVICE_CLOSE].
\n
"
,
__func__
);
#endif
break
;
...
...
@@ -871,7 +869,6 @@ void nxagentNotifyKeyboardChanges(int oldMinKeycode, int oldMaxKeycode)
#endif
int
i
;
xEvent
event
=
{
0
};
event
.
u
.
u
.
type
=
MappingNotify
;
...
...
@@ -884,7 +881,7 @@ void nxagentNotifyKeyboardChanges(int oldMinKeycode, int oldMaxKeycode)
* 0 is the server client
*/
for
(
i
=
1
;
i
<
currentMaxClients
;
i
++
)
for
(
i
nt
i
=
1
;
i
<
currentMaxClients
;
i
++
)
{
if
(
clients
[
i
]
&&
clients
[
i
]
->
clientState
==
ClientStateRunning
)
{
...
...
@@ -906,14 +903,9 @@ int nxagentResetKeyboard(void)
DeviceIntPtr
dev
=
inputInfo
.
keyboard
;
DeviceIntPtr
devBackup
;
int
result
;
int
oldMinKeycode
=
8
;
int
oldMaxKeycode
=
255
;
int
savedBellPercent
;
int
savedBellPitch
;
int
savedBellDuration
;
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
{
return
0
;
...
...
@@ -923,19 +915,19 @@ int nxagentResetKeyboard(void)
* Save bell settings.
*/
savedBellPercent
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell
;
savedBellPitch
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell_pitch
;
savedBellDuration
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell_duration
;
int
savedBellPercent
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell
;
int
savedBellPitch
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell_pitch
;
int
savedBellDuration
=
inputInfo
.
keyboard
->
kbdfeed
->
ctrl
.
bell_duration
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentResetKeyboard: bellPercent [%d] bellPitch [%d] bellDuration [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: bellPercent [%d] bellPitch [%d] bellDuration [%d].
\n
"
,
__func__
,
savedBellPercent
,
savedBellPitch
,
savedBellDuration
);
#endif
if
(
!
(
devBackup
=
calloc
(
1
,
sizeof
(
DeviceIntRec
))))
{
#ifdef PANIC
fprintf
(
stderr
,
"
nxagentResetKeyboard: PANIC! Can't allocate backup structure.
\n
"
);
fprintf
(
stderr
,
"
%s: PANIC! Can't allocate backup structure.
\n
"
,
__func__
);
#endif
}
...
...
@@ -962,7 +954,7 @@ int nxagentResetKeyboard(void)
nxagentTuneXkbWrapper
();
#endif
result
=
(
*
inputInfo
.
keyboard
->
deviceProc
)(
inputInfo
.
keyboard
,
DEVICE_INIT
);
int
result
=
(
*
inputInfo
.
keyboard
->
deviceProc
)(
inputInfo
.
keyboard
,
DEVICE_INIT
);
if
(
result
==
Success
&&
inputInfo
.
keyboard
->
key
!=
NULL
)
{
...
...
@@ -986,7 +978,7 @@ int nxagentResetKeyboard(void)
else
{
#ifdef WARNING
fprintf
(
stderr
,
"
nxagentResetKeyboard: Can't initialize the keyboard device.
\n
"
);
fprintf
(
stderr
,
"
%s: Can't initialize the keyboard device.
\n
"
,
__func__
);
#endif
nxagentRestoreKeyboardDeviceData
(
devBackup
,
dev
);
...
...
@@ -1031,7 +1023,6 @@ void nxagentCheckModifierMasks(CARD8 keycode, int j)
{
nxagentCapsMask
|=
1
<<
j
;
}
}
void
nxagentCheckRemoteKeycodes
(
void
)
...
...
@@ -1040,9 +1031,8 @@ void nxagentCheckRemoteKeycodes(void)
nxagentNumLockKeycode
=
XKeysymToKeycode
(
nxagentDisplay
,
XK_Num_Lock
);
#ifdef DEBUG
fprintf
(
stderr
,
"nxagentCheckRemoteKeycodes: Remote keycodes: CapsLock "
"[%d] NumLock [%d].
\n
"
,
nxagentCapsLockKeycode
,
nxagentNumLockKeycode
);
fprintf
(
stderr
,
"%s: Remote keycodes: CapsLock [%d] NumLock [%d].
\n
"
,
__func__
,
nxagentCapsLockKeycode
,
nxagentNumLockKeycode
);
#endif
}
...
...
@@ -1051,7 +1041,7 @@ static int nxagentSaveKeyboardDeviceData(DeviceIntPtr dev, DeviceIntPtr devBacku
if
(
!
devBackup
)
{
#ifdef PANIC
fprintf
(
stderr
,
"
nxagentSaveKeyboardDeviceData: PANIC! Pointer to backup structure is null.
\n
"
);
fprintf
(
stderr
,
"
%s: PANIC! Pointer to backup structure is null.
\n
"
,
__func__
);
#endif
return
-
1
;
...
...
@@ -1062,7 +1052,7 @@ static int nxagentSaveKeyboardDeviceData(DeviceIntPtr dev, DeviceIntPtr devBacku
devBackup
->
kbdfeed
=
dev
->
kbdfeed
;
#ifdef DEBUG
fprintf
(
stderr
,
"
nxagentSaveKeyboardDeviceData: Saved device data.
\n
"
);
fprintf
(
stderr
,
"
%s: Saved device data.
\n
"
,
__func__
);
#endif
return
1
;
...
...
@@ -1073,7 +1063,7 @@ static int nxagentRestoreKeyboardDeviceData(DeviceIntPtr devBackup, DeviceIntPtr
if
(
!
devBackup
)
{
#ifdef PANIC
fprintf
(
stderr
,
"
nxagentRestoreKeyboardDeviceData: PANIC! Pointer to backup structure is null.
\n
"
);
fprintf
(
stderr
,
"
%s: PANIC! Pointer to backup structure is null.
\n
"
,
__func__
);
#endif
return
-
1
;
...
...
@@ -1084,7 +1074,7 @@ static int nxagentRestoreKeyboardDeviceData(DeviceIntPtr devBackup, DeviceIntPtr
dev
->
kbdfeed
=
devBackup
->
kbdfeed
;
#ifdef DEBUG
fprintf
(
stderr
,
"
nxagentRestoreKeyboardDeviceData: Restored device data.
\n
"
);
fprintf
(
stderr
,
"
%s: Restored device data.
\n
"
,
__func__
);
#endif
return
1
;
...
...
@@ -1096,7 +1086,7 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev)
if
(
!
dev
)
{
#ifdef PANIC
fprintf
(
stderr
,
"
nxagentFreeKeyboardDeviceData: PANIC! Pointer to device structure is null.
\n
"
);
fprintf
(
stderr
,
"
%s: PANIC! Pointer to device structure is null.
\n
"
,
__func__
);
#endif
return
-
1
;
...
...
@@ -1138,7 +1128,7 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev)
}
#ifdef DEBUG
fprintf
(
stderr
,
"
nxagentFreeKeyboardDeviceData: Freed device data.
\n
"
);
fprintf
(
stderr
,
"
%s: Freed device data.
\n
"
,
__func__
);
#endif
return
1
;
...
...
@@ -1148,27 +1138,24 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev)
int
ProcXkbInhibited
(
register
ClientPtr
client
)
{
unsigned
char
majorop
;
unsigned
char
minorop
;
#ifdef TEST
fprintf
(
stderr
,
"
ProcXkbInhibited: Called.
\n
"
);
fprintf
(
stderr
,
"
%s: Called.
\n
"
,
__func__
);
#endif
majorop
=
((
xReq
*
)
client
->
requestBuffer
)
->
reqType
;
unsigned
char
majorop
=
((
xReq
*
)
client
->
requestBuffer
)
->
reqType
;
#ifdef PANIC
if
(
majorop
!=
(
unsigned
char
)
nxagentXkbWrapper
.
base
)
{
fprintf
(
stderr
,
"
ProcXkbInhibited: MAJOROP is [%d] but should be [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: MAJOROP is [%d] but should be [%d].
\n
"
,
__func__
,
majorop
,
nxagentXkbWrapper
.
base
);
}
#endif
minorop
=
*
((
unsigned
char
*
)
client
->
requestBuffer
+
1
);
unsigned
char
minorop
=
*
((
unsigned
char
*
)
client
->
requestBuffer
+
1
);
#ifdef TEST
fprintf
(
stderr
,
"
ProcXkbInhibited: MAJOROP is [%d] MINOROP is [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: MAJOROP is [%d] MINOROP is [%d].
\n
"
,
__func__
,
majorop
,
minorop
);
#endif
...
...
@@ -1223,13 +1210,13 @@ void nxagentInitXkbWrapper(void)
ExtensionEntry
*
extension
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentInitXkbWrapper: Called.
\n
"
);
fprintf
(
stderr
,
"
%s: Called.
\n
"
,
__func__
);
#endif
if
(
!
nxagentOption
(
InhibitXkb
))
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentInitXkbWrapper: Nothing to do.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to do.
\n
"
,
__func__
);
#endif
return
;
...
...
@@ -1246,7 +1233,7 @@ void nxagentInitXkbWrapper(void)
nxagentXkbWrapper
.
SProcXkbDispatchBackup
=
NULL
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentInitXkbWrapper: base [%d] eventBase [%d] errorBase [%d].
\n
"
,
fprintf
(
stderr
,
"
%s: base [%d] eventBase [%d] errorBase [%d].
\n
"
,
__func__
,
extension
->
base
,
extension
->
eventBase
,
extension
->
errorBase
);
#endif
}
...
...
@@ -1255,7 +1242,7 @@ void nxagentInitXkbWrapper(void)
nxagentXkbWrapper
.
base
=
-
1
;
#ifdef TEST
fprintf
(
stderr
,
"
nxagentInitXkbWrapper: XKEYBOARD extension not found.
\n
"
);
fprintf
(
stderr
,
"
%s: XKEYBOARD extension not found.
\n
"
,
__func__
);
#endif
}
}
...
...
@@ -1263,7 +1250,7 @@ void nxagentInitXkbWrapper(void)
void
nxagentDisableXkbExtension
(
void
)
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentDisableXkbExtension: Called.
\n
"
);
fprintf
(
stderr
,
"
%s: Called.
\n
"
,
__func__
);
#endif
if
(
nxagentXkbWrapper
.
base
>
0
)
...
...
@@ -1277,7 +1264,7 @@ void nxagentDisableXkbExtension(void)
#ifdef TEST
else
{
fprintf
(
stderr
,
"
nxagentDisableXkbExtension: Nothing to be done for ProcXkbDispatch.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to be done for ProcXkbDispatch.
\n
"
,
__func__
);
}
#endif
...
...
@@ -1290,7 +1277,7 @@ void nxagentDisableXkbExtension(void)
#ifdef TEST
else
{
fprintf
(
stderr
,
"
nxagentDisableXkbExtension: Nothing to be done for SProcXkbDispatch.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to be done for SProcXkbDispatch.
\n
"
,
__func__
);
}
#endif
}
...
...
@@ -1299,7 +1286,7 @@ void nxagentDisableXkbExtension(void)
void
nxagentEnableXkbExtension
(
void
)
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentEnableXkbExtension: Called.
\n
"
);
fprintf
(
stderr
,
"
%s: Called.
\n
"
,
__func__
);
#endif
if
(
nxagentXkbWrapper
.
base
>
0
)
...
...
@@ -1313,7 +1300,7 @@ void nxagentEnableXkbExtension(void)
#ifdef TEST
else
{
fprintf
(
stderr
,
"
nxagentEnableXkbExtension: Nothing to be done for ProcXkbDispatch.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to be done for ProcXkbDispatch.
\n
"
,
__func__
);
}
#endif
...
...
@@ -1326,7 +1313,7 @@ void nxagentEnableXkbExtension(void)
#ifdef TEST
else
{
fprintf
(
stderr
,
"
nxagentEnableXkbExtension: Nothing to be done for SProcXkbDispatch.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to be done for SProcXkbDispatch.
\n
"
,
__func__
);
}
#endif
}
...
...
@@ -1347,7 +1334,7 @@ void nxagentTuneXkbWrapper(void)
if
(
!
nxagentOption
(
InhibitXkb
))
{
#ifdef TEST
fprintf
(
stderr
,
"
nxagentTuneXkbWrapper: Nothing to do.
\n
"
);
fprintf
(
stderr
,
"
%s: Nothing to do.
\n
"
,
__func__
);
#endif
return
;
...
...
@@ -1374,34 +1361,29 @@ void nxagentXkbClearNames(void)
static
void
nxagentXkbGetNames
(
void
)
{
Atom
atom
;
#ifdef _XSERVER64
Atom64
type
;
#else
Atom
type
;
#endif
int
format
;
unsigned
long
n
;
unsigned
long
after
;
char
*
data
;
char
*
name
;
Status
result
;
if
(
nxagentRemoteRules
)
return
;
atom
=
XInternAtom
(
nxagentDisplay
,
"_XKB_RULES_NAMES"
,
1
);
Atom
atom
=
XInternAtom
(
nxagentDisplay
,
"_XKB_RULES_NAMES"
,
1
);
if
(
atom
==
0
)
{
return
;
}
data
=
name
=
NULL
;
#ifdef _XSERVER64
Atom64
type
;
#else
Atom
type
;
#endif
int
format
;
unsigned
long
n
;
unsigned
long
after
;
char
*
data
=
NULL
;
result
=
XGetWindowProperty
(
nxagentDisplay
,
DefaultRootWindow
(
nxagentDisplay
),
atom
,
0
,
256
,
0
,
XA_STRING
,
&
type
,
&
format
,
&
n
,
&
after
,
(
unsigned
char
**
)
&
data
);
Status
result
=
XGetWindowProperty
(
nxagentDisplay
,
DefaultRootWindow
(
nxagentDisplay
),
atom
,
0
,
256
,
0
,
XA_STRING
,
&
type
,
&
format
,
&
n
,
&
after
,
(
unsigned
char
**
)
&
data
);
if
(
result
!=
Success
||
!
data
)
{
...
...
@@ -1417,7 +1399,7 @@ static void nxagentXkbGetNames(void)
}
}
name
=
data
;
char
*
name
=
data
;
if
(
name
<
data
+
n
)
{
...
...
@@ -1589,17 +1571,17 @@ void nxagentKeycodeConversionSetup(void)
Bool
nxagentGetRemoteXkbExtension
(
void
)
{
Bool
result
;
nxagentXkbInfo
.
Opcode
=
nxagentXkbInfo
.
EventBase
=
nxagentXkbInfo
.
ErrorBase
=
nxagentXkbInfo
.
MajorVersion
=
nxagentXkbInfo
.
MinorVersion
=
-
1
;
nxagentXkbClearNames
();
if
((
result
=
XkbQueryExtension
(
nxagentDisplay
,
&
nxagentXkbInfo
.
Opcode
,
&
nxagentXkbInfo
.
EventBase
,
&
nxagentXkbInfo
.
ErrorBase
,
&
nxagentXkbInfo
.
MajorVersion
,
&
nxagentXkbInfo
.
MinorVersion
)))
Bool
result
=
XkbQueryExtension
(
nxagentDisplay
,
&
nxagentXkbInfo
.
Opcode
,
&
nxagentXkbInfo
.
EventBase
,
&
nxagentXkbInfo
.
ErrorBase
,
&
nxagentXkbInfo
.
MajorVersion
,
&
nxagentXkbInfo
.
MinorVersion
);
if
(
result
)
{
nxagentXkbGetNames
();
}
...
...
nx-X11/programs/Xserver/hw/nxagent/Reconnect.c
View file @
60e0566d
...
...
@@ -458,15 +458,6 @@ Bool nxagentReconnectSession(void)
nxagentProcessOptions
(
nxagentOptionsFilenameOrString
);
if
(
nxagentKeyboard
&&
(
strcmp
(
nxagentKeyboard
,
"null/null"
)
==
0
))
{
#ifdef TEST
fprintf
(
stderr
,
"nxagentReconnect: changing nxagentKeyboard from [null/null] to [clone].
\n
"
);
#endif
SAFE_free
(
nxagentKeyboard
);
nxagentKeyboard
=
strdup
(
"clone"
);
}
if
(
nxagentReconnectDisplay
(
reconnectLossyLevel
[
DISPLAY_STEP
])
==
0
)
{
...
...
@@ -608,29 +599,34 @@ Bool nxagentReconnectSession(void)
nxagentOldKeyboard
=
NULL
;
}
if
(
nxagentOption
(
ResetKeyboardAtResume
)
==
1
&&
(
nxagentKeyboard
==
NULL
||
nxagentOldKeyboard
==
NULL
||
strcmp
(
nxagentKeyboard
,
nxagentOldKeyboard
)
!=
0
||
strcmp
(
nxagentKeyboard
,
"query"
)
==
0
||
strcmp
(
nxagentKeyboard
,
"clone"
)
==
0
))
/* Reset the keyboard only if we detect any changes. */
if
(
nxagentOption
(
ResetKeyboardAtResume
)
==
1
)
{
if
(
nxagentResetKeyboard
()
==
0
)
if
(
nxagentKeyboard
==
NULL
||
nxagentOldKeyboard
==
NULL
||
strcmp
(
nxagentKeyboard
,
nxagentOldKeyboard
)
!=
0
||
strcmp
(
nxagentKeyboard
,
"query"
)
==
0
||
strcmp
(
nxagentKeyboard
,
"clone"
)
==
0
)
{
#ifdef WARNING
if
(
nxagentVerbose
==
1
)
if
(
nxagentResetKeyboard
()
==
0
)
{
fprintf
(
stderr
,
"nxagentReconnectSession: Failed to reset keyboard device.
\n
"
);
}
#endif
#ifdef WARNING
if
(
nxagentVerbose
==
1
)
{
fprintf
(
stderr
,
"%s: Failed to reset keyboard device.
\n
"
,
__func__
);
}
#endif
failedStep
=
WINDOW_STEP
;
failedStep
=
WINDOW_STEP
;
goto
nxagentReconnectError
;
goto
nxagentReconnectError
;
}
}
else
{
#ifdef DEBUG
fprintf
(
stderr
,
"%s: keyboard unchanged - skipping keyboard reset.
\n
"
,
__func__
);
#endif
}
}
else
{
nxagentKeycodeConversionSetup
();
}
nxagentXkbState
.
Initialized
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment