Linux ns1.utparral.edu.mx 6.8.0-79-generic #79~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 15 16:54:53 UTC 2 x86_64
Apache/2.4.58 (Unix) OpenSSL/1.1.1w PHP/8.2.12 mod_perl/2.0.12 Perl/v5.34.1
: 10.10.1.9 | : 10.10.1.254
Cant Read [ /etc/named.conf ]
daemon
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
X11
[ DIR ]
drwxr-xr-x
[
50.44
KB
-rwxr-xr-x
aa-enabled
34.52
KB
-rwxr-xr-x
aa-exec
34.52
KB
-rwxr-xr-x
aa-features-abi
30.52
KB
-rwxr-xr-x
aconnect
22.38
KB
-rwxr-xr-x
acpidbg
1.58
KB
-rwxr-xr-x
acpi_listen
18.57
KB
-rwxr-xr-x
add-apt-repository
14.14
KB
-rwxr-xr-x
addpart
14.38
KB
-rwxr-xr-x
airscan-discover
146.85
KB
-rwxr-xr-x
alsabat
42.44
KB
-rwxr-xr-x
alsaloop
83.33
KB
-rwxr-xr-x
alsamixer
84.29
KB
-rwxr-xr-x
alsatplg
74.38
KB
-rwxr-xr-x
alsaucm
30.84
KB
-rwxr-xr-x
amidi
30.38
KB
-rwxr-xr-x
amixer
62.45
KB
-rwxr-xr-x
anydesk
16.4
MB
-rwxr-xr-x
anydesk-global-settings
54
B
-rwxr-xr-x
apg
274
B
-rwxr-xr-x
apgbfm
26.16
KB
-rwxr-xr-x
aplay
82.42
KB
-rwxr-xr-x
aplaymidi
26.38
KB
-rwxr-xr-x
apport-bug
2.51
KB
-rwxr-xr-x
apport-cli
13.05
KB
-rwxr-xr-x
apport-collect
2.51
KB
-rwxr-xr-x
apport-unpack
2.02
KB
-rwxr-xr-x
appres
14.3
KB
-rwxr-xr-x
appstreamcli
118.23
KB
-rwxr-xr-x
apropos
47.28
KB
-rwxr-xr-x
apt
18.38
KB
-rwxr-xr-x
apt-add-repository
14.14
KB
-rwxr-xr-x
apt-cache
82.47
KB
-rwxr-xr-x
apt-cdrom
26.47
KB
-rwxr-xr-x
apt-config
26.39
KB
-rwxr-xr-x
aptdcon
1.01
KB
-rwxr-xr-x
apt-extracttemplates
22.47
KB
-rwxr-xr-x
apt-ftparchive
230.48
KB
-rwxr-xr-x
apt-get
50.47
KB
-rwxr-xr-x
apt-key
27.51
KB
-rwxr-xr-x
apt-mark
50.47
KB
-rwxr-xr-x
apt-sortpkgs
38.4
KB
-rwxr-xr-x
apturl
273
B
-rwxr-xr-x
apturl-gtk
1.51
KB
-rwxr-xr-x
arch
30.51
KB
-rwxr-xr-x
arecord
82.42
KB
-rwxr-xr-x
arecordmidi
30.39
KB
-rwxr-xr-x
arm2hpdl
14.31
KB
-rwxr-xr-x
arpaname
14.3
KB
-rwxr-xr-x
aseqdump
26.38
KB
-rwxr-xr-x
aseqnet
22.43
KB
-rwxr-xr-x
aspell
142.48
KB
-rwxr-xr-x
aspell-import
2
KB
-rwxr-xr-x
atobm
14.3
KB
-rwxr-xr-x
avahi-browse
30.39
KB
-rwxr-xr-x
avahi-browse-domains
30.39
KB
-rwxr-xr-x
avahi-publish
26.38
KB
-rwxr-xr-x
avahi-publish-address
26.38
KB
-rwxr-xr-x
avahi-publish-service
26.38
KB
-rwxr-xr-x
avahi-resolve
22.38
KB
-rwxr-xr-x
avahi-resolve-address
22.38
KB
-rwxr-xr-x
avahi-resolve-host-name
22.38
KB
-rwxr-xr-x
avahi-set-host-name
14.38
KB
-rwxr-xr-x
avinfo
22.26
KB
-rwxr-xr-x
awk
154.79
KB
-rwxr-xr-x
axfer
90.38
KB
-rwxr-xr-x
b2sum
50.52
KB
-rwxr-xr-x
baobab
238.58
KB
-rwxr-xr-x
base32
34.51
KB
-rwxr-xr-x
base64
34.51
KB
-rwxr-xr-x
basename
34.51
KB
-rwxr-xr-x
basenc
46.51
KB
-rwxr-xr-x
bash
1.33
MB
-rwxr-xr-x
bashbug
6.66
KB
-rwxr-xr-x
bc
90.82
KB
-rwxr-xr-x
bdftopcf
42.26
KB
-rwxr-xr-x
bdftruncate
14.15
KB
-rwxr-xr-x
bitmap
106.31
KB
-rwxr-xr-x
bluemoon
38.23
KB
-rwxr-xr-x
bluetoothctl
274.8
KB
-rwxr-xr-x
bluetooth-sendto
34.4
KB
-rwxr-xr-x
bmtoa
14.32
KB
-rwxr-xr-x
boltctl
122.98
KB
-rwxr-xr-x
bootctl
70.49
KB
-rwxr-xr-x
brltty
1012.04
KB
-rwxr-xr-x
brltty-ctb
286.73
KB
-rwxr-xr-x
brltty-trtxt
238.62
KB
-rwxr-xr-x
brltty-ttb
270.81
KB
-rwxr-xr-x
broadwayd
118.3
KB
-rwxr-xr-x
browse
25.46
KB
-rwxr-xr-x
btattach
30.23
KB
-rwxr-xr-x
btmgmt
165
KB
-rwxr-xr-x
btmon
850.3
KB
-rwxr-xr-x
bunzip2
38.38
KB
-rwxr-xr-x
busctl
90.49
KB
-rwxr-xr-x
busybox
2.09
MB
-rwxr-xr-x
bwrap
70.47
KB
-rwxr-xr-x
bzcat
38.38
KB
-rwxr-xr-x
bzcmp
2.17
KB
-rwxr-xr-x
bzdiff
2.17
KB
-rwxr-xr-x
bzegrep
3.69
KB
-rwxr-xr-x
bzexe
4.78
KB
-rwxr-xr-x
bzfgrep
3.69
KB
-rwxr-xr-x
bzgrep
3.69
KB
-rwxr-xr-x
bzip2
38.38
KB
-rwxr-xr-x
bzip2recover
14.3
KB
-rwxr-xr-x
bzless
1.27
KB
-rwxr-xr-x
bzmore
1.27
KB
-rwxr-xr-x
calibrate_ppa
26.38
KB
-rwxr-xr-x
canberra-gtk-play
18.22
KB
-rwxr-xr-x
cancel
14.3
KB
-rwxr-xr-x
captoinfo
86.41
KB
-rwxr-xr-x
cat
34.46
KB
-rwxr-xr-x
catman
34.76
KB
-rwxr-xr-x
cautious-launcher
853
B
-rwxr-xr-x
cd-create-profile
26.29
KB
-rwxr-xr-x
cd-fix-profile
26.29
KB
-rwxr-xr-x
cd-iccdump
14.29
KB
-rwxr-xr-x
cd-it8
22.29
KB
-rwxr-xr-x
chacl
22.3
KB
-rwxr-xr-x
chage
70.49
KB
-rwxr-sr-x
chardet
965
B
-rwxr-xr-x
chardetect
965
B
-rwxr-xr-x
chattr
14.31
KB
-rwxr-xr-x
chcon
58.51
KB
-rwxr-xr-x
check-language-support
2.71
KB
-rwxr-xr-x
cheese
266.39
KB
-rwxr-xr-x
chfn
71.01
KB
-rwsr-xr-x
chgrp
54.51
KB
-rwxr-xr-x
chmod
54.51
KB
-rwxr-xr-x
choom
22.38
KB
-rwxr-xr-x
chown
58.51
KB
-rwxr-xr-x
chrt
26.38
KB
-rwxr-xr-x
chsh
43.76
KB
-rwsr-xr-x
chvt
14.23
KB
-rwxr-xr-x
ciptool
34.34
KB
-rwxr-xr-x
ckbcomp
146.31
KB
-rwxr-xr-x
cksum
34.41
KB
-rwxr-xr-x
clear
14.31
KB
-rwxr-xr-x
clear_console
14.23
KB
-rwxr-xr-x
cmp
42.39
KB
-rwxr-xr-x
codepage
14.15
KB
-rwxr-xr-x
col
22.38
KB
-rwxr-xr-x
colcrt
14.38
KB
-rwxr-xr-x
colormgr
58.29
KB
-rwxr-xr-x
colrm
14.38
KB
-rwxr-xr-x
column
34.38
KB
-rwxr-xr-x
comm
34.52
KB
-rwxr-xr-x
compose
18.06
KB
-rwxr-xr-x
corelist
15.01
KB
-rwxr-xr-x
cp
138.51
KB
-rwxr-xr-x
cpan
8.16
KB
-rwxr-xr-x
cpan5.34-x86_64-linux-gnu
8.18
KB
-rwxr-xr-x
cpio
141.64
KB
-rwxr-xr-x
cpp
906.82
KB
-rwxr-xr-x
cpp-11
906.82
KB
-rwxr-xr-x
cpupower
1.58
KB
-rwxr-xr-x
c_rehash
6.8
KB
-rwxr-xr-x
crontab
38.64
KB
-rwxr-sr-x
csplit
106.51
KB
-rwxr-xr-x
ctstat
22.66
KB
-rwxr-xr-x
cupstestppd
62.38
KB
-rwxr-xr-x
cut
38.51
KB
-rwxr-xr-x
cvt
14.14
KB
-rwxr-xr-x
cvtsudoers
296.4
KB
-rwxr-xr-x
dash
122.74
KB
-rwxr-xr-x
date
102.51
KB
-rwxr-xr-x
dbus-cleanup-sockets
14.29
KB
-rwxr-xr-x
dbus-daemon
227.32
KB
-rwxr-xr-x
dbus-monitor
26.29
KB
-rwxr-xr-x
dbus-run-session
14.29
KB
-rwxr-xr-x
dbus-send
26.29
KB
-rwxr-xr-x
dbus-update-activation-environment
14.29
KB
-rwxr-xr-x
dbus-uuidgen
14.29
KB
-rwxr-xr-x
dbxtool
26.3
KB
-rwxr-xr-x
dc
46.24
KB
-rwxr-xr-x
dconf
58.21
KB
-rwxr-xr-x
dd
66.52
KB
-rwxr-xr-x
ddstdecode
18.31
KB
-rwxr-xr-x
deallocvt
14.23
KB
-rwxr-xr-x
debconf
2.79
KB
-rwxr-xr-x
debconf-apt-progress
11.27
KB
-rwxr-xr-x
debconf-communicate
608
B
-rwxr-xr-x
debconf-copydb
1.68
KB
-rwxr-xr-x
debconf-escape
647
B
-rwxr-xr-x
debconf-set-selections
2.92
KB
-rwxr-xr-x
debconf-show
1.78
KB
-rwxr-xr-x
debian-distro-info
22.95
KB
-rwxr-xr-x
deb-systemd-helper
20.89
KB
-rwxr-xr-x
deb-systemd-invoke
6.01
KB
-rwxr-xr-x
deja-dup
322.51
KB
-rwxr-xr-x
delpart
14.38
KB
-rwxr-xr-x
delv
45.32
KB
-rwxr-xr-x
desktop-file-edit
96.44
KB
-rwxr-xr-x
desktop-file-install
96.44
KB
-rwxr-xr-x
desktop-file-validate
76.69
KB
-rwxr-xr-x
devdump
183.27
KB
-rwxr-xr-x
df
83.08
KB
-rwxr-xr-x
dfu-tool
110.3
KB
-rwxr-xr-x
dh_bash-completion
4.31
KB
-rwxr-xr-x
dh_installxmlcatalogs
9.22
KB
-rwxr-xr-x
dh_perl_openssl
1.5
KB
-rwxr-xr-x
diff
130.55
KB
-rwxr-xr-x
diff3
54.52
KB
-rwxr-xr-x
dig
150.83
KB
-rwxr-xr-x
dir
134.98
KB
-rwxr-xr-x
dircolors
38.52
KB
-rwxr-xr-x
dirmngr
433.02
KB
-rwxr-xr-x
dirmngr-client
54.92
KB
-rwxr-xr-x
dirname
30.38
KB
-rwxr-xr-x
dirsplit
16.74
KB
-rwxr-xr-x
distro-info
22.89
KB
-rwxr-xr-x
dmesg
70.61
KB
-rwxr-xr-x
dnsdomainname
22.23
KB
-rwxr-xr-x
dnssec-cds
51.39
KB
-rwxr-xr-x
dnssec-dsfromkey
38.38
KB
-rwxr-xr-x
dnssec-importkey
38.38
KB
-rwxr-xr-x
dnssec-keyfromlabel
42.38
KB
-rwxr-xr-x
dnssec-keygen
46.38
KB
-rwxr-xr-x
dnssec-revoke
30.38
KB
-rwxr-xr-x
dnssec-settime
46.38
KB
-rwxr-xr-x
dnssec-signzone
94.41
KB
-rwxr-xr-x
dnssec-verify
30.39
KB
-rwxr-xr-x
domainname
22.23
KB
-rwxr-xr-x
do-release-upgrade
10.42
KB
-rwxr-xr-x
dpkg
310.69
KB
-rwxr-xr-x
dpkg-deb
134.49
KB
-rwxr-xr-x
dpkg-divert
118.49
KB
-rwxr-xr-x
dpkg-maintscript-helper
20.71
KB
-rwxr-xr-x
dpkg-query
138.52
KB
-rwxr-xr-x
dpkg-realpath
4.09
KB
-rwxr-xr-x
dpkg-split
98.51
KB
-rwxr-xr-x
dpkg-statoverride
46.26
KB
-rwxr-xr-x
dpkg-trigger
42.41
KB
-rwxr-xr-x
driverless
30.32
KB
-rwxr-xr-x
driverless-fax
537
B
-rwxr-xr-x
du
146.51
KB
-rwxr-xr-x
dumpkeys
158.71
KB
-rwxr-xr-x
duplicity
5.21
KB
-rwxr-xr-x
dvipdf
1007
B
-rwxr-xr-x
echo
34.3
KB
-rwxr-xr-x
ed
54.49
KB
-rwxr-xr-x
edit
18.06
KB
-rwxr-xr-x
editor
276.52
KB
-rwxr-xr-x
editres
72.69
KB
-rwxr-xr-x
efibootdump
22.15
KB
-rwxr-xr-x
efibootmgr
43.27
KB
-rwxr-xr-x
egrep
28
B
-rwxr-xr-x
eject
42.23
KB
-rwxr-xr-x
enc2xs
40.84
KB
-rwxr-xr-x
encguess
3.01
KB
-rwxr-xr-x
enchant-2
26.29
KB
-rwxr-xr-x
enchant-lsmod-2
18.29
KB
-rwxr-xr-x
env
42.95
KB
-rwxr-xr-x
envsubst
34.38
KB
-rwxr-xr-x
eog
18.37
KB
-rwxr-xr-x
eps2eps
639
B
-rwxr-xr-x
eqn
188.45
KB
-rwxr-xr-x
esc-m
14.16
KB
-rwxr-xr-x
eutp
26.16
KB
-rwxr-xr-x
evince
519.73
KB
-rwxr-xr-x
evince-previewer
70.52
KB
-rwxr-xr-x
evince-thumbnailer
18.38
KB
-rwxr-xr-x
ex
1.45
MB
-rwxr-xr-x
expand
34.53
KB
-rwxr-xr-x
expiry
22.59
KB
-rwxr-sr-x
expr
102.41
KB
-rwxr-xr-x
factor
70.51
KB
-rwxr-xr-x
faillog
22.59
KB
-rwxr-xr-x
fallocate
22.38
KB
-rwxr-xr-x
false
26.3
KB
-rwxr-xr-x
fc-cache
22.23
KB
-rwxr-xr-x
fc-cat
18.23
KB
-rwxr-xr-x
fc-conflist
14.23
KB
-rwxr-xr-x
fc-list
14.23
KB
-rwxr-xr-x
fc-match
14.23
KB
-rwxr-xr-x
fc-pattern
14.23
KB
-rwxr-xr-x
fc-query
14.23
KB
-rwxr-xr-x
fc-scan
14.23
KB
-rwxr-xr-x
fc-validate
14.23
KB
-rwxr-xr-x
fgconsole
14.23
KB
-rwxr-xr-x
fgrep
28
B
-rwxr-xr-x
file
26.56
KB
-rwxr-xr-x
file2brl
26.21
KB
-rwxr-xr-x
file-roller
528.85
KB
-rwxr-xr-x
filezilla
3.79
MB
-rwxr-xr-x
fincore
22.42
KB
-rwxr-xr-x
find
275.48
KB
-rwxr-xr-x
findmnt
63.61
KB
-rwxr-xr-x
firefox
2.32
KB
-rwxr-xr-x
flock
22.48
KB
-rwxr-xr-x
fmt
38.51
KB
-rwxr-xr-x
fold
34.51
KB
-rwxr-xr-x
fonttosfnt
38.16
KB
-rwxr-xr-x
foo2ddst
30.96
KB
-rwxr-xr-x
foo2ddst-wrapper
16.86
KB
-rwxr-xr-x
foo2hbpl2
30.99
KB
-rwxr-xr-x
foo2hbpl2-wrapper
17.91
KB
-rwxr-xr-x
foo2hiperc
42.99
KB
-rwxr-xr-x
foo2hiperc-wrapper
18.11
KB
-rwxr-xr-x
foo2hp
38.96
KB
-rwxr-xr-x
foo2hp2600-wrapper
18.75
KB
-rwxr-xr-x
foo2lava
42.95
KB
-rwxr-xr-x
foo2lava-wrapper
19.61
KB
-rwxr-xr-x
foo2oak
38.89
KB
-rwxr-xr-x
foo2oak-wrapper
17.45
KB
-rwxr-xr-x
foo2qpdl
43.03
KB
-rwxr-xr-x
foo2qpdl-wrapper
19.06
KB
-rwxr-xr-x
foo2slx
30.93
KB
-rwxr-xr-x
foo2slx-wrapper
17.19
KB
-rwxr-xr-x
foo2xqx
31
KB
-rwxr-xr-x
foo2xqx-wrapper
17.16
KB
-rwxr-xr-x
foo2zjs
43.03
KB
-rwxr-xr-x
foo2zjs-icc2ps
14.31
KB
-rwxr-xr-x
foo2zjs-pstops
2.93
KB
-rwxr-xr-x
foo2zjs-wrapper
25.34
KB
-rwxr-xr-x
foomatic-rip
107.41
KB
-rwxr-xr-x
fprintd-delete
86.38
KB
-rwxr-xr-x
fprintd-enroll
90.86
KB
-rwxr-xr-x
fprintd-list
78.38
KB
-rwxr-xr-x
fprintd-verify
86.38
KB
-rwxr-xr-x
free
26.23
KB
-rwxr-xr-x
ftp
178.9
KB
-rwxr-xr-x
funzip
22.3
KB
-rwxr-xr-x
fuser
39.31
KB
-rwxr-xr-x
fusermount
34.38
KB
-rwsr-xr-x
fusermount3
34.38
KB
-rwsr-xr-x
futurize
960
B
-rwxr-xr-x
fwupdagent
190.3
KB
-rwxr-xr-x
fwupdate
82.3
KB
-rwxr-xr-x
fwupdmgr
190.3
KB
-rwxr-xr-x
fwupdtool
394.92
KB
-rwxr-xr-x
fzputtygen
210.23
KB
-rwxr-xr-x
fzsftp
562.73
KB
-rwxr-xr-x
gamemoded
154.65
KB
-rwxr-xr-x
gamma4scanimage
14.3
KB
-rwxr-xr-x
gapplication
22.38
KB
-rwxr-xr-x
gatttool
103.45
KB
-rwxr-xr-x
gcalccmd
314.39
KB
-rwxr-xr-x
gcore
3.4
KB
-rwxr-xr-x
gcr-viewer
14.37
KB
-rwxr-xr-x
gdb
9.8
MB
-rwxr-xr-x
gdb-add-index
4.52
KB
-rwxr-xr-x
gdbtui
126
B
-rwxr-xr-x
gdbus
50.38
KB
-rwxr-xr-x
gdialog
9.01
KB
-rwxr-xr-x
gdk-pixbuf-csource
14.33
KB
-rwxr-xr-x
gdk-pixbuf-pixdata
14.31
KB
-rwxr-xr-x
gdk-pixbuf-thumbnailer
18.39
KB
-rwxr-xr-x
gdmflexiserver
22.78
KB
-rwxr-xr-x
gdm-screenshot
18.41
KB
-rwxr-xr-x
gedit
14.3
KB
-rwxr-xr-x
genisoimage
645.9
KB
-rwxr-xr-x
geqn
188.45
KB
-rwxr-xr-x
GET
15.82
KB
-rwxr-xr-x
getconf
34.29
KB
-rwxr-xr-x
geteltorito
6.06
KB
-rwxr-xr-x
getent
38.65
KB
-rwxr-xr-x
getfacl
30.81
KB
-rwxr-xr-x
getkeycodes
14.23
KB
-rwxr-xr-x
getopt
22.38
KB
-rwxr-xr-x
gettext
34.38
KB
-rwxr-xr-x
gettext.sh
5.07
KB
-rwxr-xr-x
ghostscript
14.15
KB
-rwxr-xr-x
ginstall-info
103.23
KB
-rwxr-xr-x
gio
90.4
KB
-rwxr-xr-x
gio-querymodules
14.3
KB
-rwxr-xr-x
gipddecode
18.31
KB
-rwxr-xr-x
gjs
22.72
KB
-rwxr-xr-x
gjs-console
22.72
KB
-rwxr-xr-x
gkbd-keyboard-display
14.3
KB
-rwxr-xr-x
glib-compile-schemas
50.3
KB
-rwxr-xr-x
gnome-calculator
914.84
KB
-rwxr-xr-x
gnome-calendar
644.57
KB
-rwxr-xr-x
gnome-characters
299
B
-rwxr-xr-x
gnome-control-center
4.47
MB
-rwxr-xr-x
gnome-disk-image-mounter
22.38
KB
-rwxr-xr-x
gnome-disks
727.49
KB
-rwxr-xr-x
gnome-extensions
62.45
KB
-rwxr-xr-x
gnome-font-viewer
94.85
KB
-rwxr-xr-x
gnome-help
66.23
KB
-rwxr-xr-x
gnome-keyring
22.54
KB
-rwxr-xr-x
gnome-keyring-3
22.54
KB
-rwxr-xr-x
gnome-keyring-daemon
993.29
KB
-rwxr-xr-x
gnome-language-selector
1.41
KB
-rwxr-xr-x
gnome-logs
190.88
KB
-rwxr-xr-x
gnome-power-statistics
66.28
KB
-rwxr-xr-x
gnome-session
803
B
-rwxr-xr-x
gnome-session-custom-session
54
B
-rwxr-xr-x
gnome-session-inhibit
22.31
KB
-rwxr-xr-x
gnome-session-properties
66.26
KB
-rwxr-xr-x
gnome-session-quit
14.61
KB
-rwxr-xr-x
gnome-shell
26.63
KB
-rwxr-xr-x
gnome-shell-extension-tool
1.67
KB
-rwxr-xr-x
gnome-shell-perf-tool
10.36
KB
-rwxr-xr-x
gnome-system-monitor
350.36
KB
-rwxr-xr-x
gnome-terminal
3.32
KB
-rwxr-xr-x
gnome-terminal.real
75.52
KB
-rwxr-xr-x
gnome-terminal.wrapper
2.65
KB
-rwxr-xr-x
gnome-text-editor
14.3
KB
-rwxr-xr-x
gnome-thumbnail-font
26.3
KB
-rwxr-xr-x
gnome-todo
406.87
KB
-rwxr-xr-x
gnome-www-browser
2.32
KB
-rwxr-xr-x
gpasswd
70.38
KB
-rwsr-xr-x
gpg
1
MB
-rwxr-xr-x
gpg-agent
312.96
KB
-rwxr-xr-x
gpgcompose
496.48
KB
-rwxr-xr-x
gpgconf
126.73
KB
-rwxr-xr-x
gpg-connect-agent
82.99
KB
-rwxr-xr-x
gpgparsemail
34.38
KB
-rwxr-xr-x
gpgsm
418.9
KB
-rwxr-xr-x
gpgsplit
26.55
KB
-rwxr-xr-x
gpgtar
63.39
KB
-rwxr-xr-x
gpgv
271.04
KB
-rwxr-xr-x
gpg-wks-server
115.05
KB
-rwxr-xr-x
gpg-zip
3.43
KB
-rwxr-xr-x
gpic
200.04
KB
-rwxr-xr-x
gpu-manager
78.82
KB
-rwxr-xr-x
grdctl
26.38
KB
-rwxr-xr-x
grep
178.45
KB
-rwxr-xr-x
gresource
22.3
KB
-rwxr-xr-x
groff
94.5
KB
-rwxr-xr-x
grog
2.71
KB
-rwxr-xr-x
grops
162.55
KB
-rwxr-xr-x
grotty
118.52
KB
-rwxr-xr-x
groups
34.51
KB
-rwxr-xr-x
grub-editenv
376.95
KB
-rwxr-xr-x
grub-file
816.45
KB
-rwxr-xr-x
grub-fstest
937.92
KB
-rwxr-xr-x
grub-glue-efi
247.86
KB
-rwxr-xr-x
grub-kbdcomp
1.64
KB
-rwxr-xr-x
grub-menulst2cfg
228.13
KB
-rwxr-xr-x
grub-mkfont
272.42
KB
-rwxr-xr-x
grub-mkimage
361.05
KB
-rwxr-xr-x
grub-mklayout
252.17
KB
-rwxr-xr-x
grub-mknetdir
417.66
KB
-rwxr-xr-x
grub-mkpasswd-pbkdf2
256.2
KB
-rwxr-xr-x
grub-mkrelpath
247.58
KB
-rwxr-xr-x
grub-mkrescue
998.47
KB
-rwxr-xr-x
grub-mkstandalone
493.95
KB
-rwxr-xr-x
grub-mount
760.84
KB
-rwxr-xr-x
grub-ntldr-img
38.24
KB
-rwxr-xr-x
grub-render-label
828.83
KB
-rwxr-xr-x
grub-script-check
275.7
KB
-rwxr-xr-x
grub-syslinux2cfg
781.34
KB
-rwxr-xr-x
gs
14.15
KB
-rwxr-xr-x
gsbj
350
B
-rwxr-xr-x
gsdj
352
B
-rwxr-xr-x
gsdj500
352
B
-rwxr-xr-x
gsettings
30.3
KB
-rwxr-xr-x
gslj
353
B
-rwxr-xr-x
gslp
350
B
-rwxr-xr-x
gsnd
277
B
-rwxr-xr-x
gst-device-monitor-1.0
22.4
KB
-rwxr-xr-x
gst-discoverer-1.0
34.32
KB
-rwxr-xr-x
gst-inspect-1.0
62.4
KB
-rwxr-xr-x
gst-launch-1.0
38.33
KB
-rwxr-xr-x
gst-play-1.0
50.4
KB
-rwxr-xr-x
gstreamer-codec-install
22.15
KB
-rwxr-xr-x
gst-stats-1.0
34.38
KB
-rwxr-xr-x
gst-tester-1.0
14.31
KB
-rwxr-xr-x
gst-typefind-1.0
18.31
KB
-rwxr-xr-x
gtbl
126.48
KB
-rwxr-xr-x
gtf
18.31
KB
-rwxr-xr-x
gtk4-builder-tool
54.43
KB
-rwxr-xr-x
gtk4-encode-symbolic-svg
7.99
MB
-rwxr-xr-x
gtk4-launch
18.46
KB
-rwxr-xr-x
gtk4-query-settings
14.3
KB
-rwxr-xr-x
gtk4-update-icon-cache
38.73
KB
-rwxr-xr-x
gtk-builder-tool
34.73
KB
-rwxr-xr-x
gtk-encode-symbolic-svg
18.41
KB
-rwxr-xr-x
gtk-launch
18.46
KB
-rwxr-xr-x
gtk-query-settings
14.3
KB
-rwxr-xr-x
gtk-update-icon-cache
38.57
KB
-rwxr-xr-x
gunzip
2.29
KB
-rwxr-xr-x
gzexe
6.3
KB
-rwxr-xr-x
gzip
91.23
KB
-rwxr-xr-x
h2ph
28.54
KB
-rwxr-xr-x
h2xs
59.51
KB
-rwxr-xr-x
hardlink
34.43
KB
-rwxr-xr-x
hbpldecode
26.31
KB
-rwxr-xr-x
hciattach
56.3
KB
-rwxr-xr-x
hciconfig
164.02
KB
-rwxr-xr-x
hcitool
159.76
KB
-rwxr-xr-x
hd
50.39
KB
-rwxr-xr-x
head
42.51
KB
-rwxr-xr-x
HEAD
15.82
KB
-rwxr-xr-x
helpztags
2.46
KB
-rwxr-xr-x
hex2hcd
18.23
KB
-rwxr-xr-x
hexdump
50.39
KB
-rwxr-xr-x
hipercdecode
18.31
KB
-rwxr-xr-x
host
118.82
KB
-rwxr-xr-x
hostid
30.51
KB
-rwxr-xr-x
hostname
22.23
KB
-rwxr-xr-x
hostnamectl
30.38
KB
-rwxr-xr-x
hp-align
9.14
KB
-rwxr-xr-x
hp-check
39.2
KB
-rwxr-xr-x
hp-clean
7.05
KB
-rwxr-xr-x
hp-colorcal
9.08
KB
-rwxr-xr-x
hp-config_usb_printer
6.98
KB
-rwxr-xr-x
hp-doctor
12.69
KB
-rwxr-xr-x
hp-firmware
6.47
KB
-rwxr-xr-x
hp-info
6.26
KB
-rwxr-xr-x
hp-levels
6.85
KB
-rwxr-xr-x
hp-logcapture
12.15
KB
-rwxr-xr-x
hp-makeuri
5.6
KB
-rwxr-xr-x
hp-pkservice
3.13
KB
-rwxr-xr-x
hp-plugin
13.62
KB
-rwxr-xr-x
hp-plugin-ubuntu
719
B
-rwxr-xr-x
hp-probe
7.98
KB
-rwxr-xr-x
hp-query
4.94
KB
-rwxr-xr-x
hp-scan
86.9
KB
-rwxr-xr-x
hp-setup
37.25
KB
-rwxr-xr-x
hp-testpage
5.98
KB
-rwxr-xr-x
hp-timedate
3.31
KB
-rwxr-xr-x
hwe-support-status
10.58
KB
-rwxr-xr-x
i386
26.65
KB
-rwxr-xr-x
ibus
38.37
KB
-rwxr-xr-x
ibus-daemon
194.42
KB
-rwxr-xr-x
ibus-setup
1.15
KB
-rwxr-xr-x
ibus-table-createdb
1.11
KB
-rwxr-xr-x
iceauth
42.42
KB
-rwxr-xr-x
ico
50.44
KB
-rwxr-xr-x
iconv
66.41
KB
-rwxr-xr-x
id
38.51
KB
-rwxr-xr-x
iecset
26.38
KB
-rwxr-xr-x
ijs_pxljr
34.53
KB
-rwxr-xr-x
im-config
11.03
KB
-rwxr-xr-x
im-launch
1.76
KB
-rwxr-xr-x
info
301.74
KB
-rwxr-xr-x
infobrowser
301.74
KB
-rwxr-xr-x
infocmp
62.38
KB
-rwxr-xr-x
infotocap
86.41
KB
-rwxr-xr-x
inputattach
33.75
KB
-rwxr-xr-x
install
142.52
KB
-rwxr-xr-x
install-info
103.23
KB
-rwxr-xr-x
install-printerdriver
95
B
-rwxr-xr-x
instmodsh
4.27
KB
-rwxr-xr-x
intel-virtual-output
70.31
KB
-rwxr-xr-x
ionice
18.38
KB
-rwxr-xr-x
ip
702.05
KB
-rwxr-xr-x
ipcmk
22.45
KB
-rwxr-xr-x
ipcrm
18.38
KB
-rwxr-xr-x
ipcs
38.38
KB
-rwxr-xr-x
ipod-read-sysinfo-extended
22.3
KB
-rwxr-xr-x
ipod-time-sync
14.3
KB
-rwxr-xr-x
ippfind
42.4
KB
-rwxr-xr-x
ipptool
94.3
KB
-rwxr-xr-x
iptables-xml
96.95
KB
-rwxr-xr-x
ischroot
14.2
KB
-rwxr-xr-x
isdv4-serial-debugger
18.31
KB
-rwxr-xr-x
isdv4-serial-inputattach
18.31
KB
-rwxr-xr-x
isodump
183.27
KB
-rwxr-xr-x
isoinfo
346.52
KB
-rwxr-xr-x
isovfy
187.27
KB
-rwxr-xr-x
ispell-wrapper
7.05
KB
-rwxr-xr-x
join
46.55
KB
-rwxr-xr-x
journalctl
78.39
KB
-rwxr-xr-x
jpgicc
34.33
KB
-rwxr-xr-x
json_pp
4.88
KB
-rwxr-xr-x
kbdinfo
18.23
KB
-rwxr-xr-x
kbd_mode
14.52
KB
-rwxr-xr-x
kbxutil
62.83
KB
-rwxr-xr-x
kernel-install
4.79
KB
-rwxr-xr-x
kerneloops-submit
14.15
KB
-rwxr-xr-x
keyring
961
B
-rwxr-xr-x
kill
30.23
KB
-rwxr-xr-x
killall
31.34
KB
-rwxr-xr-x
kmod
166.36
KB
-rwxr-xr-x
kmodsign
18.45
KB
-rwxr-xr-x
l2ping
14.16
KB
-rwxr-xr-x
l2test
34.49
KB
-rwxr-xr-x
laptop-detect
3.73
KB
-rwxr-xr-x
last
34.38
KB
-rwxr-xr-x
lastb
34.38
KB
-rwxr-xr-x
lastlog
27.63
KB
-rwxr-xr-x
lavadecode
22.31
KB
-rwxr-xr-x
lcf
7.6
KB
-rwxr-xr-x
ldd
5.32
KB
-rwxr-xr-x
less
194.38
KB
-rwxr-xr-x
lessecho
14.31
KB
-rwxr-xr-x
lessfile
8.83
KB
-rwxr-xr-x
lesskey
23.7
KB
-rwxr-xr-x
lesspipe
8.83
KB
-rwxr-xr-x
lexgrog
99.75
KB
-rwxr-xr-x
libnetcfg
15.41
KB
-rwxr-xr-x
libreoffice
6.57
KB
-rwxr-xr-x
libwacom-list-devices
14.41
KB
-rwxr-xr-x
libwacom-list-local-devices
18.46
KB
-rwxr-xr-x
libwacom-show-stylus
5.99
KB
-rwxr-xr-x
libwacom-update-db
8.9
KB
-rwxr-xr-x
link
30.51
KB
-rwxr-xr-x
linkicc
26.37
KB
-rwxr-xr-x
linux32
26.65
KB
-rwxr-xr-x
linux64
26.65
KB
-rwxr-xr-x
linux-boot-prober
1.54
KB
-rwxr-xr-x
linux-check-removal
3.99
KB
-rwxr-xr-x
linux-update-symlinks
6.17
KB
-rwxr-xr-x
linux-version
2.63
KB
-rwxr-xr-x
listres
14.73
KB
-rwxr-xr-x
ln
58.51
KB
-rwxr-xr-x
lnstat
22.66
KB
-rwxr-xr-x
loadkeys
198.76
KB
-rwxr-xr-x
loadunimap
30.32
KB
-rwxr-xr-x
localc
59
B
-rwxr-xr-x
locale
57.56
KB
-rwxr-xr-x
locale-check
14.15
KB
-rwxr-xr-x
localectl
26.37
KB
-rwxr-xr-x
localedef
326.96
KB
-rwxr-xr-x
lodraw
59
B
-rwxr-xr-x
loffice
53
B
-rwxr-xr-x
lofromtemplate
64
B
-rwxr-xr-x
logger
34.97
KB
-rwxr-xr-x
login
51.73
KB
-rwxr-xr-x
loginctl
58.48
KB
-rwxr-xr-x
logname
30.51
KB
-rwxr-xr-x
loimpress
62
B
-rwxr-xr-x
lomath
59
B
-rwxr-xr-x
look
18.38
KB
-rwxr-xr-x
loweb
58
B
-rwxr-xr-x
lowntfs-3g
114.98
KB
-rwxr-xr-x
lowriter
61
B
-rwxr-xr-x
lp
26.3
KB
-rwxr-xr-x
lpoptions
22.38
KB
-rwxr-xr-x
lpq
22.38
KB
-rwxr-xr-x
lpr
18.3
KB
-rwxr-xr-x
lprm
14.3
KB
-rwxr-xr-x
lp_solve
58.15
KB
-rwxr-xr-x
lpstat
38.63
KB
-rwxr-xr-x
ls
134.98
KB
-rwxr-xr-x
lsattr
14.31
KB
-rwxr-xr-x
lsblk
122.38
KB
-rwxr-xr-x
lsb_release
3.55
KB
-rwxr-xr-x
lscpu
98.38
KB
-rwxr-xr-x
lshw
901.2
KB
-rwxr-xr-x
lsinitramfs
706
B
-rwxr-xr-x
lsipc
50.38
KB
-rwxr-xr-x
lslocks
30.7
KB
-rwxr-xr-x
lslogins
50.38
KB
-rwxr-xr-x
lsmem
34.38
KB
-rwxr-xr-x
lsmod
166.36
KB
-rwxr-xr-x
lsns
38.38
KB
-rwxr-xr-x
lsof
163.62
KB
-rwxr-xr-x
lspci
92.08
KB
-rwxr-xr-x
lspgpot
1.06
KB
-rwxr-xr-x
lsusb
246.52
KB
-rwxr-xr-x
luit
48.44
KB
-rwxr-xr-x
lwp-download
10.05
KB
-rwxr-xr-x
lwp-dump
2.65
KB
-rwxr-xr-x
lwp-mirror
2.36
KB
-rwxr-xr-x
lwp-request
15.82
KB
-rwxr-xr-x
lzcat
82.52
KB
-rwxr-xr-x
lzcmp
6.86
KB
-rwxr-xr-x
lzdiff
6.86
KB
-rwxr-xr-x
lzegrep
5.87
KB
-rwxr-xr-x
lzfgrep
5.87
KB
-rwxr-xr-x
lzgrep
5.87
KB
-rwxr-xr-x
lzless
1.76
KB
-rwxr-xr-x
lzma
82.52
KB
-rwxr-xr-x
lzmainfo
14.23
KB
-rwxr-xr-x
lzmore
2.11
KB
-rwxr-xr-x
m2300w
28.83
KB
-rwxr-xr-x
m2300w-wrapper
14.24
KB
-rwxr-xr-x
m2400w
28.83
KB
-rwxr-xr-x
mako-render
958
B
-rwxr-xr-x
man
117.68
KB
-rwxr-xr-x
mandb
139.94
KB
-rwxr-xr-x
manpath
30.78
KB
-rwxr-xr-x
man-recode
35.68
KB
-rwxr-xr-x
mapscrn
30.32
KB
-rwxr-xr-x
mawk
154.79
KB
-rwxr-xr-x
mcookie
26.45
KB
-rwxr-xr-x
md5sum
42.41
KB
-rwxr-xr-x
md5sum.textutils
42.41
KB
-rwxr-xr-x
mdig
50.4
KB
-rwxr-xr-x
mesa-overlay-control.py
5.67
KB
-rwxr-xr-x
mesg
14.38
KB
-rwxr-xr-x
migrate-pubring-from-classic-gpg
2.99
KB
-rwxr-xr-x
mimeopen
9.34
KB
-rwxr-xr-x
mimetype
12.76
KB
-rwxr-xr-x
min12xxw
27.45
KB
-rwxr-xr-x
mkdir
66.51
KB
-rwxr-xr-x
mkfifo
38.51
KB
-rwxr-xr-x
mkfontdir
65
B
-rwxr-xr-x
mkfontscale
42.67
KB
-rwxr-xr-x
mkisofs
645.9
KB
-rwxr-xr-x
mk_modmap
15.78
KB
-rwxr-xr-x
mknod
42.51
KB
-rwxr-xr-x
mkpasswd
26.38
KB
-rwxr-xr-x
mksquashfs
254.68
KB
-rwxr-xr-x
mktemp
38.51
KB
-rwxr-xr-x
mkzftree
30.29
KB
-rwxr-xr-x
mmcli
273.84
KB
-rwxr-xr-x
mokutil
59.48
KB
-rwxr-xr-x
monitor-sensor
18.3
KB
-rwxr-xr-x
more
42.38
KB
-rwxr-xr-x
mount
46.38
KB
-rwsr-xr-x
mountpoint
18.38
KB
-rwxr-xr-x
mousetweaks
70.23
KB
-rwxr-xr-x
mscompress
14.3
KB
-rwxr-xr-x
msexpand
14.3
KB
-rwxr-xr-x
mt
66.73
KB
-rwxr-xr-x
mt-gnu
66.73
KB
-rwxr-xr-x
mtr
72.25
KB
-rwxr-xr-x
mtr-packet
38.3
KB
-rwxr-xr-x
mv
134.52
KB
-rwxr-xr-x
named-checkconf
38.4
KB
-rwxr-xr-x
named-checkzone
30.4
KB
-rwxr-xr-x
named-compilezone
30.4
KB
-rwxr-xr-x
named-journalprint
14.3
KB
-rwxr-xr-x
named-nzd2nzf
14.3
KB
-rwxr-xr-x
named-rrchecker
22.3
KB
-rwxr-xr-x
namei
22.38
KB
-rwxr-xr-x
nano
276.52
KB
-rwxr-xr-x
nautilus
1.63
MB
-rwxr-xr-x
nautilus-autorun-software
18.3
KB
-rwxr-xr-x
nautilus-sendto
22.23
KB
-rwxr-xr-x
nawk
154.79
KB
-rwxr-xr-x
nc
38.63
KB
-rwxr-xr-x
nc.openbsd
38.63
KB
-rwxr-xr-x
neqn
913
B
-rwxr-xr-x
netcat
38.63
KB
-rwxr-xr-x
netstat
154.59
KB
-rwxr-xr-x
networkctl
102.38
KB
-rwxr-xr-x
networkd-dispatcher
19.71
KB
-rwxr-xr-x
newgrp
39.55
KB
-rwsr-xr-x
ngettext
34.38
KB
-rwxr-xr-x
nice
34.51
KB
-rwxr-xr-x
nisdomainname
22.23
KB
-rwxr-xr-x
nl
98.57
KB
-rwxr-xr-x
nm-applet
268
KB
-rwxr-xr-x
nmcli
926.77
KB
-rwxr-xr-x
nm-connection-editor
963.02
KB
-rwxr-xr-x
nm-online
22.38
KB
-rwxr-xr-x
nmtui
734.35
KB
-rwxr-xr-x
nmtui-connect
734.35
KB
-rwxr-xr-x
nmtui-edit
734.35
KB
-rwxr-xr-x
nmtui-hostname
734.35
KB
-rwxr-xr-x
nohup
34.41
KB
-rwxr-xr-x
notify-send
18.23
KB
-rwxr-xr-x
nproc
34.51
KB
-rwxr-xr-x
nroff
3.22
KB
-rwxr-xr-x
nsec3hash
14.3
KB
-rwxr-xr-x
nsenter
26.6
KB
-rwxr-xr-x
nslookup
118.82
KB
-rwxr-xr-x
nstat
30.38
KB
-rwxr-xr-x
nsupdate
74.55
KB
-rwxr-xr-x
ntfs-3g
159.01
KB
-rwxr-xr-x
ntfs-3g.probe
14.38
KB
-rwxr-xr-x
ntfscat
26.38
KB
-rwxr-xr-x
ntfscluster
38.38
KB
-rwxr-xr-x
ntfscmp
30.38
KB
-rwxr-xr-x
ntfsdecrypt
42.38
KB
-rwxr-xr-x
ntfsfallocate
26.38
KB
-rwxr-xr-x
ntfsfix
34.38
KB
-rwxr-xr-x
ntfsinfo
54.38
KB
-rwxr-xr-x
ntfsls
27.45
KB
-rwxr-xr-x
ntfsmove
30.38
KB
-rwxr-xr-x
ntfsrecover
106.38
KB
-rwxr-xr-x
ntfssecaudit
78.86
KB
-rwxr-xr-x
ntfstruncate
26.3
KB
-rwxr-xr-x
ntfsusermap
18.3
KB
-rwxr-xr-x
ntfswipe
42.91
KB
-rwxr-xr-x
numfmt
54.54
KB
-rwxr-xr-x
nvidia-detector
270
B
-rwxr-xr-x
oakdecode
18.33
KB
-rwxr-xr-x
obexctl
102.24
KB
-rwxr-xr-x
oclock
23.66
KB
-rwxr-xr-x
od
66.51
KB
-rwxr-xr-x
oem-getlogs
8.59
KB
-rwxr-xr-x
on_ac_power
3.7
KB
-rwxr-xr-x
oomctl
18.37
KB
-rwxr-xr-x
open
25.46
KB
-rwxr-xr-x
openssl
977.8
KB
-rwxr-xr-x
openvt
22.59
KB
-rwxr-xr-x
opldecode
18.31
KB
-rwxr-xr-x
orca
9.05
KB
-rwxr-xr-x
orca-dm-wrapper
70
B
-rwxr-xr-x
os-prober
4.44
KB
-rwxr-xr-x
p11-kit
30.38
KB
-rwxr-xr-x
pacat
50.41
KB
-rwxr-xr-x
pacmd
18.38
KB
-rwxr-xr-x
pactl
94.4
KB
-rwxr-xr-x
padsp
2.18
KB
-rwxr-xr-x
pager
194.38
KB
-rwxr-xr-x
pa-info
2.04
KB
-rwxr-xr-x
pamon
50.41
KB
-rwxr-xr-x
paperconf
14.15
KB
-rwxr-xr-x
paplay
50.41
KB
-rwxr-xr-x
parec
50.41
KB
-rwxr-xr-x
parecord
50.41
KB
-rwxr-xr-x
partx
58.38
KB
-rwxr-xr-x
passwd
58.57
KB
-rwsr-xr-x
paste
34.41
KB
-rwxr-xr-x
pasteurize
964
B
-rwxr-xr-x
pasuspender
22.39
KB
-rwxr-xr-x
patch
186.52
KB
-rwxr-xr-x
pathchk
34.51
KB
-rwxr-xr-x
pax11publish
14.3
KB
-rwxr-xr-x
pdb3
61.74
KB
-rwxr-xr-x
pdb3.10
61.74
KB
-rwxr-xr-x
pdf2dsc
698
B
-rwxr-xr-x
pdf2ps
909
B
-rwxr-xr-x
pdfattach
18.38
KB
-rwxr-xr-x
pdfdetach
22.49
KB
-rwxr-xr-x
pdffonts
22.52
KB
-rwxr-xr-x
pdfimages
38.52
KB
-rwxr-xr-x
pdfinfo
58.52
KB
-rwxr-xr-x
pdfseparate
22.38
KB
-rwxr-xr-x
pdfsig
34.77
KB
-rwxr-xr-x
pdftocairo
134.48
KB
-rwxr-xr-x
pdftohtml
106.41
KB
-rwxr-xr-x
pdftoppm
34.41
KB
-rwxr-xr-x
pdftops
34.53
KB
-rwxr-xr-x
pdftotext
42.52
KB
-rwxr-xr-x
pdfunite
30.38
KB
-rwxr-xr-x
peekfd
14.3
KB
-rwxr-xr-x
perf
1.58
KB
-rwxr-xr-x
perl
3.63
MB
-rwxr-xr-x
perl5.34.0
3.63
MB
-rwxr-xr-x
perl5.34-x86_64-linux-gnu
14.3
KB
-rwxr-xr-x
perlbug
44.12
KB
-rwxr-xr-x
perldoc
125
B
-rwxr-xr-x
perli11ndoc
56.56
KB
-rwxr-xr-x
perlivp
10.61
KB
-rwxr-xr-x
perlthanks
44.12
KB
-rwxr-xr-x
pf2afm
498
B
-rwxr-xr-x
pfbtopfa
516
B
-rwxr-xr-x
pgrep
30.24
KB
-rwxr-xr-x
pic
200.04
KB
-rwxr-xr-x
pico
276.52
KB
-rwxr-xr-x
piconv
8.16
KB
-rwxr-xr-x
pidof
30.38
KB
-rwxr-xr-x
pidwait
30.24
KB
-rwxr-xr-x
pinentry
74.66
KB
-rwxr-xr-x
pinentry-curses
58.65
KB
-rwxr-xr-x
pinentry-gnome3
74.66
KB
-rwxr-xr-x
pinentry-x11
74.66
KB
-rwxr-xr-x
ping
74.88
KB
-rwxr-xr-x
ping4
74.88
KB
-rwxr-xr-x
ping6
74.88
KB
-rwxr-xr-x
pinky
34.41
KB
-rwxr-xr-x
pipewire
14.38
KB
-rwxr-xr-x
pipewire-media-session
398.75
KB
-rwxr-xr-x
pkaction
18.3
KB
-rwxr-xr-x
pkcheck
22.3
KB
-rwxr-xr-x
pkcon
58.3
KB
-rwxr-xr-x
pkexec
30.15
KB
-rwsr-xr-x
pkill
30.24
KB
-rwxr-xr-x
pkmon
22.3
KB
-rwxr-xr-x
pkttyagent
18.3
KB
-rwxr-xr-x
pl2pm
4.43
KB
-rwxr-xr-x
pldd
22.37
KB
-rwxr-xr-x
plog
146
B
-rwxr-xr-x
plymouth
46.3
KB
-rwxr-xr-x
pmap
34.24
KB
-rwxr-xr-x
pnm2ppa
1.57
MB
-rwxr-xr-x
pod2html
4.04
KB
-rwxr-xr-x
pod2man
14.68
KB
-rwxr-xr-x
pod2text
10.55
KB
-rwxr-xr-x
pod2usage
4.01
KB
-rwxr-xr-x
podchecker
3.57
KB
-rwxr-xr-x
poff
2.77
KB
-rwxr-xr-x
pon
1.33
KB
-rwxr-xr-x
POST
15.82
KB
-rwxr-xr-x
powerprofilesctl
7.9
KB
-rwxr-xr-x
ppdc
98.48
KB
-rwxr-xr-x
ppdhtml
74.48
KB
-rwxr-xr-x
ppdi
90.48
KB
-rwxr-xr-x
ppdmerge
18.38
KB
-rwxr-xr-x
ppdpo
78.48
KB
-rwxr-xr-x
pphs
404
B
-rwxr-xr-x
pr
66.58
KB
-rwxr-xr-x
precat
5.52
KB
-rwxr-xr-x
preconv
54.48
KB
-rwxr-xr-x
preunzip
5.52
KB
-rwxr-xr-x
prezip
5.52
KB
-rwxr-xr-x
prezip-bin
14.3
KB
-rwxr-xr-x
print
18.06
KB
-rwxr-xr-x
printafm
395
B
-rwxr-xr-x
printenv
30.38
KB
-rwxr-xr-x
printer-profile
5.51
KB
-rwxr-xr-x
printf
50.44
KB
-rwxr-xr-x
prlimit
26.89
KB
-rwxr-xr-x
pro
1003
B
-rwxr-xr-x
prove
13.34
KB
-rwxr-xr-x
prtstat
22.38
KB
-rwxr-xr-x
ps
138.45
KB
-rwxr-xr-x
ps2ascii
631
B
-rwxr-xr-x
ps2epsi
1.23
KB
-rwxr-xr-x
ps2pdf
272
B
-rwxr-xr-x
ps2pdf12
215
B
-rwxr-xr-x
ps2pdf13
215
B
-rwxr-xr-x
ps2pdf14
215
B
-rwxr-xr-x
ps2pdfwr
1.05
KB
-rwxr-xr-x
ps2ps
647
B
-rwxr-xr-x
ps2ps2
669
B
-rwxr-xr-x
ps2txt
631
B
-rwxr-xr-x
psfaddtable
26.23
KB
-rwxr-xr-x
psfgettable
26.23
KB
-rwxr-xr-x
psfstriptable
26.23
KB
-rwxr-xr-x
psfxtable
26.23
KB
-rwxr-xr-x
psicc
14.31
KB
-rwxr-xr-x
pslog
14.3
KB
-rwxr-xr-x
pstree
35.32
KB
-rwxr-xr-x
pstree.x11
35.32
KB
-rwxr-xr-x
ptar
3.48
KB
-rwxr-xr-x
ptardiff
2.58
KB
-rwxr-xr-x
ptargrep
4.29
KB
-rwxr-xr-x
ptx
126.55
KB
-rwxr-xr-x
pulseaudio
94.44
KB
-rwxr-xr-x
pw-cat
138.38
KB
-rwxr-xr-x
pw-cli
134.38
KB
-rwxr-xr-x
pwd
34.51
KB
-rwxr-xr-x
pw-dot
34.38
KB
-rwxr-xr-x
pw-dsdplay
138.38
KB
-rwxr-xr-x
pw-dump
94.38
KB
-rwxr-xr-x
pwdx
14.23
KB
-rwxr-xr-x
pw-link
30.38
KB
-rwxr-xr-x
pw-loopback
18.38
KB
-rwxr-xr-x
pw-metadata
14.38
KB
-rwxr-xr-x
pw-mididump
34.38
KB
-rwxr-xr-x
pw-midiplay
138.38
KB
-rwxr-xr-x
pw-midirecord
138.38
KB
-rwxr-xr-x
pw-mon
90.42
KB
-rwxr-xr-x
pw-play
138.38
KB
-rwxr-xr-x
pw-profiler
26.38
KB
-rwxr-xr-x
pw-record
138.38
KB
-rwxr-xr-x
pw-reserve
26.38
KB
-rwxr-xr-x
pw-top
30.38
KB
-rwxr-xr-x
pw-v4l2
1.95
KB
-rwxr-xr-x
py3clean
7.63
KB
-rwxr-xr-x
py3compile
12.88
KB
-rwxr-xr-x
py3versions
11.63
KB
-rwxr-xr-x
pydoc3
79
B
-rwxr-xr-x
pydoc3.10
79
B
-rwxr-xr-x
pygettext3
23.67
KB
-rwxr-xr-x
pygettext3.10
23.67
KB
-rwxr-xr-x
python3
5.66
MB
-rwxr-xr-x
python3.10
5.66
MB
-rwxr-xr-x
python3-futurize
960
B
-rwxr-xr-x
python3-pasteurize
964
B
-rwxr-xr-x
pzstd
702.47
KB
-rwxr-xr-x
qpdldecode
22.6
KB
-rwxr-xr-x
quirks-handler
2.4
KB
-rwxr-xr-x
rbash
1.33
MB
-rwxr-xr-x
rcp
130.59
KB
-rwxr-xr-x
rctest
38.19
KB
-rwxr-xr-x
rdiffdir
8.91
KB
-rwxr-xr-x
rdma
98.52
KB
-rwxr-xr-x
readlink
38.41
KB
-rwxr-xr-x
realpath
38.41
KB
-rwxr-xr-x
red
89
B
-rwxr-xr-x
remmina
875.6
KB
-rwxr-xr-x
remmina-file-wrapper
1.29
KB
-rwxr-xr-x
remmina-gnome
530
B
-rwxr-xr-x
rendercheck
59.78
KB
-rwxr-xr-x
renice
14.38
KB
-rwxr-xr-x
reset
26.31
KB
-rwxr-xr-x
resizecons
26.32
KB
-rwxr-xr-x
resizepart
22.38
KB
-rwxr-xr-x
resolvectl
130.52
KB
-rwxr-xr-x
rev
14.38
KB
-rwxr-xr-x
rfcomm
30.59
KB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
rhythmbox
14.29
KB
-rwxr-xr-x
rhythmbox-client
47.93
KB
-rwxr-xr-x
rlogin
827.04
KB
-rwxr-xr-x
rm
58.51
KB
-rwxr-xr-x
rmdir
42.41
KB
-rwxr-xr-x
rnano
276.52
KB
-rwxr-xr-x
routef
208
B
-rwxr-xr-x
routel
1.62
KB
-rwxr-xr-x
rrsync
12.34
KB
-rwxr-xr-x
rsh
827.04
KB
-rwxr-xr-x
rstart
2.55
KB
-rwxr-xr-x
rstartd
1.43
KB
-rwxr-xr-x
rsync
506.13
KB
-rwxr-xr-x
rsync-ssl
5.02
KB
-rwxr-xr-x
rtstat
22.66
KB
-rwxr-xr-x
runcon
34.51
KB
-rwxr-xr-x
run-mailcap
18.06
KB
-rwxr-xr-x
run-parts
26.54
KB
-rwxr-xr-x
run-with-aspell
57
B
-rwxr-xr-x
rview
1.45
MB
-rwxr-xr-x
rygel
50.37
KB
-rwxr-xr-x
sane-find-scanner
91
KB
-rwxr-xr-x
savelog
10.24
KB
-rwxr-xr-x
sbattach
26.54
KB
-rwxr-xr-x
sbkeysync
34.74
KB
-rwxr-xr-x
sbsiglist
14.6
KB
-rwxr-xr-x
sbsign
34.7
KB
-rwxr-xr-x
sbvarsign
22.73
KB
-rwxr-xr-x
sbverify
34.61
KB
-rwxr-xr-x
scanimage
63.11
KB
-rwxr-xr-x
scp
130.59
KB
-rwxr-xr-x
scp-dbus-service
90
B
-rwxr-xr-x
screendump
14.15
KB
-rwxr-xr-x
script
50.38
KB
-rwxr-xr-x
scriptlive
42.38
KB
-rwxr-xr-x
scriptreplay
34.38
KB
-rwxr-xr-x
sdiff
46.39
KB
-rwxr-xr-x
sdptool
129.71
KB
-rwxr-xr-x
seahorse
1.12
MB
-rwxr-xr-x
sed
110.57
KB
-rwxr-xr-x
see
18.06
KB
-rwxr-xr-x
select-default-iwrap
474
B
-rwxr-xr-x
select-editor
2.39
KB
-rwxr-xr-x
sensible-browser
1.26
KB
-rwxr-xr-x
sensible-editor
1.24
KB
-rwxr-xr-x
sensible-pager
565
B
-rwxr-xr-x
seq
46.51
KB
-rwxr-xr-x
session-migration
22.15
KB
-rwxr-xr-x
sessreg
14.31
KB
-rwxr-xr-x
setarch
26.65
KB
-rwxr-xr-x
setfacl
42.91
KB
-rwxr-xr-x
setfont
50.32
KB
-rwxr-xr-x
setkeycodes
14.23
KB
-rwxr-xr-x
setleds
18.21
KB
-rwxr-xr-x
setlogcons
14.23
KB
-rwxr-xr-x
setmetamode
14.26
KB
-rwxr-xr-x
setpci
30.38
KB
-rwxr-xr-x
setpriv
38.38
KB
-rwxr-xr-x
setsid
14.38
KB
-rwxr-xr-x
setterm
34.38
KB
-rwxr-xr-x
setupcon
38.31
KB
-rwxr-xr-x
setxkbmap
26.7
KB
-rwxr-xr-x
sftp
142.66
KB
-rwxr-xr-x
sg
39.55
KB
-rwsr-xr-x
sh
122.74
KB
-rwxr-xr-x
sha1sum
42.41
KB
-rwxr-xr-x
sha224sum
50.41
KB
-rwxr-xr-x
sha256sum
50.41
KB
-rwxr-xr-x
sha384sum
58.41
KB
-rwxr-xr-x
sha512sum
58.41
KB
-rwxr-xr-x
shasum
9.75
KB
-rwxr-xr-x
shotwell
4.84
MB
-rwxr-xr-x
showconsolefont
18.23
KB
-rwxr-xr-x
showkey
18.23
KB
-rwxr-xr-x
showrgb
14.31
KB
-rwxr-xr-x
shred
50.51
KB
-rwxr-xr-x
shuf
46.51
KB
-rwxr-xr-x
simple-scan
390.36
KB
-rwxr-xr-x
skill
30.23
KB
-rwxr-xr-x
slabtop
22.23
KB
-rwxr-xr-x
sleep
34.51
KB
-rwxr-xr-x
slogin
827.04
KB
-rwxr-xr-x
slxdecode
18.31
KB
-rwxr-xr-x
smproxy
26.31
KB
-rwxr-xr-x
snap
19.09
MB
-rwxr-xr-x
snapctl
6.26
MB
-rwxr-xr-x
snapfuse
38.23
KB
-rwxr-xr-x
snice
30.23
KB
-rwxr-xr-x
soelim
30.48
KB
-rwxr-xr-x
soffice
6.57
KB
-rwxr-xr-x
software-properties-gtk
4.08
KB
-rwxr-xr-x
sort
98.8
KB
-rwxr-xr-x
spa-acp-tool
268.12
KB
-rwxr-xr-x
spa-inspect
78.48
KB
-rwxr-xr-x
spa-json-dump
14.3
KB
-rwxr-xr-x
spa-monitor
14.48
KB
-rwxr-xr-x
spa-resample
30.6
KB
-rwxr-xr-x
spd-conf
1003
B
-rwxr-xr-x
spd-say
31.14
KB
-rwxr-xr-x
spdsend
14.31
KB
-rwxr-xr-x
speaker-test
30.44
KB
-rwxr-xr-x
speech-dispatcher
206.41
KB
-rwxr-xr-x
spice-vdagent
86.77
KB
-rwxr-xr-x
splain
18.96
KB
-rwxr-xr-x
split
50.97
KB
-rwxr-xr-x
splitfont
14.15
KB
-rwxr-xr-x
sqfscat
131.9
KB
-rwxr-xr-x
sqfstar
254.68
KB
-rwxr-xr-x
ss
125.07
KB
-rwxr-xr-x
ssh
827.04
KB
-rwxr-xr-x
ssh-add
166.42
KB
-rwxr-xr-x
ssh-agent
286.43
KB
-rwxr-sr-x
ssh-argv0
1.42
KB
-rwxr-xr-x
ssh-copy-id
12.38
KB
-rwxr-xr-x
ssh-import-id
985
B
-rwxr-xr-x
ssh-import-id-gh
785
B
-rwxr-xr-x
ssh-import-id-lp
785
B
-rwxr-xr-x
ssh-keygen
446.44
KB
-rwxr-xr-x
ssh-keyscan
190.44
KB
-rwxr-xr-x
start-pulseaudio-x11
2.11
KB
-rwxr-xr-x
startx
5.39
KB
-rwxr-xr-x
stat
78.52
KB
-rwxr-xr-x
static-sh
2.09
MB
-rwxr-xr-x
stdbuf
42.51
KB
-rwxr-xr-x
strace
1.88
MB
-rwxr-xr-x
strace-log-merge
1.78
KB
-rwxr-xr-x
streamzip
7.75
KB
-rwxr-xr-x
stty
74.51
KB
-rwxr-xr-x
su
54.38
KB
-rwsr-xr-x
sudo
226.97
KB
-rwsr-xr-x
sudoedit
226.97
KB
-rwsr-xr-x
sudoreplay
87.64
KB
-rwxr-xr-x
sum
34.41
KB
-rwxr-xr-x
switcherooctl
4.54
KB
-rwxr-xr-x
sync
34.41
KB
-rwxr-xr-x
system-config-printer
95
B
-rwxr-xr-x
system-config-printer-applet
80
B
-rwxr-xr-x
systemctl
1.06
MB
-rwxr-xr-x
systemd
1.76
MB
-rwxr-xr-x
systemd-analyze
1.73
MB
-rwxr-xr-x
systemd-ask-password
18.48
KB
-rwxr-xr-x
systemd-cat
18.38
KB
-rwxr-xr-x
systemd-cgls
22.48
KB
-rwxr-xr-x
systemd-cgtop
38.39
KB
-rwxr-xr-x
systemd-cryptenroll
50.53
KB
-rwxr-xr-x
systemd-delta
26.37
KB
-rwxr-xr-x
systemd-detect-virt
18.37
KB
-rwxr-xr-x
systemd-escape
22.37
KB
-rwxr-xr-x
systemd-hwdb
118.66
KB
-rwxr-xr-x
systemd-id128
26.37
KB
-rwxr-xr-x
systemd-inhibit
22.39
KB
-rwxr-xr-x
systemd-machine-id-setup
18.48
KB
-rwxr-xr-x
systemd-mount
50.59
KB
-rwxr-xr-x
systemd-notify
22.38
KB
-rwxr-xr-x
systemd-path
18.37
KB
-rwxr-xr-x
systemd-run
62.57
KB
-rwxr-xr-x
systemd-socket-activate
26.37
KB
-rwxr-xr-x
systemd-stdio-bridge
22.38
KB
-rwxr-xr-x
systemd-sysext
46.49
KB
-rwxr-xr-x
systemd-sysusers
62.68
KB
-rwxr-xr-x
systemd-tmpfiles
98.57
KB
-rwxr-xr-x
systemd-tty-ask-password-agent
34.37
KB
-rwxr-xr-x
systemd-umount
50.59
KB
-rwxr-xr-x
tabs
18.3
KB
-rwxr-xr-x
tac
98.41
KB
-rwxr-xr-x
tail
66.52
KB
-rwxr-xr-x
tar
505.81
KB
-rwxr-xr-x
taskset
22.38
KB
-rwxr-xr-x
tbl
126.48
KB
-rwxr-xr-x
tclsh
14.15
KB
-rwxr-xr-x
tclsh8.6
14.15
KB
-rwxr-xr-x
tcpdump
1.27
MB
-rwxr-xr-x
tee
34.51
KB
-rwxr-xr-x
telnet
107.56
KB
-rwxr-xr-x
telnet.netkit
107.56
KB
-rwxr-xr-x
tempfile
14.02
KB
-rwxr-xr-x
test
42.44
KB
-rwxr-xr-x
thunderbird
2.88
KB
-rwxr-xr-x
tic
86.41
KB
-rwxr-xr-x
tificc
34.38
KB
-rwxr-xr-x
time
26.52
KB
-rwxr-xr-x
timedatectl
46.37
KB
-rwxr-xr-x
timeout
38.95
KB
-rwxr-xr-x
tload
18.24
KB
-rwxr-xr-x
tnftp
178.9
KB
-rwxr-xr-x
toe
22.3
KB
-rwxr-xr-x
top
130.06
KB
-rwxr-xr-x
totem
22.38
KB
-rwxr-xr-x
totem-video-thumbnailer
38.4
KB
-rwxr-xr-x
touch
90.51
KB
-rwxr-xr-x
tput
26.34
KB
-rwxr-xr-x
tr
46.51
KB
-rwxr-xr-x
tracepath
18.15
KB
-rwxr-xr-x
tracker3
613.73
KB
-rwxr-xr-x
transicc
34.32
KB
-rwxr-xr-x
transmission-gtk
982.2
KB
-rwxr-xr-x
transset
22.78
KB
-rwxr-xr-x
troff
718.61
KB
-rwxr-xr-x
true
26.3
KB
-rwxr-xr-x
truncate
34.51
KB
-rwxr-xr-x
trust
206.38
KB
-rwxr-xr-x
tset
26.31
KB
-rwxr-xr-x
tsort
46.51
KB
-rwxr-xr-x
tty
30.51
KB
-rwxr-xr-x
turbostat
1.58
KB
-rwxr-xr-x
tzselect
15.02
KB
-rwxr-xr-x
ua
1003
B
-rwxr-xr-x
ubuntu-advantage
1003
B
-rwxr-xr-x
ubuntu-bug
2.51
KB
-rwxr-xr-x
ubuntu-distro-info
22.89
KB
-rwxr-xr-x
ubuntu-drivers
16.36
KB
-rwxr-xr-x
ubuntu-report
6.29
MB
-rwxr-xr-x
ubuntu-security-status
22.25
KB
-rwxr-xr-x
ucf
40.9
KB
-rwxr-xr-x
ucfq
18.91
KB
-rwxr-xr-x
ucfr
10.47
KB
-rwxr-xr-x
uclampset
26.38
KB
-rwxr-xr-x
ucs2any
26.15
KB
-rwxr-xr-x
udevadm
1.08
MB
-rwxr-xr-x
udisksctl
58.38
KB
-rwxr-xr-x
ul
22.38
KB
-rwxr-xr-x
umax_pp
179.38
KB
-rwxr-xr-x
umount
34.38
KB
-rwsr-xr-x
uname
34.51
KB
-rwxr-xr-x
unattended-upgrade
97.21
KB
-rwxr-xr-x
unattended-upgrades
97.21
KB
-rwxr-xr-x
uncompress
2.29
KB
-rwxr-xr-x
unexpand
34.53
KB
-rwxr-xr-x
unicode_start
2.7
KB
-rwxr-xr-x
unicode_stop
530
B
-rwxr-xr-x
uniq
42.51
KB
-rwxr-xr-x
unity-scope-loader
14.38
KB
-rwxr-xr-x
unlink
30.51
KB
-rwxr-xr-x
unlzma
82.52
KB
-rwxr-xr-x
unmkinitramfs
3.69
KB
-rwxr-xr-x
unopkg
52
B
-rwxr-xr-x
unshare
30.6
KB
-rwxr-xr-x
unsquashfs
131.9
KB
-rwxr-xr-x
unxz
82.52
KB
-rwxr-xr-x
unzip
170.42
KB
-rwxr-xr-x
unzipsfx
78.42
KB
-rwxr-xr-x
unzstd
854.59
KB
-rwxr-xr-x
update-alternatives
58.24
KB
-rwxr-xr-x
update-desktop-database
22.38
KB
-rwxr-xr-x
update-manager
4.66
KB
-rwxr-xr-x
update-mime-database
58.23
KB
-rwxr-xr-x
update-notifier
82.98
KB
-rwxr-xr-x
upower
22.3
KB
-rwxr-xr-x
uptime
14.23
KB
-rwxr-xr-x
usb-creator-gtk
2.87
KB
-rwxr-xr-x
usb-devices
4.33
KB
-rwxr-xr-x
usbhid-dump
30.38
KB
-rwxr-xr-x
usbip
1.58
KB
-rwxr-xr-x
usbipd
1.58
KB
-rwxr-xr-x
usb_printerid
14.31
KB
-rwxr-xr-x
usbreset
14.3
KB
-rwxr-xr-x
users
34.51
KB
-rwxr-xr-x
utmpdump
22.38
KB
-rwxr-xr-x
uuidgen
18.38
KB
-rwxr-xr-x
uuidparse
22.38
KB
-rwxr-xr-x
vdir
134.98
KB
-rwxr-xr-x
vi
1.45
MB
-rwxr-xr-x
view
1.45
MB
-rwxr-xr-x
viewres
31.23
KB
-rwxr-xr-x
vim.tiny
1.45
MB
-rwxr-xr-x
vmstat
38.24
KB
-rwxr-xr-x
vmwarectrl
14.26
KB
-rwxr-xr-x
vstp
26.16
KB
-rwxr-xr-x
w
22.23
KB
-rwxr-xr-x
wall
22.38
KB
-rwxr-xr-x
watch
26.6
KB
-rwxr-xr-x
watchgnupg
18.3
KB
-rwxr-xr-x
wc
42.42
KB
-rwxr-xr-x
wdctl
30.4
KB
-rwxr-xr-x
wget
459.02
KB
-rwxr-xr-x
whatis
47.28
KB
-rwxr-xr-x
whereis
30.84
KB
-rwxr-xr-x
which
946
B
-rwxr-xr-x
which.debianutils
946
B
-rwxr-xr-x
whiptail
30.16
KB
-rwxr-xr-x
who
50.52
KB
-rwxr-xr-x
whoami
30.51
KB
-rwxr-xr-x
whois
155.66
KB
-rwxr-xr-x
whoopsie
46.9
KB
-rwxr-xr-x
whoopsie-preferences
22.14
KB
-rwxr-xr-x
word-list-compress
14.3
KB
-rwxr-xr-x
wpa_passphrase
14.31
KB
-rwxr-xr-x
write
22.38
KB
-rwxr-xr-x
write.ul
22.38
KB
-rwxr-xr-x
X
274
B
-rwxr-xr-x
x11perf
197.46
KB
-rwxr-xr-x
x11perfcomp
2.74
KB
-rwxr-xr-x
x86_64
26.65
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp
906.82
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp-11
906.82
KB
-rwxr-xr-x
x86_energy_perf_policy
1.58
KB
-rwxr-xr-x
xargs
62.41
KB
-rwxr-xr-x
xauth
54.96
KB
-rwxr-xr-x
xbiff
24.16
KB
-rwxr-xr-x
xbrlapi
198.5
KB
-rwxr-xr-x
xcalc
47.48
KB
-rwxr-xr-x
xclipboard
22.58
KB
-rwxr-xr-x
xclock
61.06
KB
-rwxr-xr-x
xcmsdb
35.05
KB
-rwxr-xr-x
xconsole
23.2
KB
-rwxr-xr-x
xcursorgen
22.3
KB
-rwxr-xr-x
xcutsel
18.56
KB
-rwxr-xr-x
xdg-dbus-proxy
50.14
KB
-rwxr-xr-x
xdg-desktop-icon
20.16
KB
-rwxr-xr-x
xdg-desktop-menu
42.27
KB
-rwxr-xr-x
xdg-email
26.3
KB
-rwxr-xr-x
xdg-icon-resource
29.33
KB
-rwxr-xr-x
xdg-mime
41.14
KB
-rwxr-xr-x
xdg-open
25.46
KB
-rwxr-xr-x
xdg-screensaver
37.11
KB
-rwxr-xr-x
xdg-settings
37.52
KB
-rwxr-xr-x
xdg-user-dir
234
B
-rwxr-xr-x
xdg-user-dirs-gtk-update
22.15
KB
-rwxr-xr-x
xdg-user-dirs-update
26.23
KB
-rwxr-xr-x
xditview
108.13
KB
-rwxr-xr-x
xdpyinfo
39.05
KB
-rwxr-xr-x
xdriinfo
14.3
KB
-rwxr-xr-x
xedit
709.34
KB
-rwxr-xr-x
Xephyr
2.35
MB
-rwxr-xr-x
xev
34.63
KB
-rwxr-xr-x
xeyes
23.69
KB
-rwxr-xr-x
xfd
40.01
KB
-rwxr-xr-x
xfontsel
43.85
KB
-rwxr-xr-x
xgamma
14.31
KB
-rwxr-xr-x
xgc
70.38
KB
-rwxr-xr-x
xhost
18.31
KB
-rwxr-xr-x
xinit
22.3
KB
-rwxr-xr-x
xinput
62.83
KB
-rwxr-xr-x
xkbbell
14.32
KB
-rwxr-xr-x
xkbcomp
212.1
KB
-rwxr-xr-x
xkbevd
42.38
KB
-rwxr-xr-x
xkbprint
90.34
KB
-rwxr-xr-x
xkbvleds
23.1
KB
-rwxr-xr-x
xkbwatch
23.16
KB
-rwxr-xr-x
xkeystone
16.58
KB
-rwxr-xr-x
xkill
14.3
KB
-rwxr-xr-x
xload
22.92
KB
-rwxr-xr-x
xlogo
23.19
KB
-rwxr-xr-x
xlsatoms
14.3
KB
-rwxr-xr-x
xlsclients
18.31
KB
-rwxr-xr-x
xlsfonts
26.4
KB
-rwxr-xr-x
xmag
48.31
KB
-rwxr-xr-x
xman
77.2
KB
-rwxr-xr-x
xmessage
23.12
KB
-rwxr-xr-x
xmodmap
42.68
KB
-rwxr-xr-x
xmore
14.53
KB
-rwxr-xr-x
Xorg
274
B
-rwxr-xr-x
xprop
48.61
KB
-rwxr-xr-x
xqxdecode
18.31
KB
-rwxr-xr-x
xrandr
62.41
KB
-rwxr-xr-x
xrdb
34.4
KB
-rwxr-xr-x
xrefresh
14.38
KB
-rwxr-xr-x
x-session-manager
803
B
-rwxr-xr-x
xset
34.31
KB
-rwxr-xr-x
xsetmode
14.31
KB
-rwxr-xr-x
xsetpointer
14.31
KB
-rwxr-xr-x
xsetroot
18.31
KB
-rwxr-xr-x
xsetwacom
63.84
KB
-rwxr-xr-x
xsm
98.71
KB
-rwxr-xr-x
xstdcmap
14.89
KB
-rwxr-xr-x
xsubpp
5.05
KB
-rwxr-xr-x
x-terminal-emulator
2.65
KB
-rwxr-xr-x
xvidtune
43.76
KB
-rwxr-xr-x
xvinfo
18.3
KB
-rwxr-xr-x
Xwayland
2.12
MB
-rwxr-xr-x
xwd
30.31
KB
-rwxr-xr-x
xwininfo
50.38
KB
-rwxr-xr-x
xwud
34.3
KB
-rwxr-xr-x
x-www-browser
2.32
KB
-rwxr-xr-x
xxd
18.28
KB
-rwxr-xr-x
xz
82.52
KB
-rwxr-xr-x
xzcat
82.52
KB
-rwxr-xr-x
xzcmp
6.86
KB
-rwxr-xr-x
xzdiff
6.86
KB
-rwxr-xr-x
xzegrep
5.87
KB
-rwxr-xr-x
xzfgrep
5.87
KB
-rwxr-xr-x
xzgrep
5.87
KB
-rwxr-xr-x
xzless
1.76
KB
-rwxr-xr-x
xzmore
2.11
KB
-rwxr-xr-x
yelp
66.23
KB
-rwxr-xr-x
yes
30.38
KB
-rwxr-xr-x
ypdomainname
22.23
KB
-rwxr-xr-x
zcat
1.94
KB
-rwxr-xr-x
zcmp
1.64
KB
-rwxr-xr-x
zdiff
5.76
KB
-rwxr-xr-x
zdump
26.21
KB
-rwxr-xr-x
zegrep
29
B
-rwxr-xr-x
zenity
128.75
KB
-rwxr-xr-x
zfgrep
29
B
-rwxr-xr-x
zforce
2.03
KB
-rwxr-xr-x
zgrep
7.91
KB
-rwxr-xr-x
zip
198.99
KB
-rwxr-xr-x
zipcloak
70.4
KB
-rwxr-xr-x
zipdetails
58.66
KB
-rwxr-xr-x
zipgrep
2.89
KB
-rwxr-xr-x
zipinfo
170.42
KB
-rwxr-xr-x
zipnote
62.4
KB
-rwxr-xr-x
zipsplit
58.4
KB
-rwxr-xr-x
zjsdecode
26.32
KB
-rwxr-xr-x
zless
2.15
KB
-rwxr-xr-x
zmore
1.8
KB
-rwxr-xr-x
znew
4.47
KB
-rwxr-xr-x
zstd
854.59
KB
-rwxr-xr-x
zstdcat
854.59
KB
-rwxr-xr-x
zstdgrep
3.78
KB
-rwxr-xr-x
zstdless
30
B
-rwxr-xr-x
zstdmt
854.59
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : perli11ndoc
#!/usr/bin/perl use strict; use warnings; use v5.10; # for '//' use open qw/:utf8 :std/; use utf8; use Config qw//; use File::Find qw//; use File::Spec qw//; use XML::LibXML qw//; { my $have_display; BEGIN { if (!@ARGV) { local $@; $have_display = eval 'use Gtk3; Gtk3::init_check ()'; } } my $parser = GirParser->new; if (!@ARGV && $have_display) { my @girs = find_girs (); my $gui = GirGUI->new ($parser, @girs); $gui->run; exit; } if (!@ARGV) { die 'Usage: perli11ndoc <library name>[::<element name>[::<element name>]]'; } my $pattern = $ARGV[0]; my ($lib_pattern, @element_patterns) = split /::/, $pattern; my $gir = find_gir ($lib_pattern); $parser->open ($gir); if (!@element_patterns) { print $parser->format_namespace; } else { print $parser->format_search_results (@element_patterns); } } # ------------------------------------------------------------------------------ sub find_gir { my ($lib_pattern) = @_; if ($lib_pattern !~ /^([^\d\-]+)-?(\d(?:\.\d)?)?$/) { die "Cannot recognize the library name\n"; } my $name_wanted = $1; my $version_wanted = $2; if (defined $version_wanted && $version_wanted !~ /\./) { $version_wanted .= '.0'; } my $match_func = sub { if (defined $version_wanted) { return $_ eq "$name_wanted-$version_wanted.gir"; } else { return $_ =~ /^\Q$name_wanted\E-\d+\.\d+\.gir$/; } }; my @girs = find_girs ($match_func); if (@girs == 0) { die "Could not find any matching GIR file\n"; } if (@girs > 1) { my $girs_string = join (', ', map { $_->{path} } @girs); die "Found multiple matching GIR files: $girs_string; please be more specific\n"; } return $girs[0]->{path}; } sub find_girs { my ($match_func) = @_; $match_func //= sub { 1 }; my @prefixes = ('/usr'); my @env_vars = ( {name => 'LD_LIBRARY_PATH', extra_depth => 1}, # /<prefix>/lib => /<prefix> {name => 'GI_TYPELIB_PATH', extra_depth => 2}, # /<prefix>/lib/girepository-1.0 => /<prefix> ); foreach my $env_var (@env_vars) { next unless exists $ENV{$env_var->{name}}; my @dirs = split /$Config::Config{path_sep}/, $ENV{$env_var->{name}}; foreach my $dir (@dirs) { my @dir_parts = File::Spec->splitdir ($dir); my $prefix = File::Spec->catdir ( @dir_parts[0 .. ($#dir_parts-$env_var->{extra_depth})]); if (-d $prefix) { push @prefixes, Cwd::abs_path ($prefix); } } } my %seen; my @search_dirs = grep { !$seen{$_}++ && -d $_ } map { $_ . '/share/gir-1.0' } @prefixes; my @girs; File::Find::find (sub { if ($_ =~ m/\.gir$/ && $match_func->($_)) { push @girs, {path => $File::Find::name, dir => $File::Find::dir, file => $_}; } }, @search_dirs); return @girs; } # ------------------------------------------------------------------------------ # --- GirParser ---------------------------------------------------------------- # ------------------------------------------------------------------------------ package GirParser; use strict; use warnings; sub new { my ($class) = @_; return bless {}, $class } sub open { my ($self, $gir) = @_; $self->{gir} = $gir; $self->{parser} = XML::LibXML->new; $self->{dom} = $self->{parser}->load_xml (location => $gir); $self->{xpc} = XML::LibXML::XPathContext->new; $self->{xpc}->registerNs ('core', 'http://www.gtk.org/introspection/core/1.0'); $self->{repository} = $self->{dom}->documentElement; my $namespace_list = $self->{xpc}->find ('core:namespace', $self->{repository}); if ($namespace_list->size != 1) { die 'Can only handle a single namespace'; } $self->{namespace} = $namespace_list->pop; $self->{basename} = $self->construct_basename; } sub construct_basename { my ($self) = @_; my $name = $self->find_attribute ($self->{namespace}, 'name'); my $version = $self->find_attribute ($self->{namespace}, 'version'); $version =~ s/.0$//; $version = '' if $version eq '1'; return $name . $version; } # ------------------------------------------------------------------------------ sub find_attribute { my ($self, $element, $attribute) = @_; my $attribute_list = $element->find ("\@$attribute"); return undef if $attribute_list->size != 1; return $attribute_list->pop->value; } sub find_full_element_name { my ($self, $element) = @_; my $name = $self->find_attribute ($element, 'name'); return () unless defined $name; if ($name =~ /\./) { die "Unexpected fully qualified name '$name' encountered; aborting\n"; } my $package = ''; my $current_element = $element; while (1) { my $parent = $current_element->parentNode; last unless defined $parent; if ($parent->nodeName eq 'namespace') { $package = $self->{basename} . '::' . $package; last; } $package = $self->find_attribute ($parent, 'name') . '::' . $package; $current_element = $parent; } my $full_name = $package . $name; $package =~ s/::$//; return ($package, $name, $full_name); } sub find_node_by_path { my ($self, $path) = @_; my $match_list = $self->{xpc}->find ($path, $self->{namespace}); if ($match_list->size < 1) { die "Cannot find a matching element for the path $path\n"; } if ($match_list->size > 1) { die "Found more than one matching element for the path $path\n"; } return $match_list->pop; } sub find_parameters_and_return_value { my ($self, $element) = @_; my (@in, @out); my $parameter_list = $self->{xpc}->find ('core:parameters/core:parameter', $element); foreach my $parameter ($parameter_list->get_nodelist) { my $direction = $self->find_attribute ($parameter, 'direction') // 'in'; if ($direction eq 'inout' || $direction eq 'out') { push @out, $parameter; } if ($direction eq 'inout' || $direction eq 'in') { push @in, $parameter; } } my $retval = undef; my $retval_list = $self->{xpc}->find ('core:return-value', $element); if ($retval_list->size == 1) { $retval = $retval_list->[0]; if (defined $retval) { if ($self->find_type_name ($retval) eq 'none') { $retval = undef; } } } return (\@in, $retval, \@out); } sub find_type_name { my ($self, $element) = @_; # arrays my $array_list = $self->{xpc}->find ('core:array', $element); if ($array_list->size == 1) { my $array = $array_list->pop; my $prefix = 'reference to array of '; my $child_type_name = $self->find_type_name ($array); return $prefix . $child_type_name; } # callbacks my $callback_list = $self->{xpc}->find ('core:callback', $element); if ($callback_list->size == 1) { my $callback = $callback_list->pop; my ($in, $retval, $out) = $self->find_parameters_and_return_value ($callback); unshift @$out, $retval if defined $retval; my $in_list = join ', ', map { $self->find_type_name ($_) } @$in; my $out_list = join ', ', map { $self->find_type_name ($_) } @$out; my $in_text = $in_list ne '' ? "in: $in_list" : ''; my $out_text = $out_list ne '' ? "; out: $out_list" : ''; return "callback ($in_text$out_text)"; } # bare types my $type_list = $self->{xpc}->find ('core:type', $element); return '[unknown type]' unless $type_list->size == 1; my $type = $type_list->pop; return $self->find_attribute ($type, 'name'); } # ------------------------------------------------------------------------------ sub enumerate_namespace { my ($self, $descend) = @_; $descend //= 0; my @class_and_interface_sub_categories = ( [Constructors => 'core:constructor'], [Methods => 'core:method'], [Functions => 'core:function'], [Signals => 'glib:signal'], [Properties => 'core:property'], [Fields => 'core:field'], ['Virtual methods' => 'core:virtual-method'], ); my @record_sub_categories = ( [Constructors => 'core:constructor'], [Methods => 'core:method'], [Functions => 'core:function'], [Fields => 'core:field'], ); my @enum_and_bitfield_sub_categories = ( [Functions => 'core:function'], ); my @categories = ( [Classes => 'core:class', \@class_and_interface_sub_categories, sub { shift =~ /Accessible$/ }], [Interfaces => 'core:interface', \@class_and_interface_sub_categories], [Records => 'core:record', \@record_sub_categories, sub { shift =~ /(?:Class|Iface|Interface|Private)$/ }], [Enumerations => 'core:enumeration', \@enum_and_bitfield_sub_categories], [Bitfields => 'core:bitfield', \@enum_and_bitfield_sub_categories], [Functions => 'core:function'], [Callbacks => 'core:callback'], [Constants => 'core:constant'], [Aliases => 'core:alias', undef, sub { shift =~ /_autoptr$/ }], ['Classes for accessibility' => 'core:class', \@class_and_interface_sub_categories, sub { shift !~ /Accessible$/ }], ['Records for object classes' => 'core:record', \@record_sub_categories, sub { shift !~ /Class$/ }], ['Records for interfaces' => 'core:record', \@record_sub_categories, sub { shift !~ /(?:Iface|Interface)$/ }], ); my @results; foreach my $category (@categories) { my $heading = $category->[0]; my $path = $category->[1]; my $sub_categories = $category->[2] // undef; my $skip = $category->[3] // sub { 0 }; # accept all by default my $list = $self->{xpc}->find ($path, $self->{namespace}); next if $list->size == 0; my @entries; foreach my $node ($list->get_nodelist) { my $node_path = $node->nodePath; my $name = $self->find_attribute ($node, 'name'); next if $skip->($name); my @sub_results; if ($descend && defined $sub_categories) { foreach my $sub_category (@$sub_categories) { my $sub_heading = $sub_category->[0]; my $sub_path = $sub_category->[1]; my $sub_list = $self->{xpc}->find ($sub_path, $node); next if $sub_list->size == 0; my @sub_entries; foreach my $sub_node ($sub_list->get_nodelist) { my $sub_path = $sub_node->nodePath; my $sub_name = $self->find_attribute ($sub_node, 'name'); push @sub_entries, {path => $sub_path, name => $sub_name}; } push @sub_results, [$sub_heading => \@sub_entries]; } } push @entries, {path => $node_path, name => $name, sub_results => \@sub_results}; } next unless @entries; push @results, [$heading => \@entries]; } return \@results; } sub format_namespace { my ($self) = @_; my $text = ''; my $name = $self->find_attribute ($self->{namespace}, 'name'); my $version = $self->find_attribute ($self->{namespace}, 'version'); $text .= "NAMESPACE\n\n $name $version => " . $self->{basename} . "\n\n"; my $results = $self->enumerate_namespace; foreach my $results (@$results) { my $heading = uc $results->[0]; my $entries = $results->[1]; next unless @$entries; $text .= "$heading\n\n"; foreach my $entry (@$entries) { $text .= sprintf " [%s](%s)\n", $entry->{name}, $entry->{path}; } $text .= "\n"; } $text =~ s/\n\n\Z/\n/; return $text; } # ------------------------------------------------------------------------------ sub format_search_results { my ($self, @search_terms) = @_; die 'Can only handle up to two search terms' if @search_terms > 2; my $query = @search_terms == 1 ? "*[\@name='$search_terms[0]']" : "*[\@name='$search_terms[0]']/*[\@name='$search_terms[1]']"; my $match_list = $self->{xpc}->find ($query, $self->{namespace}); if ($match_list->size == 0) { die "Cannot find a matching element for the search terms @search_terms\n"; } my @matches = $match_list->get_nodelist; if (@matches > 1) { my $matches_string = join (', ', map { $self->format_full_element_name ($_) } @matches); die "Found two many matches: $matches_string; please be more specific\n"; } my $match = $matches[0]; return $self->format_node ($match); } sub format_node_by_path { my ($self, $path) = @_; my $node = $self->find_node_by_path ($path); return $self->format_node ($node); } sub format_node_name_by_path { my ($self, $path) = @_; my $node = $self->find_node_by_path ($path); return $self->format_full_element_name ($node); } sub format_node { my ($self, $node) = @_; my %categories = ( alias => 'format_alias', bitfield => 'format_bitfield', callback => 'format_callback', class => 'format_class', constant => 'format_constant', constructor => 'format_constructor', enumeration => 'format_enumeration', field => 'format_field', function => 'format_function', method => 'format_method', property => 'format_property', interface => 'format_interface', record => 'format_record', 'glib:signal' => 'format_signal', 'virtual-method' => 'format_virtual_method', ); my $type = $node->nodeName; my $handler = $categories{$type}; if (!defined $handler) { die "Unknown node type '$type' encountered; aborting\n"; } return $self->$handler ($node); } # ------------------------------------------------------------------------------ sub format_alias { my ($self, $element) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); my $type_name = $self->find_type_name ($element); my $full_type_name = $self->format_full_type_name ($type_name); $text .= "ALIAS\n\n $full_name = $full_type_name\n"; $text .= $self->format_description ($element); return $text; } # ------------------------------------------------------------------------------ sub format_bitfield { my ($self, $element) = @_; return $self->format_bitfield_and_enumeration ($element, 'BITFIELD'); } sub format_enumeration { my ($self, $element) = @_; return $self->format_bitfield_and_enumeration ($element, 'ENUMERATION'); } sub format_bitfield_and_enumeration { my ($self, $element, $heading) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); $text .= "$heading\n\n $full_name\n"; $text .= $self->format_description ($element); $text .= $self->format_sub_members ($element); $text .= $self->format_sub_functions ($element, 'FUNCTIONS'); return $text; } # ------------------------------------------------------------------------------ sub format_callable { my ($self, $element, $heading, $synopsis_format, $flags_formatter) = @_; $flags_formatter //= 'format_callable_flags'; my $text = ''; my ($package, $name, $full_name) = $self->find_full_element_name ($element); my $flags = $self->$flags_formatter ($element); $text .= "$heading\n\n $full_name$flags\n"; my ($in, $retval, $out) = $self->find_parameters_and_return_value ($element); # --- synopsis --- my @in_names = map { '$' . $self->find_attribute ($_, 'name') } @$in; my @out_names = map { '$' . $self->find_attribute ($_, 'name') } @$out; if (defined $retval) { unshift @out_names, '$retval'; } my $in_list = join ', ', @in_names; my $in_list_pre_comma = @in_names > 0 ? ", $in_list" : ''; my $in_list_post_comma = @in_names > 0 ? "$in_list, " : ''; my $out_list = join ', ', @out_names; my $out_list_parens = @out_names > 1 ? "($out_list)" : $out_list; my $out_list_assign = @out_names > 0 ? "$out_list_parens = " : ''; my $synopsis = $synopsis_format; $synopsis =~ s/\[\[PACKAGE\]\]/$package/g; $synopsis =~ s/\[\[NAME\]\]/$name/g; $synopsis =~ s/\[\[NAME_UC\]\]/uc $name/ge; $synopsis =~ s/\[\[FULL_NAME\]\]/$full_name/g; $synopsis =~ s/\[\[IN_LIST\]\]/$in_list/g; $synopsis =~ s/\[\[IN_LIST_PRE_COMMA\]\]/$in_list_pre_comma/g; $synopsis =~ s/\[\[IN_LIST_POST_COMMA\]\]/$in_list_post_comma/g; $synopsis =~ s/\[\[OUT_LIST\]\]/$out_list/g; $synopsis =~ s/\[\[OUT_LIST_PARENS\]\]/$out_list_parens/g; $synopsis =~ s/\[\[OUT_LIST_ASSIGN\]\]/$out_list_assign/g; $text .= "\nSYNOPSIS\n\n $synopsis\n"; # --- description --- $text .= $self->format_description ($element); # --- in --- if (@$in) { $text .= "\nPARAMETERS\n\n"; foreach my $parameter (@$in) { my $name = $self->find_attribute ($parameter, 'name'); my $type_name = $self->find_type_name ($parameter); my $full_type_name = $self->format_full_type_name ($type_name); $text .= " • $name: $full_type_name\n"; my $doc = $self->format_docs ($parameter, ' '); if (defined $doc) { $text .= "$doc\n"; } $text .= "\n"; } $text =~ s/\n\n\Z/\n/; } # --- retval & out --- my $retval_type_name = 'none'; if (defined $retval) { $retval_type_name = $self->find_type_name ($retval); } if ($retval_type_name ne 'none' || @$out) { $text .= "\nRETURN VALUES\n\n"; if ($retval_type_name ne 'none') { my $full_retval_type_name = $self->format_full_type_name ($retval_type_name); $text .= " • $full_retval_type_name\n"; my $doc = $self->format_docs ($retval, ' '); if (defined $doc) { $text .= "$doc\n\n"; } } if (@$out) { foreach my $parameter (@$out) { my $name = $self->find_attribute ($parameter, 'name'); my $type_name = $self->find_type_name ($parameter); my $full_type_name = $self->format_full_type_name ($type_name); $text .= " • $name: $full_type_name\n"; my $doc = $self->format_docs ($parameter, ' '); if (defined $doc) { $text .= "$doc\n\n"; } } } $text =~ s/\n\n\Z/\n/; } return $text; } sub format_callback { my ($self, $element) = @_; my $synopsis_format = <<'__EOS__'; sub { my ([[IN_LIST]]) = @_; ... return [[OUT_LIST_PARENS]]; } __EOS__ return $self->format_callable ($element, 'CALLBACK', $synopsis_format); } sub format_constructor { my ($self, $element) = @_; my $synopsis_format = '$object = [[PACKAGE]]->[[NAME]] ([[IN_LIST]])'; return $self->format_callable ($element, 'CONSTRUCTOR', $synopsis_format); } sub format_function { my ($self, $element) = @_; my $synopsis_format = '[[OUT_LIST_ASSIGN]][[FULL_NAME]] ([[IN_LIST]])'; return $self->format_callable ($element, 'FUNCTION', $synopsis_format); } sub format_method { my ($self, $element) = @_; my $synopsis_format = '[[OUT_LIST_ASSIGN]]$object->[[NAME]] ([[IN_LIST]])'; # Treat methods of class structs as functions. { my $parent = $element->parentNode; if ($parent->nodeName eq 'record' && defined $self->find_attribute ($parent, 'glib:is-gtype-struct-for')) { $synopsis_format = '[[OUT_LIST_ASSIGN]][[FULL_NAME]] ($package[[IN_LIST_PRE_COMMA]])'; } } return $self->format_callable ($element, 'METHOD', $synopsis_format); } sub format_signal { my ($self, $element) = @_; my $synopsis_format = <<'__EOS__'; $object->signal_connect ('[[NAME]]' => sub { my ($object, [[IN_LIST_POST_COMMA]]$data) = @_; ... return [[OUT_LIST_PARENS]]; }, $data); __EOS__ return $self->format_callable ($element, 'SIGNAL', $synopsis_format, 'format_signal_flags'); } sub format_virtual_method { my ($self, $element) = @_; my $synopsis_format = <<'__EOS__'; sub [[NAME_UC]] { my ($object[[IN_LIST_PRE_COMMA]]) = @_; ... return [[OUT_LIST_PARENS]]; } __EOS__ return $self->format_callable ($element, 'VIRTUAL METHOD', $synopsis_format, 'format_virtual_method_flags'); } # ------------------------------------------------------------------------------ sub format_class { my ($self, $element) = @_; my $format_hierarchy_and_interfaces = sub { my @parents; my $current_element = $element; while (1) { my $parent_name = $self->find_attribute ($current_element, 'parent'); last unless defined $parent_name; unshift @parents, $self->format_full_type_name ($parent_name); # Stop if the parent is fully qualified, i.e., if it points elsewhere. last if $parent_name =~ /\./; my $parent_list = $self->{xpc}->find ("core:class[\@name='$parent_name']", $self->{namespace}); if ($parent_list->size != 1) { die "Found no or too many classes with name '$parent_name'\n"; } $current_element = $parent_list->pop; } my @children; my $name = $self->find_attribute ($element, 'name'); my $children_list = $self->{xpc}->find ("core:class[\@parent='$name']", $self->{namespace}); foreach my $child ($children_list->get_nodelist) { push @children, $self->format_full_element_name ($child); } my $hierarchy_text = ''; if (@parents || @children) { push @parents, $self->format_full_element_name ($element); $hierarchy_text = "\nHIERARCHY\n\n"; my $hook = '╰── '; # thanks, devhelp my $spacer = ' ' x length $hook; for (my $i = 0; $i < @parents; $i++) { $hierarchy_text .= ' ' . ($i > 0 ? (($spacer x ($i-1)) . $hook) : '') . $parents[$i] . "\n"; } foreach my $child (@children) { $hierarchy_text .= ' ' . $spacer x $#parents . $hook . $child . "\n"; } } my $impl_list = $self->{xpc}->find ('core:implements', $element); my $impl_text = $self->format_full_type_names ($impl_list, 'IMPLEMENTED INTERFACES'); return $hierarchy_text . $impl_text; }; return $self->format_class_and_interface ($element, 'CLASS', $format_hierarchy_and_interfaces); } sub format_interface { my ($self, $element) = @_; my $format_prerequisites_and_implementations = sub { my $prereq_list = $self->{xpc}->find ('core:prerequisite', $element); my $prereq_text = $self->format_full_type_names ($prereq_list, 'PREREQUISITES'); my $name = $self->find_attribute ($element, 'name'); my $impl_list = $self->{xpc}->find ("core:class[./core:implements[\@name='$name']]", $self->{namespace}); my $impl_text = $self->format_full_type_names ($impl_list, 'KNOWN IMPLEMENTATIONS'); return $prereq_text . $impl_text; }; return $self->format_class_and_interface ($element, 'INTERFACE', $format_prerequisites_and_implementations); } sub format_class_and_interface { my ($self, $element, $heading, $intro) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); $text .= "$heading\n\n $full_name\n"; $text .= $intro->(); $text .= $self->format_description ($element); $text .= $self->format_sub_constructors ($element); $text .= $self->format_sub_methods ($element); $text .= $self->format_sub_functions ($element, 'CLASS FUNCTIONS'); $text .= $self->format_sub_signals ($element); $text .= $self->format_sub_properties ($element); $text .= $self->format_sub_fields ($element); $text .= $self->format_sub_virtual_methods ($element); return $text; } # ------------------------------------------------------------------------------ sub format_constant { my ($self, $element) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); my $value = $self->find_attribute ($element, 'value'); my $type_name = $self->find_type_name ($element); my $full_type_name = $self->format_full_type_name ($type_name); $text .= "CONSTANT\n\n $full_name = $value ($full_type_name)\n"; $text .= $self->format_description ($element); return $text; } # ------------------------------------------------------------------------------ sub format_field { my ($self, $element) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); my $type_name = $self->find_type_name ($element); my $full_type_name = $self->format_full_type_name ($type_name); my $flags = $self->format_field_flags ($element); $text .= "FIELD\n\n $full_name: $full_type_name$flags\n"; $text .= $self->format_description ($element); return $text; } # ------------------------------------------------------------------------------ sub format_property { my ($self, $element) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); my $type_name = $self->find_type_name ($element); my $full_type_name = $self->format_full_type_name ($type_name); my $flags = $self->format_property_flags ($element); $text .= "PROPERTY\n\n $full_name: $full_type_name$flags\n"; $text .= $self->format_description ($element); return $text; } # ------------------------------------------------------------------------------ sub format_record { my ($self, $element) = @_; my $text = ''; my $full_name = $self->format_full_element_name ($element); $text .= "RECORD\n\n $full_name\n"; $text .= $self->format_description ($element); $text .= $self->format_sub_fields ($element); $text .= $self->format_sub_constructors ($element); $text .= $self->format_sub_methods ($element); $text .= $self->format_sub_functions ($element, 'FUNCTIONS'); return $text; } # ------------------------------------------------------------------------------ sub format_sub_constructors { my ($self, $element) = @_; my $text = ''; my $ctor_list = $self->{xpc}->find ('core:constructor', $element); if ($ctor_list->size > 0) { $text .= "\nCONSTRUCTORS\n\n"; foreach my $ctor ($ctor_list->get_nodelist) { my $name = $self->find_attribute ($ctor, 'name'); my $path = $ctor->nodePath; my $flags = $self->format_callable_flags ($ctor, qw/introspectable version/); $text .= " • [$name]($path)$flags\n"; } } return $text; } sub format_sub_fields { my ($self, $element) = @_; my $text = ''; my $field_list = $self->{xpc}->find ('core:field', $element); if ($field_list->size > 0) { $text .= "\nFIELDS\n\n"; foreach my $field ($field_list->get_nodelist) { my $name = $self->find_attribute ($field, 'name'); my $path = $field->nodePath; my $type_name = $self->find_type_name ($field); my $full_type_name = $self->format_full_type_name ($type_name); my $flags = $self->format_field_flags ($field, qw/introspectable/); $text .= " • [$name]($path): $full_type_name$flags\n"; } } return $text; } sub format_sub_functions { my ($self, $element, $heading) = @_; my $text = ''; my $function_list = $self->{xpc}->find ('core:function', $element); if ($function_list->size > 0) { $text .= "\n$heading\n\n"; foreach my $function ($function_list->get_nodelist) { my $name = $self->find_attribute ($function, 'name'); my $path = $function->nodePath; my $flags = $self->format_callable_flags ($function, qw/introspectable version/); $text .= " • [$name]($path)$flags\n"; } } return $text; } sub format_sub_members { my ($self, $element) = @_; my $text = ''; my $member_list = $self->{xpc}->find ('core:member', $element); if ($member_list->size > 0) { $text .= "\nMEMBERS\n"; foreach my $member ($member_list->get_nodelist) { my $name = $self->find_attribute ($member, 'name'); my $value = $self->find_attribute ($member, 'value'); $text .= "\n • $name = $value\n"; my $doc = $self->format_docs ($member, ' '); if (defined $doc) { $text .= "$doc\n"; } } } return $text; } sub format_sub_methods { my ($self, $element) = @_; my $text = ''; my $method_list = $self->{xpc}->find ('core:method', $element); if ($method_list->size > 0) { $text .= "\nMETHODS\n\n"; foreach my $method ($method_list->get_nodelist) { my $name = $self->find_attribute ($method, 'name'); my $path = $method->nodePath; my $flags = $self->format_callable_flags ($method, qw/introspectable version/); $text .= " • [$name]($path)$flags\n"; } } return $text; } sub format_sub_properties { my ($self, $element) = @_; my $text = ''; my $property_list = $self->{xpc}->find ('core:property', $element); if ($property_list->size > 0) { $text .= "\nPROPERTIES\n\n"; foreach my $property ($property_list->get_nodelist) { my $name = $self->find_attribute ($property, 'name'); my $path = $property->nodePath; my $type_name = $self->find_type_name ($property); my $full_type_name = $self->format_full_type_name ($type_name); my $flags = $self->format_property_flags ($property, qw/version/); $text .= " • [$name]($path): $full_type_name$flags\n"; } } return $text; } sub format_sub_signals { my ($self, $element) = @_; my $text = ''; my $signal_list = $self->{xpc}->find ('glib:signal', $element); if ($signal_list->size > 0) { $text .= "\nSIGNALS\n\n"; foreach my $signal ($signal_list->get_nodelist) { my $name = $self->find_attribute ($signal, 'name'); my $path = $signal->nodePath; my $flags = $self->format_signal_flags ($signal, qw/version/); $text .= " • [$name]($path)$flags\n"; } } return $text; } sub format_sub_virtual_methods { my ($self, $element) = @_; my $text = ''; my $vfunc_list = $self->{xpc}->find ('core:virtual-method', $element); if ($vfunc_list->size > 0) { $text .= "\nVIRTUAL METHODS\n\n"; foreach my $vfunc ($vfunc_list->get_nodelist) { my $name = $self->find_attribute ($vfunc, 'name'); my $path = $vfunc->nodePath; my $flags = $self->format_virtual_method_flags ($vfunc); $text .= " • [$name]($path)$flags\n"; } } return $text; } # ------------------------------------------------------------------------------ sub format_deprecation_docs { my ($self, $element) = @_; my $deprecated = $self->find_attribute ($element, 'deprecated') // 0; return undef unless $deprecated; my $text = ''; my $version = $self->find_attribute ($element, 'deprecated-version'); if (defined $version) { $text .= "Deprecated since: $version."; } my $doc_dep_list = $self->{xpc}->find ('core:doc-deprecated', $element); if ($doc_dep_list->size == 1) { $text .= ' ' . $doc_dep_list->pop->textContent; } return undef if $text eq ''; return $text; } sub format_description { my ($self, $element) = @_; my $docs = $self->format_docs ($element); return defined $docs ? "\nDESCRIPTION\n\n$docs\n" : ''; } sub format_docs { my ($self, $element, $indent) = @_; $indent //= ' '; my $text = ''; # The normal docs. my $docs_list = $self->{xpc}->find ('core:doc', $element); if ($docs_list->size == 1) { $text .= $docs_list->pop->textContent; } # The version constraint. my $ver = $self->format_version_constraint ($element); $text .= "\n\n$ver\n" if defined $ver; # The deprecation docs. my $dep = $self->format_deprecation_docs ($element); $text .= "\n\n$dep\n" if defined $dep; return undef if $text eq ''; # Extract code blocks so that they are not wrapped. my $code_block_pattern = qr/\|\[\n?(.*?)\n?\]\|/s; my $empty_code_block = '|[]|'; my $empty_code_block_pattern = qr/\|\[\]\|/; my @code_blocks = $text =~ m/$code_block_pattern/g; $text =~ s/$code_block_pattern/$empty_code_block/g; # Remove leading white space as fill() otherwise takes it for starting a new # paragraph. Do this after the code block extraction to preserve their # indentation. $text =~ s/^[ \t]+//mg; require Text::Wrap; my $formatted_text = Text::Wrap::fill ($indent, $indent, $text); while ($formatted_text =~ m/$empty_code_block_pattern/g) { my $code_block = shift @code_blocks; $code_block =~ s/^/$indent/mg; my $divider = '-' x (76-length($indent)); my $formatted_code_block = "\n$indent$divider\n$code_block\n$indent$divider"; $formatted_text =~ s/(?:\n)?(?:$indent)?$empty_code_block_pattern/$formatted_code_block/; } return $formatted_text; } sub format_full_element_name { my ($self, $element) = @_; my (undef, undef, $full_name) = $self->find_full_element_name ($element); return $full_name; } sub format_full_type_name { my ($self, $name) = @_; if ($name =~ /\./) { # fully qualified $name =~ s/\./::/g; return $name; } if ($name =~ /^[A-Z]/) { # local return $self->{basename} . '::' . $name; } return $name; # global } sub format_full_type_names { my ($self, $list, $heading) = @_; my $text = ''; if ($list->size > 0) { $text .= "\n$heading\n\n"; foreach my $node ($list->get_nodelist) { my $type_name = $self->find_attribute ($node, 'name'); my $full_type_name = $self->format_full_type_name ($type_name); $text .= " • $full_type_name\n"; } } return $text; } sub format_version_constraint { my ($self, $element) = @_; my $version = $self->find_attribute ($element, 'version'); return undef if !defined $version; return "Since: $version."; } # ------------------------------------------------------------------------------ sub format_flags { my ($self, $element, $available, $wanted) = @_; $wanted //= []; my @texts; foreach my $flag (@$available) { my $name = $flag->[0]; my $default = $flag->[1]; my $formatter = $flag->[2]; if (@$wanted) { next unless grep { $_ eq $name } @$wanted; } my $value = $self->find_attribute ($element, $name) // $default; my $text = $formatter->($value); push @texts, $text if defined $text; } return '' unless @texts; return ' [' . join (', ', @texts) . ']'; } sub format_callable_flags { my ($self, $element, @wanted) = @_; # name, default, formatter my @available = ( ['introspectable', 1, sub { !$_[0] ? 'NOT INTROSPECTABLE' : undef }], ['deprecated', 0, sub { $_[0] ? "deprecated" : undef }], ['moved-to', undef, sub { defined $_[0] ? "moved to $_[0]" : undef }], ['shadowed-by', undef, sub { defined $_[0] ? "shadowed by $_[0]" : undef }], # FIXME: Format $_[0] properly. ['throws', 0, sub { $_[0] ? "throws" : undef }], ['version', undef, sub { defined $_[0] ? "available since $_[0]" : undef }], ['shadows', undef, sub { defined $_[0] ? "shadows $_[0]" : undef }], # FIXME: Format $_[0] properly. ); return $self->format_flags ($element, \@available, \@wanted); } sub format_field_flags { my ($self, $element, @wanted) = @_; # name, default, formatter my @available = ( ['introspectable', 1, sub { !$_[0] ? 'NOT INTROSPECTABLE' : undef }], ['readable', 1, sub { $_[0] ? 'readable' : undef }], ['writable', 1, sub { $_[0] ? 'writable' : undef }], ); return $self->format_flags ($element, \@available, \@wanted); } sub format_property_flags { my ($self, $element, @wanted) = @_; my @available = ( ['deprecated', 0, sub { $_[0] ? "deprecated" : undef }], ['version', undef, sub { defined $_[0] ? "available since $_[0]" : undef }], ['readable', 1, sub { $_[0] ? 'readable' : undef }], ['writable', 0, sub { $_[0] ? 'writable' : undef }], ); return $self->format_flags ($element, \@available, \@wanted); } sub format_signal_flags { my ($self, $element, @wanted) = @_; # name, default, formatter my @available = ( ['deprecated', 0, sub { $_[0] ? "deprecated" : undef }], ['version', undef, sub { defined $_[0] ? "available since $_[0]" : undef }], ['when', undef, sub { defined $_[0] ? "$_[0]" : undef }], ['no-recurse', 0, sub { $_[0] ? "no recurse" : undef }], ['detailed', 0, sub { $_[0] ? "detailed" : undef }], ); return $self->format_flags ($element, \@available, \@wanted); } sub format_virtual_method_flags { my ($self, $element, @wanted) = @_; my $name = $self->find_attribute ($element, 'name'); my @available = ( ['introspectable', 1, sub { !$_[0] ? 'NOT INTROSPECTABLE' : undef }], ['invoker', undef, sub { defined $_[0] && $_[0] ne $name ? "invoked by $_[0]" : undef }], ['version', undef, sub { defined $_[0] ? "available since $_[0]" : undef }], ); return $self->format_flags ($element, \@available, \@wanted); } # ------------------------------------------------------------------------------ # --- GirGUI ---------------------------------------------------------------- # ------------------------------------------------------------------------------ package GirGUI; use strict; use warnings; use File::Basename qw//; sub TRUE () {1} sub FALSE () {0} sub FILE_MENU_COL_TEXT () { 0 } sub FILE_MENU_COL_FILE () { 1 } sub FILE_MENU_COL_DIR () { 2 } sub FILE_MENU_COL_PATH () { 3 } sub FILE_MENU_COL_IS_SENSITIVE () { 4 } sub GIR_VIEW_COL_TEXT () { 0 } sub GIR_VIEW_COL_PATH () { 1 } sub GIR_VIEW_COL_IS_CATEGORY () { 2 } sub GIR_VIEW_COL_IS_VISIBLE () { 3 } sub new { my ($class, $parser, @girs) = @_; if (!Gtk3::CHECK_VERSION (3, 10, 0)) { die "Need gtk+ >= 3.10 for the GUI\n"; } my $self = bless { parser => $parser, }, $class; my $window = Gtk3::Window->new; $self->setup_file_menu (@girs); $self->setup_gir_view; $self->setup_search_entry; $self->setup_path_bar; $self->setup_result_view; my $gir_view_window = Gtk3::ScrolledWindow->new; $gir_view_window->add ($self->{gir_view}); my $result_view_window = Gtk3::ScrolledWindow->new; $result_view_window->add ($self->{result_view}); my $side_box = Gtk3::Box->new ('vertical', 2); $side_box->pack_start ($self->{file_menu}, FALSE, FALSE, 0); $side_box->pack_start ($gir_view_window, TRUE, TRUE, 0); $side_box->pack_start ($self->{search_entry}, FALSE, FALSE, 0); $side_box->set (margin => 2); my $result_box = Gtk3::Box->new ('vertical', 0); $result_box->pack_start ($self->{path_bar}, FALSE, FALSE, 0); $result_box->pack_start ($result_view_window, TRUE, TRUE, 0); my $paned = Gtk3::Paned->new ('horizontal'); $paned->pack1 ($side_box, TRUE, TRUE); $paned->pack2 ($result_box, TRUE, TRUE); $paned->set_position (300); $window->add ($paned); $window->signal_connect (delete_event => sub { $self->quit; }); $window->set_default_geometry (900, 800); my $accel_group = Gtk3::AccelGroup->new; $accel_group->connect (Gtk3::Gdk::KEY_q (), qw/control-mask/, [], sub { $self->quit; return Gtk3::EVENT_STOP (); }); $accel_group->connect (Gtk3::Gdk::KEY_k (), qw/control-mask/, [], sub { $self->{search_entry}->grab_focus; return Gtk3::EVENT_STOP (); }); $window->add_accel_group ($accel_group); $self->{window} = $window; return $self; } sub filter_gir_view { my ($self, $criterion) = @_; my $view = $self->{gir_view}; my $model = $self->{gir_model}; my $filter_model = $self->{gir_filter_model}; if (!defined $criterion || $criterion eq '') { # Make everything visible. $model->foreach (sub { my (undef, undef, $iter) = @_; $model->set ($iter, GIR_VIEW_COL_IS_VISIBLE, TRUE); return FALSE; # continue }); # Scroll to selected element. my $selection = $view->get_selection; my ($selected_model, $selected_iter) = $selection->get_selected; if (defined $selected_iter) { my $selected_path = $selected_model->get_path ($selected_iter); $view->scroll_to_cell ($selected_path, undef, FALSE, 0.5, 0.5); } } else { my $re; if ($criterion =~ m|\A/.+/\z|) { $criterion =~ s|\A/(.+)/\z|$1|; $re = qr/$criterion/; } else { $re = qr/\Q$criterion\E/i; } my $check_tree; $check_tree = sub { my ($iter) = @_; my @children = map { $model->iter_nth_child ($iter, $_) } 0..$model->iter_n_children ($iter); foreach my $child (@children) { my ($text, $is_cat) = $model->get ($child, GIR_VIEW_COL_TEXT, GIR_VIEW_COL_IS_CATEGORY); if ($is_cat || $text !~ $re) { # no match $model->set ($child, GIR_VIEW_COL_IS_VISIBLE, FALSE); $check_tree->($child); # descend } else { # match # Make the element and all its parents visible. my $cur = $child; do { $model->set ($cur, GIR_VIEW_COL_IS_VISIBLE, TRUE); } while (defined ($cur = $model->iter_parent ($cur))); # Expand the matching element and all its parents. $view->expand_to_path ( $filter_model->convert_child_path_to_path ( $model->get_path ($child))); # No need to descend as we want all children of matching elements to # be visible. (All elements are visible by default.) } } }; $check_tree->(undef); # start with the virtual root node } } sub display_results { my ($self, $results) = @_; my $b = $self->{result_buffer}; $b->delete ($b->get_start_iter (), $b->get_end_iter ()); my $iter = $b->get_start_iter (); my $insert_part = sub { my ($start, $end) = @_; $b->insert ($iter, substr ($results, $start, $end - $start)); }; my ($prev_match_start, $prev_match_end) = (0, 0); while ($results =~ m/\[([^\n\]]+)\]\(([^\n\)]+)\)/g) { my ($link_text, $link_target) = ($1, $2); my ($match_start, $match_end) = ($-[0], $+[0]); if ($match_start != $prev_match_end) { $insert_part->($prev_match_end, $match_start); } my $tag = $b->create_tag (undef, foreground => 'blue'); $tag->{__target} = $link_target; $b->insert_with_tags ($iter, $link_text, $tag); ($prev_match_start, $prev_match_end) = ($match_start, $match_end); } my $end_offset = length ($results); if ($prev_match_end != $end_offset) { $insert_part->($prev_match_end, $end_offset); } } sub run { my ($self) = @_; $self->{window}->show_all; Gtk3::main (); } sub setup_file_menu { my ($self, @girs) = @_; my $file_model = Gtk3::TreeStore->new (qw/Glib::String Glib::String Glib::String Glib::String Glib::Boolean/); my $file_menu = Gtk3::ComboBox->new_with_model ($file_model); my $renderer = Gtk3::CellRendererText->new; $file_menu->pack_start ($renderer, TRUE); $file_menu->set_attributes ($renderer, text => FILE_MENU_COL_TEXT, sensitive => FILE_MENU_COL_IS_SENSITIVE); $file_menu->set_id_column (FILE_MENU_COL_PATH); my $prompt = '<Select GIR>'; $file_model->set ($file_model->append, FILE_MENU_COL_TEXT, $prompt, FILE_MENU_COL_IS_SENSITIVE, FALSE); $file_menu->set_active (0); my %dirs; $dirs{$_->{dir}}++ for @girs; my $n_dirs = scalar keys %dirs; foreach my $gir (sort { $a->{file} cmp $b->{file} } @girs) { my $text = File::Basename::fileparse ($gir->{file}, qr/\.gir$/); if ($n_dirs > 1) { my $dir = $gir->{dir}; $dir =~ s|/share/gir-1\.0$||; $text .= ' (' . $dir . ')'; } $file_model->set ($file_model->append, FILE_MENU_COL_TEXT, $text, FILE_MENU_COL_FILE, $gir->{file}, FILE_MENU_COL_DIR, $gir->{dir}, FILE_MENU_COL_PATH, $gir->{path}, FILE_MENU_COL_IS_SENSITIVE, TRUE); } $file_menu->signal_connect (changed => sub { my (undef, $iter) = $file_menu->get_active_iter; $self->{parser}->open ($file_model->get ($iter, FILE_MENU_COL_PATH)); $self->update_gir_view; }); $self->{file_menu} = $file_menu; } sub setup_gir_view { my ($self) = @_; my $gir_model = Gtk3::TreeStore->new (qw/Glib::String Glib::String Glib::Boolean Glib::Boolean/); my $gir_filter_model = Gtk3::TreeModelFilter->new ($gir_model); $gir_filter_model->set_visible_column (GIR_VIEW_COL_IS_VISIBLE); my $gir_view = Gtk3::TreeView->new_with_model ($gir_filter_model); $gir_view->insert_column_with_attributes ( GIR_VIEW_COL_TEXT, 'Element', Gtk3::CellRendererText->new, text => GIR_VIEW_COL_TEXT); $gir_view->set_headers_visible (FALSE); $gir_view->signal_connect (key_press_event => sub { my (undef, $event) = @_; if ($event->keyval == Gtk3::Gdk::KEY_Left () || $event->keyval == Gtk3::Gdk::KEY_Right ()) { my $selection = $gir_view->get_selection; my ($model, $iter) = $selection->get_selected; if (defined $iter) { my $path = $model->get_path ($iter); if ($event->keyval == Gtk3::Gdk::KEY_Left ()) { $gir_view->collapse_row ($path); } else { $gir_view->expand_row ($path, FALSE); } } return Gtk3::EVENT_STOP (); } return Gtk3::EVENT_PROPAGATE (); }); $gir_view->get_selection->signal_connect (changed => sub { $self->go_to_selection unless $self->{suppress_gir_view_selection_changes}; }); $self->{gir_model} = $gir_model; $self->{gir_filter_model} = $gir_filter_model; $self->{gir_view} = $gir_view; } sub setup_path_bar { my ($self) = @_; my $path_bar = PathBar->new (orientation => 'horizontal', spacing => 2); $path_bar->set_update_func (sub { my ($name, $path) = @_; $self->update_results ($path); }); $self->{path_bar} = $path_bar; } sub setup_search_entry { my ($self) = @_; my $wait_time_ms = 500; my $search_entry = Gtk3::SearchEntry->new; $search_entry->signal_connect (search_changed => sub { # Use a timeout which is reset when the search text changes so that we do # not filter the view too often. if (defined $search_entry->{__timer_id}) { Glib::Source->remove ($search_entry->{__timer_id}); } $search_entry->{__timer_id} = Glib::Timeout->add ($wait_time_ms, sub { $self->filter_gir_view ($search_entry->get_text); $search_entry->{__timer_id} = undef; return Glib::SOURCE_REMOVE (); }); }); $self->{search_entry} = $search_entry; } sub setup_result_view { my ($self) = @_; my $result_buffer = Gtk3::TextBuffer->new (undef); my $result_view = Gtk3::TextView->new_with_buffer ($result_buffer); $result_view->set (editable => FALSE, margin => 2); my $display = $result_view->get_display (); $result_view->{__hand_cursor} = Gtk3::Gdk::Cursor->new_from_name ($display, 'pointer'); $result_view->{__regular_cursor} = Gtk3::Gdk::Cursor->new_from_name ($display, 'text'); my $hovering_over_link = sub { my ($event) = @_; my ($x, $y) = $result_view->window_to_buffer_coords ('widget', $event->x, $event->y); my $iter = $result_view->get_iter_at_location ($x, $y); if (!$iter) { return undef; } my $tags = $iter->get_tags (); foreach my $tag (@$tags) { if (defined $tag->{__target}) { return $tag; } } return undef; }; $result_view->{__hovering} = FALSE; $result_view->signal_connect (motion_notify_event => sub { my ($result_view, $event) = @_; my $hovering = defined $hovering_over_link->($event); if ($result_view->{__hovering} != $hovering) { $result_view->{__hovering} = $hovering; $result_view->get_window ('text')->set_cursor ( $hovering ? $result_view->{__hand_cursor} : $result_view->{__regular_cursor}); } return Gtk3::EVENT_PROPAGATE (); }); my $handle_button = sub { my ($event, $cb) = @_; if ($event->button == Gtk3::Gdk::BUTTON_PRIMARY ()) { my $tag = $hovering_over_link->($event); if (defined $tag) { if (defined $cb) { $cb->($tag); } return Gtk3::EVENT_STOP (); } } return Gtk3::EVENT_PROPAGATE (); }; $result_view->signal_connect (button_press_event => sub { my ($result_view, $event) = @_; return $handle_button->($event); }); $result_view->signal_connect (button_release_event => sub { my ($result_view, $event) = @_; return $handle_button->($event, sub { $self->go_to_path ($_[0]->{__target}); }); }); $self->{result_buffer} = $result_buffer; $self->{result_view} = $result_view; } sub update_gir_view { my ($self) = @_; $self->{suppress_gir_view_selection_changes} = TRUE; $self->{gir_model}->clear; $self->{search_entry}->set_text (''); $self->{path_bar}->clear; my $inserter = sub { my ($iter, $text, $path, $is_cat, $is_vis) = @_; $self->{gir_model}->set ($iter, GIR_VIEW_COL_TEXT, $text, GIR_VIEW_COL_PATH, $path, GIR_VIEW_COL_IS_CATEGORY, $is_cat, GIR_VIEW_COL_IS_VISIBLE, $is_vis); }; my $results = $self->{parser}->enumerate_namespace (TRUE); foreach my $result (@$results) { my $heading = $result->[0]; my $entries = $result->[1]; my $heading_iter = $self->{gir_model}->append; $inserter->($heading_iter, $heading, undef, TRUE, TRUE); next unless defined $entries; foreach my $entry (@$entries) { my $iter = $self->{gir_model}->append ($heading_iter); $inserter->($iter, $entry->{name}, $entry->{path}, FALSE, TRUE); next unless defined $entry->{sub_results}; foreach my $sub_result (@{$entry->{sub_results}}) { my $sub_heading = $sub_result->[0]; my $sub_entries = $sub_result->[1]; my $sub_heading_iter = $self->{gir_model}->append ($iter); $inserter->($sub_heading_iter, $sub_heading, undef, TRUE, TRUE); next unless defined $sub_entries; foreach my $sub_entry (@$sub_entries) { my $sub_iter = $self->{gir_model}->append ($sub_heading_iter); $inserter->($sub_iter, $sub_entry->{name}, $sub_entry->{path}, FALSE, TRUE); } } } } $self->{suppress_gir_view_selection_changes} = FALSE; $self->display_results ($self->{parser}->format_namespace); } sub go_to_selection { my ($self) = @_; my $selection = $self->{gir_view}->get_selection; my ($model, $iter) = $selection->get_selected; if (!defined $iter) { $self->display_results ($self->{parser}->format_namespace); } elsif (!$model->get ($iter, GIR_VIEW_COL_IS_CATEGORY)) { my $path = $model->get ($iter, GIR_VIEW_COL_PATH); $self->go_to_path ($path); } } sub go_to_path { my ($self, $path) = @_; my $name = $self->{parser}->format_node_name_by_path ($path); $self->{path_bar}->append ($name, $path); # indirectly calls update_results } sub update_results { my ($self, $path) = @_; $self->display_results ($self->{parser}->format_node_by_path ($path)); # Show and select the correponding tree entry. $self->{gir_model}->foreach (sub { my ($model, $tree_path, $iter) = @_; my $this_path = $model->get ($iter, GIR_VIEW_COL_PATH); if (defined $this_path && $this_path eq $path) { $self->{gir_view}->expand_to_path ($tree_path); $self->{gir_view}->scroll_to_cell ($tree_path, undef, FALSE, 0.0, 0.0); $self->{suppress_gir_view_selection_changes} = TRUE; { $self->{gir_view}->get_selection ()->select_path ($tree_path); } $self->{suppress_gir_view_selection_changes} = FALSE; return TRUE; # stop } return FALSE; # continue }); } sub quit { my ($self) = @_; Gtk3::main_quit (); } package PathBar; # The BEGIN { eval } dance is to support not loading Gtk3 in text mode. BEGIN { eval 'use Glib::Object::Subclass qw/Gtk3::Box/;' } sub TRUE () {1} sub FALSE () {0} sub INIT_INSTANCE { my ($self) = @_; my $back_button = Gtk3::Button->new; $back_button->set_image ( Gtk3::Image->new_from_icon_name ('go-previous-symbolic', 'button')); $back_button->set_sensitive (FALSE); $back_button->signal_connect (clicked => sub { $self->{path_label}->go_back }); my $forward_button = Gtk3::Button->new; $forward_button->set_image ( Gtk3::Image->new_from_icon_name ('go-next-symbolic', 'button')); $forward_button->set_sensitive (FALSE); $forward_button->signal_connect (clicked => sub { $self->{path_label}->go_forward }); my $nav_box = Gtk3::Box->new ('horizontal', 2); $nav_box->pack_start ($back_button, FALSE, FALSE, 0); $nav_box->pack_start ($forward_button, FALSE, FALSE, 0); $nav_box->get_style_context->add_class ('linked'); my $path_label = PathLabel->new; $path_label->set_update_func (sub { my ($name, $path) = @_; $self->update_buttons; if (defined $self->{update_func}) { $self->{update_func}->($name, $path); } }); $self->pack_start ($nav_box, FALSE, FALSE, 0); $self->pack_start (Gtk3::VSeparator->new, FALSE, FALSE, 0); $self->pack_start ($path_label, TRUE, TRUE, 0); $self->set (margin => 2); $self->{back_button} = $back_button; $self->{forward_button} = $forward_button; $self->{path_label} = $path_label; return $self; } sub clear { my ($self) = @_; $self->{path_label}->clear (); $self->update_buttons (); } sub append { my ($self, $name, $path) = @_; $self->{path_label}->append ($name, $path); } sub set_update_func { my ($self, $func) = @_; $self->{update_func} = $func; } sub update_buttons { my ($self) = @_; $self->{back_button}->set_sensitive ($self->{path_label}->can_go_back); $self->{forward_button}->set_sensitive ($self->{path_label}->can_go_forward); } package PathLabel; # The BEGIN { eval } dance is to support not loading Gtk3 in text mode. BEGIN { eval 'use Glib::Object::Subclass qw/Gtk3::Label/;' } sub TRUE () {1} sub FALSE () {0} sub INIT_INSTANCE { my ($self) = @_; $self->signal_connect (activate_link => sub { my (undef, $index) = @_; $self->{current_child} = $index; $self->update; return Gtk3::EVENT_STOP (); }); $self->set_track_visited_links (FALSE); $self->clear (); } sub clear { my ($self) = @_; $self->{children} = []; $self->{current_child} = undef; $self->{natural_width} = 0; $self->update (); } sub append { my ($self, $name, $path) = @_; my $cur = $self->{current_child}; # If the new entry is equal to the current entry, do nothing. if (defined $cur) { my $child = $self->{children}->[$cur]; if ($child->{name} eq $name && $child->{path} eq $path) { return; } } # If the current entry is not the last entry, remove all entries after the # current one before appending the new entry. if (defined $cur && $cur < $#{$self->{children}}) { splice @{$self->{children}}, $cur+1; } push @{$self->{children}}, {name => $name, path => $path}; $self->{current_child} = $#{$self->{children}}; $self->update; } sub can_go_back { my ($self) = @_; return defined $self->{current_child} && $self->{current_child} > 0; } sub can_go_forward { my ($self) = @_; return defined $self->{current_child} && $self->{current_child} < $#{$self->{children}}; } sub go_back { my ($self) = @_; return unless $self->{current_child} > 0; $self->{current_child}--; $self->update; } sub go_forward { my ($self) = @_; return unless $self->{current_child} < $#{$self->{children}}; $self->{current_child}++; $self->update; } sub set_update_func { my ($self, $func) = @_; $self->{update_func} = $func; } sub update { my ($self) = @_; $self->set_markup ($self->_format_children); if (defined $self->{current_child} && defined $self->{update_func}) { my $child = $self->{children}->[$self->{current_child}]; $self->{update_func}->($child->{name}, $child->{path}); } } sub GET_PREFERRED_WIDTH { #say 'GET_PREFERRED_WIDTH'; my ($self) = @_; (undef, $self->{natural_width}) = $self->SUPER::GET_PREFERRED_WIDTH; return (0, 0); } sub SIZE_ALLOCATE { #say 'SIZE_ALLOCATE'; my ($self, $allocation) = @_; if ($self->{natural_width} > $allocation->{width}) { my @selected = ($self->{current_child}); while (1) { my @candidates = @selected; if ($selected[0] > 0) { unshift @candidates, $selected[0]-1; } if ($selected[-1] < $#{$self->{children}}) { push @candidates, $selected[-1]+1; } $self->set_markup ($self->_format_children (@candidates)); my ($ink_rect, $logical_rect) = $self->get_layout->get_extents; my $text_width = $logical_rect->{width}/Pango::SCALE (); if ($text_width > $allocation->{width}) { last; } else { @selected = @candidates; } } $self->set_markup ($self->_format_children (@selected)); } $self->SUPER::SIZE_ALLOCATE ($allocation); } # Use undef as an indicator for left-out children. sub _add_omission_markers { my ($self, @indices) = @_; if (!@indices) { return @indices; } if ($indices[0] > 0) { unshift @indices, undef; } if ($indices[-1] < $#{$self->{children}}) { push @indices, undef; } return @indices; } sub _format_child { my ($self, $index) = @_; return '…' unless defined $index; my $name = $self->{children}->[$index]->{name}; my $markup = $index == $self->{current_child} ? "<b>$name</b>" : "<a href='$index'>$name</a>"; return $markup; } sub _format_children { my ($self, @indices) = @_; if (!@indices) { @indices = 0..$#{$self->{children}}; } @indices = $self->_add_omission_markers (@indices); return join ' ▸ ', map { $self->_format_child ($_) } @indices; }
Close