Blame common.h

Ivan Mahonin 452870
#ifndef COMMON_H
Ivan Mahonin 452870
#define COMMON_H
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin dbe1a1
#include "config.h"
Ivan Mahonin dbe1a1
Ivan Mahonin dbe1a1
Ivan Mahonin 5b6cfc
#define _XOPEN_SOURCE 600
Ivan Mahonin 5b6cfc
Ivan Mahonin 5b6cfc
#include <time.h>
Ivan Mahonin 452870
#include <stdio.h>
Ivan Mahonin 452870
#include <stdlib.h>
Ivan Mahonin 843e7a
#include <string.h>
Ivan Mahonin 452870
#include <assert.h>
Ivan Mahonin 452870
Ivan Mahonin dbe1a1
#include <X11/Xlib.h>
Ivan Mahonin 8864eb
#include <X11/XKBlib.h>
Ivan Mahonin 8864eb
#include <X11/keysym.h>
Ivan Mahonin 8864eb
#include <X11/keysymdef.h>
Ivan Mahonin 5b6cfc
Ivan Mahonin 061fcf
Ivan Mahonin 452870
Ivan Mahonin 843e7a
#define COUNTOF(x) (sizeof(x)/sizeof((x)[0]))
Ivan Mahonin dbe1a1
#define CLEARFROM(x, field) memset( &((x)->field), 0, sizeof(*(x)) - ((const char *)&((x)->field) - (const char *)(x)) )
Ivan Mahonin 452870
Ivan Mahonin 452870
#define LOG(stream, prefix, suffix, result, ...) \
Ivan Mahonin 452870
  ( fputs(prefix, stream), fprintf(stream, __VA_ARGS__), fputs(suffix, stream), fflush(stream), dummy(result) )
Ivan Mahonin 452870
Ivan Mahonin 452870
#ifdef NDEBUG
Ivan Mahonin 452870
  #define LOGDBG(...) dummy(1)
Ivan Mahonin 452870
#else
Ivan Mahonin 452870
  #define LOGDBG(...) LOG(stdout, "DEBUG: ",    "\n", 1, __VA_ARGS__)
Ivan Mahonin 452870
#endif
Ivan Mahonin 452870
Ivan Mahonin 452870
#define LOGINF(...) LOG(stdout, "INFO: ",    "\n", 1, __VA_ARGS__)
Ivan Mahonin 452870
#define LOGWRN(...) LOG(stderr, "WARNING: ", "\n", 1, __VA_ARGS__)
Ivan Mahonin 452870
#define LOGERR(...) LOG(stderr, "ERROR: ",   "\n", 0, __VA_ARGS__)
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
struct App;
Ivan Mahonin 452870
typedef struct App App;
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
static inline int dummy(int i) { return i; }
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 63daec
unsigned int keysymCharcode(unsigned int keySym);
Ivan Mahonin 63daec
int keysymString(unsigned int keySym, char *buf5bytes);
Ivan Mahonin 63daec
Ivan Mahonin 63daec
Ivan Mahonin 5b6cfc
// cyclic monotonic timer
Ivan Mahonin 5b6cfc
static inline unsigned int monotonicMs() {
Ivan Mahonin 5b6cfc
  struct timespec t = {};
Ivan Mahonin 5b6cfc
  clock_gettime(CLOCK_MONOTONIC, &t);
Ivan Mahonin 5b6cfc
  return (unsigned int)t.tv_sec*1000u + (unsigned int)t.tv_nsec/1000000u;
Ivan Mahonin 5b6cfc
}
Ivan Mahonin 5b6cfc
Ivan Mahonin 5b6cfc
Ivan Mahonin 452870
static inline void rectIntersect(int *x, int *y, int *w, int *h, int xx, int yy, int ww, int hh) {
Ivan Mahonin 452870
  if (*x < xx) *w += *x - xx, *x = xx;
Ivan Mahonin 452870
  if (*y < yy) *h += *y - yy, *y = xx;
Ivan Mahonin 452870
  ww += xx; hh += yy;
Ivan Mahonin 452870
  if (*x + *w > ww) *w = ww - *x;
Ivan Mahonin 452870
  if (*y + *h > hh) *h = hh - *y;
Ivan Mahonin 452870
}
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
static inline void rectMerge(int *x, int *y, int *w, int *h, int xx, int yy, int ww, int hh) {
Ivan Mahonin 452870
  if (ww <= 0 || hh <= 0)
Ivan Mahonin 452870
    return;
Ivan Mahonin 452870
  if (*w <= 0 || *h <= 0)
Ivan Mahonin 452870
    { *x = xx, *y = yy, *w = ww, *h = hh; return; }
Ivan Mahonin 452870
  if (*x > xx) *w += *x - xx, *x = xx;
Ivan Mahonin d3e9d7
  if (*y > yy) *h += *y - yy, *y = yy;
Ivan Mahonin 452870
  ww += xx; hh += yy;
Ivan Mahonin 452870
  if (*x + *w < ww) *w = ww - *x;
Ivan Mahonin 452870
  if (*y + *h < hh) *h = hh - *y;
Ivan Mahonin 452870
}
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
Ivan Mahonin 452870
#endif