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