swayfx/common/util.c
Geoff Greer 6e3046878d Add support for manually setting subpixel hinting on outputs.
Many laptop screens report unknown subpixel order. Allow users to manually set subpixel hinting to work around this.

Addresses https://github.com/swaywm/sway/issues/3163
2019-03-24 09:37:24 +02:00

78 lines
1.8 KiB
C

#define _POSIX_C_SOURCE 200809L
#include <float.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <wayland-server-protocol.h>
#include "log.h"
#include "util.h"
int wrap(int i, int max) {
return ((i % max) + max) % max;
}
uint32_t parse_color(const char *color) {
if (color[0] == '#') {
++color;
}
int len = strlen(color);
if (len != 6 && len != 8) {
sway_log(SWAY_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color);
return 0xFFFFFFFF;
}
uint32_t res = (uint32_t)strtoul(color, NULL, 16);
if (strlen(color) == 6) {
res = (res << 8) | 0xFF;
}
return res;
}
bool parse_boolean(const char *boolean, bool current) {
if (strcasecmp(boolean, "1") == 0
|| strcasecmp(boolean, "yes") == 0
|| strcasecmp(boolean, "on") == 0
|| strcasecmp(boolean, "true") == 0
|| strcasecmp(boolean, "enable") == 0
|| strcasecmp(boolean, "enabled") == 0
|| strcasecmp(boolean, "active") == 0) {
return true;
} else if (strcasecmp(boolean, "toggle") == 0) {
return !current;
}
// All other values are false to match i3
return false;
}
float parse_float(const char *value) {
errno = 0;
char *end;
float flt = strtof(value, &end);
if (*end || errno) {
sway_log(SWAY_DEBUG, "Invalid float value '%s', defaulting to NAN", value);
return NAN;
}
return flt;
}
const char *sway_wl_output_subpixel_to_string(enum wl_output_subpixel subpixel) {
switch (subpixel) {
case WL_OUTPUT_SUBPIXEL_UNKNOWN:
return "unknown";
case WL_OUTPUT_SUBPIXEL_NONE:
return "none";
case WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB:
return "rgb";
case WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR:
return "bgr";
case WL_OUTPUT_SUBPIXEL_VERTICAL_RGB:
return "vrgb";
case WL_OUTPUT_SUBPIXEL_VERTICAL_BGR:
return "vbgr";
}
sway_assert(false, "Unknown value for wl_output_subpixel.");
return NULL;
}