about summary refs log tree commit diff stats
path: root/src/config/conflists.c
blob: 148d3ac4bcaaf0b45e91c572a4495b39e45255ef (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * conflists.c
 * vim: expandtab:ts=4:sts=4:sw=4
 *
 * Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com>
 *
 * This file is part of Profanity.
 *
 * Profanity 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.
 *
 * Profanity 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 Profanity.  If not, see <https://www.gnu.org/licenses/>.
 *
 * In addition, as a special exception, the copyright holders give permission to
 * link the code of portions of this program with the OpenSSL library under
 * certain conditions as described in each individual source file, and
 * distribute linked combinations including the two.
 *
 * You must obey the GNU General Public License in all respects for all of the
 * code used other than OpenSSL. If you modify file(s) with this exception, you
 * may extend this exception to your version of the file(s), but you are not
 * obligated to do so. If you do not wish to do so, delete this exception
 * statement from your version. If you delete this exception statement from all
 * source files in the program, then also delete it here.
 *
 */

#include "config.h"

#include <string.h>
#include <glib.h>

gboolean
conf_string_list_add(GKeyFile* keyfile, const char* const group, const char* const key, const char* const item)
{
    gsize length;
    gchar** list = g_key_file_get_string_list(keyfile, group, key, &length, NULL);
    GList* glist = NULL;

    // list found
    if (list) {
        int i = 0;
        for (i = 0; i < length; i++) {
            // item already in list, exit function
            if (strcmp(list[i], item) == 0) {
                g_list_free_full(glist, g_free);
                g_strfreev(list);
                return FALSE;
            }
            // add item to our g_list
            glist = g_list_append(glist, strdup(list[i]));
        }

        // item not found, add to our g_list
        glist = g_list_append(glist, strdup(item));

        // create the new list entry
        const gchar* new_list[g_list_length(glist) + 1];
        GList* curr = glist;
        i = 0;
        while (curr) {
            new_list[i++] = curr->data;
            curr = g_list_next(curr);
        }
        new_list[i] = NULL;
        g_key_file_set_string_list(keyfile, group, key, new_list, g_list_length(glist));

        // list not found
    } else {
        const gchar* new_list[2];
        new_list[0] = item;
        new_list[1] = NULL;
        g_key_file_set_string_list(keyfile, group, key, new_list, 1);
    }

    g_strfreev(list);
    g_list_free_full(glist, g_free);

    return TRUE;
}

gboolean
conf_string_list_remove(GKeyFile* keyfile, const char* const group, const char* const key, const char* const item)
{
    gsize length;
    gchar** list = g_key_file_get_string_list(keyfile, group, key, &length, NULL);

    gboolean deleted = FALSE;
    if (list) {
        int i = 0;
        GList* glist = NULL;

        for (i = 0; i < length; i++) {
            // item found, mark as deleted
            if (strcmp(list[i], item) == 0) {
                deleted = TRUE;
            } else {
                // add item to our g_list
                glist = g_list_append(glist, strdup(list[i]));
            }
        }

        if (deleted) {
            if (g_list_length(glist) == 0) {
                g_key_file_remove_key(keyfile, group, key, NULL);
            } else {
                // create the new list entry
                const gchar* new_list[g_list_length(glist) + 1];
                GList* curr = glist;
                i = 0;
                while (curr) {
                    new_list[i++] = curr->data;
                    curr = g_list_next(curr);
                }
                new_list[i] = NULL;
                g_key_file_set_string_list(keyfile, group, key, new_list, g_list_length(glist));
            }
        }

        g_list_free_full(glist, g_free);
    }

    g_strfreev(list);

    return deleted;
}
keys in rc.conf * Fixed parsing of chained commands (like in the binding `om`) # 2011-10-11: Version 1.5.0 * Full python3.2 compatibility * Added new configuration file `rc.conf` which contains a list of commands that are executed on startup - mainly used for keybindings * Added --list-unused-keys * Added new program handlers to apps.py * Added pop-up window for keychains and bookmarks * Added `load_default_rc` option * Fixed all known unicode issues * Fixed crash when $TERM is unknown to the system * Fixed scrolling in colored preview * Changed the default `column_ratios` to 1/3/4 and sorting method to `natural` * Changed :rename so it doesn't overwrite existing files * Internal actions are now accessible as commands * Replaced unittests by doctests * Replaced integrated help with an extended man page and dynamic lists of keybindings, commands and settings. * Removed `keys.py` configuration file in favor of `rc.conf` * Removed `texas` colorscheme * apps.py: Now able to define programs that only run with Xorg * commands.py: Using parse(self.line) to parse the line is unnecessary now. parse(self.line).rest(n) is now written as self.rest(n). However, parse(self.line).chunk(n) has been renamed to self.arg(n). * commands.py: parse(self.line) + X is now self.firstpart + X * commands.py: New special attribute `resolve_macros` which decides whether strings like %f should be expanded to the name of the current file, etc. * commands.py: New special attribute `escape_macros_for_shell` to toggle whether or not macros should be escaped, so you can use them in other commands than :shell, for example :edit %f * Countless small fixes and improvements # 2011-10-02: Version 1.4.4 * Added keys for chmod (like +ow for `chmod o+w`, etc) * Added `c` flag for running files * Added various key bindings * Added wavpack and webm types to mime.types * Added option `display_tags_in_all_columns` * Added command.cancel method which is called when pressing ESC in console * Added sorting and cycling by ctime and atime * Added custom tags (press "x) * Added bittorrent preview * Fixed blocking when using interactive scripts in scope.sh * Fixed issues with ALT key * Fixed pager crash when trying to read non-readable file * Forbid piping things into ranger * Improved hints # 2011-04-05: Version 1.4.3 * Fixed mimetype checking when invoking ranger with a filename * Fixed loss of bookmarks when disk is full * Minor improvements # 2011-03-05: Version 1.4.2 * Added --choosefile and --choosedir flag * Added use of bookmarks in tab completion of the :cd command * Fixed bug with detached programs and python 3.2 # 2011-01-04: Version 1.4.1 * Fixed crash when preview failed under some circumstances * Fixed graphical bug when pressing i # 2010-12-22: Version 1.4.0 * Added option to use any external scripts for previews (see scope.sh) * Added key: zv to toggle the use of the external script * Added indicator for the used filter (type `zf`) * Added option `padding_right` to remove whitespace if theres no preview * Added command `:search_inc` for incremental search * Added commands `:save_copy_buffer` and `:load_copy_buffer` to share the copied files between ranger instances * Added mimeopen as a fallback if no useful application can be found * Added natural sort, sorts 1foo before 10foo. (type `on`) * Added keys: yp, yd and yb to copy path, dirname or basename to seleciton * Let `open_with` use the selection, not just one file * Run files with right mouse click * Implemented copying via coreutils rather than internal python code * Improved handling of unicode * Some restructuration of the source code # 2010-12-13: Version 1.2.3 * Enable binding to alt-keys * Fixed memory leak in garbage collecting of old, unused directory objects * Fixed python3 incompatibilities * Fixed problems with identifying changes of files * Fixed lazy lookup of some FSObject attributes # 2010-10-10: Version 1.2.2 * Prevent currently used directories from being garbage collected * Disable mouse buttons when console is open * Fixed :cd command: Without arguments, cd's into $HOME * Fixed bug which prevented pydoc to work on some config files * Fixed some bugs in `snow` and `jungle` colorschemes * Several other clean-ups and fixes # 2010-09-16: Version 1.2.1 * Fixed yy/pp bug when yanking multiple directories # 2010-09-13: Version 1.2.0 * !!! Changed the default configuration directory to ~/.config/ranger !!! * Removed `Console Modes`, each old mode is now a simple command * Disabled file previews by default if ranger is used by root * Allow to jump to specific help sections by typing two numbers, e.g. 13? * Added keys: da, dr, ya, yr for adding and removing files from copy buffer * Added keys: gl and gL to resolve links, see 11? * Added key: pL to create a relative symlink * Added %<LETTER> and %<N><LETTER> macros for the console, see 33? * Fixed ansi codes for colors in the pager * Use the file ~/.mime.types for mime type detection * Several clean-ups and fixes # 2010-07-17: Version 1.1.2 * Fix crash when using scrollwheel to scroll down in some cases * The command `ranger dir1 dir2 ...` opens multiple directories in tabs * Removed pydoc html documentation by default, re-create it with `make doc` * Minor fixes # 2010-06-18: Version 1.1.1 * New install script, `setup.py` * New flag for running programs: `w` (waits for enter press) * Minor fixes # 2010-06-09: Version 1.1.0 * Added a man page * Tab support * Improved directory loading performance * Commands are definable in ~/.ranger/commands.py * Case insensitive sorting (type zs) * Better UTF support * Possibility to turn off previews (zp and zP) * Changing options with :set (e.g. `:set column_ratios=1,2,3,4`) * Ask for confirmation when using :delete * New invocation flag: --fail-unless-cd * New hotkeys, commands, options. * New syntax for ~/.ranger/keys.py * Several user contributions * And tons of general improvements NOTE: The syntax for configuration is still subject to change.