Skip to content
Commits on Source (32)
......@@ -7,10 +7,9 @@ variables:
stages:
- image
- test
- cross environment
- deploy
flatpak devel:
flatpak:
extends: '.flatpak'
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master
variables:
......@@ -22,36 +21,7 @@ flatpak devel:
nightly:
extends: '.publish_nightly'
dependencies:
- 'flatpak devel'
fedora latest:
image:
name: registry.gitlab.gnome.org/gnome/nautilus:latest
entrypoint: ["/bin/sh", "-c"]
stage: cross environment
script:
- meson _build .
- cd _build
- ninja test
only:
- web
- master
allow_failure: true
flatpak master:
stage: cross environment
dependencies: []
variables:
MANIFEST_PATH: "build-aux/flatpak/org.gnome.NautilusMaster.yml"
FLATPAK_MODULE: "nautilus"
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
APP_ID: "org.gnome.NautilusDevel"
extends: .flatpak
only:
- schedules
- web
- tags
allow_failure: true
- flatpak
style check:
image: registry.gitlab.gnome.org/gnome/nautilus:latest
......@@ -64,16 +34,17 @@ style check:
- 'uncrustify.diff'
expire_in: 14 days
script:
- gcc data/lineup-parameters.c `pkg-config --cflags --libs gio-2.0 gio-unix-2.0` -o data/lineup-parameters
- LANG=C.utf8 data/run-uncrustify.sh
- git diff --exit-code | tee uncrustify.diff
except:
- /^gnome-.*$/
update image:
variables:
STORAGE_DRIVER: vfs
BUILDAH_FORMAT: docker
BUILDAH_ISOLATION: chroot
image: registry.fedoraproject.org/fedora:33
image: registry.fedoraproject.org/fedora:latest
stage: image
script:
- dnf install -y buildah runc
......@@ -81,8 +52,8 @@ update image:
- buildah bud --tag $CI_REGISTRY_IMAGE -f .gitlab/Dockerfile
- buildah tag $CI_REGISTRY_IMAGE "$CI_REGISTRY_IMAGE:v$CI_JOB_ID"
- buildah login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- buildah push $CI_REGISTRY_IMAGE
- buildah push "$CI_REGISTRY_IMAGE:v$CI_JOB_ID"
- buildah push --creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD $CI_REGISTRY_IMAGE
- buildah push --creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD "$CI_REGISTRY_IMAGE:v$CI_JOB_ID"
when: manual
only:
- web
......
FROM fedora:latest
RUN dnf install --nogpg -y dnf-plugins-core findutils git libportal-devel tracker3-miners python3-gobject dbus-daemon libhandy1-devel \
&& dnf builddep --nogpg -y nautilus \
&& dnf clean all
RUN dnf install --nogpg -y gnome-common \
&& dnf builddep --nogpg -y gnome-autoar \
&& dnf clean all \
&& git clone --depth 1 https://gitlab.gnome.org/GNOME/gnome-autoar.git \
&& cd gnome-autoar \
&& meson . _build --prefix=/usr \
&& ninja -C _build \
&& ninja -C _build install \
&& cd .. \
&& rm -rf gnome-autoar
RUN dnf builddep --nogpg -y libhandy \
&& dnf clean all \
&& git clone --depth 1 https://gitlab.gnome.org/GNOME/libhandy.git \
&& cd libhandy \
&& meson . _build --prefix=/usr \
&& ninja -C _build \
&& ninja -C _build install \
&& cd .. \
&& rm -rf libhandy
RUN dnf builddep --nogpg -y uncrustify \
RUN dnf install --nogpg -y dnf-plugins-core findutils git \
&& dnf builddep --nogpg -y uncrustify \
&& dnf clean all \
&& git clone --depth 1 https://github.com/uncrustify/uncrustify.git \
&& cd uncrustify \
......
Major changes in 41.1
=====================
* Cache Scripts and New Document menus to avoid lags (António Fernandes)
* Ellipsize subtitle label in trash bar to reduce minimum width (António Fernandes)
* Fix build with meson 0.60.0 (Albert Vaca Cintora)
* Don't change action when unchecking in File Conflict dialog (António Fernandes)
* Fix progress reporting when skipping during extraction (Ondrej Holy)
* Offer skipping in case of extraction failure only when there are more files (Ondrej Holy)
* Remove leftover files after extraction failure (Ondrej Holy)
* Set keyboard focus on the row with the selected archive format (Clyde Laforge)
* Translation updates
Major changes in 41.0
=====================
* Translation updates
......
---
app-id: org.gnome.NautilusDevel
runtime: org.gnome.Platform
runtime-version: master
sdk: org.gnome.Sdk
command: nautilus
tags:
- devel
- development
- nightly
finish-args:
- "--share=ipc"
- "--socket=x11"
- "--socket=wayland"
- "--talk-name=org.gnome.OnlineAccounts"
- "--filesystem=host"
- "--talk-name=org.gtk.vfs"
- "--talk-name=org.gtk.vfs.*"
- "--filesystem=xdg-run/gvfsd"
- "--filesystem=xdg-run/dconf"
- "--filesystem=~/.config/dconf:ro"
- "--talk-name=ca.desrt.dconf"
- "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
# Access to host Tracker Miners
- "--add-policy=Tracker3.dbus:org.freedesktop.Tracker3.Miner.Files=tracker:FileSystem;tracker:Documents"
modules:
- name: exiv2
config-opts:
- "-DCMAKE_INSTALL_PREFIX=/app"
- "-DCMAKE_INSTALL_LIBDIR=/app/lib"
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/Exiv2/exiv2.git
branch: 0.27-maintenance
- name: gexiv2
buildsystem: meson
builddir: true
config-opts:
- "--libdir=/app/lib"
- "-Dintrospection=false"
- "-Dvapi=false"
- "-Dpython3=false"
- "-Dpython3_girdir=no"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/gexiv2.git
branch: gexiv2-0.12
- name: tracker-miners
buildsystem: meson
cleanup:
- "/etc"
- "/libexec/tracker-3"
- "/share/dbus-1/services/org.freedesktop.Tracker3.Miner.Extract.service"
- "/share/dbus-1/services/org.freedesktop.Tracker3.Miner.Files.service"
- "/share/dbus-1/services/org.freedesktop.Tracker3.Miner.Files.Control.service"
config-opts:
- "-Dextract=true"
- "-Dgeneric_media_extractor=none"
- "-Dman=false"
- "-Dminer_fs=true"
- "-Dminer_rss=false"
- "-Dsystemd_user_services=false"
- "-Dwriteback=false"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/tracker-miners.git
branch: master
- name: gnome-desktop
buildsystem: meson
config-opts:
- "-Ddebug_tools=false"
- "-Ddesktop_docs=false"
- "-Dudev=disabled"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/gnome-desktop.git
- name: gnome-autoar
buildsystem: meson
builddir: true
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/gnome-autoar.git
- name: libportal
buildsystem: meson
builddir: true
config-opts:
- "--libdir=/app/lib"
- "--buildtype=debugoptimized"
sources:
- type: git
url: https://github.com/flatpak/libportal.git
- buildsystem: meson
builddir: true
name: nautilus
config-opts:
- "--libdir=/app/lib"
- "-Dprofile=Devel"
- "-Dtests=all"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/nautilus.git
/lineup-parameters
/nautilus-autorun-software.desktop
/org.freedesktop.FileManager1.service
/org.gnome.Nautilus.appdata.xml
......
#!/usr/bin/env python3
#
# Copyright © 2019 Michael Catanzaro <mcatanzaro@gnome.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Based on original C lineup-parameters by Sébastien Wilmet <swilmet@gnome.org>
# Rewritten in Python to allow simple execution from source directory.
#
# Usage: lineup-parameters [file]
# If the file is not given, stdin is read.
# The result is printed to stdout.
#
# The restrictions:
# - The function name must be at column 0, followed by a space and an opening
# parenthesis;
# - One parameter per line;
# - A parameter must follow certain rules (see the regex in the code), but it
# doesn't accept all possibilities of the C language.
# - The opening curly brace ("{") of the function must also be at column 0.
#
# If one restriction is missing, the function declaration is not modified.
#
# Example:
#
# gboolean
# frobnitz (Frobnitz *frobnitz,
# gint magic_number,
# GError **error)
# {
# ...
# }
#
# Becomes:
#
# gboolean
# frobnitz (Frobnitz *frobnitz,
# gint magic_number,
# GError **error)
# {
# ...
# }
#
# TODO: support "..." vararg parameter
import argparse
import re
import sys
from typing import NamedTuple
# https://regexr.com/ is your friend.
functionNameRegex = re.compile(r'^(\w+) ?\(')
parameterRegex = re.compile(
r'^\s*(?P<type>(const\s+)?\w+)'
r'\s+(?P<stars>\**)'
r'\s*(?P<name>\w+)'
r'\s*(?P<end>,|\))'
r'\s*$')
openingCurlyBraceRegex = re.compile(r'^{\s*$')
def matchFunctionName(line):
match = functionNameRegex.match(line)
if match:
functionName = match.group(1)
firstParamPosition = match.end(0)
return (functionName, firstParamPosition)
return (None, 0)
class ParameterInfo(NamedTuple):
paramType: str
name: str
numStars: int
isLastParameter: bool
def matchParameter(line):
_, firstParamPosition = matchFunctionName(line)
match = parameterRegex.match(line[firstParamPosition:])
if match is None:
return None
paramType = match.group('type')
assert(paramType is not None)
name = match.group('name')
assert(name is not None)
stars = match.group('stars')
numStars = len(stars) if stars is not None else 0
end = match.group('end')
isLastParameter = True if end is not None and end == ')' else False
return ParameterInfo(paramType, name, numStars, isLastParameter)
def matchOpeningCurlyBrace(line):
return True if openingCurlyBraceRegex.match(line) is not None else False
# Length returned is number of lines the declaration takes up
def getFunctionDeclarationLength(remainingLines):
for i in range(len(remainingLines)):
currentLine = remainingLines[i]
parameterInfo = matchParameter(currentLine)
if parameterInfo is None:
return 0
if parameterInfo.isLastParameter:
if i + 1 == len(remainingLines):
return 0
nextLine = remainingLines[i + 1]
if not matchOpeningCurlyBrace(nextLine):
return 0
return i + 1
return 0
def getParameterInfos(remainingLines, length):
parameterInfos = []
for i in range(length):
parameterInfos.append(matchParameter(remainingLines[i]))
return parameterInfos
def computeSpacing(parameterInfos):
maxTypeLength = 0
maxStarsLength = 0
for parameterInfo in parameterInfos:
maxTypeLength = max(maxTypeLength, len(parameterInfo.paramType))
maxStarsLength = max(maxStarsLength, parameterInfo.numStars)
return (maxTypeLength, maxStarsLength)
def printParameter(parameterInfo, maxTypeLength, maxStarsLength, outfile):
outfile.write(f'{parameterInfo.paramType:<{maxTypeLength + 1}}')
paramNamePaddedWithStars = f'{parameterInfo.name:*>{parameterInfo.numStars + len(parameterInfo.name)}}'
outfile.write(f'{paramNamePaddedWithStars:>{maxStarsLength + len(parameterInfo.name)}}')
def printFunctionDeclaration(remainingLines, length, useTabs, outfile):
functionName, _ = matchFunctionName(remainingLines[0])
assert(functionName is not None)
outfile.write(f'{functionName} (')
numSpacesToParenthesis = len(functionName) + 2
whitespace = ''
if useTabs:
tabs = ''.ljust(numSpacesToParenthesis // 8, '\t')
spaces = ''.ljust(numSpacesToParenthesis % 8)
whitespace = tabs + spaces
else:
whitespace = ''.ljust(numSpacesToParenthesis)
parameterInfos = getParameterInfos(remainingLines, length)
maxTypeLength, maxStarsLength = computeSpacing(parameterInfos)
numParameters = len(parameterInfos)
for i in range(numParameters):
parameterInfo = parameterInfos[i]
if i != 0:
outfile.write(whitespace)
printParameter(parameterInfo, maxTypeLength, maxStarsLength, outfile)
if i + 1 != numParameters:
outfile.write(',\n')
outfile.write(')\n')
def parseContents(infile, useTabs, outfile):
lines = infile.readlines()
i = 0
while i < len(lines):
line = lines[i]
functionName, _ = matchFunctionName(line)
if functionName is None:
outfile.write(line)
i += 1
continue
remainingLines = lines[i:]
length = getFunctionDeclarationLength(remainingLines)
if length == 0:
outfile.write(line)
i += 1
continue
printFunctionDeclaration(remainingLines, length, useTabs, outfile)
i += length
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description='Line up parameters of C functions')
parser.add_argument('infile', nargs='?',
type=argparse.FileType('r'),
default=sys.stdin,
help='input C source file')
parser.add_argument('-o', metavar='outfile', nargs='?',
type=argparse.FileType('w'),
default=sys.stdout,
help='where to output modified file')
parser.add_argument('--tabs', action='store_true',
help='whether use tab characters in the output')
args = parser.parse_args()
parseContents(args.infile, args.tabs, args.o)
args.infile.close()
args.o.close()
/*
* This file is part of gnome-c-utils.
*
* Copyright © 2013 Sébastien Wilmet <swilmet@gnome.org>
*
* gnome-c-utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gnome-c-utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gnome-c-utils. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Line up parameters of function declarations.
*
* Usage: lineup-parameters [file]
* If the file is not given, stdin is read.
* The result is printed to stdout.
*
* The restrictions:
* - The function name must be at column 0, followed by a space and an opening
* parenthesis;
* - One parameter per line;
* - A paramater must follow certain rules (see the regex in the code), but it
* doesn't accept all possibilities of the C language.
* - The opening curly brace ("{") of the function must also be at column 0.
*
* If one restriction is missing, the function declaration is not modified.
*
* Example:
*
* gboolean
* frobnitz (Frobnitz *frobnitz,
* gint magic_number,
* GError **error)
* {
* ...
* }
*
* Becomes:
*
* gboolean
* frobnitz (Frobnitz *frobnitz,
* gint magic_number,
* GError **error)
* {
* ...
* }
*/
/*
* Use with Vim:
*
* Although this script can be used in Vim (or other text editors), a Vim plugin
* exists:
* http://damien.lespiau.name/blog/2009/12/07/aligning-c-function-parameters-with-vim/
*
* You can use a selection:
* - place the cursor at the function's name;
* - press V to start the line selection;
* - press ]] to go to the "{";
* - type ":" followed by "!lineup-parameters".
*
* Note: the "{" is required in the selection, to detect that we are in a
* function declaration.
*
* You can easily map these steps with a keybinding (F8 in the example below).
* Note that I'm not a Vim expert, so there is maybe a better way to configure
* this stuff.
*
* function! LineupParameters()
* let l:winview = winsaveview()
* execute "normal {V]]:!lineup-parameters\<CR>"
* call winrestview(l:winview)
* endfunction
*
* autocmd Filetype c map <F8> :call LineupParameters()<CR>
*/
/* TODO support "..." vararg parameter. */
#include <gio/gio.h>
#include <gio/gunixinputstream.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <unistd.h>
#define USE_TABS FALSE
typedef struct
{
gchar *type;
guint nb_stars;
gchar *name;
} ParameterInfo;
static void
parameter_info_free (ParameterInfo *param_info)
{
g_free (param_info->type);
g_free (param_info->name);
g_slice_free (ParameterInfo, param_info);
}
static gboolean
match_function_name (const gchar *line,
gchar **function_name,
gint *first_param_pos)
{
static GRegex *regex = NULL;
GMatchInfo *match_info;
gint end_pos;
gboolean match = FALSE;
if (G_UNLIKELY (regex == NULL))
regex = g_regex_new ("^(\\w+) ?\\(", G_REGEX_OPTIMIZE, 0, NULL);
g_regex_match (regex, line, 0, &match_info);
if (g_match_info_matches (match_info) &&
g_match_info_fetch_pos (match_info, 1, NULL, &end_pos) &&
g_match_info_fetch_pos (match_info, 0, NULL, first_param_pos))
{
match = TRUE;
if (function_name != NULL)
*function_name = g_strndup (line, end_pos);
}
g_match_info_free (match_info);
return match;
}
static gboolean
match_parameter (gchar *line,
ParameterInfo **info,
gboolean *is_last_parameter)
{
static GRegex *regex = NULL;
GMatchInfo *match_info;
gint start_pos = 0;
if (G_UNLIKELY (regex == NULL))
regex = g_regex_new ("^\\s*(?<type>(const\\s+)?\\w+)\\s+(?<stars>\\**)\\s*(?<name>\\w+)\\s*(?<end>,|\\))\\s*$",
G_REGEX_OPTIMIZE,
0,
NULL);
if (is_last_parameter != NULL)
*is_last_parameter = FALSE;
match_function_name (line, NULL, &start_pos);
g_regex_match (regex, line + start_pos, 0, &match_info);
if (!g_match_info_matches (match_info))
{
g_match_info_free (match_info);
return FALSE;
}
if (info != NULL)
{
gchar *stars;
*info = g_slice_new0 (ParameterInfo);
(*info)->type = g_match_info_fetch_named (match_info, "type");
(*info)->name = g_match_info_fetch_named (match_info, "name");
g_assert ((*info)->type != NULL);
g_assert ((*info)->name != NULL);
stars = g_match_info_fetch_named (match_info, "stars");
(*info)->nb_stars = strlen (stars);
g_free (stars);
}
if (is_last_parameter != NULL)
{
gchar *end = g_match_info_fetch_named (match_info, "end");
*is_last_parameter = g_str_equal (end, ")");
g_free (end);
}
g_match_info_free (match_info);
return TRUE;
}
static gboolean
match_opening_curly_brace (const gchar *line)
{
static GRegex *regex = NULL;
if (G_UNLIKELY (regex == NULL))
regex = g_regex_new ("^{\\s*$", G_REGEX_OPTIMIZE, 0, NULL);
return g_regex_match (regex, line, 0, NULL);
}
/* Returns the number of lines that take the function declaration.
* Returns 0 if not a function declaration. */
static guint
get_function_declaration_length (gchar **lines)
{
guint nb_lines = 1;
gchar **cur_line = lines;
while (*cur_line != NULL)
{
gboolean match_param;
gboolean is_last_param;
match_param = match_parameter (*cur_line, NULL, &is_last_param);
if (is_last_param)
{
gchar *next_line = *(cur_line + 1);
if (next_line == NULL ||
!match_opening_curly_brace (next_line))
return 0;
return nb_lines;
}
if (!match_param)
return 0;
nb_lines++;
cur_line++;
}
/* should not be reachable - but silences a compiler warning */
return 0;
}
static GSList *
get_list_parameter_infos (gchar **lines,
guint length)
{
GSList *list = NULL;
gint i;
for (i = length - 1; i >= 0; i--)
{
ParameterInfo *info = NULL;
match_parameter (lines[i], &info, NULL);
g_assert (info != NULL);
list = g_slist_prepend (list, info);
}
return list;
}
static void
compute_spacing (GSList *parameter_infos,
guint *max_type_length,
guint *max_stars_length)
{
GSList *l;
*max_type_length = 0;
*max_stars_length = 0;
for (l = parameter_infos; l != NULL; l = l->next)
{
ParameterInfo *info = l->data;
guint type_length = strlen (info->type);
if (type_length > *max_type_length)
*max_type_length = type_length;
if (info->nb_stars > *max_stars_length)
*max_stars_length = info->nb_stars;
}
}
static void
print_parameter (ParameterInfo *info,
guint max_type_length,
guint max_stars_length)
{
gint type_length;
gint nb_spaces;
gchar *spaces;
gchar *stars;
g_print ("%s", info->type);
type_length = strlen (info->type);
nb_spaces = max_type_length - type_length;
g_assert (nb_spaces >= 0);
spaces = g_strnfill (nb_spaces, ' ');
g_print ("%s ", spaces);
g_free (spaces);
nb_spaces = max_stars_length - info->nb_stars;
g_assert (nb_spaces >= 0);
spaces = g_strnfill (nb_spaces, ' ');
g_print ("%s", spaces);
g_free (spaces);
stars = g_strnfill (info->nb_stars, '*');
g_print ("%s", stars);
g_free (stars);
g_print ("%s", info->name);
}
static void
print_function_declaration (gchar **lines,
guint length)
{
gchar **cur_line = lines;
gchar *function_name;
gint nb_spaces_to_parenthesis;
GSList *parameter_infos;
GSList *l;
guint max_type_length;
guint max_stars_length;
gchar *spaces;
if (!match_function_name (*cur_line, &function_name, NULL))
g_error ("The line doesn't match a function name.");
g_print ("%s (", function_name);
nb_spaces_to_parenthesis = strlen (function_name) + 2;
if (USE_TABS)
{
gchar *tabs = g_strnfill (nb_spaces_to_parenthesis / 8, '\t');
gchar *spaces_after_tabs = g_strnfill (nb_spaces_to_parenthesis % 8, ' ');
spaces = g_strdup_printf ("%s%s", tabs, spaces_after_tabs);
g_free (tabs);
g_free (spaces_after_tabs);
}
else
{
spaces = g_strnfill (nb_spaces_to_parenthesis, ' ');
}
parameter_infos = get_list_parameter_infos (lines, length);
compute_spacing (parameter_infos, &max_type_length, &max_stars_length);
for (l = parameter_infos; l != NULL; l = l->next)
{
ParameterInfo *info = l->data;
if (l != parameter_infos)
g_print ("%s", spaces);
print_parameter (info, max_type_length, max_stars_length);
if (l->next != NULL)
g_print (",\n");
}
g_print (")\n");
g_free (function_name);
g_free (spaces);
g_slist_free_full (parameter_infos, (GDestroyNotify)parameter_info_free);
}
static void
parse_contents (gchar **lines)
{
gchar **cur_line = lines;
/* Skip the empty last line, to avoid adding an extra \n. */
for (cur_line = lines; cur_line[0] != NULL && cur_line[1] != NULL; cur_line++)
{
guint length;
if (!match_function_name (*cur_line, NULL, NULL))
{
g_print ("%s\n", *cur_line);
continue;
}
length = get_function_declaration_length (cur_line);
if (length == 0)
{
g_print ("%s\n", *cur_line);
continue;
}
print_function_declaration (cur_line, length);
cur_line += length - 1;
}
}
static gchar *
get_file_contents (gchar *arg)
{
GFile *file;
gchar *path;
gchar *contents;
GError *error = NULL;
file = g_file_new_for_commandline_arg (arg);
path = g_file_get_path (file);
g_file_get_contents (path, &contents, NULL, &error);
if (error != NULL)
g_error ("Impossible to get file contents: %s", error->message);
g_object_unref (file);
g_free (path);
return contents;
}
static gchar *
get_stdin_contents (void)
{
GInputStream *stream;
GString *string;
GError *error = NULL;
stream = g_unix_input_stream_new (STDIN_FILENO, FALSE);
string = g_string_new ("");
while (TRUE)
{
gchar buffer[4097] = { '\0' };
gssize nb_bytes_read = g_input_stream_read (stream, buffer, 4096, NULL, &error);
if (nb_bytes_read == 0)
break;
if (error != NULL)
g_error ("Impossible to read stdin: %s", error->message);
g_string_append (string, buffer);
}
g_input_stream_close (stream, NULL, NULL);
g_object_unref (stream);
return g_string_free (string, FALSE);
}
gint
main (gint argc,
gchar *argv[])
{
gchar *contents;
gchar **contents_lines;
setlocale (LC_ALL, "");
if (argc > 2)
{
g_printerr ("Usage: %s [file]\n", argv[0]);
return EXIT_FAILURE;
}
if (argc == 2)
contents = get_file_contents (argv[1]);
else
contents = get_stdin_contents ();
contents_lines = g_strsplit (contents, "\n", 0);
g_free (contents);
parse_contents (contents_lines);
return EXIT_SUCCESS;
}
......@@ -15,22 +15,11 @@ install_data(
po_dir = join_paths(meson.source_root(), 'po')
line_up_parameters = executable(
'lineup-parameters',
'lineup-parameters.c',
build_by_default: false,
dependencies: [
gio,
gio_unix,
]
)
desktop_conf = configuration_data()
desktop_conf.set('icon', application_id)
desktop = i18n.merge_file(
'desktop',
input: configure_file(
input: files('org.gnome.Nautilus.desktop.in.in'),
output: 'org.gnome.Nautilus.desktop.in',
......@@ -44,7 +33,6 @@ desktop = i18n.merge_file(
)
desktop_autorun_software = i18n.merge_file(
'desktop-autorun-software',
input: 'nautilus-autorun-software.desktop.in',
output: 'nautilus-autorun-software.desktop',
install: true,
......@@ -58,7 +46,6 @@ appdata_conf = configuration_data()
appdata_conf.set('appid', application_id)
appdata = i18n.merge_file(
'appdata',
input: configure_file(
input: files('org.gnome.Nautilus.appdata.xml.in.in'),
output: 'org.gnome.Nautilus.appdata.xml.in',
......
......@@ -27,7 +27,7 @@
<url type="translate">https://wiki.gnome.org/TranslationProject</url>
<launchable type="desktop-id">@appid@.desktop</launchable>
<releases>
<release version="41.0" date="2021-09-17" />
<release version="41.1" date="2021-10-30" />
</releases>
<project_group>GNOME</project_group>
<project_license>GPL-2.0+</project_license>
......
......@@ -10,8 +10,7 @@ fi
if [ ! -x "$DATA/lineup-parameters" ];
then
echo "Script lineup-parameters does not exists here in (source directory)/data, probably because Nautilus was built in a different directory than the source directory.
Copy the program in the (build directory)/data/lineup-parameters here in (source directory)/data and run again run-uncrustify.sh."
echo "Script lineup-parameters does not exists."
exit 1
fi
......
......@@ -4,7 +4,7 @@ project('nautilus', 'c',
# Do not forget when releasing:
# * Update version in data/org.gnome.Nautilus.appdata.xml.in.in
# * Update GTK-based codes over src/gtk/gtk-code-generator.sh
version: '41.0',
version: '41.1',
meson_version: '>= 0.49.0',
license: 'GPL3+'
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -36,9 +36,13 @@ struct _NautilusCompressDialogController
GtkWidget *error_label;
GtkWidget *name_entry;
GtkWidget *extension_stack;
GtkWidget *zip_row;
GtkWidget *zip_label;
GtkWidget *encrypted_zip_row;
GtkWidget *encrypted_zip_label;
GtkWidget *tar_xz_row;
GtkWidget *tar_xz_label;
GtkWidget *seven_zip_row;
GtkWidget *seven_zip_label;
GtkWidget *extension_popover;
GtkWidget *zip_checkmark;
......@@ -348,6 +352,50 @@ activate_button_on_sensitive_notify (GObject *gobject,
}
}
static void
popover_on_show (GtkWidget *widget,
gpointer user_data)
{
NautilusCompressDialogController *self;
NautilusCompressionFormat format;
self = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
format = g_settings_get_enum (nautilus_compression_preferences,
NAUTILUS_PREFERENCES_DEFAULT_COMPRESSION_FORMAT);
switch (format)
{
case NAUTILUS_COMPRESSION_ZIP:
{
gtk_widget_grab_focus (self->zip_row);
}
break;
case NAUTILUS_COMPRESSION_ENCRYPTED_ZIP:
{
gtk_widget_grab_focus (self->encrypted_zip_row);
}
break;
case NAUTILUS_COMPRESSION_TAR_XZ:
{
gtk_widget_grab_focus (self->tar_xz_row);
}
break;
case NAUTILUS_COMPRESSION_7ZIP:
{
gtk_widget_grab_focus (self->seven_zip_row);
}
break;
default:
{
g_assert_not_reached ();
}
break;
}
}
NautilusCompressDialogController *
nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
NautilusDirectory *destination_directory,
......@@ -361,9 +409,13 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
GtkWidget *name_entry;
GtkWidget *activate_button;
GtkWidget *extension_stack;
GtkWidget *zip_row;
GtkWidget *zip_label;
GtkWidget *encrypted_zip_row;
GtkWidget *encrypted_zip_label;
GtkWidget *tar_xz_row;
GtkWidget *tar_xz_label;
GtkWidget *seven_zip_row;
GtkWidget *seven_zip_label;
GtkWidget *extension_popover;
GtkWidget *zip_checkmark;
......@@ -392,6 +444,10 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
seven_zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_checkmark"));
passphrase_label = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_label"));
passphrase_entry = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_entry"));
zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "zip_row"));
encrypted_zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "encrypted_zip_row"));
tar_xz_row = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_row"));
seven_zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_row"));
gtk_window_set_transient_for (GTK_WINDOW (compress_dialog),
parent_window);
......@@ -420,6 +476,10 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
self->name_entry = name_entry;
self->passphrase_label = passphrase_label;
self->passphrase_entry = passphrase_entry;
self->zip_row = zip_row;
self->encrypted_zip_row = encrypted_zip_row;
self->tar_xz_row = tar_xz_row;
self->seven_zip_row = seven_zip_row;
self->response_handler_id = g_signal_connect (compress_dialog,
"response",
......@@ -441,6 +501,8 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
G_CALLBACK (passphrase_entry_on_icon_press),
"activate_button_on_sensitive_notify",
G_CALLBACK (activate_button_on_sensitive_notify),
"popover_on_show",
G_CALLBACK (popover_on_show),
NULL);
gtk_builder_connect_signals (builder, self);
......