static imc_packet *interpret2(const char *argument) { char seq[20]; static imc_packet out; imc_initdata(&out.data); argument = imc_getarg(argument, out.i.from, IMC_NAME_LENGTH); argument = imc_getarg(argument, seq, 20); argument = imc_getarg(argument, out.i.path, IMC_PATH_LENGTH); argument = imc_getarg(argument, out.type, IMC_TYPE_LENGTH); argument = imc_getarg(argument, out.i.to, IMC_NAME_LENGTH); if(!out.i.from[0] || !seq[0] || !out.i.path[0] || !out.type[0] || !out.i.to[0]) { imc_logerror("interpret2: bad packet received, discarding"); return NULL; } parsekeys(argument, &out.data); out.i.sequence = strtoul(seq, NULL, 10); return &out; }
void initkeys(Bool reload) { unsigned int i, j, l; const char *res; char t[64]; freekeys(); initmodkey(); /* global functions */ for (i = 0; i < LENGTH(KeyItems); i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s", KeyItems[i].name); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItems[i].action; key.arg = KeyItems[i].arg; parsekeys(res, &key); } /* increment, decrement and set functions */ for (j = 0; j < LENGTH(KeyItemsByAmt); j++) { for (i = 0; i < LENGTH(inc_prefix); i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%s", inc_prefix[i].prefix, KeyItemsByAmt[j].name); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByAmt[j].action; key.arg = NULL; key.act = inc_prefix[i].act; parsekeys(res, &key); } } /* client or screen state set, unset and toggle functions */ for (j = 0; j < LENGTH(KeyItemsByState); j++) { for (i = 0; i < LENGTH(set_prefix); i++) { for (l = 0; l < LENGTH(set_suffix); l++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%s%s", set_prefix[i].prefix, KeyItemsByState[j].name, set_suffix[l].suffix); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByState[j].action; key.arg = NULL; key.set = set_prefix[i].set; key.any = set_suffix[l].any; parsekeys(res, &key); } } } /* functions with a relative direction */ for (j = 0; j < LENGTH(KeyItemsByDir); j++) { for (i = 0; i < LENGTH(rel_suffix); i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%s", KeyItemsByDir[j].name, rel_suffix[i].suffix); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByDir[j].action; key.arg = NULL; key.dir = rel_suffix[i].dir; parsekeys(res, &key); } } /* per tag functions */ for (j = 0; j < LENGTH(KeyItemsByTag); j++) { for (i = 0; i < MAXTAGS; i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%d", KeyItemsByTag[j].name, i); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByTag[j].action; key.arg = NULL; key.tag = i; key.dir = RelativeNone; parsekeys(res, &key); } for (i = 0; i < LENGTH(tag_suffix); i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%s", KeyItemsByTag[j].name, tag_suffix[i].suffix); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByTag[j].action; key.arg = NULL; key.tag = 0; key.dir = tag_suffix[i].dir; key.wrap = tag_suffix[i].wrap; parsekeys(res, &key); } } /* list settings */ for (j = 0; j < LENGTH(KeyItemsByList); j++) { for (i = 0; i < 32; i++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%d", KeyItemsByList[j].name, i); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByList[j].action; key.arg = NULL; key.tag = i; key.any = AllClients; key.dir = RelativeNone; key.cyc = False; parsekeys(res, &key); } for (i = 0; i < LENGTH(lst_suffix); i++) { for (l = 0; l < LENGTH(list_which); l++) { Key key = { 0, }; snprintf(t, sizeof(t), "%s%s%s", KeyItemsByList[j].name, lst_suffix[i].suffix, list_which[l].which); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByList[j].action; key.arg = NULL; key.tag = 0; key.any = list_which[l].any; key.dir = lst_suffix[i].dir; key.cyc = False; parsekeys(res, &key); } } for (i = 0; i < LENGTH(cyc_suffix); i++) { for (l = 0; l < LENGTH(list_which); l++) { Key key = { 0, }; snprintf(t, sizeof(t), "cycle%s%s%s", KeyItemsByList[j].name, cyc_suffix[i].suffix, list_which[l].which); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = KeyItemsByList[j].action; key.arg = NULL; key.tag = 0; key.any = list_which[l].any; key.dir = cyc_suffix[i].dir; key.cyc = True; parsekeys(res, &key); } } } /* layout setting */ for (i = 0; layouts[i].symbol != '\0'; i++) { Key key = { 0, }; snprintf(t, sizeof(t), "setlayout%c", layouts[i].symbol); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = k_setlayout; key.arg = t + 9; parsekeys(res, &key); } /* spawn */ for (i = 0; i < 64; i++) { Key key = { 0, }; snprintf(t, sizeof(t), "spawn%d", i); XPRINTF("Check for key item '%s'\n", t); if (!(res = getresource(t, NULL))) continue; key.func = k_spawn; key.arg = NULL; parsekeys(res, &key); } }