#!/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; }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
X11 | Folder | 0755 |
|
|
GET | File | 15.82 KB | 0755 |
|
HEAD | File | 15.82 KB | 0755 |
|
POST | File | 15.82 KB | 0755 |
|
X | File | 274 B | 0755 |
|
Xephyr | File | 2.32 MB | 0755 |
|
Xorg | File | 274 B | 0755 |
|
Xwayland | File | 2.22 MB | 0755 |
|
[ | File | 58.34 KB | 0755 |
|
aa-enabled | File | 30.52 KB | 0755 |
|
aa-exec | File | 34.52 KB | 0755 |
|
ab | File | 58.34 KB | 0755 |
|
aconnect | File | 22.38 KB | 0755 |
|
acpi_listen | File | 18.57 KB | 0755 |
|
add-apt-repository | File | 7.24 KB | 0755 |
|
addpart | File | 30.23 KB | 0755 |
|
alsabat | File | 46.44 KB | 0755 |
|
alsaloop | File | 83.3 KB | 0755 |
|
alsamixer | File | 70.73 KB | 0755 |
|
alsatplg | File | 14.38 KB | 0755 |
|
alsaucm | File | 30.79 KB | 0755 |
|
amidi | File | 30.38 KB | 0755 |
|
amixer | File | 62.45 KB | 0755 |
|
amuFormat.sh | File | 2.61 KB | 0755 |
|
apg | File | 274 B | 0755 |
|
apgbfm | File | 26.07 KB | 0755 |
|
aplay | File | 82.43 KB | 0755 |
|
aplaymidi | File | 26.38 KB | 0755 |
|
apport-bug | File | 2.5 KB | 0755 |
|
apport-cli | File | 13.05 KB | 0755 |
|
apport-collect | File | 2.5 KB | 0755 |
|
apport-unpack | File | 2.02 KB | 0755 |
|
appres | File | 14.3 KB | 0755 |
|
appstreamcli | File | 66.23 KB | 0755 |
|
apropos | File | 55.21 KB | 0755 |
|
apt | File | 18.38 KB | 0755 |
|
apt-add-repository | File | 7.24 KB | 0755 |
|
apt-cache | File | 86.46 KB | 0755 |
|
apt-cdrom | File | 30.46 KB | 0755 |
|
apt-config | File | 26.38 KB | 0755 |
|
apt-extracttemplates | File | 26.47 KB | 0755 |
|
apt-ftparchive | File | 274.47 KB | 0755 |
|
apt-get | File | 46.46 KB | 0755 |
|
apt-key | File | 27.28 KB | 0755 |
|
apt-mark | File | 62.46 KB | 0755 |
|
apt-sortpkgs | File | 46.39 KB | 0755 |
|
aptdcon | File | 1.01 KB | 0755 |
|
apturl | File | 273 B | 0755 |
|
apturl-gtk | File | 1.51 KB | 0755 |
|
arch | File | 38.37 KB | 0755 |
|
arecord | File | 82.43 KB | 0755 |
|
arecordmidi | File | 30.39 KB | 0755 |
|
arm2hpdl | File | 14.31 KB | 0755 |
|
aseqdump | File | 26.38 KB | 0755 |
|
aseqnet | File | 26.43 KB | 0755 |
|
aspell | File | 166.5 KB | 0755 |
|
aspell-import | File | 2 KB | 0755 |
|
atobm | File | 14.3 KB | 0755 |
|
avahi-browse | File | 30.24 KB | 0755 |
|
avahi-browse-domains | File | 30.24 KB | 0755 |
|
avahi-publish | File | 26.23 KB | 0755 |
|
avahi-publish-address | File | 26.23 KB | 0755 |
|
avahi-publish-service | File | 26.23 KB | 0755 |
|
avahi-resolve | File | 22.23 KB | 0755 |
|
avahi-resolve-address | File | 22.23 KB | 0755 |
|
avahi-resolve-host-name | File | 22.23 KB | 0755 |
|
avahi-set-host-name | File | 14.23 KB | 0755 |
|
awk | File | 158.74 KB | 0755 |
|
axfer | File | 90.38 KB | 0755 |
|
b2sum | File | 58.37 KB | 0755 |
|
baobab | File | 202.44 KB | 0755 |
|
base32 | File | 42.34 KB | 0755 |
|
base64 | File | 42.34 KB | 0755 |
|
basename | File | 38.34 KB | 0755 |
|
bash | File | 1.13 MB | 0755 |
|
bashbug | File | 6.63 KB | 0755 |
|
bc | File | 98.7 KB | 0755 |
|
bccmd | File | 192.46 KB | 0755 |
|
bdftopcf | File | 42.12 KB | 0755 |
|
bdftruncate | File | 9.99 KB | 0755 |
|
bitmap | File | 106.39 KB | 0755 |
|
bluemoon | File | 82.23 KB | 0755 |
|
bluetooth-sendto | File | 34.4 KB | 0755 |
|
bluetoothctl | File | 246.71 KB | 0755 |
|
bmtoa | File | 14.32 KB | 0755 |
|
boltctl | File | 150.82 KB | 0755 |
|
bootctl | File | 62.34 KB | 0755 |
|
brltty | File | 799.61 KB | 0755 |
|
brltty-ctb | File | 242.72 KB | 0755 |
|
brltty-trtxt | File | 182.59 KB | 0755 |
|
brltty-ttb | File | 214.78 KB | 0755 |
|
broadwayd | File | 118.38 KB | 0755 |
|
browse | File | 25.02 KB | 0755 |
|
bsd-from | File | 14.15 KB | 0755 |
|
bsd-write | File | 14.15 KB | 2755 |
|
btattach | File | 74.23 KB | 0755 |
|
btmgmt | File | 299.95 KB | 0755 |
|
btmon | File | 796.15 KB | 0755 |
|
bunzip2 | File | 38.23 KB | 0755 |
|
busctl | File | 86.34 KB | 0755 |
|
busybox | File | 2.07 MB | 0755 |
|
bwrap | File | 66.44 KB | 0755 |
|
bzcat | File | 38.23 KB | 0755 |
|
bzcmp | File | 2.17 KB | 0755 |
|
bzdiff | File | 2.17 KB | 0755 |
|
bzegrep | File | 3.69 KB | 0755 |
|
bzexe | File | 4.76 KB | 0755 |
|
bzfgrep | File | 3.69 KB | 0755 |
|
bzgrep | File | 3.69 KB | 0755 |
|
bzip2 | File | 38.23 KB | 0755 |
|
bzip2recover | File | 18.15 KB | 0755 |
|
bzless | File | 1.27 KB | 0755 |
|
bzmore | File | 1.27 KB | 0755 |
|
c_rehash | File | 6.65 KB | 0755 |
|
cal | File | 36.95 KB | 0755 |
|
calendar | File | 34.63 KB | 0755 |
|
calibrate_ppa | File | 27.04 KB | 0755 |
|
canberra-gtk-play | File | 18.07 KB | 0755 |
|
cancel | File | 14.3 KB | 0755 |
|
captoinfo | File | 90.41 KB | 0755 |
|
cat | File | 42.4 KB | 0755 |
|
catchsegv | File | 3.25 KB | 0755 |
|
catman | File | 38.69 KB | 0755 |
|
cautious-launcher | File | 853 B | 0755 |
|
cd-create-profile | File | 26.3 KB | 0755 |
|
cd-fix-profile | File | 26.3 KB | 0755 |
|
cd-iccdump | File | 14.3 KB | 0755 |
|
cd-it8 | File | 22.3 KB | 0755 |
|
certbot | File | 385 B | 0755 |
|
chacl | File | 18.15 KB | 0755 |
|
chage | File | 82.53 KB | 2755 |
|
chardet3 | File | 389 B | 0755 |
|
chardetect3 | File | 389 B | 0755 |
|
chattr | File | 14.31 KB | 0755 |
|
chcon | File | 70.34 KB | 0755 |
|
check-language-support | File | 2.71 KB | 0755 |
|
checkgid | File | 14.15 KB | 0755 |
|
cheese | File | 266.38 KB | 0755 |
|
chfn | File | 83.07 KB | 4755 |
|
chgrp | File | 70.34 KB | 0755 |
|
chmod | File | 62.37 KB | 0755 |
|
choom | File | 50.23 KB | 0755 |
|
chown | File | 70.34 KB | 0755 |
|
chrt | File | 38.23 KB | 0755 |
|
chsh | File | 51.8 KB | 4755 |
|
chvt | File | 14.07 KB | 0755 |
|
ciptool | File | 145.74 KB | 0755 |
|
ckbcomp | File | 146.39 KB | 0755 |
|
cksum | File | 38.34 KB | 0755 |
|
clear | File | 14.31 KB | 0755 |
|
clear_console | File | 14.23 KB | 0755 |
|
cmp | File | 50.09 KB | 0755 |
|
codepage | File | 13.99 KB | 0755 |
|
col | File | 18.15 KB | 0755 |
|
colcrt | File | 14.15 KB | 0755 |
|
colormgr | File | 58.3 KB | 0755 |
|
colrm | File | 14.15 KB | 0755 |
|
column | File | 14.16 KB | 0755 |
|
comm | File | 42.37 KB | 0755 |
|
compose | File | 18.05 KB | 0755 |
|
corelist | File | 14.73 KB | 0755 |
|
cp | File | 150.37 KB | 0755 |
|
cpan | File | 7.96 KB | 0755 |
|
cpan5.30-x86_64-linux-gnu | File | 7.98 KB | 0755 |
|
cpio | File | 161.63 KB | 0755 |
|
cpp | File | 1.1 MB | 0755 |
|
cpp-9 | File | 1.1 MB | 0755 |
|
crontab | File | 42.7 KB | 2755 |
|
csplit | File | 54.37 KB | 0755 |
|
ctstat | File | 30.51 KB | 0755 |
|
cupstestppd | File | 62.38 KB | 0755 |
|
cut | File | 46.37 KB | 0755 |
|
cvt | File | 18.31 KB | 0755 |
|
cvtsudoers | File | 266.7 KB | 0755 |
|
dash | File | 126.77 KB | 0755 |
|
date | File | 106.37 KB | 0755 |
|
dbus-cleanup-sockets | File | 14.14 KB | 0755 |
|
dbus-daemon | File | 243.2 KB | 0755 |
|
dbus-launch | File | 34.14 KB | 0755 |
|
dbus-monitor | File | 30.14 KB | 0755 |
|
dbus-run-session | File | 14.14 KB | 0755 |
|
dbus-send | File | 30.14 KB | 0755 |
|
dbus-update-activation-environment | File | 14.14 KB | 0755 |
|
dbus-uuidgen | File | 14.14 KB | 0755 |
|
dbxtool | File | 26.3 KB | 0755 |
|
dc | File | 54.09 KB | 0755 |
|
dconf | File | 54.23 KB | 0755 |
|
dd | File | 78.38 KB | 0755 |
|
ddstdecode | File | 18.31 KB | 0755 |
|
deallocvt | File | 14.07 KB | 0755 |
|
deb-systemd-helper | File | 20.83 KB | 0755 |
|
deb-systemd-invoke | File | 4.33 KB | 0755 |
|
debconf | File | 2.79 KB | 0755 |
|
debconf-apt-progress | File | 11.27 KB | 0755 |
|
debconf-communicate | File | 608 B | 0755 |
|
debconf-copydb | File | 1.68 KB | 0755 |
|
debconf-escape | File | 647 B | 0755 |
|
debconf-set-selections | File | 2.87 KB | 0755 |
|
debconf-show | File | 1.78 KB | 0755 |
|
debian-distro-info | File | 22.89 KB | 0755 |
|
deja-dup | File | 222.51 KB | 0755 |
|
delpart | File | 30.23 KB | 0755 |
|
delv | File | 48.88 KB | 0755 |
|
desktop-file-edit | File | 96.18 KB | 0755 |
|
desktop-file-install | File | 96.18 KB | 0755 |
|
desktop-file-validate | File | 80.41 KB | 0755 |
|
devdump | File | 179.27 KB | 0755 |
|
df | File | 90.95 KB | 0755 |
|
dfu-tool | File | 106.3 KB | 0755 |
|
dh_bash-completion | File | 2.39 KB | 0755 |
|
dh_installxmlcatalogs | File | 9.22 KB | 0755 |
|
dh_perl_openssl | File | 1.36 KB | 0755 |
|
diff | File | 214.34 KB | 0755 |
|
diff3 | File | 66.21 KB | 0755 |
|
dig | File | 146.84 KB | 0755 |
|
dir | File | 138.81 KB | 0755 |
|
dircolors | File | 46.34 KB | 0755 |
|
dirmngr | File | 569.86 KB | 0755 |
|
dirmngr-client | File | 119.06 KB | 0755 |
|
dirname | File | 38.34 KB | 0755 |
|
dirsplit | File | 16.74 KB | 0755 |
|
distro-info | File | 22.89 KB | 0755 |
|
dmesg | File | 82.46 KB | 0755 |
|
dnsdomainname | File | 26.23 KB | 0755 |
|
do-release-upgrade | File | 9.99 KB | 0755 |
|
domainname | File | 26.23 KB | 0755 |
|
dpkg | File | 302.68 KB | 0755 |
|
dpkg-deb | File | 174.54 KB | 0755 |
|
dpkg-divert | File | 150.59 KB | 0755 |
|
dpkg-maintscript-helper | File | 20.03 KB | 0755 |
|
dpkg-query | File | 162.59 KB | 0755 |
|
dpkg-split | File | 122.48 KB | 0755 |
|
dpkg-statoverride | File | 62.27 KB | 0755 |
|
dpkg-trigger | File | 82.49 KB | 0755 |
|
driverless | File | 22.32 KB | 0755 |
|
du | File | 106.37 KB | 0755 |
|
dumpkeys | File | 174.52 KB | 0755 |
|
duplicity | File | 5.23 KB | 0755 |
|
dvipdf | File | 1007 B | 0755 |
|
echo | File | 38.34 KB | 0755 |
|
ed | File | 54.2 KB | 0755 |
|
edit | File | 18.05 KB | 0755 |
|
editor | File | 312.63 KB | 0755 |
|
editres | File | 72.7 KB | 0755 |
|
egrep | File | 28 B | 0755 |
|
eject | File | 34.84 KB | 0755 |
|
enc2xs | File | 41.12 KB | 0755 |
|
encguess | File | 2.99 KB | 0755 |
|
enchant-2 | File | 22.38 KB | 0755 |
|
enchant-lsmod-2 | File | 14.3 KB | 0755 |
|
env | File | 42.34 KB | 0755 |
|
envsubst | File | 42.23 KB | 0755 |
|
eog | File | 18.37 KB | 0755 |
|
eps2eps | File | 639 B | 0755 |
|
eqn | File | 201.5 KB | 0755 |
|
esc-m | File | 14.01 KB | 0755 |
|
eutp | File | 26.16 KB | 0755 |
|
evince | File | 471.66 KB | 0755 |
|
evince-previewer | File | 54.52 KB | 0755 |
|
evince-thumbnailer | File | 18.38 KB | 0755 |
|
ex | File | 2.78 MB | 0755 |
|
expand | File | 42.37 KB | 0755 |
|
expiry | File | 30.58 KB | 2755 |
|
expr | File | 54.34 KB | 0755 |
|
factor | File | 78.37 KB | 0755 |
|
faillog | File | 22.59 KB | 0755 |
|
fallocate | File | 34.23 KB | 0755 |
|
false | File | 38.34 KB | 0755 |
|
fc-cache | File | 22.23 KB | 0755 |
|
fc-cat | File | 18.23 KB | 0755 |
|
fc-conflist | File | 14.23 KB | 0755 |
|
fc-list | File | 14.23 KB | 0755 |
|
fc-match | File | 14.23 KB | 0755 |
|
fc-pattern | File | 14.23 KB | 0755 |
|
fc-query | File | 14.23 KB | 0755 |
|
fc-scan | File | 14.23 KB | 0755 |
|
fc-validate | File | 14.23 KB | 0755 |
|
fcgistarter | File | 14.15 KB | 0755 |
|
fgconsole | File | 14.07 KB | 0755 |
|
fgrep | File | 28 B | 0755 |
|
file | File | 26.47 KB | 0755 |
|
file-roller | File | 534.11 KB | 0755 |
|
file2brl | File | 26.23 KB | 0755 |
|
fincore | File | 34.27 KB | 0755 |
|
find | File | 312.66 KB | 0755 |
|
findmnt | File | 71.41 KB | 0755 |
|
firefox | File | 2.6 KB | 0755 |
|
flock | File | 34.3 KB | 0755 |
|
fmt | File | 46.34 KB | 0755 |
|
fold | File | 42.34 KB | 0755 |
|
fonttosfnt | File | 34.02 KB | 0755 |
|
foo2ddst | File | 31.23 KB | 0755 |
|
foo2ddst-wrapper | File | 16.86 KB | 0755 |
|
foo2hbpl2 | File | 36.26 KB | 0755 |
|
foo2hbpl2-wrapper | File | 17.91 KB | 0755 |
|
foo2hiperc | File | 43.23 KB | 0755 |
|
foo2hiperc-wrapper | File | 18.11 KB | 0755 |
|
foo2hp | File | 39.48 KB | 0755 |
|
foo2hp2600-wrapper | File | 18.75 KB | 0755 |
|
foo2lava | File | 44.24 KB | 0755 |
|
foo2lava-wrapper | File | 19.61 KB | 0755 |
|
foo2oak | File | 39.41 KB | 0755 |
|
foo2oak-wrapper | File | 17.45 KB | 0755 |
|
foo2qpdl | File | 43.26 KB | 0755 |
|
foo2qpdl-wrapper | File | 19.06 KB | 0755 |
|
foo2slx | File | 31.23 KB | 0755 |
|
foo2slx-wrapper | File | 17.19 KB | 0755 |
|
foo2xqx | File | 35.23 KB | 0755 |
|
foo2xqx-wrapper | File | 17.16 KB | 0755 |
|
foo2zjs | File | 44.23 KB | 0755 |
|
foo2zjs-icc2ps | File | 26.16 KB | 0755 |
|
foo2zjs-pstops | File | 2.93 KB | 0755 |
|
foo2zjs-wrapper | File | 25.34 KB | 0755 |
|
foomatic-rip | File | 115.42 KB | 0755 |
|
fprintd-delete | File | 78.38 KB | 0755 |
|
fprintd-enroll | File | 86.86 KB | 0755 |
|
fprintd-list | File | 78.38 KB | 0755 |
|
fprintd-verify | File | 78.38 KB | 0755 |
|
free | File | 26.23 KB | 0755 |
|
from | File | 14.15 KB | 0755 |
|
ftp | File | 106.7 KB | 0755 |
|
funzip | File | 26.15 KB | 0755 |
|
fuser | File | 39.24 KB | 0755 |
|
fusermount | File | 38.23 KB | 4755 |
|
futurize | File | 384 B | 0755 |
|
fwupdagent | File | 190.3 KB | 0755 |
|
fwupdate | File | 82.3 KB | 0755 |
|
fwupdmgr | File | 190.3 KB | 0755 |
|
fwupdtool | File | 386.92 KB | 0755 |
|
gamemoded | File | 162.49 KB | 0755 |
|
gamemoderun | File | 366 B | 0755 |
|
gamma4scanimage | File | 14.15 KB | 0755 |
|
gapplication | File | 22.38 KB | 0755 |
|
gatttool | File | 278.88 KB | 0755 |
|
gcalccmd | File | 246.39 KB | 0755 |
|
gcore | File | 3.4 KB | 0755 |
|
gcr-viewer | File | 18.37 KB | 0755 |
|
gdb | File | 8.05 MB | 0755 |
|
gdb-add-index | File | 3.95 KB | 0755 |
|
gdbserver | File | 509.55 KB | 0755 |
|
gdbtui | File | 126 B | 0755 |
|
gdbus | File | 50.38 KB | 0755 |
|
gdialog | File | 9.01 KB | 0755 |
|
gdk-pixbuf-csource | File | 14.33 KB | 0755 |
|
gdk-pixbuf-pixdata | File | 14.31 KB | 0755 |
|
gdk-pixbuf-thumbnailer | File | 18.39 KB | 0755 |
|
gdm-screenshot | File | 18.41 KB | 0755 |
|
gdmflexiserver | File | 30.78 KB | 0755 |
|
gedit | File | 14.3 KB | 0755 |
|
genisoimage | File | 641.9 KB | 0755 |
|
geqn | File | 201.5 KB | 0755 |
|
getconf | File | 34.29 KB | 0755 |
|
geteltorito | File | 6.06 KB | 0755 |
|
getent | File | 38.65 KB | 0755 |
|
getfacl | File | 30.77 KB | 0755 |
|
getkeycodes | File | 14.07 KB | 0755 |
|
getopt | File | 22.23 KB | 0755 |
|
gettext | File | 42.23 KB | 0755 |
|
gettext.sh | File | 4.52 KB | 0755 |
|
ghostscript | File | 14.15 KB | 0755 |
|
ginstall-info | File | 115.24 KB | 0755 |
|
gio | File | 90.4 KB | 0755 |
|
gio-querymodules | File | 14.3 KB | 0755 |
|
gipddecode | File | 18.31 KB | 0755 |
|
gjs | File | 22.59 KB | 0755 |
|
gjs-console | File | 22.59 KB | 0755 |
|
gkbd-keyboard-display | File | 14.15 KB | 0755 |
|
glib-compile-schemas | File | 50.38 KB | 0755 |
|
gnome-calculator | File | 774.84 KB | 0755 |
|
gnome-calendar | File | 579.4 KB | 0755 |
|
gnome-characters | File | 301 B | 0755 |
|
gnome-control-center | File | 5.16 MB | 0755 |
|
gnome-disk-image-mounter | File | 54.38 KB | 0755 |
|
gnome-disks | File | 743.47 KB | 0755 |
|
gnome-extensions | File | 50.45 KB | 0755 |
|
gnome-font-viewer | File | 94.57 KB | 0755 |
|
gnome-help | File | 62.23 KB | 0755 |
|
gnome-keyring | File | 22.37 KB | 0755 |
|
gnome-keyring-3 | File | 22.37 KB | 0755 |
|
gnome-keyring-daemon | File | 1.11 MB | 0755 |
|
gnome-language-selector | File | 1.41 KB | 0755 |
|
gnome-logs | File | 186.88 KB | 0755 |
|
gnome-power-statistics | File | 70.28 KB | 0755 |
|
gnome-screenshot | File | 94.74 KB | 0755 |
|
gnome-session | File | 806 B | 0755 |
|
gnome-session-custom-session | File | 54 B | 0755 |
|
gnome-session-inhibit | File | 14.31 KB | 0755 |
|
gnome-session-properties | File | 78.34 KB | 0755 |
|
gnome-session-quit | File | 14.61 KB | 0755 |
|
gnome-shell | File | 22.63 KB | 0755 |
|
gnome-shell-extension-tool | File | 1.67 KB | 0755 |
|
gnome-shell-perf-tool | File | 10.21 KB | 0755 |
|
gnome-system-monitor | File | 334.35 KB | 0755 |
|
gnome-terminal | File | 3.32 KB | 0755 |
|
gnome-terminal.real | File | 111.15 KB | 0755 |
|
gnome-terminal.wrapper | File | 2.36 KB | 0755 |
|
gnome-text-editor | File | 14.3 KB | 0755 |
|
gnome-thumbnail-font | File | 26.16 KB | 0755 |
|
gnome-todo | File | 398.84 KB | 0755 |
|
gnome-www-browser | File | 2.6 KB | 0755 |
|
gpasswd | File | 86.39 KB | 4755 |
|
gpg | File | 1.02 MB | 0755 |
|
gpg-agent | File | 409.04 KB | 0755 |
|
gpg-connect-agent | File | 163.16 KB | 0755 |
|
gpg-wks-server | File | 203.2 KB | 0755 |
|
gpg-zip | File | 3.43 KB | 0755 |
|
gpgcompose | File | 874.29 KB | 0755 |
|
gpgconf | File | 174.66 KB | 0755 |
|
gpgparsemail | File | 34.38 KB | 0755 |
|
gpgsm | File | 507.24 KB | 0755 |
|
gpgsplit | File | 86.76 KB | 0755 |
|
gpgtar | File | 151.63 KB | 0755 |
|
gpgv | File | 447.15 KB | 0755 |
|
gpic | File | 216.34 KB | 0755 |
|
gpu-manager | File | 74.82 KB | 0755 |
|
grep | File | 194.47 KB | 0755 |
|
gresource | File | 22.3 KB | 0755 |
|
groff | File | 121.53 KB | 0755 |
|
grog | File | 2.71 KB | 0755 |
|
grops | File | 181.94 KB | 0755 |
|
grotty | File | 129.56 KB | 0755 |
|
groups | File | 38.34 KB | 0755 |
|
grub-editenv | File | 248.02 KB | 0755 |
|
grub-file | File | 780.38 KB | 0755 |
|
grub-fstest | File | 901.84 KB | 0755 |
|
grub-glue-efi | File | 243.86 KB | 0755 |
|
grub-kbdcomp | File | 1.64 KB | 0755 |
|
grub-menulst2cfg | File | 228.13 KB | 0755 |
|
grub-mkfont | File | 268.42 KB | 0755 |
|
grub-mkimage | File | 348.95 KB | 0755 |
|
grub-mklayout | File | 252.17 KB | 0755 |
|
grub-mknetdir | File | 401.56 KB | 0755 |
|
grub-mkpasswd-pbkdf2 | File | 248.2 KB | 0755 |
|
grub-mkrelpath | File | 239.58 KB | 0755 |
|
grub-mkrescue | File | 954.3 KB | 0755 |
|
grub-mkstandalone | File | 477.86 KB | 0755 |
|
grub-mount | File | 728.8 KB | 0755 |
|
grub-ntldr-img | File | 38.24 KB | 0755 |
|
grub-render-label | File | 800.75 KB | 0755 |
|
grub-script-check | File | 271.7 KB | 0755 |
|
grub-syslinux2cfg | File | 741.27 KB | 0755 |
|
gs | File | 14.15 KB | 0755 |
|
gsbj | File | 350 B | 0755 |
|
gsdj | File | 352 B | 0755 |
|
gsdj500 | File | 352 B | 0755 |
|
gsettings | File | 30.38 KB | 0755 |
|
gslj | File | 353 B | 0755 |
|
gslp | File | 350 B | 0755 |
|
gsnd | File | 277 B | 0755 |
|
gst-device-monitor-1.0 | File | 22.23 KB | 0755 |
|
gst-discoverer-1.0 | File | 30.15 KB | 0755 |
|
gst-inspect-1.0 | File | 62.23 KB | 0755 |
|
gst-launch-1.0 | File | 38.15 KB | 0755 |
|
gst-play-1.0 | File | 50.23 KB | 0755 |
|
gst-typefind-1.0 | File | 18.15 KB | 0755 |
|
gstreamer-codec-install | File | 22.15 KB | 0755 |
|
gtbl | File | 138.51 KB | 0755 |
|
gtf | File | 18.31 KB | 0755 |
|
gtk-builder-tool | File | 34.73 KB | 0755 |
|
gtk-encode-symbolic-svg | File | 18.41 KB | 0755 |
|
gtk-launch | File | 18.46 KB | 0755 |
|
gtk-query-settings | File | 14.3 KB | 0755 |
|
gtk-update-icon-cache | File | 38.63 KB | 0755 |
|
gunzip | File | 2.29 KB | 0755 |
|
gvfs-cat | File | 273 B | 0755 |
|
gvfs-copy | File | 275 B | 0755 |
|
gvfs-info | File | 275 B | 0755 |
|
gvfs-less | File | 884 B | 0755 |
|
gvfs-ls | File | 275 B | 0755 |
|
gvfs-mime | File | 275 B | 0755 |
|
gvfs-mkdir | File | 277 B | 0755 |
|
gvfs-monitor-dir | File | 281 B | 0755 |
|
gvfs-monitor-file | File | 281 B | 0755 |
|
gvfs-mount | File | 277 B | 0755 |
|
gvfs-move | File | 275 B | 0755 |
|
gvfs-open | File | 275 B | 0755 |
|
gvfs-rename | File | 279 B | 0755 |
|
gvfs-rm | File | 279 B | 0755 |
|
gvfs-save | File | 275 B | 0755 |
|
gvfs-set-attribute | File | 273 B | 0755 |
|
gvfs-trash | File | 277 B | 0755 |
|
gvfs-tree | File | 275 B | 0755 |
|
gzexe | File | 6.3 KB | 0755 |
|
gzip | File | 95.21 KB | 0755 |
|
h2ph | File | 28.54 KB | 0755 |
|
h2xs | File | 59.44 KB | 0755 |
|
hbpldecode | File | 26.31 KB | 0755 |
|
hciattach | File | 138.15 KB | 0755 |
|
hciconfig | File | 196.18 KB | 0755 |
|
hcitool | File | 147.71 KB | 0755 |
|
hd | File | 34.25 KB | 0755 |
|
head | File | 46.37 KB | 0755 |
|
helpztags | File | 2.46 KB | 0755 |
|
hex2hcd | File | 18.23 KB | 0755 |
|
hexdump | File | 34.25 KB | 0755 |
|
hipercdecode | File | 18.31 KB | 0755 |
|
host | File | 118.78 KB | 0755 |
|
hostid | File | 38.34 KB | 0755 |
|
hostname | File | 26.23 KB | 0755 |
|
hostnamectl | File | 26.22 KB | 0755 |
|
hp-align | File | 9.14 KB | 0755 |
|
hp-check | File | 39.17 KB | 0755 |
|
hp-clean | File | 7.05 KB | 0755 |
|
hp-colorcal | File | 9.08 KB | 0755 |
|
hp-config_usb_printer | File | 6.98 KB | 0755 |
|
hp-doctor | File | 12.69 KB | 0755 |
|
hp-firmware | File | 6.47 KB | 0755 |
|
hp-info | File | 6.26 KB | 0755 |
|
hp-levels | File | 6.85 KB | 0755 |
|
hp-logcapture | File | 12.15 KB | 0755 |
|
hp-makeuri | File | 5.6 KB | 0755 |
|
hp-pkservice | File | 3.13 KB | 0755 |
|
hp-plugin | File | 13.62 KB | 0755 |
|
hp-plugin-ubuntu | File | 719 B | 0755 |
|
hp-probe | File | 7.98 KB | 0755 |
|
hp-query | File | 4.94 KB | 0755 |
|
hp-scan | File | 86.87 KB | 0755 |
|
hp-setup | File | 37.25 KB | 0755 |
|
hp-testpage | File | 5.98 KB | 0755 |
|
hp-timedate | File | 3.31 KB | 0755 |
|
htcacheclean | File | 38.16 KB | 0755 |
|
htdbm | File | 26.15 KB | 0755 |
|
htdigest | File | 14.15 KB | 0755 |
|
htpasswd | File | 26.15 KB | 0755 |
|
hwe-support-status | File | 10.58 KB | 0755 |
|
i386 | File | 26.5 KB | 0755 |
|
i686-linux-gnu-pkg-config | File | 2.18 KB | 0755 |
|
ibd2sdi | File | 6.48 MB | 0755 |
|
ibus | File | 42.37 KB | 0755 |
|
ibus-daemon | File | 194.42 KB | 0755 |
|
ibus-setup | File | 1.15 KB | 0755 |
|
ibus-table-createdb | File | 1.11 KB | 0755 |
|
iceauth | File | 38.12 KB | 0755 |
|
ico | File | 50.44 KB | 0755 |
|
iconv | File | 66.41 KB | 0755 |
|
id | File | 46.37 KB | 0755 |
|
iecset | File | 26.38 KB | 0755 |
|
ijs_pxljr | File | 30.38 KB | 0755 |
|
im-config | File | 10.75 KB | 0755 |
|
im-launch | File | 1.88 KB | 0755 |
|
info | File | 309.74 KB | 0755 |
|
infobrowser | File | 309.74 KB | 0755 |
|
infocmp | File | 62.38 KB | 0755 |
|
infotocap | File | 90.41 KB | 0755 |
|
innochecksum | File | 6.37 MB | 0755 |
|
inputattach | File | 33.68 KB | 0755 |
|
install | File | 154.41 KB | 0755 |
|
install-info | File | 115.24 KB | 0755 |
|
install-printerdriver | File | 95 B | 0755 |
|
instmodsh | File | 4.27 KB | 0755 |
|
intel-virtual-output | File | 70.31 KB | 0755 |
|
ionice | File | 30.23 KB | 0755 |
|
ip | File | 597.62 KB | 0755 |
|
ipcmk | File | 34.3 KB | 0755 |
|
ipcrm | File | 34.23 KB | 0755 |
|
ipcs | File | 66.23 KB | 0755 |
|
ipod-read-sysinfo-extended | File | 22.15 KB | 0755 |
|
ipod-time-sync | File | 14.15 KB | 0755 |
|
ippfind | File | 42.4 KB | 0755 |
|
ipptool | File | 82.3 KB | 0755 |
|
iptables-xml | File | 96.97 KB | 0755 |
|
ischroot | File | 14.2 KB | 0755 |
|
isdv4-serial-debugger | File | 18.17 KB | 0755 |
|
isdv4-serial-inputattach | File | 30.17 KB | 0755 |
|
isodump | File | 183.27 KB | 0755 |
|
isoinfo | File | 342.52 KB | 0755 |
|
isovfy | File | 183.27 KB | 0755 |
|
ispell-wrapper | File | 7.05 KB | 0755 |
|
join | File | 54.37 KB | 0755 |
|
journalctl | File | 78.24 KB | 0755 |
|
jpgicc | File | 34.17 KB | 0755 |
|
json_pp | File | 4.56 KB | 0755 |
|
kbd_mode | File | 14.07 KB | 0755 |
|
kbdinfo | File | 14.07 KB | 0755 |
|
kbxutil | File | 174.97 KB | 0755 |
|
kernel-install | File | 5.07 KB | 0755 |
|
kerneloops-submit | File | 9.99 KB | 0755 |
|
keyring | File | 385 B | 0755 |
|
kill | File | 30.23 KB | 0755 |
|
killall | File | 31.27 KB | 0755 |
|
kmod | File | 170.34 KB | 0755 |
|
kmodsign | File | 22.29 KB | 0755 |
|
l2ping | File | 100.01 KB | 0755 |
|
l2test | File | 112.26 KB | 0755 |
|
laptop-detect | File | 3.73 KB | 0755 |
|
last | File | 50.23 KB | 0755 |
|
lastb | File | 50.23 KB | 0755 |
|
lastlog | File | 31.66 KB | 0755 |
|
lavadecode | File | 22.31 KB | 0755 |
|
lcf | File | 7.6 KB | 0755 |
|
ldd | File | 5.3 KB | 0755 |
|
less | File | 175.84 KB | 0755 |
|
lessecho | File | 14.31 KB | 0755 |
|
lessfile | File | 8.36 KB | 0755 |
|
lesskey | File | 23.72 KB | 0755 |
|
lesspipe | File | 8.36 KB | 0755 |
|
letsencrypt | File | 385 B | 0755 |
|
lexgrog | File | 98.95 KB | 0755 |
|
libnetcfg | File | 15.41 KB | 0755 |
|
libreoffice | File | 6.58 KB | 0755 |
|
libwacom-list-local-devices | File | 14.26 KB | 0755 |
|
link | File | 38.34 KB | 0755 |
|
linkicc | File | 26.21 KB | 0755 |
|
linux-boot-prober | File | 1.54 KB | 0755 |
|
linux-check-removal | File | 3.99 KB | 0755 |
|
linux-update-symlinks | File | 6.17 KB | 0755 |
|
linux-version | File | 2.63 KB | 0755 |
|
linux32 | File | 26.5 KB | 0755 |
|
linux64 | File | 26.5 KB | 0755 |
|
listres | File | 14.73 KB | 0755 |
|
ln | File | 74.38 KB | 0755 |
|
lnstat | File | 30.51 KB | 0755 |
|
loadkeys | File | 210.57 KB | 0755 |
|
loadunimap | File | 34.13 KB | 0755 |
|
localc | File | 59 B | 0755 |
|
locale | File | 57.56 KB | 0755 |
|
locale-check | File | 14.16 KB | 0755 |
|
localectl | File | 26.22 KB | 0755 |
|
localedef | File | 326.96 KB | 0755 |
|
lodraw | File | 59 B | 0755 |
|
loffice | File | 53 B | 0755 |
|
lofromtemplate | File | 64 B | 0755 |
|
logger | File | 50.82 KB | 0755 |
|
login | File | 55.77 KB | 0755 |
|
loginctl | File | 58.34 KB | 0755 |
|
logname | File | 38.34 KB | 0755 |
|
logresolve | File | 14.16 KB | 0755 |
|
loimpress | File | 62 B | 0755 |
|
lomath | File | 59 B | 0755 |
|
look | File | 14.38 KB | 0755 |
|
lorder | File | 2.82 KB | 0755 |
|
loweb | File | 58 B | 0755 |
|
lowntfs-3g | File | 118.86 KB | 0755 |
|
lowriter | File | 61 B | 0755 |
|
lp | File | 22.3 KB | 0755 |
|
lp_solve | File | 49.99 KB | 0755 |
|
lpoptions | File | 22.38 KB | 0755 |
|
lpq | File | 22.38 KB | 0755 |
|
lpr | File | 18.3 KB | 0755 |
|
lprm | File | 14.3 KB | 0755 |
|
lpstat | File | 38.59 KB | 0755 |
|
ls | File | 138.81 KB | 0755 |
|
lsattr | File | 14.31 KB | 0755 |
|
lsb_release | File | 3.55 KB | 0755 |
|
lsblk | File | 130.23 KB | 0755 |
|
lscpu | File | 98.23 KB | 0755 |
|
lshw | File | 841.2 KB | 0755 |
|
lsinitramfs | File | 706 B | 0755 |
|
lsipc | File | 94.23 KB | 0755 |
|
lslocks | File | 38.55 KB | 0755 |
|
lslogins | File | 66.23 KB | 0755 |
|
lsmem | File | 66.23 KB | 0755 |
|
lsmod | File | 170.34 KB | 0755 |
|
lsns | File | 50.23 KB | 0755 |
|
lsof | File | 171.63 KB | 0755 |
|
lspci | File | 91.95 KB | 0755 |
|
lspgpot | File | 1.06 KB | 0755 |
|
lsusb | File | 242.51 KB | 0755 |
|
ltrace | File | 301.33 KB | 0755 |
|
luit | File | 52.42 KB | 0755 |
|
lwp-download | File | 10.05 KB | 0755 |
|
lwp-dump | File | 2.65 KB | 0755 |
|
lwp-mirror | File | 2.36 KB | 0755 |
|
lwp-request | File | 15.82 KB | 0755 |
|
lz | File | 2.48 KB | 0755 |
|
lz4 | File | 186.23 KB | 0755 |
|
lz4c | File | 186.23 KB | 0755 |
|
lz4cat | File | 186.23 KB | 0755 |
|
lzcat | File | 78.5 KB | 0755 |
|
lzcmp | File | 6.48 KB | 0755 |
|
lzdiff | File | 6.48 KB | 0755 |
|
lzegrep | File | 5.76 KB | 0755 |
|
lzfgrep | File | 5.76 KB | 0755 |
|
lzgrep | File | 5.76 KB | 0755 |
|
lzless | File | 1.76 KB | 0755 |
|
lzma | File | 78.5 KB | 0755 |
|
lzmainfo | File | 14.23 KB | 0755 |
|
lzmore | File | 2.11 KB | 0755 |
|
m2300w | File | 28.86 KB | 0755 |
|
m2300w-wrapper | File | 14.24 KB | 0755 |
|
m2400w | File | 32.86 KB | 0755 |
|
mako-render | File | 383 B | 0755 |
|
man | File | 116.83 KB | 0755 |
|
man-recode | File | 26.9 KB | 0755 |
|
mandb | File | 139.09 KB | 0755 |
|
manpath | File | 38.7 KB | 0755 |
|
mapscrn | File | 26.13 KB | 0755 |
|
mattrib | File | 196.75 KB | 0755 |
|
mawk | File | 158.74 KB | 0755 |
|
mbadblocks | File | 196.75 KB | 0755 |
|
mcat | File | 196.75 KB | 0755 |
|
mcd | File | 196.75 KB | 0755 |
|
mcheck | File | 1.64 KB | 0755 |
|
mclasserase | File | 196.75 KB | 0755 |
|
mcomp | File | 847 B | 0755 |
|
mcookie | File | 34.3 KB | 0755 |
|
mcopy | File | 196.75 KB | 0755 |
|
md5sum | File | 46.37 KB | 0755 |
|
md5sum.textutils | File | 46.37 KB | 0755 |
|
mdel | File | 196.75 KB | 0755 |
|
mdeltree | File | 196.75 KB | 0755 |
|
mdig | File | 50.4 KB | 0755 |
|
mdir | File | 196.75 KB | 0755 |
|
mdu | File | 196.75 KB | 0755 |
|
mesa-overlay-control.py | File | 5.67 KB | 0755 |
|
mesg | File | 14.23 KB | 0755 |
|
mformat | File | 196.75 KB | 0755 |
|
migrate-pubring-from-classic-gpg | File | 2.99 KB | 0755 |
|
mimeopen | File | 8.42 KB | 0755 |
|
mimetype | File | 11.78 KB | 0755 |
|
min12xxw | File | 27.3 KB | 0755 |
|
minfo | File | 196.75 KB | 0755 |
|
mk_modmap | File | 15.78 KB | 0755 |
|
mkdir | File | 86.34 KB | 0755 |
|
mkfifo | File | 66.34 KB | 0755 |
|
mkfontdir | File | 65 B | 0755 |
|
mkfontscale | File | 38.52 KB | 0755 |
|
mkisofs | File | 641.9 KB | 0755 |
|
mkmanifest | File | 14.4 KB | 0755 |
|
mknod | File | 70.34 KB | 0755 |
|
mksquashfs | File | 205.96 KB | 0755 |
|
mktemp | File | 46.34 KB | 0755 |
|
mkzftree | File | 30.29 KB | 0755 |
|
mlabel | File | 196.75 KB | 0755 |
|
mmcli | File | 257.27 KB | 0755 |
|
mmd | File | 196.75 KB | 0755 |
|
mmount | File | 196.75 KB | 0755 |
|
mmove | File | 196.75 KB | 0755 |
|
monitor-sensor | File | 14.15 KB | 0755 |
|
more | File | 42.15 KB | 0755 |
|
mount | File | 54.23 KB | 4755 |
|
mountpoint | File | 14.23 KB | 0755 |
|
mousetweaks | File | 70.23 KB | 0755 |
|
mpartition | File | 196.75 KB | 0755 |
|
mrd | File | 196.75 KB | 0755 |
|
mren | File | 196.75 KB | 0755 |
|
mscompress | File | 14.31 KB | 0755 |
|
msexpand | File | 14.31 KB | 0755 |
|
mshortname | File | 196.75 KB | 0755 |
|
mshowfat | File | 196.75 KB | 0755 |
|
mt | File | 86.78 KB | 0755 |
|
mt-gnu | File | 86.78 KB | 0755 |
|
mtools | File | 196.75 KB | 0755 |
|
mtoolstest | File | 196.75 KB | 0755 |
|
mtr | File | 80.25 KB | 0755 |
|
mtr-packet | File | 38.38 KB | 0755 |
|
mtype | File | 196.75 KB | 0755 |
|
mutter | File | 196.32 KB | 0755 |
|
mv | File | 146.38 KB | 0755 |
|
mxtar | File | 784 B | 0755 |
|
my_print_defaults | File | 6.29 MB | 0755 |
|
myisam_ftdump | File | 6.58 MB | 0755 |
|
myisamchk | File | 6.69 MB | 0755 |
|
myisamlog | File | 6.53 MB | 0755 |
|
myisampack | File | 6.6 MB | 0755 |
|
mysql | File | 7.33 MB | 0755 |
|
mysql_config_editor | File | 6.31 MB | 0755 |
|
mysql_migrate_keyring | File | 7.24 MB | 0755 |
|
mysql_secure_installation | File | 7.16 MB | 0755 |
|
mysql_ssl_rsa_setup | File | 6.33 MB | 0755 |
|
mysql_tzinfo_to_sql | File | 6.23 MB | 0755 |
|
mysql_upgrade | File | 7.26 MB | 0755 |
|
mysqladmin | File | 7.17 MB | 0755 |
|
mysqlanalyze | File | 7.18 MB | 0755 |
|
mysqlbinlog | File | 7.62 MB | 0755 |
|
mysqlcheck | File | 7.18 MB | 0755 |
|
mysqld_multi | File | 26.73 KB | 0755 |
|
mysqld_safe | File | 28.45 KB | 0755 |
|
mysqldump | File | 7.25 MB | 0755 |
|
mysqldumpslow | File | 7.54 KB | 0755 |
|
mysqlimport | File | 7.17 MB | 0755 |
|
mysqloptimize | File | 7.18 MB | 0755 |
|
mysqlpump | File | 7.6 MB | 0755 |
|
mysqlrepair | File | 7.18 MB | 0755 |
|
mysqlreport | File | 38.1 KB | 0755 |
|
mysqlshow | File | 7.17 MB | 0755 |
|
mysqlslap | File | 7.18 MB | 0755 |
|
mzip | File | 196.75 KB | 0755 |
|
namei | File | 34.23 KB | 0755 |
|
nano | File | 312.63 KB | 0755 |
|
nautilus | File | 1.69 MB | 0755 |
|
nautilus-autorun-software | File | 26.3 KB | 0755 |
|
nautilus-sendto | File | 22.23 KB | 0755 |
|
nawk | File | 158.74 KB | 0755 |
|
nc | File | 42.64 KB | 0755 |
|
nc.openbsd | File | 42.64 KB | 0755 |
|
ncal | File | 36.95 KB | 0755 |
|
neqn | File | 913 B | 0755 |
|
netcat | File | 42.64 KB | 0755 |
|
netkit-ftp | File | 106.7 KB | 0755 |
|
netstat | File | 154.58 KB | 0755 |
|
networkctl | File | 74.23 KB | 0755 |
|
networkd-dispatcher | File | 19.71 KB | 0755 |
|
newgrp | File | 43.73 KB | 4755 |
|
ngettext | File | 42.23 KB | 0755 |
|
nice | File | 42.34 KB | 0755 |
|
nisdomainname | File | 26.23 KB | 0755 |
|
nl | File | 42.43 KB | 0755 |
|
nm-applet | File | 335.95 KB | 0755 |
|
nm-connection-editor | File | 1002.99 KB | 0755 |
|
nm-online | File | 22.3 KB | 0755 |
|
nmcli | File | 839.34 KB | 0755 |
|
nmtui | File | 667.38 KB | 0755 |
|
nmtui-connect | File | 667.38 KB | 0755 |
|
nmtui-edit | File | 667.38 KB | 0755 |
|
nmtui-hostname | File | 667.38 KB | 0755 |
|
nohup | File | 42.34 KB | 0755 |
|
notify-send | File | 18.23 KB | 0755 |
|
nproc | File | 42.34 KB | 0755 |
|
nroff | File | 3.22 KB | 0755 |
|
nsenter | File | 34.43 KB | 0755 |
|
nslookup | File | 122.81 KB | 0755 |
|
nstat | File | 78.23 KB | 0755 |
|
nsupdate | File | 78.63 KB | 0755 |
|
ntfs-3g | File | 158.89 KB | 0755 |
|
ntfs-3g.probe | File | 14.23 KB | 0755 |
|
ntfscat | File | 34.26 KB | 0755 |
|
ntfscluster | File | 38.26 KB | 0755 |
|
ntfscmp | File | 38.26 KB | 0755 |
|
ntfsdecrypt | File | 50.27 KB | 0755 |
|
ntfsfallocate | File | 38.27 KB | 0755 |
|
ntfsfix | File | 46.27 KB | 0755 |
|
ntfsinfo | File | 58.27 KB | 0755 |
|
ntfsls | File | 35.34 KB | 0755 |
|
ntfsmove | File | 38.26 KB | 0755 |
|
ntfsrecover | File | 118.26 KB | 0755 |
|
ntfssecaudit | File | 94.75 KB | 0755 |
|
ntfstruncate | File | 42.19 KB | 0755 |
|
ntfsusermap | File | 38.18 KB | 0755 |
|
ntfswipe | File | 54.79 KB | 0755 |
|
numfmt | File | 66.4 KB | 0755 |
|
nvidia-detector | File | 270 B | 0755 |
|
oakdecode | File | 18.33 KB | 0755 |
|
obexctl | File | 166.3 KB | 0755 |
|
oclock | File | 27.72 KB | 0755 |
|
od | File | 70.37 KB | 0755 |
|
oem-getlogs | File | 8.37 KB | 0755 |
|
on_ac_power | File | 2.18 KB | 0755 |
|
openssl | File | 735.68 KB | 0755 |
|
openvt | File | 22.43 KB | 0755 |
|
opldecode | File | 18.31 KB | 0755 |
|
orca | File | 8.52 KB | 0755 |
|
orca-dm-wrapper | File | 70 B | 0755 |
|
os-prober | File | 4.44 KB | 0755 |
|
p11-kit | File | 34.39 KB | 0755 |
|
pa-info | File | 1.99 KB | 0755 |
|
pacat | File | 50.41 KB | 0755 |
|
pacmd | File | 18.38 KB | 0755 |
|
pactl | File | 66.4 KB | 0755 |
|
padsp | File | 2.21 KB | 0755 |
|
pager | File | 175.84 KB | 0755 |
|
pamon | File | 50.41 KB | 0755 |
|
paperconf | File | 13.99 KB | 0755 |
|
paplay | File | 50.41 KB | 0755 |
|
parec | File | 50.41 KB | 0755 |
|
parecord | File | 50.41 KB | 0755 |
|
partx | File | 118.23 KB | 0755 |
|
passwd | File | 66.61 KB | 4755 |
|
paste | File | 42.37 KB | 0755 |
|
pasteurize | File | 388 B | 0755 |
|
pasuspender | File | 22.39 KB | 0755 |
|
patch | File | 190.52 KB | 0755 |
|
pathchk | File | 38.34 KB | 0755 |
|
pax11publish | File | 14.3 KB | 0755 |
|
pbr | File | 152 B | 0755 |
|
pdb3 | File | 61.27 KB | 0755 |
|
pdb3.8 | File | 61.27 KB | 0755 |
|
pdf2dsc | File | 698 B | 0755 |
|
pdf2ps | File | 909 B | 0755 |
|
pdfattach | File | 22.44 KB | 0755 |
|
pdfdetach | File | 22.91 KB | 0755 |
|
pdffonts | File | 22.34 KB | 0755 |
|
pdfimages | File | 58.34 KB | 0755 |
|
pdfinfo | File | 58.34 KB | 0755 |
|
pdfseparate | File | 22.23 KB | 0755 |
|
pdfsig | File | 26.23 KB | 0755 |
|
pdftocairo | File | 162.26 KB | 0755 |
|
pdftohtml | File | 122.25 KB | 0755 |
|
pdftoppm | File | 34.26 KB | 0755 |
|
pdftops | File | 30.35 KB | 0755 |
|
pdftotext | File | 46.35 KB | 0755 |
|
pdfunite | File | 30.23 KB | 0755 |
|
peekfd | File | 14.15 KB | 0755 |
|
perl | File | 3.32 MB | 0755 |
|
perl5.30-x86_64-linux-gnu | File | 14.3 KB | 0755 |
|
perl5.30.0 | File | 3.32 MB | 0755 |
|
perlbug | File | 45.28 KB | 0755 |
|
perldoc | File | 125 B | 0755 |
|
perli11ndoc | File | 56.56 KB | 0755 |
|
perlivp | File | 10.61 KB | 0755 |
|
perlthanks | File | 45.28 KB | 0755 |
|
perror | File | 7.62 MB | 0755 |
|
pf2afm | File | 498 B | 0755 |
|
pfbtopfa | File | 516 B | 0755 |
|
pftp | File | 106.7 KB | 0755 |
|
pgrep | File | 30.24 KB | 0755 |
|
phar | File | 14.54 KB | 0755 |
|
phar.phar | File | 14.54 KB | 0755 |
|
phar.phar7.4 | File | 14.54 KB | 0755 |
|
phar7.4 | File | 14.54 KB | 0755 |
|
php | File | 4.56 MB | 0755 |
|
php7.4 | File | 4.56 MB | 0755 |
|
pic | File | 216.34 KB | 0755 |
|
pico | File | 312.63 KB | 0755 |
|
piconv | File | 8.16 KB | 0755 |
|
pidof | File | 26.38 KB | 0755 |
|
pinentry | File | 78.64 KB | 0755 |
|
pinentry-curses | File | 66.64 KB | 0755 |
|
pinentry-gnome3 | File | 78.64 KB | 0755 |
|
pinentry-x11 | File | 78.64 KB | 0755 |
|
ping | File | 71.07 KB | 0755 |
|
ping4 | File | 71.07 KB | 0755 |
|
ping6 | File | 71.07 KB | 0755 |
|
pinky | File | 42.37 KB | 0755 |
|
pkaction | File | 18.3 KB | 0755 |
|
pkcheck | File | 22.38 KB | 0755 |
|
pkcon | File | 74.3 KB | 0755 |
|
pkexec | File | 30.3 KB | 4755 |
|
pkg-config | File | 54.25 KB | 0755 |
|
pkill | File | 30.24 KB | 0755 |
|
pkmon | File | 22.3 KB | 0755 |
|
pkttyagent | File | 18.3 KB | 0755 |
|
pl2pm | File | 4.43 KB | 0755 |
|
pldd | File | 22.37 KB | 0755 |
|
plog | File | 146 B | 0755 |
|
plymouth | File | 50.15 KB | 0755 |
|
pmap | File | 34.24 KB | 0755 |
|
pnm2ppa | File | 1.58 MB | 0755 |
|
pod2html | File | 4.04 KB | 0755 |
|
pod2man | File | 14.68 KB | 0755 |
|
pod2text | File | 10.55 KB | 0755 |
|
pod2usage | File | 3.86 KB | 0755 |
|
podchecker | File | 3.57 KB | 0755 |
|
podselect | File | 2.47 KB | 0755 |
|
poff | File | 2.77 KB | 0755 |
|
pon | File | 1.33 KB | 0755 |
|
ppdc | File | 114.53 KB | 0755 |
|
ppdhtml | File | 110.53 KB | 0755 |
|
ppdi | File | 114.53 KB | 0755 |
|
ppdmerge | File | 18.38 KB | 0755 |
|
ppdpo | File | 110.53 KB | 0755 |
|
pphs | File | 404 B | 0755 |
|
pr | File | 74.43 KB | 0755 |
|
precat | File | 5.52 KB | 0755 |
|
preconv | File | 66.51 KB | 0755 |
|
preunzip | File | 5.52 KB | 0755 |
|
prezip | File | 5.52 KB | 0755 |
|
prezip-bin | File | 14.3 KB | 0755 |
|
File | 18.05 KB | 0755 |
|
|
printafm | File | 395 B | 0755 |
|
printenv | File | 38.34 KB | 0755 |
|
printer-profile | File | 5.51 KB | 0755 |
|
printerbanner | File | 22.15 KB | 0755 |
|
printf | File | 58.34 KB | 0755 |
|
prlimit | File | 38.74 KB | 0755 |
|
pro | File | 442 B | 0755 |
|
prove | File | 13.33 KB | 0755 |
|
prtstat | File | 22.23 KB | 0755 |
|
ps | File | 134.46 KB | 0755 |
|
ps2ascii | File | 631 B | 0755 |
|
ps2epsi | File | 2.69 KB | 0755 |
|
ps2pdf | File | 272 B | 0755 |
|
ps2pdf12 | File | 215 B | 0755 |
|
ps2pdf13 | File | 215 B | 0755 |
|
ps2pdf14 | File | 215 B | 0755 |
|
ps2pdfwr | File | 1.05 KB | 0755 |
|
ps2ps | File | 647 B | 0755 |
|
ps2ps2 | File | 669 B | 0755 |
|
ps2txt | File | 631 B | 0755 |
|
psfaddtable | File | 21.99 KB | 0755 |
|
psfgettable | File | 21.99 KB | 0755 |
|
psfstriptable | File | 21.99 KB | 0755 |
|
psfxtable | File | 21.99 KB | 0755 |
|
psicc | File | 26.16 KB | 0755 |
|
pslog | File | 14.15 KB | 0755 |
|
pstree | File | 35.16 KB | 0755 |
|
pstree.x11 | File | 35.16 KB | 0755 |
|
ptar | File | 3.47 KB | 0755 |
|
ptardiff | File | 2.57 KB | 0755 |
|
ptargrep | File | 4.29 KB | 0755 |
|
ptx | File | 78.4 KB | 0755 |
|
pulseaudio | File | 98.47 KB | 0755 |
|
pwd | File | 42.34 KB | 0755 |
|
pwdx | File | 14.23 KB | 0755 |
|
py3clean | File | 7.63 KB | 0755 |
|
py3compile | File | 11.84 KB | 0755 |
|
py3versions | File | 11.44 KB | 0755 |
|
pydoc3 | File | 79 B | 0755 |
|
pydoc3.8 | File | 79 B | 0755 |
|
pygettext3 | File | 21.03 KB | 0755 |
|
pygettext3.8 | File | 21.03 KB | 0755 |
|
pyjwt3 | File | 372 B | 0755 |
|
python3 | File | 5.24 MB | 0755 |
|
python3-futurize | File | 384 B | 0755 |
|
python3-pasteurize | File | 388 B | 0755 |
|
python3-pbr | File | 152 B | 0755 |
|
python3.8 | File | 5.24 MB | 0755 |
|
qpdldecode | File | 22.6 KB | 0755 |
|
quirks-handler | File | 2.4 KB | 0755 |
|
rbash | File | 1.13 MB | 0755 |
|
rcp | File | 114.3 KB | 0755 |
|
rctest | File | 145.6 KB | 0755 |
|
rdiffdir | File | 8.9 KB | 0755 |
|
rdma | File | 130.23 KB | 0755 |
|
readlink | File | 50.34 KB | 0755 |
|
realpath | File | 50.37 KB | 0755 |
|
red | File | 89 B | 0755 |
|
remmina | File | 867.6 KB | 0755 |
|
remmina-file-wrapper | File | 1.29 KB | 0755 |
|
rename.ul | File | 22.23 KB | 0755 |
|
rendercheck | File | 59.95 KB | 0755 |
|
renice | File | 14.23 KB | 0755 |
|
reset | File | 30.31 KB | 0755 |
|
resizecons | File | 22.13 KB | 0755 |
|
resizepart | File | 62.23 KB | 0755 |
|
resolvectl | File | 126.38 KB | 0755 |
|
rev | File | 14.23 KB | 0755 |
|
rfcomm | File | 108.68 KB | 0755 |
|
rgrep | File | 30 B | 0755 |
|
rhythmbox | File | 14.3 KB | 0755 |
|
rhythmbox-client | File | 52.22 KB | 0755 |
|
rlogin | File | 774.95 KB | 0755 |
|
rm | File | 70.37 KB | 0755 |
|
rmdir | File | 46.34 KB | 0755 |
|
rnano | File | 312.63 KB | 0755 |
|
rotatelogs | File | 26.23 KB | 0755 |
|
routef | File | 208 B | 0755 |
|
routel | File | 1.62 KB | 0755 |
|
rrsync | File | 7.07 KB | 0755 |
|
rsh | File | 774.95 KB | 0755 |
|
rstart | File | 2.55 KB | 0755 |
|
rstartd | File | 1.43 KB | 0755 |
|
rsync | File | 500.84 KB | 0755 |
|
rtstat | File | 30.51 KB | 0755 |
|
run-mailcap | File | 18.05 KB | 0755 |
|
run-parts | File | 26.51 KB | 0755 |
|
run-with-aspell | File | 57 B | 0755 |
|
runcon | File | 38.34 KB | 0755 |
|
rview | File | 2.78 MB | 0755 |
|
rvim | File | 2.78 MB | 0755 |
|
rygel | File | 50.38 KB | 0755 |
|
sane-find-scanner | File | 134.85 KB | 0755 |
|
savelog | File | 10.24 KB | 0755 |
|
sbattach | File | 58.48 KB | 0755 |
|
sbkeysync | File | 66.7 KB | 0755 |
|
sbsiglist | File | 58.55 KB | 0755 |
|
sbsign | File | 58.55 KB | 0755 |
|
sbvarsign | File | 66.61 KB | 0755 |
|
sbverify | File | 62.48 KB | 0755 |
|
scanimage | File | 54.96 KB | 0755 |
|
scp | File | 114.3 KB | 0755 |
|
scp-dbus-service | File | 90 B | 0755 |
|
screendump | File | 13.99 KB | 0755 |
|
script | File | 54.23 KB | 0755 |
|
scriptreplay | File | 30.23 KB | 0755 |
|
sdiff | File | 50.09 KB | 0755 |
|
sdptool | File | 209.09 KB | 0755 |
|
seahorse | File | 1.15 MB | 0755 |
|
sed | File | 118.45 KB | 0755 |
|
see | File | 18.05 KB | 0755 |
|
select-default-iwrap | File | 474 B | 0755 |
|
select-editor | File | 2.38 KB | 0755 |
|
sensible-browser | File | 1.2 KB | 0755 |
|
sensible-editor | File | 1.14 KB | 0755 |
|
sensible-pager | File | 452 B | 0755 |
|
seq | File | 50.34 KB | 0755 |
|
session-migration | File | 22.15 KB | 0755 |
|
sessreg | File | 13.99 KB | 0755 |
|
setarch | File | 26.5 KB | 0755 |
|
setfacl | File | 38.84 KB | 0755 |
|
setfont | File | 46.13 KB | 0755 |
|
setkeycodes | File | 14.07 KB | 0755 |
|
setleds | File | 14.05 KB | 0755 |
|
setlogcons | File | 14.07 KB | 0755 |
|
setmetamode | File | 14.1 KB | 0755 |
|
setpci | File | 30.23 KB | 0755 |
|
setpriv | File | 46.23 KB | 0755 |
|
setsid | File | 14.23 KB | 0755 |
|
setterm | File | 46.23 KB | 0755 |
|
setupcon | File | 38.31 KB | 0755 |
|
setxkbmap | File | 30.7 KB | 0755 |
|
sftp | File | 166.51 KB | 0755 |
|
sg | File | 43.73 KB | 4755 |
|
sh | File | 126.77 KB | 0755 |
|
sha1sum | File | 50.37 KB | 0755 |
|
sha224sum | File | 58.37 KB | 0755 |
|
sha256sum | File | 58.37 KB | 0755 |
|
sha384sum | File | 66.37 KB | 0755 |
|
sha512sum | File | 66.37 KB | 0755 |
|
shasum | File | 9.74 KB | 0755 |
|
shotwell | File | 4.71 MB | 0755 |
|
showconsolefont | File | 18.07 KB | 0755 |
|
showkey | File | 18.07 KB | 0755 |
|
showrgb | File | 9.99 KB | 0755 |
|
shred | File | 62.37 KB | 0755 |
|
shuf | File | 58.34 KB | 0755 |
|
simple-scan | File | 402.36 KB | 0755 |
|
skill | File | 30.23 KB | 0755 |
|
slabtop | File | 22.23 KB | 0755 |
|
sleep | File | 38.34 KB | 0755 |
|
slogin | File | 774.95 KB | 0755 |
|
slxdecode | File | 18.31 KB | 0755 |
|
smproxy | File | 26.31 KB | 0755 |
|
snap | File | 16.3 MB | 0755 |
|
snapctl | File | 6.26 MB | 0755 |
|
snapfuse | File | 46.29 KB | 0755 |
|
snice | File | 30.23 KB | 0755 |
|
soelim | File | 46.51 KB | 0755 |
|
soffice | File | 6.58 KB | 0755 |
|
software-properties-gtk | File | 4.08 KB | 0755 |
|
sort | File | 114.63 KB | 0755 |
|
spd-conf | File | 1003 B | 0755 |
|
spd-say | File | 30.91 KB | 0755 |
|
speaker-test | File | 30.43 KB | 0755 |
|
speech-dispatcher | File | 162.24 KB | 0755 |
|
spice-vdagent | File | 78.77 KB | 0755 |
|
splain | File | 18.7 KB | 0755 |
|
split | File | 58.77 KB | 0755 |
|
splitfont | File | 13.99 KB | 0755 |
|
ss | File | 164.84 KB | 0755 |
|
ssh | File | 774.95 KB | 0755 |
|
ssh-add | File | 362.28 KB | 0755 |
|
ssh-agent | File | 342.29 KB | 2755 |
|
ssh-argv0 | File | 1.42 KB | 0755 |
|
ssh-copy-id | File | 10.41 KB | 0755 |
|
ssh-import-id | File | 409 B | 0755 |
|
ssh-import-id-gh | File | 785 B | 0755 |
|
ssh-import-id-lp | File | 785 B | 0755 |
|
ssh-keygen | File | 466.3 KB | 0755 |
|
ssh-keyscan | File | 454.3 KB | 0755 |
|
start-pulseaudio-x11 | File | 1.65 KB | 0755 |
|
startx | File | 5.39 KB | 0755 |
|
stat | File | 86.37 KB | 0755 |
|
static-sh | File | 2.07 MB | 0755 |
|
stdbuf | File | 50.34 KB | 0755 |
|
strace | File | 1.51 MB | 0755 |
|
strace-log-merge | File | 1.78 KB | 0755 |
|
stty | File | 82.37 KB | 0755 |
|
su | File | 66.23 KB | 4755 |
|
sudo | File | 162.16 KB | 4755 |
|
sudoedit | File | 162.16 KB | 4755 |
|
sudoreplay | File | 63 KB | 0755 |
|
sum | File | 46.34 KB | 0755 |
|
symcryptrun | File | 123.03 KB | 0755 |
|
sync | File | 38.34 KB | 0755 |
|
syslinux | File | 207.34 KB | 0755 |
|
syslinux-legacy | File | 28.84 KB | 0755 |
|
system-config-printer | File | 95 B | 0755 |
|
system-config-printer-applet | File | 80 B | 0755 |
|
systemctl | File | 973.23 KB | 0755 |
|
systemd | File | 1.55 MB | 0755 |
|
systemd-analyze | File | 1.51 MB | 0755 |
|
systemd-ask-password | File | 14.34 KB | 0755 |
|
systemd-cat | File | 18.23 KB | 0755 |
|
systemd-cgls | File | 22.33 KB | 0755 |
|
systemd-cgtop | File | 38.24 KB | 0755 |
|
systemd-delta | File | 26.22 KB | 0755 |
|
systemd-detect-virt | File | 18.22 KB | 0755 |
|
systemd-escape | File | 22.22 KB | 0755 |
|
systemd-hwdb | File | 106.52 KB | 0755 |
|
systemd-id128 | File | 22.22 KB | 0755 |
|
systemd-inhibit | File | 22.24 KB | 0755 |
|
systemd-machine-id-setup | File | 26.32 KB | 0755 |
|
systemd-mount | File | 50.45 KB | 0755 |
|
systemd-notify | File | 18.23 KB | 0755 |
|
systemd-path | File | 18.22 KB | 0755 |
|
systemd-resolve | File | 126.38 KB | 0755 |
|
systemd-run | File | 58.42 KB | 0755 |
|
systemd-socket-activate | File | 26.22 KB | 0755 |
|
systemd-stdio-bridge | File | 22.23 KB | 0755 |
|
systemd-sysusers | File | 54.52 KB | 0755 |
|
systemd-tmpfiles | File | 86.41 KB | 0755 |
|
systemd-tty-ask-password-agent | File | 30.22 KB | 0755 |
|
systemd-umount | File | 50.45 KB | 0755 |
|
tabs | File | 18.3 KB | 0755 |
|
tac | File | 42.34 KB | 0755 |
|
tail | File | 70.4 KB | 0755 |
|
tar | File | 437.61 KB | 0755 |
|
taskset | File | 34.23 KB | 0755 |
|
tbl | File | 138.51 KB | 0755 |
|
tee | File | 42.37 KB | 0755 |
|
telnet | File | 112.67 KB | 0755 |
|
telnet.netkit | File | 112.67 KB | 0755 |
|
tempfile | File | 14.02 KB | 0755 |
|
test | File | 54.34 KB | 0755 |
|
tgz | File | 2.24 KB | 0755 |
|
thunderbird | File | 3.12 KB | 0755 |
|
tic | File | 90.41 KB | 0755 |
|
tificc | File | 34.23 KB | 0755 |
|
time | File | 14.38 KB | 0755 |
|
timedatectl | File | 46.22 KB | 0755 |
|
timeout | File | 42.77 KB | 0755 |
|
tload | File | 22.24 KB | 0755 |
|
toe | File | 22.3 KB | 0755 |
|
top | File | 126.05 KB | 0755 |
|
totem | File | 22.38 KB | 0755 |
|
totem-video-thumbnailer | File | 34.4 KB | 0755 |
|
touch | File | 98.37 KB | 0755 |
|
tput | File | 26.34 KB | 0755 |
|
tr | File | 50.34 KB | 0755 |
|
tracepath | File | 18.15 KB | 0755 |
|
traceroute6 | File | 26.15 KB | 0755 |
|
traceroute6.iputils | File | 26.15 KB | 0755 |
|
tracker | File | 195.52 KB | 0755 |
|
transicc | File | 38.16 KB | 0755 |
|
transmission-gtk | File | 837.91 KB | 0755 |
|
transset | File | 22.79 KB | 0755 |
|
troff | File | 735.91 KB | 0755 |
|
true | File | 38.34 KB | 0755 |
|
truncate | File | 42.34 KB | 0755 |
|
trust | File | 218.67 KB | 0755 |
|
tset | File | 30.31 KB | 0755 |
|
tsort | File | 42.34 KB | 0755 |
|
ttfread | File | 14.3 KB | 0755 |
|
tty | File | 38.34 KB | 0755 |
|
tzselect | File | 15.02 KB | 0755 |
|
ua | File | 442 B | 0755 |
|
ubuntu-advantage | File | 442 B | 0755 |
|
ubuntu-bug | File | 2.5 KB | 0755 |
|
ubuntu-core-launcher | File | 151.45 KB | 4755 |
|
ubuntu-distro-info | File | 22.89 KB | 0755 |
|
ubuntu-drivers | File | 16.07 KB | 0755 |
|
ubuntu-report | File | 7.39 MB | 0755 |
|
ubuntu-security-status | File | 22.25 KB | 0755 |
|
ucf | File | 39.73 KB | 0755 |
|
ucfq | File | 18.91 KB | 0755 |
|
ucfr | File | 10.47 KB | 0755 |
|
ucs2any | File | 21.99 KB | 0755 |
|
udevadm | File | 931.2 KB | 0755 |
|
udisksctl | File | 58.38 KB | 0755 |
|
ul | File | 18.16 KB | 0755 |
|
ulockmgr_server | File | 18.15 KB | 0755 |
|
umax_pp | File | 183.23 KB | 0755 |
|
umount | File | 38.23 KB | 4755 |
|
uname | File | 38.37 KB | 0755 |
|
unattended-upgrade | File | 96.99 KB | 0755 |
|
unattended-upgrades | File | 96.99 KB | 0755 |
|
uncompress | File | 2.29 KB | 0755 |
|
unexpand | File | 42.37 KB | 0755 |
|
unicode_start | File | 2.7 KB | 0755 |
|
unicode_stop | File | 530 B | 0755 |
|
uniq | File | 50.37 KB | 0755 |
|
unity-scope-loader | File | 14.23 KB | 0755 |
|
unlink | File | 38.34 KB | 0755 |
|
unlz4 | File | 186.23 KB | 0755 |
|
unlzma | File | 78.5 KB | 0755 |
|
unmkinitramfs | File | 3.59 KB | 0755 |
|
unopkg | File | 52 B | 0755 |
|
unshare | File | 42.43 KB | 0755 |
|
unsquashfs | File | 112.12 KB | 0755 |
|
unxz | File | 78.5 KB | 0755 |
|
unzip | File | 182.29 KB | 0755 |
|
unzipsfx | File | 82.27 KB | 0755 |
|
update-alternatives | File | 54.41 KB | 0755 |
|
update-desktop-database | File | 26.23 KB | 0755 |
|
update-manager | File | 4.48 KB | 0755 |
|
update-mime-database | File | 58.37 KB | 0755 |
|
update-notifier | File | 78.98 KB | 0755 |
|
upgmodectl | File | 406 B | 0550 |
|
upower | File | 22.15 KB | 0755 |
|
uptime | File | 14.23 KB | 0755 |
|
usb-creator-gtk | File | 2.87 KB | 0755 |
|
usb-devices | File | 4 KB | 0755 |
|
usb_printerid | File | 14.31 KB | 0755 |
|
usbhid-dump | File | 30.38 KB | 0755 |
|
usbreset | File | 14.3 KB | 0755 |
|
users | File | 38.34 KB | 0755 |
|
utmpdump | File | 30.23 KB | 0755 |
|
uuidgen | File | 14.23 KB | 0755 |
|
uuidparse | File | 38.23 KB | 0755 |
|
uz | File | 2.48 KB | 0755 |
|
vdir | File | 138.81 KB | 0755 |
|
vi | File | 2.78 MB | 0755 |
|
view | File | 2.78 MB | 0755 |
|
viewres | File | 31.27 KB | 0755 |
|
vim | File | 2.78 MB | 0755 |
|
vim.basic | File | 2.78 MB | 0755 |
|
vim.tiny | File | 1.29 MB | 0755 |
|
vimdiff | File | 2.78 MB | 0755 |
|
vimtutor | File | 2.07 KB | 0755 |
|
vm-agent | File | 1.89 MB | 0550 |
|
vmstat | File | 38.25 KB | 0755 |
|
vmwarectrl | File | 14.43 KB | 0755 |
|
volname | File | 14.15 KB | 0755 |
|
vstp | File | 26.16 KB | 0755 |
|
w | File | 22.23 KB | 0755 |
|
w.procps | File | 22.23 KB | 0755 |
|
wall | File | 34.23 KB | 0755 |
|
watch | File | 26.57 KB | 0755 |
|
watchgnupg | File | 18.3 KB | 0755 |
|
wc | File | 46.34 KB | 0755 |
|
wdctl | File | 34.23 KB | 0755 |
|
webmin | File | 14.57 KB | 0755 |
|
wget | File | 531.71 KB | 0755 |
|
whatis | File | 55.21 KB | 0755 |
|
whereis | File | 34.66 KB | 0755 |
|
which | File | 946 B | 0755 |
|
whiptail | File | 34.16 KB | 0755 |
|
who | File | 58.37 KB | 0755 |
|
whoami | File | 38.34 KB | 0755 |
|
whoopsie | File | 66.98 KB | 0755 |
|
whoopsie-preferences | File | 26.15 KB | 0755 |
|
word-list-compress | File | 14.3 KB | 0755 |
|
wpa_passphrase | File | 82.32 KB | 0755 |
|
write | File | 14.15 KB | 2755 |
|
x-session-manager | File | 806 B | 0755 |
|
x-terminal-emulator | File | 2.36 KB | 0755 |
|
x-window-manager | File | 196.32 KB | 0755 |
|
x-www-browser | File | 2.6 KB | 0755 |
|
x11perf | File | 197.46 KB | 0755 |
|
x11perfcomp | File | 2.74 KB | 0755 |
|
x86_64 | File | 26.5 KB | 0755 |
|
x86_64-linux-gnu-cpp | File | 1.1 MB | 0755 |
|
x86_64-linux-gnu-cpp-9 | File | 1.1 MB | 0755 |
|
x86_64-linux-gnu-pkg-config | File | 2.18 KB | 0755 |
|
x86_64-pc-linux-gnu-pkg-config | File | 54.25 KB | 0755 |
|
xargs | File | 74.37 KB | 0755 |
|
xauth | File | 54.97 KB | 0755 |
|
xbiff | File | 24.19 KB | 0755 |
|
xbrlapi | File | 162.48 KB | 0755 |
|
xcalc | File | 47.48 KB | 0755 |
|
xclipboard | File | 26.66 KB | 0755 |
|
xclock | File | 65.14 KB | 0755 |
|
xcmsdb | File | 30.74 KB | 0755 |
|
xconsole | File | 27.28 KB | 0755 |
|
xcursorgen | File | 22.3 KB | 0755 |
|
xcutsel | File | 22.64 KB | 0755 |
|
xdg-dbus-proxy | File | 50.15 KB | 0755 |
|
xdg-desktop-icon | File | 20.15 KB | 0755 |
|
xdg-desktop-menu | File | 42.26 KB | 0755 |
|
xdg-email | File | 26.3 KB | 0755 |
|
xdg-icon-resource | File | 29.32 KB | 0755 |
|
xdg-mime | File | 41.13 KB | 0755 |
|
xdg-open | File | 25.02 KB | 0755 |
|
xdg-screensaver | File | 37.07 KB | 0755 |
|
xdg-settings | File | 37.49 KB | 0755 |
|
xdg-user-dir | File | 234 B | 0755 |
|
xdg-user-dirs-gtk-update | File | 22.07 KB | 0755 |
|
xdg-user-dirs-update | File | 26.07 KB | 0755 |
|
xditview | File | 108.14 KB | 0755 |
|
xdpyinfo | File | 43.07 KB | 0755 |
|
xdriinfo | File | 14.3 KB | 0755 |
|
xedit | File | 673.35 KB | 0755 |
|
xev | File | 34.66 KB | 0755 |
|
xeyes | File | 31.8 KB | 0755 |
|
xfd | File | 40.06 KB | 0755 |
|
xfontsel | File | 47.91 KB | 0755 |
|
xgamma | File | 9.99 KB | 0755 |
|
xgc | File | 78.42 KB | 0755 |
|
xhost | File | 13.99 KB | 0755 |
|
xinit | File | 22.33 KB | 0755 |
|
xinput | File | 62.83 KB | 0755 |
|
xkbbell | File | 14.32 KB | 0755 |
|
xkbcomp | File | 212.09 KB | 0755 |
|
xkbevd | File | 42.39 KB | 0755 |
|
xkbprint | File | 94.34 KB | 0755 |
|
xkbvleds | File | 23.09 KB | 0755 |
|
xkbwatch | File | 23.18 KB | 0755 |
|
xkeystone | File | 16.58 KB | 0755 |
|
xkill | File | 14.3 KB | 0755 |
|
xload | File | 27 KB | 0755 |
|
xlogo | File | 27.27 KB | 0755 |
|
xlsatoms | File | 14.3 KB | 0755 |
|
xlsclients | File | 18.31 KB | 0755 |
|
xlsfonts | File | 26.4 KB | 0755 |
|
xmag | File | 48.42 KB | 0755 |
|
xman | File | 81.2 KB | 0755 |
|
xmessage | File | 27.19 KB | 0755 |
|
xmodmap | File | 34.34 KB | 0755 |
|
xmore | File | 18.58 KB | 0755 |
|
xprop | File | 48.6 KB | 0755 |
|
xqxdecode | File | 18.31 KB | 0755 |
|
xrandr | File | 62.09 KB | 0755 |
|
xrdb | File | 30.09 KB | 0755 |
|
xrefresh | File | 10.07 KB | 0755 |
|
xset | File | 29.99 KB | 0755 |
|
xsetmode | File | 9.99 KB | 0755 |
|
xsetpointer | File | 9.99 KB | 0755 |
|
xsetroot | File | 18 KB | 0755 |
|
xsetwacom | File | 63.7 KB | 0755 |
|
xsm | File | 102.77 KB | 0755 |
|
xstdcmap | File | 14.57 KB | 0755 |
|
xsubpp | File | 5.04 KB | 0755 |
|
xvidtune | File | 39.41 KB | 0755 |
|
xvinfo | File | 18.3 KB | 0755 |
|
xwd | File | 38.31 KB | 0755 |
|
xwininfo | File | 50.38 KB | 0755 |
|
xwud | File | 34.3 KB | 0755 |
|
xxd | File | 18.27 KB | 0755 |
|
xz | File | 78.5 KB | 0755 |
|
xzcat | File | 78.5 KB | 0755 |
|
xzcmp | File | 6.48 KB | 0755 |
|
xzdiff | File | 6.48 KB | 0755 |
|
xzegrep | File | 5.76 KB | 0755 |
|
xzfgrep | File | 5.76 KB | 0755 |
|
xzgrep | File | 5.76 KB | 0755 |
|
xzless | File | 1.76 KB | 0755 |
|
xzmore | File | 2.11 KB | 0755 |
|
yelp | File | 62.23 KB | 0755 |
|
yes | File | 38.34 KB | 0755 |
|
ypdomainname | File | 26.23 KB | 0755 |
|
zcat | File | 1.94 KB | 0755 |
|
zcmp | File | 1.64 KB | 0755 |
|
zdiff | File | 5.76 KB | 0755 |
|
zdump | File | 26.21 KB | 0755 |
|
zegrep | File | 29 B | 0755 |
|
zenity | File | 132.77 KB | 0755 |
|
zfgrep | File | 29 B | 0755 |
|
zforce | File | 2.03 KB | 0755 |
|
zgrep | File | 7.91 KB | 0755 |
|
zip | File | 211.19 KB | 0755 |
|
zipcloak | File | 91.62 KB | 0755 |
|
zipdetails | File | 49.53 KB | 0755 |
|
zipgrep | File | 2.88 KB | 0755 |
|
zipinfo | File | 182.29 KB | 0755 |
|
zipnote | File | 87.39 KB | 0755 |
|
zipsplit | File | 91.39 KB | 0755 |
|
zjsdecode | File | 26.32 KB | 0755 |
|
zless | File | 2.15 KB | 0755 |
|
zmore | File | 1.8 KB | 0755 |
|
znew | File | 4.47 KB | 0755 |
|