@@ -50,7 +50,8 @@ static int parse_kvp(char *s, char **key, char **value)
50
50
char * last_space = NULL ;
51
51
char * c = s ;
52
52
53
- if (* c == '=' ) //Allow the first character to be = as a special case.
53
+ /* Allow the first character to be = as a special case. */
54
+ if (* c == '=' )
54
55
c ++ ;
55
56
56
57
while (* c ) {
@@ -263,35 +264,60 @@ static void parse_id_section(struct config *config, struct ini_section *section)
263
264
}
264
265
}
265
266
267
+ struct config * create_config (const char * name )
268
+ {
269
+ size_t i ;
270
+ struct layer * main ;
271
+ struct config * config ;
272
+
273
+ config = calloc (1 , sizeof (struct config ));
274
+ strncpy (config -> name , name , sizeof (config -> name )- 1 );
275
+
276
+ main = create_layer ("main" , 0 , 1 );
277
+
278
+ config -> nr_layers = 0 ;
279
+ config -> layers [config -> nr_layers ++ ] = main ;
280
+
281
+ for (i = 0 ; i < sizeof (modifier_table )/sizeof (modifier_table [0 ]); i ++ ) {
282
+ struct modifier_table_ent * m = & modifier_table [i ];
283
+
284
+ struct layer * layer ;
285
+ struct descriptor d ;
286
+
287
+ layer = create_layer (m -> name , m -> mask , 0 );
288
+
289
+ d .op = OP_LAYER ;
290
+ d .args [0 ].layer = layer ;
291
+
292
+ layer_set_descriptor (main , m -> code1 , & d );
293
+ layer_set_descriptor (main , m -> code2 , & d );
294
+
295
+ config -> layers [config -> nr_layers ++ ] = layer ;
296
+ }
297
+
298
+ return config ;
299
+ }
300
+
266
301
/*
267
302
* Ownership of the input string is forfeit, it will eventually be freed when
268
303
* the config is destroyed.
269
304
*/
270
305
271
- static int parse_config (const char * config_name , char * str , struct config * config )
306
+ static int parse_config (struct config * config , char * str )
272
307
{
273
308
size_t i , j ;
274
309
275
310
struct ini ini ;
276
311
277
312
struct ini_section * layer_sections [MAX_LAYERS ];
278
313
struct layer * layers [MAX_LAYERS ];
279
- size_t nr_layers = 0 ;
280
-
314
+ size_t n = 0 ;
281
315
282
316
if (ini_parse (str , & ini , NULL ) < 0 ) {
283
- fprintf (stderr , "ERROR: %s is not a valid config (missing [main]?) \n" , config_name );
317
+ fprintf (stderr , "ERROR: %s is not a valid config\n" , config -> name );
284
318
return -1 ;
285
319
}
286
320
287
- config -> nr_layers = 1 ;
288
- config -> nr_device_ids = 0 ;
289
-
290
- config -> layers [0 ] = create_layer ("main" , 0 , 1 );
291
-
292
- assert (strlen (config_name ) < MAX_CONFIG_NAME );
293
- strcpy (config -> name , config_name );
294
-
295
321
/*
296
322
* First pass, create layers so they are available
297
323
* for lookup during descriptor parsing.
@@ -311,42 +337,46 @@ static int parse_config(const char *config_name, char *str, struct config *confi
311
337
if (parse_header (section -> name , name , type ) < 0 ) {
312
338
fprintf (stderr ,
313
339
"ERROR %s:%zu: Invalid header.\n" ,
314
- config_name ,
340
+ config -> name ,
315
341
section -> lnum );
316
342
continue ;
317
343
}
318
344
319
345
layer = lookup_layer (name , (void * )config );
320
346
321
- if (!layer ) { // If the layer doesn't exist, create it.
322
- if (!strcmp (type , "layout" )) {
347
+ if (!layer ) { /* If the layer doesn't exist, create it. */
348
+ if (!strcmp (type , "layout" ))
323
349
layer = create_layer (name , 0 , 1 );
324
- } else if (!parse_modset (type , & mods )) {
350
+ else if (!parse_modset (type , & mods ))
325
351
layer = create_layer (name , mods , 0 );
326
- } else if (strcmp (type , "" )) {
352
+ else if (strcmp (type , "" )) {
327
353
fprintf (stderr ,
328
354
"WARNING %s:%zu: \"%s\" is not a valid layer type "
329
355
" (must be \"layout\" or a valid modifier set).\n" ,
330
- config_name , section -> lnum , type );
356
+ config -> name , section -> lnum , type );
331
357
continue ;
332
358
}
333
359
334
360
config -> layers [config -> nr_layers ++ ] = layer ;
335
361
}
336
362
337
- layers [nr_layers ] = layer ;
338
- layer_sections [nr_layers ++ ] = section ;
363
+ layers [n ] = layer ;
364
+ layer_sections [n ] = section ;
365
+
366
+ n ++ ;
339
367
}
340
368
341
- /* Parse each entry section entry and build the layer keymap. */
369
+ /* Parse each section entry and build the layer keymap. */
342
370
343
- for (i = 0 ; i < nr_layers ; i ++ ) {
371
+ for (i = 0 ; i < n ; i ++ ) {
344
372
struct ini_section * section = layer_sections [i ];
345
373
struct layer * layer = layers [i ];
346
374
347
375
/* Populate the layer described by the section. */
348
376
349
377
for (j = 0 ; j < section -> nr_entries ; j ++ ) {
378
+ size_t i ;
379
+ int is_mod ;
350
380
struct ini_entry * ent = & section -> entries [j ];
351
381
352
382
char * k , * v ;
@@ -357,97 +387,58 @@ static int parse_config(const char *config_name, char *str, struct config *confi
357
387
if (parse_kvp (ent -> line , & k , & v ) < 0 ) {
358
388
fprintf (stderr ,
359
389
"ERROR %s:%zu: Invalid key value pair.\n" ,
360
- config_name , ent -> lnum );
361
- continue ;
362
- }
363
-
364
- code = lookup_keycode (k );
365
-
366
- if (!code ) {
367
- fprintf (stderr ,
368
- "ERROR %s:%zu: %s is not a valid key.\n" ,
369
- config_name , ent -> lnum , k );
390
+ config -> name , ent -> lnum );
370
391
continue ;
371
392
}
372
393
373
394
if (parse_descriptor (v , & desc , lookup_layer , config ) < 0 ) {
374
- fprintf (stderr , "ERROR %s:%zu: %s\n" , config_name ,
395
+ fprintf (stderr , "ERROR %s:%zu: %s\n" , config -> name ,
375
396
ent -> lnum , errstr );
376
397
continue ;
377
398
}
378
399
379
- layer_set_descriptor (layer , code , & desc );
380
- }
381
- }
382
-
383
- return 0 ;
384
- }
400
+ is_mod = 0 ;
401
+ for (i = 0 ; i < sizeof (modifier_table )/sizeof (modifier_table [0 ]); i ++ ) {
402
+ struct modifier_table_ent * m = & modifier_table [i ];
385
403
386
- static void post_process_config (const struct config * config )
387
- {
388
- size_t i ;
389
- uint16_t code ;
390
-
391
- /*
392
- * Convert all modifier keycodes into their corresponding layer
393
- * counterparts for consistency. This allows us to avoid explicitly
394
- * accounting for modifier layer/modifier keycode overlap within the
395
- * remapping logic and provides the user the ability to remap stock
396
- * modifiers using their eponymous layer names.
397
- */
404
+ if (!strcmp (m -> name , k )) {
405
+ layer_set_descriptor (layer , m -> code1 , & desc );
406
+ layer_set_descriptor (layer , m -> code2 , & desc );
398
407
399
- for (i = 0 ; i < config -> nr_layers ; i ++ ) {
400
- struct layer * layer = config -> layers [i ];
401
-
402
- for (code = 0 ; code < KEY_MAX ; code ++ ) {
403
- struct descriptor * d = layer_get_descriptor (layer , code );
404
-
405
- if (d && d -> op == OP_KEYSEQ ) {
406
- uint16_t key = d -> args [0 ].sequence .code ;
407
- struct layer * modlayer = NULL ;
408
-
409
- switch (key ) {
410
- case KEY_RIGHTSHIFT :
411
- case KEY_LEFTSHIFT :
412
- modlayer = lookup_layer ("S" , (void * )config );
413
- break ;
414
- case KEY_RIGHTALT :
415
- modlayer = lookup_layer ("G" , (void * )config );
416
- break ;
417
- case KEY_RIGHTCTRL :
418
- case KEY_LEFTCTRL :
419
- modlayer = lookup_layer ("C" , (void * )config );
420
- break ;
421
- case KEY_RIGHTMETA :
422
- case KEY_LEFTMETA :
423
- modlayer = lookup_layer ("M" , (void * )config );
424
- break ;
425
- case KEY_LEFTALT :
426
- modlayer = lookup_layer ("A" , (void * )config );
408
+ is_mod ++ ;
427
409
break ;
428
410
}
411
+ }
429
412
430
- if (modlayer ) {
431
- d -> op = OP_LAYER ;
432
- d -> args [0 ].layer = modlayer ;
433
- }
413
+ if (is_mod )
414
+ continue ;
415
+
416
+ code = lookup_keycode (k );
417
+
418
+ if (!code ) {
419
+ fprintf (stderr ,
420
+ "ERROR %s:%zu: %s is not a valid key.\n" ,
421
+ config -> name , ent -> lnum , k );
422
+ continue ;
434
423
}
435
424
425
+ layer_set_descriptor (layer , code , & desc );
426
+
436
427
}
437
428
}
429
+
430
+ return 0 ;
438
431
}
439
432
440
433
struct config * add_config (const char * config_name , char * str )
441
434
{
442
- struct config * config = malloc ( sizeof ( struct config ) );
435
+ struct config * config = create_config ( config_name );
443
436
444
- if (parse_config (config_name , str , config ) < 0 ) {
437
+ if (parse_config (config , str ) < 0 ) {
445
438
free (config );
446
439
return NULL ;
447
440
}
448
441
449
- post_process_config (config );
450
-
451
442
config -> next = configs ;
452
443
configs = config ;
453
444
0 commit comments