void
setlayoutex(const Arg *arg)
{
	setlayout(&((Arg) { .v = &layouts[arg->i] }));
}

void
viewex(const Arg *arg)
{
	view(&((Arg) { .ui = 1 << arg->ui }));
}

void
viewallex(const Arg *arg)
{
	#if SCRATCHPADS_PATCH
	view(&((Arg){.ui = ~SPTAGMASK}));
	#else
	view(&((Arg){.ui = ~0}));
	#endif // SCRATCHPADS_PATCH
}

void
toggleviewex(const Arg *arg)
{
	toggleview(&((Arg) { .ui = 1 << arg->ui }));
}

void
tagex(const Arg *arg)
{
	tag(&((Arg) { .ui = 1 << arg->ui }));
}

void
toggletagex(const Arg *arg)
{
	toggletag(&((Arg) { .ui = 1 << arg->ui }));
}

void
tagallex(const Arg *arg)
{
	#if SCRATCHPADS_PATCH
	tag(&((Arg){.ui = ~SPTAGMASK}));
	#else
	tag(&((Arg){.ui = ~0}));
	#endif // SCRATCHPADS_PATCH
}

int
fake_signal(void)
{
	char fsignal[256];
	char indicator[9] = "fsignal:";
	char str_sig[50];
	char param[16];
	int i, len_str_sig, n, paramn;
	size_t len_fsignal, len_indicator = strlen(indicator);
	Arg arg;

	// Get root name property
	if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
		len_fsignal = strlen(fsignal);

		// Check if this is indeed a fake signal
		if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
			paramn = sscanf(fsignal+len_indicator, "%s%n%s%n", str_sig, &len_str_sig, param, &n);

			if (paramn == 1) arg = (Arg) {0};
			else if (paramn > 2) return 1;
			else if (strncmp(param, "i", n - len_str_sig) == 0)
				#if IPC_PATCH
				sscanf(fsignal + len_indicator + n, "%li", &(arg.i));
				#else
				sscanf(fsignal + len_indicator + n, "%i", &(arg.i));
				#endif // IPC_PATCH
			else if (strncmp(param, "ui", n - len_str_sig) == 0)
				#if IPC_PATCH
				sscanf(fsignal + len_indicator + n, "%lu", &(arg.ui));
				#else
				sscanf(fsignal + len_indicator + n, "%u", &(arg.ui));
				#endif // IPC_PATCH
			else if (strncmp(param, "f", n - len_str_sig) == 0)
				sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
			else return 1;

			// Check if a signal was found, and if so handle it
			for (i = 0; i < LENGTH(signals); i++)
				if (strncmp(str_sig, signals[i].sig, len_str_sig) == 0 && signals[i].func)
					signals[i].func(&(arg));

			// A fake signal was sent
			return 1;
		}
	}

	// No fake signal was sent, so proceed with update
	return 0;
}
