box.c (3102B)
1 /* 2 * Copyright (c) 2021-2026 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <stddef.h> 18 19 #include "err.h" 20 #include "ltkd.h" 21 #include "widget.h" 22 #include "cmd.h" 23 24 #include <ltk/ltk.h> 25 #include <ltk/util.h> 26 #include <ltk/box.h> 27 28 /* box <box id> add <widget id> [sticky] */ 29 static int 30 ltkd_box_cmd_add( 31 ltk_widget_id windowid, 32 ltkd_widget *widget, 33 ltkd_cmd_token *tokens, 34 size_t num_tokens, 35 ltkd_error *err) { 36 (void)windowid; 37 ltkd_cmdarg_parseinfo cmd[] = { 38 {.type = CMDARG_WIDGET, .widget_type = LTK_WIDGET_UNKNOWN, .optional = 0}, 39 {.type = CMDARG_STICKY, .optional = 1}, 40 }; 41 if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err)) 42 return 1; 43 if (ltk_box_add(widget->ltkid, cmd[0].val.widget->ltkid, cmd[1].initialized ? cmd[1].val.sticky : 0)) { 44 err->type = ERR_WIDGET_IN_CONTAINER; 45 err->arg = 0; 46 return 1; 47 } 48 return 0; 49 } 50 51 /* box <box id> remove <widget id> */ 52 static int 53 ltkd_box_cmd_remove( 54 ltk_widget_id windowid, 55 ltkd_widget *widget, 56 ltkd_cmd_token *tokens, 57 size_t num_tokens, 58 ltkd_error *err) { 59 (void)windowid; 60 ltkd_cmdarg_parseinfo cmd[] = { 61 {.type = CMDARG_WIDGET, .widget_type = LTK_WIDGET_UNKNOWN, .optional = 0}, 62 }; 63 if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err)) 64 return 1; 65 if (ltk_box_remove(widget->ltkid, cmd[0].val.widget->ltkid)) { 66 err->type = ERR_WIDGET_NOT_IN_CONTAINER; 67 err->arg = 0; 68 return 1; 69 } 70 return 0; 71 } 72 73 /* box <box id> create <orientation> */ 74 static int 75 ltkd_box_cmd_create( 76 ltk_widget_id windowid, 77 ltkd_widget *widget_unneeded, 78 ltkd_cmd_token *tokens, 79 size_t num_tokens, 80 ltkd_error *err) { 81 (void)widget_unneeded; 82 ltkd_cmdarg_parseinfo cmd[] = { 83 {.type = CMDARG_IGNORE, .optional = 0}, 84 {.type = CMDARG_STRING, .optional = 0}, 85 {.type = CMDARG_IGNORE, .optional = 0}, 86 {.type = CMDARG_ORIENTATION, .optional = 0}, 87 }; 88 if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err)) 89 return 1; 90 ltk_widget_id box = ltk_box_create(windowid, cmd[3].val.orient); 91 if (!ltkd_widget_create(box, cmd[1].val.str, NULL, 0, err)) { 92 ltk_widget_id_destroy(box, 1); 93 err->arg = 1; 94 return 1; 95 } 96 97 return 0; 98 } 99 100 static ltkd_cmd_info box_cmds[] = { 101 {"add", <kd_box_cmd_add, 0}, 102 {"create", <kd_box_cmd_create, 1}, 103 {"remove", <kd_box_cmd_remove, 0}, 104 }; 105 106 GEN_CMD_HELPERS(ltkd_box_cmd, LTK_WIDGET_BOX, box_cmds)