URI: 
       box.c - ltk - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/ltk.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       box.c (3184B)
       ---
            1 /*
            2  * Copyright (c) 2021-2024 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_window *window,
           32     ltkd_widget *widget,
           33     ltkd_cmd_token *tokens,
           34     size_t num_tokens,
           35     ltkd_error *err) {
           36         (void)window;
           37         ltk_box *box = LTK_CAST_BOX(widget->widget);
           38         ltkd_cmdarg_parseinfo cmd[] = {
           39                 {.type = CMDARG_WIDGET, .widget_type = LTK_WIDGET_UNKNOWN, .optional = 0},
           40                 {.type = CMDARG_STICKY, .optional = 1},
           41         };
           42         if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err))
           43                 return 1;
           44         if (ltk_box_add(box, cmd[0].val.widget->widget, cmd[1].initialized ? cmd[1].val.sticky : 0)) {
           45                 err->type = ERR_WIDGET_IN_CONTAINER;
           46                 err->arg = 0;
           47                 return 1;
           48         }
           49         return 0;
           50 }
           51 
           52 /* box <box id> remove <widget id> */
           53 static int
           54 ltkd_box_cmd_remove(
           55     ltk_window *window,
           56     ltkd_widget *widget,
           57     ltkd_cmd_token *tokens,
           58     size_t num_tokens,
           59     ltkd_error *err) {
           60         (void)window;
           61         ltk_box *box = LTK_CAST_BOX(widget->widget);
           62         ltkd_cmdarg_parseinfo cmd[] = {
           63                 {.type = CMDARG_WIDGET, .widget_type = LTK_WIDGET_UNKNOWN, .optional = 0},
           64         };
           65         if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err))
           66                 return 1;
           67         if (ltk_box_remove(box, cmd[0].val.widget->widget)) {
           68                 err->type = ERR_WIDGET_NOT_IN_CONTAINER;
           69                 err->arg = 0;
           70                 return 1;
           71         }
           72         return 0;
           73 }
           74 
           75 /* box <box id> create <orientation> */
           76 static int
           77 ltkd_box_cmd_create(
           78     ltk_window *window,
           79     ltkd_widget *widget_unneeded,
           80     ltkd_cmd_token *tokens,
           81     size_t num_tokens,
           82     ltkd_error *err) {
           83         (void)widget_unneeded;
           84         ltkd_cmdarg_parseinfo cmd[] = {
           85                 {.type = CMDARG_IGNORE, .optional = 0},
           86                 {.type = CMDARG_STRING, .optional = 0},
           87                 {.type = CMDARG_IGNORE, .optional = 0},
           88                 {.type = CMDARG_ORIENTATION, .optional = 0},
           89         };
           90         if (ltkd_parse_cmd(tokens, num_tokens, cmd, LENGTH(cmd), err))
           91                 return 1;
           92         ltk_box *box = ltk_box_create(window, cmd[3].val.orient);
           93         if (!ltkd_widget_create(LTK_CAST_WIDGET(box), cmd[1].val.str, NULL, 0, err)) {
           94                 ltk_widget_destroy(LTK_CAST_WIDGET(box), 1);
           95                 err->arg = 1;
           96                 return 1;
           97         }
           98 
           99         return 0;
          100 }
          101 
          102 static ltkd_cmd_info box_cmds[] = {
          103         {"add", &ltkd_box_cmd_add, 0},
          104         {"create", &ltkd_box_cmd_create, 1},
          105         {"remove", &ltkd_box_cmd_remove, 0},
          106 };
          107 
          108 GEN_CMD_HELPERS(ltkd_box_cmd, LTK_WIDGET_BOX, box_cmds)