Removal of bootmagic lite terminology (#22979)
This commit is contained in:
parent
5383335717
commit
e2dbe39b94
@ -36,10 +36,10 @@
|
|||||||
"BACKLIGHT_DEFAULT_LEVEL": {"info_key": "backlight.default.brightness", "value_type": "int"},
|
"BACKLIGHT_DEFAULT_LEVEL": {"info_key": "backlight.default.brightness", "value_type": "int"},
|
||||||
|
|
||||||
// Bootmagic
|
// Bootmagic
|
||||||
"BOOTMAGIC_LITE_COLUMN": {"info_key": "bootmagic.matrix.1", "value_type": "int"},
|
"BOOTMAGIC_COLUMN": {"info_key": "bootmagic.matrix.1", "value_type": "int"},
|
||||||
"BOOTMAGIC_LITE_COLUMN_RIGHT": {"info_key": "split.bootmagic.matrix.1", "value_type": "int"},
|
"BOOTMAGIC_COLUMN_RIGHT": {"info_key": "split.bootmagic.matrix.1", "value_type": "int"},
|
||||||
"BOOTMAGIC_LITE_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"},
|
"BOOTMAGIC_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"},
|
||||||
"BOOTMAGIC_LITE_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"},
|
"BOOTMAGIC_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"},
|
||||||
|
|
||||||
// Caps Word
|
// Caps Word
|
||||||
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "flag"},
|
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "flag"},
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# Bootmagic Lite :id=bootmagic-lite
|
# Bootmagic :id=bootmagic
|
||||||
|
|
||||||
The Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button, giving you a way to jump into the bootloader
|
The Bootmagic feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button, giving you a way to jump into the bootloader
|
||||||
|
|
||||||
On some keyboards Bootmagic Lite is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with:
|
On some keyboards Bootmagic is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with:
|
||||||
|
|
||||||
```make
|
```make
|
||||||
BOOTMAGIC_ENABLE = yes
|
BOOTMAGIC_ENABLE = yes
|
||||||
@ -11,15 +11,15 @@ BOOTMAGIC_ENABLE = yes
|
|||||||
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
|
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW 0
|
#define BOOTMAGIC_ROW 0
|
||||||
#define BOOTMAGIC_LITE_COLUMN 1
|
#define BOOTMAGIC_COLUMN 1
|
||||||
```
|
```
|
||||||
|
|
||||||
By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards.
|
By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards.
|
||||||
|
|
||||||
And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key.
|
And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key.
|
||||||
|
|
||||||
!> Using Bootmagic Lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
|
!> Using Bootmagic will **always reset** the EEPROM, so you will lose any settings that have been saved.
|
||||||
|
|
||||||
## Split Keyboards
|
## Split Keyboards
|
||||||
|
|
||||||
@ -44,35 +44,35 @@ When [handedness](feature_split_keyboard.md#setting-handedness) is predetermined
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic Lite trigger, add these entries to your `config.h` file:
|
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
#define BOOTMAGIC_ROW_RIGHT 4
|
||||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 4
|
#define BOOTMAGIC_COLUMN_RIGHT 4
|
||||||
```
|
```
|
||||||
|
|
||||||
?> These values are not set by default.
|
?> These values are not set by default.
|
||||||
|
|
||||||
## Advanced Bootmagic Lite
|
## Advanced Bootmagic
|
||||||
|
|
||||||
The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
|
The `bootmagic_scan` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
|
||||||
|
|
||||||
To replace the function, all you need to do is add something like this to your code:
|
To replace the function, all you need to do is add something like this to your code:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void bootmagic_lite(void) {
|
void bootmagic_scan(void) {
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
wait_ms(DEBOUNCE * 2);
|
wait_ms(DEBOUNCE * 2);
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
|
|
||||||
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
|
if (matrix_get_row(BOOTMAGIC_ROW) & (1 << BOOTMAGIC_COLUMN)) {
|
||||||
// Jump to bootloader.
|
// Jump to bootloader.
|
||||||
bootloader_jump();
|
bootloader_jump();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can define additional logic here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic Lite. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
|
You can define additional logic here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic. Keep in mind that `bootmagic_scan` is called before a majority of features are initialized in the firmware.
|
||||||
|
|
||||||
## Addenda
|
## Addenda
|
||||||
|
|
||||||
|
@ -139,8 +139,8 @@ BOOTMAGIC_ENABLE = lite
|
|||||||
さらに、どのキーを使うかを指定したほうが良いかもしれません。これは普通ではないマトリックスを持つキーボードで特に便利です。そのためには、使いたいキーの行と列を指定する必要があります。`config.h` ファイルにこれらのエントリを追加します:
|
さらに、どのキーを使うかを指定したほうが良いかもしれません。これは普通ではないマトリックスを持つキーボードで特に便利です。そのためには、使いたいキーの行と列を指定する必要があります。`config.h` ファイルにこれらのエントリを追加します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW 0
|
#define BOOTMAGIC_ROW 0
|
||||||
#define BOOTMAGIC_LITE_COLUMN 1
|
#define BOOTMAGIC_COLUMN 1
|
||||||
```
|
```
|
||||||
|
|
||||||
デフォルトでは、これらは 0 と 0 に設定されます。これは通常はほとんどのキーボードで "ESC" キーです。
|
デフォルトでは、これらは 0 と 0 に設定されます。これは通常はほとんどのキーボードで "ESC" キーです。
|
||||||
@ -154,8 +154,8 @@ BOOTMAGIC_ENABLE = lite
|
|||||||
`SPLIT_HAND_PIN` のようなオプションで、左右の設定があらかじめ決められている場合は、キーボードの左右で別のキーを設定する必要があるかもしれません。これを行うには、`config.h` ファイルに以下のエントリを追加します。
|
`SPLIT_HAND_PIN` のようなオプションで、左右の設定があらかじめ決められている場合は、キーボードの左右で別のキーを設定する必要があるかもしれません。これを行うには、`config.h` ファイルに以下のエントリを追加します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
#define BOOTMAGIC_ROW_RIGHT 4
|
||||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
#define BOOTMAGIC_COLUMN_RIGHT 1
|
||||||
```
|
```
|
||||||
|
|
||||||
デフォルトでは、これらの値は設定されていません。
|
デフォルトでは、これらの値は設定されていません。
|
||||||
@ -172,7 +172,7 @@ void bootmagic_lite(void) {
|
|||||||
wait_ms(DEBOUNCE * 2);
|
wait_ms(DEBOUNCE * 2);
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
|
|
||||||
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
|
if (matrix_get_row(BOOTMAGIC_ROW) & (1 << BOOTMAGIC_COLUMN)) {
|
||||||
// ブートローダにジャンプする。
|
// ブートローダにジャンプする。
|
||||||
bootloader_jump();
|
bootloader_jump();
|
||||||
}
|
}
|
||||||
|
@ -16,18 +16,18 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef BOOTMAGIC_LITE_ROW
|
#ifndef BOOTMAGIC_ROW
|
||||||
# define BOOTMAGIC_LITE_ROW 0
|
# define BOOTMAGIC_ROW 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN
|
#ifndef BOOTMAGIC_COLUMN
|
||||||
# define BOOTMAGIC_LITE_COLUMN 1
|
# define BOOTMAGIC_COLUMN 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOOTMAGIC_LITE_ROW_RIGHT
|
#ifndef BOOTMAGIC_ROW_RIGHT
|
||||||
# define BOOTMAGIC_LITE_ROW_RIGHT 4
|
# define BOOTMAGIC_ROW_RIGHT 4
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN_RIGHT
|
#ifndef BOOTMAGIC_COLUMN_RIGHT
|
||||||
# define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
# define BOOTMAGIC_COLUMN_RIGHT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
@ -24,7 +24,7 @@ void matrix_scan_sub_kb(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((weak)) void bootmagic_lite(void) {
|
__attribute__((weak)) void bootmagic_scan(void) {
|
||||||
// We need multiple scans because debouncing can't be turned off.
|
// We need multiple scans because debouncing can't be turned off.
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
#if defined(DEBOUNCE) && DEBOUNCE > 0
|
#if defined(DEBOUNCE) && DEBOUNCE > 0
|
||||||
@ -34,13 +34,13 @@ __attribute__((weak)) void bootmagic_lite(void) {
|
|||||||
#endif
|
#endif
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
|
|
||||||
uint8_t row = BOOTMAGIC_LITE_ROW;
|
uint8_t row = BOOTMAGIC_ROW;
|
||||||
uint8_t col = BOOTMAGIC_LITE_COLUMN;
|
uint8_t col = BOOTMAGIC_COLUMN;
|
||||||
|
|
||||||
#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_LITE_ROW_RIGHT) && defined(BOOTMAGIC_LITE_COLUMN_RIGHT)
|
#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_ROW_RIGHT) && defined(BOOTMAGIC_COLUMN_RIGHT)
|
||||||
if (!is_keyboard_left()) {
|
if (!is_keyboard_left()) {
|
||||||
row = BOOTMAGIC_LITE_ROW_RIGHT;
|
row = BOOTMAGIC_ROW_RIGHT;
|
||||||
col = BOOTMAGIC_LITE_COLUMN_RIGHT;
|
col = BOOTMAGIC_COLUMN_RIGHT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2,18 +2,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef BOOTMAGIC_LITE_ROW
|
#ifndef BOOTMAGIC_ROW
|
||||||
# define BOOTMAGIC_LITE_ROW 0
|
# define BOOTMAGIC_ROW 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN
|
#ifndef BOOTMAGIC_COLUMN
|
||||||
# define BOOTMAGIC_LITE_COLUMN 1
|
# define BOOTMAGIC_COLUMN 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOOTMAGIC_LITE_ROW_RIGHT
|
#ifndef BOOTMAGIC_ROW_RIGHT
|
||||||
# define BOOTMAGIC_LITE_ROW_RIGHT 4
|
# define BOOTMAGIC_ROW_RIGHT 4
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN_RIGHT
|
#ifndef BOOTMAGIC_COLUMN_RIGHT
|
||||||
# define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
# define BOOTMAGIC_COLUMN_RIGHT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
// Top left for left side is default in core
|
// Top left for left side is default in core
|
||||||
|
|
||||||
// Top right for right side
|
// Top right for right side
|
||||||
#ifndef BOOTMAGIC_LITE_ROW_RIGHT
|
#ifndef BOOTMAGIC_ROW_RIGHT
|
||||||
# define BOOTMAGIC_LITE_ROW_RIGHT 5
|
# define BOOTMAGIC_ROW_RIGHT 5
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN_RIGHT
|
#ifndef BOOTMAGIC_COLUMN_RIGHT
|
||||||
# define BOOTMAGIC_LITE_COLUMN_RIGHT 0
|
# define BOOTMAGIC_COLUMN_RIGHT 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,5 +18,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#pragma once
|
#pragma once
|
||||||
// Alternate boot pins for accessing the bootloader,
|
// Alternate boot pins for accessing the bootloader,
|
||||||
// since the boot switch is blocked by the OLED.
|
// since the boot switch is blocked by the OLED.
|
||||||
#define BOOTMAGIC_LITE_ROW 1
|
#define BOOTMAGIC_ROW 1
|
||||||
#define BOOTMAGIC_LITE_COLUMN 2
|
#define BOOTMAGIC_COLUMN 2
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "usb_main.h"
|
#include "usb_main.h"
|
||||||
#include "phoenix.h"
|
#include "phoenix.h"
|
||||||
|
|
||||||
void bootmagic_lite(void) {
|
void bootmagic_scan(void) {
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
wait_ms(5);
|
wait_ms(5);
|
||||||
matrix_scan();
|
matrix_scan();
|
||||||
|
@ -20,44 +20,54 @@
|
|||||||
#include "eeconfig.h"
|
#include "eeconfig.h"
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
|
#ifndef BOOTMAGIC_DEBOUNCE
|
||||||
|
# if defined(DEBOUNCE) && DEBOUNCE > 0
|
||||||
|
# define BOOTMAGIC_DEBOUNCE (DEBOUNCE * 2)
|
||||||
|
# else
|
||||||
|
# define BOOTMAGIC_DEBOUNCE 30
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/** \brief Reset eeprom
|
/** \brief Reset eeprom
|
||||||
*
|
*
|
||||||
* ...just incase someone wants to only change the eeprom behaviour
|
* ...just incase someone wants to only change the eeprom behaviour
|
||||||
*/
|
*/
|
||||||
__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) {
|
__attribute__((weak)) void bootmagic_reset_eeprom(void) {
|
||||||
eeconfig_disable();
|
eeconfig_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief The lite version of TMK's bootmagic based on Wilba.
|
/** \brief Decide reboot based on current matrix state
|
||||||
*
|
|
||||||
* 100% less potential for accidentally making the keyboard do stupid things.
|
|
||||||
*/
|
*/
|
||||||
__attribute__((weak)) void bootmagic_lite(void) {
|
__attribute__((weak)) bool bootmagic_should_reset(void) {
|
||||||
// We need multiple scans because debouncing can't be turned off.
|
|
||||||
matrix_scan();
|
|
||||||
#if defined(DEBOUNCE) && DEBOUNCE > 0
|
|
||||||
wait_ms(DEBOUNCE * 2);
|
|
||||||
#else
|
|
||||||
wait_ms(30);
|
|
||||||
#endif
|
|
||||||
matrix_scan();
|
|
||||||
|
|
||||||
// If the configured key (commonly Esc) is held down on power up,
|
// If the configured key (commonly Esc) is held down on power up,
|
||||||
// reset the EEPROM valid state and jump to bootloader.
|
// reset the EEPROM valid state and jump to bootloader.
|
||||||
// This isn't very generalized, but we need something that doesn't
|
// This isn't very generalized, but we need something that doesn't
|
||||||
// rely on user's keymaps in firmware or EEPROM.
|
// rely on user's keymaps in firmware or EEPROM.
|
||||||
uint8_t row = BOOTMAGIC_LITE_ROW;
|
uint8_t row = BOOTMAGIC_ROW;
|
||||||
uint8_t col = BOOTMAGIC_LITE_COLUMN;
|
uint8_t col = BOOTMAGIC_COLUMN;
|
||||||
|
|
||||||
#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_LITE_ROW_RIGHT) && defined(BOOTMAGIC_LITE_COLUMN_RIGHT)
|
#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_ROW_RIGHT) && defined(BOOTMAGIC_COLUMN_RIGHT)
|
||||||
if (!is_keyboard_left()) {
|
if (!is_keyboard_left()) {
|
||||||
row = BOOTMAGIC_LITE_ROW_RIGHT;
|
row = BOOTMAGIC_ROW_RIGHT;
|
||||||
col = BOOTMAGIC_LITE_COLUMN_RIGHT;
|
col = BOOTMAGIC_COLUMN_RIGHT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (matrix_get_row(row) & (1 << col)) {
|
return matrix_get_row(row) & (1 << col);
|
||||||
bootmagic_lite_reset_eeprom();
|
}
|
||||||
|
|
||||||
|
/** \brief The abridged version of TMK's bootmagic based on Wilba.
|
||||||
|
*
|
||||||
|
* 100% less potential for accidentally making the keyboard do stupid things.
|
||||||
|
*/
|
||||||
|
__attribute__((weak)) void bootmagic_scan(void) {
|
||||||
|
// We need multiple scans because debouncing can't be turned off.
|
||||||
|
matrix_scan();
|
||||||
|
wait_ms(BOOTMAGIC_DEBOUNCE);
|
||||||
|
matrix_scan();
|
||||||
|
|
||||||
|
if (bootmagic_should_reset()) {
|
||||||
|
bootmagic_reset_eeprom();
|
||||||
|
|
||||||
// Jump to bootloader.
|
// Jump to bootloader.
|
||||||
bootloader_jump();
|
bootloader_jump();
|
||||||
@ -65,5 +75,5 @@ __attribute__((weak)) void bootmagic_lite(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bootmagic(void) {
|
void bootmagic(void) {
|
||||||
bootmagic_lite();
|
bootmagic_scan();
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,26 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef BOOTMAGIC_LITE_COLUMN
|
// ======== DEPRECATED DEFINES - DO NOT USE ========
|
||||||
# define BOOTMAGIC_LITE_COLUMN 0
|
#ifdef BOOTMAGIC_LITE_ROW
|
||||||
|
# define BOOTMAGIC_ROW BOOTMAGIC_LITE_ROW
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOTMAGIC_LITE_ROW
|
#ifdef BOOTMAGIC_LITE_COLUMN
|
||||||
# define BOOTMAGIC_LITE_ROW 0
|
# define BOOTMAGIC_COLUMN BOOTMAGIC_LITE_COLUMN
|
||||||
|
#endif
|
||||||
|
#ifdef BOOTMAGIC_LITE_ROW_RIGHT
|
||||||
|
# define BOOTMAGIC_ROW_RIGHT BOOTMAGIC_LITE_ROW_RIGHT
|
||||||
|
#endif
|
||||||
|
#ifdef BOOTMAGIC_LITE_COLUMN_RIGHT
|
||||||
|
# define BOOTMAGIC_COLUMN_RIGHT BOOTMAGIC_LITE_COLUMN_RIGHT
|
||||||
|
#endif
|
||||||
|
// ========
|
||||||
|
|
||||||
|
#ifndef BOOTMAGIC_COLUMN
|
||||||
|
# define BOOTMAGIC_COLUMN 0
|
||||||
|
#endif
|
||||||
|
#ifndef BOOTMAGIC_ROW
|
||||||
|
# define BOOTMAGIC_ROW 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void bootmagic(void);
|
void bootmagic(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user