Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
libvncserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
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
rasky
libvncserver
Commits
0afa1da8
Commit
0afa1da8
authored
Jul 10, 2006
by
runge
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
x11vnc: improve uinput heuristics so button clicks work on qt-embedded.
parent
07952847
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1536 additions
and
1299 deletions
+1536
-1299
README
x11vnc/README
+1418
-1257
help.c
x11vnc/help.c
+18
-16
remote.c
x11vnc/remote.c
+1
-1
sslcmds.c
x11vnc/sslcmds.c
+1
-1
sslhelper.c
x11vnc/sslhelper.c
+1
-1
uinput.c
x11vnc/uinput.c
+75
-3
unixpw.c
x11vnc/unixpw.c
+1
-1
x11vnc.1
x11vnc/x11vnc.1
+18
-16
x11vnc.c
x11vnc/x11vnc.c
+1
-1
x11vnc.h
x11vnc/x11vnc.h
+1
-1
x11vnc_defs.c
x11vnc/x11vnc_defs.c
+1
-1
No files found.
x11vnc/README
View file @
0afa1da8
This source diff could not be displayed because it is too large. You can
view the blob
instead.
x11vnc/help.c
View file @
0afa1da8
...
@@ -454,7 +454,7 @@ void print_help(int mode) {
...
@@ -454,7 +454,7 @@ void print_help(int mode) {
" and last line be
\"
__BEGIN_VIEWONLY__
\"
to have 2
\n
"
" and last line be
\"
__BEGIN_VIEWONLY__
\"
to have 2
\n
"
" full-access passwords)
\n
"
" full-access passwords)
\n
"
"
\n
"
"
\n
"
#ifndef REL8
1
#ifndef REL8
x
"-unixpw [list] Use Unix username and password authentication. x11vnc
\n
"
"-unixpw [list] Use Unix username and password authentication. x11vnc
\n
"
" uses the su(1) program to verify the user's password.
\n
"
" uses the su(1) program to verify the user's password.
\n
"
" [list] is an optional comma separated list of allowed
\n
"
" [list] is an optional comma separated list of allowed
\n
"
...
@@ -2562,7 +2562,7 @@ void print_help(int mode) {
...
@@ -2562,7 +2562,7 @@ void print_help(int mode) {
" -rawfb cons3 (force /dev/tty3)
\n
"
" -rawfb cons3 (force /dev/tty3)
\n
"
" -rawfb consx (no keystrokes or mouse)
\n
"
" -rawfb consx (no keystrokes or mouse)
\n
"
" -rawfb console:/dev/nonstd
\n
"
" -rawfb console:/dev/nonstd
\n
"
" -rawfb cons -pipeinput UINPUT:accel=
1.5
\n
"
" -rawfb cons -pipeinput UINPUT:accel=
4.0
\n
"
"
\n
"
"
\n
"
"-freqtab file For use with
\"
-rawfb video
\"
for TV tuner devices to
\n
"
"-freqtab file For use with
\"
-rawfb video
\"
for TV tuner devices to
\n
"
" specify station frequencies. Instead of using the built
\n
"
" specify station frequencies. Instead of using the built
\n
"
...
@@ -2640,28 +2640,30 @@ void print_help(int mode) {
...
@@ -2640,28 +2640,30 @@ void print_help(int mode) {
" A UINPUT option of the form: accel=f, or accel=fx+fy
\n
"
" A UINPUT option of the form: accel=f, or accel=fx+fy
\n
"
" sets the mouse motion
\"
acceleration
\"
. This is used
\n
"
" sets the mouse motion
\"
acceleration
\"
. This is used
\n
"
" to correct raw mouse relative motion into how much the
\n
"
" to correct raw mouse relative motion into how much the
\n
"
" application cursor moves (x11vnc has no control over
\n
"
" application cursor moves (x11vnc has no control over
,
\n
"
"
how the application interprets the raw mouse motions).
\n
"
"
or knowledge of how the windowing application interprets
\n
"
"
Typically the acceleration for an X display is 2 (see
\n
"
"
the raw mouse motions). Typically the acceleration
\n
"
"
xset
\"
m
\"
option).
\"
f
\"
is a floating point number,
\n
"
"
for an X display is 2 (see xset
\"
m
\"
option).
\"
f
\"
\n
"
"
e.g. 2.0. Use
\"
fx+fy
\"
if you need to supply different
\n
"
"
is a floating point number, e.g. 3.0. Use
\"
fx+fy
\"
\n
"
" corrections for x and y.
\n
"
"
if you need to supply different
corrections for x and y.
\n
"
"
\n
"
"
\n
"
" Note: the default acceleration is 2.0 since it seems
\n
"
" Note: the default acceleration is 2.0 since it seems
\n
"
" both X and qt-embedded often use this value.
\n
"
" both X and qt-embedded often (but not always) use
\n
"
" this value.
\n
"
"
\n
"
"
\n
"
" Even with a correct accel setting the mouse position
\n
"
" Even with a correct accel setting the mouse position
\n
"
" will get out of sync (probably due to a mouse
\n
"
" will get out of sync (probably due to a mouse
\n
"
"
\"
threshold
\"
setting where the acceleration doe not
\n
"
"
\"
threshold
\"
setting where the acceleration doe not
\n
"
" apply, set xset(1)). The option reset=N sets the number
\n
"
" apply, set xset(1)). The option reset=N sets the
\n
"
" of ms (default 500) after which the cursor is attempted
\n
"
" number of ms (default 500) after which the cursor is
\n
"
" to be reset (by forcing the mouse to (0, 0) via small
\n
"
" attempted to be reset (by forcing the mouse to (0,
\n
"
" increments and then back out to (x, y) in 1 jump), This
\n
"
" 0) via small increments and then back out to (x, y)
\n
"
" correction seems to be needed but can cause jerkiness
\n
"
" in 1 jump), This correction seems to be needed but can
\n
"
" or unexpected behavior. Use reset=0 to disable.
\n
"
" cause jerkiness or unexpected behavior with menus, etc.
\n
"
" Use reset=0 to disable.
\n
"
"
\n
"
"
\n
"
" Example:
\n
"
" Example:
\n
"
" -pipeinput UINPUT:accel=
1
.0 -cursor none
\n
"
" -pipeinput UINPUT:accel=
4
.0 -cursor none
\n
"
"
\n
"
"
\n
"
"-gui [gui-opts] Start up a simple tcl/tk gui based on the the remote
\n
"
"-gui [gui-opts] Start up a simple tcl/tk gui based on the the remote
\n
"
" control options -remote/-query described below.
\n
"
" control options -remote/-query described below.
\n
"
...
...
x11vnc/remote.c
View file @
0afa1da8
...
@@ -4005,7 +4005,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -4005,7 +4005,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
snprintf
(
buf
,
bufn
,
"aro=%s:%d"
,
p
,
no_external_cmds
);
snprintf
(
buf
,
bufn
,
"aro=%s:%d"
,
p
,
no_external_cmds
);
}
else
if
(
!
strcmp
(
p
,
"passwdfile"
))
{
}
else
if
(
!
strcmp
(
p
,
"passwdfile"
))
{
snprintf
(
buf
,
bufn
,
"aro=%s:%s"
,
p
,
NONUL
(
passwdfile
));
snprintf
(
buf
,
bufn
,
"aro=%s:%s"
,
p
,
NONUL
(
passwdfile
));
#ifndef REL8
1
#ifndef REL8
x
}
else
if
(
!
strcmp
(
p
,
"unixpw"
))
{
}
else
if
(
!
strcmp
(
p
,
"unixpw"
))
{
snprintf
(
buf
,
bufn
,
"aro=%s:%d"
,
p
,
unixpw
);
snprintf
(
buf
,
bufn
,
"aro=%s:%d"
,
p
,
unixpw
);
}
else
if
(
!
strcmp
(
p
,
"unixpw_nis"
))
{
}
else
if
(
!
strcmp
(
p
,
"unixpw_nis"
))
{
...
...
x11vnc/sslcmds.c
View file @
0afa1da8
...
@@ -15,7 +15,7 @@
...
@@ -15,7 +15,7 @@
#endif
#endif
#endif
#endif
#ifdef REL8
1
#ifdef REL8
x
#undef SSLCMDS
#undef SSLCMDS
#endif
#endif
...
...
x11vnc/sslhelper.c
View file @
0afa1da8
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
#endif
#endif
#endif
#endif
#ifdef REL8
1
#ifdef REL8
x
#undef FORK_OK
#undef FORK_OK
#undef LIBVNCSERVER_HAVE_LIBSSL
#undef LIBVNCSERVER_HAVE_LIBSSL
#define LIBVNCSERVER_HAVE_LIBSSL 0
#define LIBVNCSERVER_HAVE_LIBSSL 0
...
...
x11vnc/uinput.c
View file @
0afa1da8
...
@@ -32,6 +32,9 @@ void parse_uinput_str(char *str);
...
@@ -32,6 +32,9 @@ void parse_uinput_str(char *str);
void
uinput_pointer_command
(
int
mask
,
int
x
,
int
y
,
rfbClientPtr
client
);
void
uinput_pointer_command
(
int
mask
,
int
x
,
int
y
,
rfbClientPtr
client
);
void
uinput_key_command
(
int
down
,
int
keysym
,
rfbClientPtr
client
);
void
uinput_key_command
(
int
down
,
int
keysym
,
rfbClientPtr
client
);
static
void
init_key_tracker
(
void
);
static
int
mod_is_down
(
void
);
static
int
key_is_down
(
void
);
static
void
set_uinput_accel_xy
(
double
fx
,
double
fy
);
static
void
set_uinput_accel_xy
(
double
fx
,
double
fy
);
static
void
shutdown_uinput
(
void
);
static
void
shutdown_uinput
(
void
);
static
void
ptr_move
(
int
dx
,
int
dy
);
static
void
ptr_move
(
int
dx
,
int
dy
);
...
@@ -94,6 +97,45 @@ int check_uinput(void) {
...
@@ -94,6 +97,45 @@ int check_uinput(void) {
#endif
#endif
}
}
static
int
key_pressed
[
256
];
static
int
key_ismod
[
256
];
static
void
init_key_tracker
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
key_pressed
[
i
]
=
0
;
key_ismod
[
i
]
=
0
;
}
i
=
lookup_code
(
XK_Shift_L
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Shift_R
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Control_L
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Control_R
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Alt_L
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Alt_R
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Meta_L
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
i
=
lookup_code
(
XK_Meta_R
);
if
(
0
<=
i
&&
i
<
256
)
key_ismod
[
i
]
=
1
;
}
static
int
mod_is_down
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
if
(
key_pressed
[
i
]
&&
key_ismod
[
i
])
{
return
1
;
}
}
return
0
;
}
static
int
key_is_down
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
if
(
key_pressed
[
i
])
{
return
1
;
}
}
return
0
;
}
static
void
shutdown_uinput
(
void
)
{
static
void
shutdown_uinput
(
void
)
{
#ifdef UINPUT_OK
#ifdef UINPUT_OK
ioctl
(
fd
,
UI_DEV_DESTROY
);
ioctl
(
fd
,
UI_DEV_DESTROY
);
...
@@ -112,6 +154,8 @@ int initialize_uinput(void) {
...
@@ -112,6 +154,8 @@ int initialize_uinput(void) {
close
(
fd
);
close
(
fd
);
fd
=
-
1
;
fd
=
-
1
;
}
}
init_key_tracker
();
if
(
uinput_dev
)
{
if
(
uinput_dev
)
{
fd
=
open
(
uinput_dev
,
O_RDWR
);
fd
=
open
(
uinput_dev
,
O_RDWR
);
...
@@ -176,6 +220,7 @@ static double resid_x = 0.0;
...
@@ -176,6 +220,7 @@ static double resid_x = 0.0;
static
double
resid_y
=
0
.
0
;
static
double
resid_y
=
0
.
0
;
static
double
zero_delay
=
0
.
5
;
static
double
zero_delay
=
0
.
5
;
static
double
last_button_click
=
0
.
0
;
static
void
set_uinput_accel_xy
(
double
fx
,
double
fy
)
{
static
void
set_uinput_accel_xy
(
double
fx
,
double
fy
)
{
fudge_x
=
1
.
0
/
fx
;
fudge_x
=
1
.
0
/
fx
;
...
@@ -353,6 +398,8 @@ static void button_click(int down, int btn) {
...
@@ -353,6 +398,8 @@ static void button_click(int down, int btn) {
ev
.
value
=
0
;
ev
.
value
=
0
;
write
(
fd
,
&
ev
,
sizeof
(
ev
));
write
(
fd
,
&
ev
,
sizeof
(
ev
));
last_button_click
=
dnow
();
#endif
#endif
}
}
...
@@ -361,6 +408,8 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
...
@@ -361,6 +408,8 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
static
int
last_x
=
-
1
,
last_y
=
-
1
,
last_mask
=
-
1
;
static
int
last_x
=
-
1
,
last_y
=
-
1
,
last_mask
=
-
1
;
static
double
last_zero
=
0
.
0
;
static
double
last_zero
=
0
.
0
;
allowed_input_t
input
;
allowed_input_t
input
;
int
do_reset
;
double
now
;
if
(
db
)
fprintf
(
stderr
,
"uinput_pointer_command: %d %d - %d
\n
"
,
x
,
y
,
mask
);
if
(
db
)
fprintf
(
stderr
,
"uinput_pointer_command: %d %d - %d
\n
"
,
x
,
y
,
mask
);
...
@@ -369,13 +418,31 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
...
@@ -369,13 +418,31 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
}
}
get_allowed_input
(
client
,
&
input
);
get_allowed_input
(
client
,
&
input
);
if
(
!
bmask
&&
dnow
()
>=
last_zero
+
zero_delay
&&
input
.
motion
)
{
now
=
dnow
();
do_reset
=
1
;
if
(
mask
||
bmask
)
{
do_reset
=
0
;
/* do not do reset if moust button down */
}
else
if
(
!
input
.
motion
)
{
do_reset
=
0
;
}
else
if
(
now
<
last_zero
+
zero_delay
)
{
do_reset
=
0
;
}
if
(
do_reset
)
{
if
(
mod_is_down
())
{
do_reset
=
0
;
}
else
if
(
now
<
last_button_click
+
0
.
25
)
{
do_reset
=
0
;
}
}
if
(
do_reset
)
{
static
int
first
=
1
;
static
int
first
=
1
;
if
(
zero_delay
>
0
.
0
||
first
)
{
if
(
zero_delay
>
0
.
0
||
first
)
{
/* try to push it to 0,0 */
/* try to push it to 0,0 */
int
tx
=
fudge_x
*
last_x
;
int
tx
=
fudge_x
*
last_x
+
40
;
int
ty
=
fudge_y
*
last_y
;
int
ty
=
fudge_y
*
last_y
+
40
;
int
bigjump
=
1
;
int
bigjump
=
1
;
if
(
bigjump
)
{
if
(
bigjump
)
{
...
@@ -399,6 +466,7 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
...
@@ -399,6 +466,7 @@ void uinput_pointer_command(int mask, int x, int y, rfbClientPtr client) {
/* now jump back out */
/* now jump back out */
ptr_rel
(
x
,
y
);
ptr_rel
(
x
,
y
);
if
(
0
)
usleep
(
10
*
1000
);
last_x
=
x
;
last_x
=
x
;
last_y
=
y
;
last_y
=
y
;
...
@@ -488,6 +556,10 @@ void uinput_key_command(int down, int keysym, rfbClientPtr client) {
...
@@ -488,6 +556,10 @@ void uinput_key_command(int down, int keysym, rfbClientPtr client) {
ev
.
code
=
SYN_REPORT
;
ev
.
code
=
SYN_REPORT
;
ev
.
value
=
0
;
ev
.
value
=
0
;
write
(
fd
,
&
ev
,
sizeof
(
ev
));
write
(
fd
,
&
ev
,
sizeof
(
ev
));
if
(
0
<=
scancode
<
256
)
{
key_pressed
[
scancode
]
=
down
?
1
:
0
;
}
#endif
#endif
}
}
...
...
x11vnc/unixpw.c
View file @
0afa1da8
...
@@ -51,7 +51,7 @@ extern char *crypt(const char*, const char *);
...
@@ -51,7 +51,7 @@ extern char *crypt(const char*, const char *);
#define IS_BSD
#define IS_BSD
#endif
#endif
#ifdef REL8
1
#ifdef REL8
x
#undef UNIXPW_SU
#undef UNIXPW_SU
#undef UNIXPW_CRYPT
#undef UNIXPW_CRYPT
#endif
#endif
...
...
x11vnc/x11vnc.1
View file @
0afa1da8
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
.TH X11VNC "1" "July 2006" "x11vnc " "User Commands"
.TH X11VNC "1" "July 2006" "x11vnc " "User Commands"
.SH NAME
.SH NAME
x11vnc - allow VNC connections to real X11 displays
x11vnc - allow VNC connections to real X11 displays
version: 0.8.2, lastmod: 2006-07-0
8
version: 0.8.2, lastmod: 2006-07-0
9
.SH SYNOPSIS
.SH SYNOPSIS
.B x11vnc
.B x11vnc
[OPTION]...
[OPTION]...
...
@@ -3026,7 +3026,7 @@ Examples:
...
@@ -3026,7 +3026,7 @@ Examples:
\fB-rawfb\fR cons3 (force /dev/tty3)
\fB-rawfb\fR cons3 (force /dev/tty3)
\fB-rawfb\fR consx (no keystrokes or mouse)
\fB-rawfb\fR consx (no keystrokes or mouse)
\fB-rawfb\fR console:/dev/nonstd
\fB-rawfb\fR console:/dev/nonstd
\fB-rawfb\fR cons \fB-pipeinput\fR UINPUT:accel=
1.5
\fB-rawfb\fR cons \fB-pipeinput\fR UINPUT:accel=
4.0
.PP
.PP
\fB-freqtab\fR \fIfile\fR
\fB-freqtab\fR \fIfile\fR
.IP
.IP
...
@@ -3108,30 +3108,32 @@ and motion but not button clicks.
...
@@ -3108,30 +3108,32 @@ and motion but not button clicks.
A UINPUT option of the form: accel=f, or accel=fx+fy
A UINPUT option of the form: accel=f, or accel=fx+fy
sets the mouse motion "acceleration". This is used
sets the mouse motion "acceleration". This is used
to correct raw mouse relative motion into how much the
to correct raw mouse relative motion into how much the
application cursor moves (x11vnc has no control over
application cursor moves (x11vnc has no control over
,
how the application interprets the raw mouse motions).
or knowledge of how the windowing application interprets
Typically the acceleration for an X display is 2 (see
the raw mouse motions). Typically the acceleration
xset "m" option). "f" is a floating point number,
for an X display is 2 (see xset "m" option). "f"
e.g. 2.0. Use "fx+fy" if you need to supply different
is a floating point number, e.g. 3.0. Use "fx+fy"
corrections for x and y.
if you need to supply different
corrections for x and y.
.IP
.IP
Note: the default acceleration is 2.0 since it seems
Note: the default acceleration is 2.0 since it seems
both X and qt-embedded often use this value.
both X and qt-embedded often (but not always) use
this value.
.IP
.IP
Even with a correct accel setting the mouse position
Even with a correct accel setting the mouse position
will get out of sync (probably due to a mouse
will get out of sync (probably due to a mouse
"threshold" setting where the acceleration doe not
"threshold" setting where the acceleration doe not
apply, set
apply, set
.IR xset (1)
.IR xset (1)
). The option reset=N sets the number
). The option reset=N sets the
of ms (default 500) after which the cursor is attempted
number of ms (default 500) after which the cursor is
to be reset (by forcing the mouse to (0, 0) via small
attempted to be reset (by forcing the mouse to (0,
increments and then back out to (x, y) in 1 jump), This
0) via small increments and then back out to (x, y)
correction seems to be needed but can cause jerkiness
in 1 jump), This correction seems to be needed but can
or unexpected behavior. Use reset=0 to disable.
cause jerkiness or unexpected behavior with menus, etc.
Use reset=0 to disable.
.IP
.IP
Example:
Example:
\fB-pipeinput\fR UINPUT:accel=
1
.0 \fB-cursor\fR none
\fB-pipeinput\fR UINPUT:accel=
4
.0 \fB-cursor\fR none
.PP
.PP
\fB-gui\fR \fI[gui-opts]\fR
\fB-gui\fR \fI[gui-opts]\fR
.IP
.IP
...
...
x11vnc/x11vnc.c
View file @
0afa1da8
...
@@ -1642,7 +1642,7 @@ int main(int argc, char* argv[]) {
...
@@ -1642,7 +1642,7 @@ int main(int argc, char* argv[]) {
CHECK_ARGC
CHECK_ARGC
passwdfile
=
strdup
(
argv
[
++
i
]);
passwdfile
=
strdup
(
argv
[
++
i
]);
got_passwdfile
=
1
;
got_passwdfile
=
1
;
#ifndef REL8
1
#ifndef REL8
x
}
else
if
(
strstr
(
arg
,
"-unixpw"
)
==
arg
)
{
}
else
if
(
strstr
(
arg
,
"-unixpw"
)
==
arg
)
{
unixpw
=
1
;
unixpw
=
1
;
if
(
strstr
(
arg
,
"-unixpw_nis"
))
{
if
(
strstr
(
arg
,
"-unixpw_nis"
))
{
...
...
x11vnc/x11vnc.h
View file @
0afa1da8
...
@@ -118,7 +118,7 @@
...
@@ -118,7 +118,7 @@
#define PASSWD_UNLESS_NOPW 0
#define PASSWD_UNLESS_NOPW 0
#endif
#endif
#define noREL8
1
#define noREL8
x
/*
/*
* Beginning of support for small binary footprint build for embedded
* Beginning of support for small binary footprint build for embedded
...
...
x11vnc/x11vnc_defs.c
View file @
0afa1da8
...
@@ -15,7 +15,7 @@ int xtrap_base_event_type = 0;
...
@@ -15,7 +15,7 @@ int xtrap_base_event_type = 0;
int
xdamage_base_event_type
=
0
;
int
xdamage_base_event_type
=
0
;
/* date +'lastmod: %Y-%m-%d' */
/* date +'lastmod: %Y-%m-%d' */
char
lastmod
[]
=
"0.8.2 lastmod: 2006-07-0
8
"
;
char
lastmod
[]
=
"0.8.2 lastmod: 2006-07-0
9
"
;
/* X display info */
/* X display info */
...
...
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