mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-26 12:27:52 +00:00
Merge branch 'master' into imlib2
This commit is contained in:
commit
80aaadb48f
@ -1,3 +1,7 @@
|
|||||||
|
2009-05-09
|
||||||
|
* Allow the use of '#' for comments within text area (can be escaped with
|
||||||
|
'\#'
|
||||||
|
|
||||||
2009-05-07
|
2009-05-07
|
||||||
* Fix occasional cpubar segfaults
|
* Fix occasional cpubar segfaults
|
||||||
* Added top_name_width config option
|
* Added top_name_width config option
|
||||||
|
@ -617,8 +617,15 @@ dnl Check for OpenMP support
|
|||||||
dnl
|
dnl
|
||||||
|
|
||||||
AX_OPENMP([
|
AX_OPENMP([
|
||||||
AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])
|
gcc_version=`$CC -dumpversion`
|
||||||
CFLAGS="$CFLAGS $OPENMP_CFLAGS"
|
gcc_major=`echo $gcc_version | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
|
||||||
|
gcc_minor=`echo $gcc_version | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
|
||||||
|
dnl check that the gcc version is >=4.3, if we're using gcc
|
||||||
|
if test ! "x$GCC" = "xyes" -o $gcc_major -ge 4 -a $gcc_minor -ge 3; then
|
||||||
|
AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])
|
||||||
|
CFLAGS="$CFLAGS $OPENMP_CFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
|
242
src/conky.c
242
src/conky.c
@ -245,6 +245,9 @@ enum alignment {
|
|||||||
NONE
|
NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* display to connect to */
|
||||||
|
static char *disp = NULL;
|
||||||
|
|
||||||
#endif /* X11 */
|
#endif /* X11 */
|
||||||
|
|
||||||
/* struct that has all info to be shared between
|
/* struct that has all info to be shared between
|
||||||
@ -254,9 +257,6 @@ struct information info;
|
|||||||
/* default config file */
|
/* default config file */
|
||||||
static char *current_config;
|
static char *current_config;
|
||||||
|
|
||||||
/* display to connect to */
|
|
||||||
static char *disp = NULL;
|
|
||||||
|
|
||||||
/* set to 1 if you want all text to be in uppercase */
|
/* set to 1 if you want all text to be in uppercase */
|
||||||
static unsigned int stuff_in_upper_case;
|
static unsigned int stuff_in_upper_case;
|
||||||
|
|
||||||
@ -2598,6 +2598,12 @@ static struct text_object *create_plain_text(const char *s)
|
|||||||
{
|
{
|
||||||
struct text_object *obj;
|
struct text_object *obj;
|
||||||
|
|
||||||
|
char *esc = strstr(s, "\\#");
|
||||||
|
if (esc) {
|
||||||
|
/* remove extra '\' */
|
||||||
|
strcpy(esc, esc + 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (s == NULL || *s == '\0') {
|
if (s == NULL || *s == '\0') {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2819,6 +2825,12 @@ static int extract_variable_text_internal(struct text_object *retval, const char
|
|||||||
if (*p == '\n') {
|
if (*p == '\n') {
|
||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
|
/* handle comments within the TEXT area */
|
||||||
|
if (*p == '#' && (p == orig_p || *(p - 1) != '\\')) {
|
||||||
|
while (*p && *p != '\n') p++;
|
||||||
|
s = p;
|
||||||
|
line++;
|
||||||
|
}
|
||||||
if (*p == '$') {
|
if (*p == '$') {
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
obj = create_plain_text(s);
|
obj = create_plain_text(s);
|
||||||
@ -6532,6 +6544,7 @@ static void set_default_configurations_for_x(void)
|
|||||||
|
|
||||||
static void set_default_configurations(void)
|
static void set_default_configurations(void)
|
||||||
{
|
{
|
||||||
|
update_uname();
|
||||||
fork_to_background = 0;
|
fork_to_background = 0;
|
||||||
total_run_times = 0;
|
total_run_times = 0;
|
||||||
info.cpu_avg_samples = 2;
|
info.cpu_avg_samples = 2;
|
||||||
@ -6591,7 +6604,6 @@ static void set_default_configurations(void)
|
|||||||
window.type = TYPE_NORMAL;
|
window.type = TYPE_NORMAL;
|
||||||
window.hints = 0;
|
window.hints = 0;
|
||||||
strcpy(window.class_name, PACKAGE_NAME);
|
strcpy(window.class_name, PACKAGE_NAME);
|
||||||
update_uname();
|
|
||||||
sprintf(window.title, PACKAGE_NAME" (%s)", info.uname_s.nodename);
|
sprintf(window.title, PACKAGE_NAME" (%s)", info.uname_s.nodename);
|
||||||
#endif
|
#endif
|
||||||
stippled_borders = 0;
|
stippled_borders = 0;
|
||||||
@ -6657,86 +6669,104 @@ static void X11_initialisation(void)
|
|||||||
}
|
}
|
||||||
#endif /* X11 */
|
#endif /* X11 */
|
||||||
|
|
||||||
static void load_config_file(const char *f)
|
|
||||||
{
|
|
||||||
#define CONF_ERR ERR("%s: %d: config file error", f, line)
|
#define CONF_ERR ERR("%s: %d: config file error", f, line)
|
||||||
#define CONF_ERR2(a) ERR("%s: %d: config file error: %s", f, line, a)
|
#define CONF_ERR2(a) ERR("%s: %d: config file error: %s", f, line, a)
|
||||||
|
#define CONF2(a) if (strcasecmp(name, a) == 0)
|
||||||
|
#define CONF(a) else CONF2(a)
|
||||||
|
#define CONF3(a, b) else if (strcasecmp(name, a) == 0 \
|
||||||
|
|| strcasecmp(name, b) == 0)
|
||||||
|
#define CONF_CONTINUE 1
|
||||||
|
#define CONF_BREAK 2
|
||||||
|
#define CONF_BUFF_SIZE 512
|
||||||
|
|
||||||
|
static FILE *open_config_file(const char *f)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_OUTPUT
|
||||||
|
if (!strcmp(f, "==builtin==")) {
|
||||||
|
#ifdef HAVE_FOPENCOOKIE
|
||||||
|
return fopencookie(NULL, "r", conf_cookie);
|
||||||
|
#endif /* HAVE_FOPENCOOKIE */
|
||||||
|
} else
|
||||||
|
#endif /* CONFIG_OUTPUT */
|
||||||
|
return fopen(f, "r");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_config_step(int *line, FILE *fp, char *buf, char **name, char **value)
|
||||||
|
{
|
||||||
|
char *p, *p2;
|
||||||
|
(*line)++;
|
||||||
|
if (fgets(buf, CONF_BUFF_SIZE, fp) == NULL) {
|
||||||
|
return CONF_BREAK;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = buf;
|
||||||
|
|
||||||
|
/* break at comment, unless preceeded by \ */
|
||||||
|
p2 = strchr(p, '#');
|
||||||
|
if (p2 && (p2 == p || *(p2 - 1) != '\\')) {
|
||||||
|
*p2 = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip spaces */
|
||||||
|
while (*p && isspace((int) *p)) {
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (*p == '\0') {
|
||||||
|
return CONF_CONTINUE; /* empty line */
|
||||||
|
}
|
||||||
|
|
||||||
|
*name = p;
|
||||||
|
|
||||||
|
/* skip name */
|
||||||
|
p2 = p;
|
||||||
|
while (*p2 && !isspace((int) *p2)) {
|
||||||
|
p2++;
|
||||||
|
}
|
||||||
|
if (*p2 != '\0') {
|
||||||
|
*p2 = '\0'; /* break at name's end */
|
||||||
|
p2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get value */
|
||||||
|
if (*p2) {
|
||||||
|
p = p2;
|
||||||
|
while (*p && isspace((int) *p)) {
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = p;
|
||||||
|
|
||||||
|
p2 = *value + strlen(*value);
|
||||||
|
while (isspace((int) *(p2 - 1))) {
|
||||||
|
*--p2 = '\0';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*value = 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void load_config_file(const char *f)
|
||||||
|
{
|
||||||
int line = 0;
|
int line = 0;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
set_default_configurations();
|
set_default_configurations();
|
||||||
#ifdef CONFIG_OUTPUT
|
fp = open_config_file(f);
|
||||||
if (!strcmp(f, "==builtin==")) {
|
|
||||||
#ifdef HAVE_FOPENCOOKIE
|
|
||||||
fp = fopencookie(NULL, "r", conf_cookie);
|
|
||||||
#endif
|
|
||||||
} else
|
|
||||||
#endif /* CONFIG_OUTPUT */
|
|
||||||
fp = fopen(f, "r");
|
|
||||||
|
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DBGP("reading contents from config file '%s'", f);
|
DBGP("reading contents from config file '%s'", f);
|
||||||
|
|
||||||
while (!feof(fp)) {
|
while (!feof(fp)) {
|
||||||
char buf[256], *p, *p2, *name, *value;
|
char buff[CONF_BUFF_SIZE], *name, *value;
|
||||||
|
int ret = do_config_step(&line, fp, buff, &name, &value);
|
||||||
line++;
|
if (ret == CONF_BREAK) {
|
||||||
if (fgets(buf, 256, fp) == NULL) {
|
|
||||||
break;
|
break;
|
||||||
|
} else if (ret == CONF_CONTINUE) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = buf;
|
|
||||||
|
|
||||||
/* break at comment */
|
|
||||||
p2 = strchr(p, '#');
|
|
||||||
if (p2) {
|
|
||||||
*p2 = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip spaces */
|
|
||||||
while (*p && isspace((int) *p)) {
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
if (*p == '\0') {
|
|
||||||
continue; /* empty line */
|
|
||||||
}
|
|
||||||
|
|
||||||
name = p;
|
|
||||||
|
|
||||||
/* skip name */
|
|
||||||
p2 = p;
|
|
||||||
while (*p2 && !isspace((int) *p2)) {
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
if (*p2 != '\0') {
|
|
||||||
*p2 = '\0'; /* break at name's end */
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get value */
|
|
||||||
if (*p2) {
|
|
||||||
p = p2;
|
|
||||||
while (*p && isspace((int) *p)) {
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = p;
|
|
||||||
|
|
||||||
p2 = value + strlen(value);
|
|
||||||
while (isspace((int) *(p2 - 1))) {
|
|
||||||
*--p2 = '\0';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
value = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CONF2(a) if (strcasecmp(name, a) == 0)
|
|
||||||
#define CONF(a) else CONF2(a)
|
|
||||||
#define CONF3(a, b) else if (strcasecmp(name, a) == 0 \
|
|
||||||
|| strcasecmp(name, b) == 0)
|
|
||||||
|
|
||||||
#ifdef X11
|
#ifdef X11
|
||||||
CONF2("out_to_x") {
|
CONF2("out_to_x") {
|
||||||
/* don't listen if X is already initialised or
|
/* don't listen if X is already initialised or
|
||||||
@ -7299,8 +7329,9 @@ static void load_config_file(const char *f)
|
|||||||
while (!feof(fp)) {
|
while (!feof(fp)) {
|
||||||
unsigned int l = strlen(global_text);
|
unsigned int l = strlen(global_text);
|
||||||
unsigned int bl;
|
unsigned int bl;
|
||||||
|
char buf[CONF_BUFF_SIZE];
|
||||||
|
|
||||||
if (fgets(buf, 256, fp) == NULL) {
|
if (fgets(buf, CONF_BUFF_SIZE, fp) == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7429,71 +7460,19 @@ static void load_config_file_x11(const char *f)
|
|||||||
int line = 0;
|
int line = 0;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
#ifdef CONFIG_OUTPUT
|
fp = open_config_file(f);
|
||||||
if (!strcmp(f, "==builtin==")) {
|
|
||||||
#ifdef HAVE_FOPENCOOKIE
|
|
||||||
fp = fopencookie(NULL, "r", conf_cookie);
|
|
||||||
#endif
|
|
||||||
} else
|
|
||||||
#endif /* CONFIG_OUTPUT */
|
|
||||||
fp = fopen(f, "r");
|
|
||||||
|
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DBGP("reading contents from config file '%s'", f);
|
DBGP("reading contents from config file '%s'", f);
|
||||||
|
|
||||||
while (!feof(fp)) {
|
while (!feof(fp)) {
|
||||||
char buf[256], *p, *p2, *name, *value;
|
char buff[CONF_BUFF_SIZE], *name, *value;
|
||||||
|
int ret = do_config_step(&line, fp, buff, &name, &value);
|
||||||
line++;
|
if (ret == CONF_BREAK) {
|
||||||
if (fgets(buf, 256, fp) == NULL) {
|
|
||||||
break;
|
break;
|
||||||
}
|
} else if (ret == CONF_CONTINUE) {
|
||||||
|
continue;
|
||||||
p = buf;
|
|
||||||
|
|
||||||
/* break at comment */
|
|
||||||
p2 = strchr(p, '#');
|
|
||||||
if (p2) {
|
|
||||||
*p2 = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip spaces */
|
|
||||||
while (*p && isspace((int) *p)) {
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
if (*p == '\0') {
|
|
||||||
continue; /* empty line */
|
|
||||||
}
|
|
||||||
|
|
||||||
name = p;
|
|
||||||
|
|
||||||
/* skip name */
|
|
||||||
p2 = p;
|
|
||||||
while (*p2 && !isspace((int) *p2)) {
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
if (*p2 != '\0') {
|
|
||||||
*p2 = '\0'; /* break at name's end */
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get value */
|
|
||||||
if (*p2) {
|
|
||||||
p = p2;
|
|
||||||
while (*p && isspace((int) *p)) {
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = p;
|
|
||||||
|
|
||||||
p2 = value + strlen(value);
|
|
||||||
while (isspace((int) *(p2 - 1))) {
|
|
||||||
*--p2 = '\0';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
value = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef X11
|
#ifdef X11
|
||||||
@ -7649,11 +7628,16 @@ static void load_config_file_x11(const char *f)
|
|||||||
#endif /* X11 */
|
#endif /* X11 */
|
||||||
#undef CONF
|
#undef CONF
|
||||||
#undef CONF2
|
#undef CONF2
|
||||||
|
#undef CONF3
|
||||||
|
#undef CONF_ERR
|
||||||
|
#undef CONF_ERR2
|
||||||
|
#undef CONF_BREAK
|
||||||
|
#undef CONF_CONTINUE
|
||||||
|
#undef CONF_BUFF_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
#undef CONF_ERR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_help(const char *prog_name) {
|
static void print_help(const char *prog_name) {
|
||||||
|
@ -277,9 +277,9 @@ struct mail_s *parse_mail_args(char type, const char *arg)
|
|||||||
if (sscanf(arg, "%128s %128s %128s", mail->host, mail->user, mail->pass)
|
if (sscanf(arg, "%128s %128s %128s", mail->host, mail->user, mail->pass)
|
||||||
!= 3) {
|
!= 3) {
|
||||||
if (type == POP3_TYPE) {
|
if (type == POP3_TYPE) {
|
||||||
ERR("Scanning IMAP args failed");
|
|
||||||
} else if (type == IMAP_TYPE) {
|
|
||||||
ERR("Scanning POP3 args failed");
|
ERR("Scanning POP3 args failed");
|
||||||
|
} else if (type == IMAP_TYPE) {
|
||||||
|
ERR("Scanning IMAP args failed");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -206,27 +206,41 @@ static struct special_t *new_special(char *buf, enum special_types t)
|
|||||||
|
|
||||||
void new_gauge(char *buf, int w, int h, int usage)
|
void new_gauge(char *buf, int w, int h, int usage)
|
||||||
{
|
{
|
||||||
struct special_t *s = new_special(buf, GAUGE);
|
#ifdef X11
|
||||||
|
struct special_t *s = 0;
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = new_special(buf, GAUGE);
|
||||||
|
|
||||||
s->arg = (usage > 255) ? 255 : ((usage < 0) ? 0 : usage);
|
s->arg = (usage > 255) ? 255 : ((usage < 0) ? 0 : usage);
|
||||||
s->width = w;
|
s->width = w;
|
||||||
s->height = h;
|
s->height = h;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_bar(char *buf, int w, int h, int usage)
|
void new_bar(char *buf, int w, int h, int usage)
|
||||||
{
|
{
|
||||||
struct special_t *s = new_special(buf, BAR);
|
#ifdef X11
|
||||||
|
struct special_t *s = 0;
|
||||||
|
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = new_special(buf, BAR);
|
||||||
|
|
||||||
s->arg = (usage > 255) ? 255 : ((usage < 0) ? 0 : usage);
|
s->arg = (usage > 255) ? 255 : ((usage < 0) ? 0 : usage);
|
||||||
s->width = w;
|
s->width = w;
|
||||||
s->height = h;
|
s->height = h;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_font(char *buf, char *args)
|
void new_font(char *buf, char *args)
|
||||||
{
|
{
|
||||||
|
#ifdef X11
|
||||||
if ((output_methods & TO_X) == 0)
|
if ((output_methods & TO_X) == 0)
|
||||||
return;
|
return;
|
||||||
#ifdef X11
|
|
||||||
if (args) {
|
if (args) {
|
||||||
struct special_t *s = new_special(buf, FONT);
|
struct special_t *s = new_special(buf, FONT);
|
||||||
|
|
||||||
@ -284,7 +298,13 @@ static void graph_append(struct special_t *graph, double f, char showaslog)
|
|||||||
void new_graph(char *buf, int w, int h, unsigned int first_colour,
|
void new_graph(char *buf, int w, int h, unsigned int first_colour,
|
||||||
unsigned int second_colour, double i, int scale, int append, char showaslog)
|
unsigned int second_colour, double i, int scale, int append, char showaslog)
|
||||||
{
|
{
|
||||||
struct special_t *s = new_special(buf, GRAPH);
|
#ifdef X11
|
||||||
|
struct special_t *s = 0;
|
||||||
|
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = new_special(buf, GRAPH);
|
||||||
|
|
||||||
s->width = w;
|
s->width = w;
|
||||||
if (s->graph == NULL) {
|
if (s->graph == NULL) {
|
||||||
@ -321,29 +341,52 @@ void new_graph(char *buf, int w, int h, unsigned int first_colour,
|
|||||||
if (append) {
|
if (append) {
|
||||||
graph_append(s, i, showaslog);
|
graph_append(s, i, showaslog);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_hr(char *buf, int a)
|
void new_hr(char *buf, int a)
|
||||||
{
|
{
|
||||||
|
#ifdef X11
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
new_special(buf, HORIZONTAL_LINE)->height = a;
|
new_special(buf, HORIZONTAL_LINE)->height = a;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_stippled_hr(char *buf, int a, int b)
|
void new_stippled_hr(char *buf, int a, int b)
|
||||||
{
|
{
|
||||||
struct special_t *s = new_special(buf, STIPPLED_HR);
|
#ifdef X11
|
||||||
|
struct special_t *s = 0;
|
||||||
|
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = new_special(buf, STIPPLED_HR);
|
||||||
|
|
||||||
s->height = b;
|
s->height = b;
|
||||||
s->arg = a;
|
s->arg = a;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_fg(char *buf, long c)
|
void new_fg(char *buf, long c)
|
||||||
{
|
{
|
||||||
|
#ifdef X11
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
new_special(buf, FG)->arg = c;
|
new_special(buf, FG)->arg = c;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_bg(char *buf, long c)
|
void new_bg(char *buf, long c)
|
||||||
{
|
{
|
||||||
|
#ifdef X11
|
||||||
|
if ((output_methods & TO_X) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
new_special(buf, BG)->arg = c;
|
new_special(buf, BG)->arg = c;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_outline(char *buf, long c)
|
void new_outline(char *buf, long c)
|
||||||
|
Loading…
Reference in New Issue
Block a user