Changeset e63e74a in mainline for uspace/lib/tbarcfg/src/tbarcfg.c


Ignore:
Timestamp:
2024-02-21T20:26:35Z (3 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
95e2967
Parents:
5f3188b8
Message:

Start menu separator entry support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/tbarcfg/src/tbarcfg.c

    r5f3188b8 re63e74a  
    108108        sif_node_t *nentry;
    109109        const char *ntype;
     110        const char *separator;
    110111        const char *caption;
    111112        const char *cmd;
     
    143144                }
    144145
    145                 caption = sif_node_get_attr(nentry, "caption");
    146                 if (caption == NULL) {
     146                separator = sif_node_get_attr(nentry, "separator");
     147                if (separator != NULL && str_cmp(separator, "y") != 0) {
    147148                        rc = EIO;
    148149                        goto error;
    149150                }
    150151
    151                 cmd = sif_node_get_attr(nentry, "cmd");
    152                 if (cmd == NULL) {
    153                         rc = EIO;
    154                         goto error;
     152                if (separator == NULL) {
     153                        caption = sif_node_get_attr(nentry, "caption");
     154                        if (caption == NULL) {
     155                                rc = EIO;
     156                                goto error;
     157                        }
     158
     159                        cmd = sif_node_get_attr(nentry, "cmd");
     160                        if (cmd == NULL) {
     161                                rc = EIO;
     162                                goto error;
     163                        }
     164
     165                        terminal = sif_node_get_attr(nentry, "terminal");
     166                        if (terminal == NULL)
     167                                terminal = "n";
     168
     169                        rc = smenu_entry_new(tbcfg, nentry, caption, cmd,
     170                            str_cmp(terminal, "y") == 0, NULL);
     171                        if (rc != EOK)
     172                                goto error;
     173                } else {
     174                        rc = smenu_entry_sep_new(tbcfg, nentry, NULL);
     175                        if (rc != EOK)
     176                                goto error;
    155177                }
    156 
    157                 terminal = sif_node_get_attr(nentry, "terminal");
    158                 if (terminal == NULL)
    159                         terminal = "n";
    160 
    161                 rc = smenu_entry_new(tbcfg, nentry, caption, cmd,
    162                     str_cmp(terminal, "y") == 0, NULL);
    163                 if (rc != EOK)
    164                         goto error;
    165178
    166179                nentry = sif_node_next_child(nentry);
     
    266279const char *smenu_entry_get_caption(smenu_entry_t *entry)
    267280{
     281        assert(!entry->separator);
    268282        return entry->caption;
    269283}
     
    276290const char *smenu_entry_get_cmd(smenu_entry_t *entry)
    277291{
     292        assert(!entry->separator);
    278293        return entry->cmd;
    279294}
    280295
    281 /** Get start menu start in terminal flag.
     296/** Get start menu entry start in terminal flag.
    282297 *
    283298 * @param entry Start menu entry
     
    286301bool smenu_entry_get_terminal(smenu_entry_t *entry)
    287302{
     303        assert(!entry->separator);
    288304        return entry->terminal;
     305}
     306
     307/** Get start menu entry separator flag.
     308 *
     309 * @param entry Start menu entry
     310 * @return Separator flag
     311 */
     312bool smenu_entry_get_separator(smenu_entry_t *entry)
     313{
     314        return entry->separator;
    289315}
    290316
     
    301327{
    302328        char *dcap;
     329
     330        assert(!entry->separator);
    303331
    304332        dcap = str_dup(caption);
     
    324352        char *dcmd;
    325353
     354        assert(!entry->separator);
     355
    326356        dcmd = str_dup(cmd);
    327357        if (dcmd == NULL)
     
    343373void smenu_entry_set_terminal(smenu_entry_t *entry, bool terminal)
    344374{
     375        assert(!entry->separator);
    345376        entry->terminal = terminal;
    346377}
     
    355386        errno_t rc;
    356387
    357         rc = sif_node_set_attr(trans, entry->nentry, "cmd", entry->cmd);
    358         if (rc != EOK)
    359                 goto error;
    360 
    361         rc = sif_node_set_attr(trans, entry->nentry, "caption", entry->caption);
    362         if (rc != EOK)
    363                 goto error;
    364 
    365         rc = sif_node_set_attr(trans, entry->nentry, "terminal",
    366             entry->terminal ? "y" : "n");
    367         if (rc != EOK)
    368                 goto error;
     388        if (entry->separator) {
     389                rc = sif_node_set_attr(trans, entry->nentry, "separator", "y");
     390                if (rc != EOK)
     391                        goto error;
     392        } else {
     393                sif_node_unset_attr(trans, entry->nentry, "separator");
     394
     395                rc = sif_node_set_attr(trans, entry->nentry, "cmd", entry->cmd);
     396                if (rc != EOK)
     397                        goto error;
     398
     399                rc = sif_node_set_attr(trans, entry->nentry, "caption",
     400                    entry->caption);
     401                if (rc != EOK)
     402                        goto error;
     403
     404                rc = sif_node_set_attr(trans, entry->nentry, "terminal",
     405                    entry->terminal ? "y" : "n");
     406                if (rc != EOK)
     407                        goto error;
     408        }
    369409
    370410        return EOK;
     
    457497}
    458498
     499/** Allocate a start menu separator entry and append it to the start menu
     500 * (internal).
     501 *
     502 * This only creates the entry in memory, but does not update the repository.
     503 *
     504 * @param smenu Start menu
     505 * @param nentry Backing SIF node
     506 * @param rentry Place to store pointer to new entry or @c NULL
     507 */
     508errno_t smenu_entry_sep_new(tbarcfg_t *smenu, sif_node_t *nentry,
     509    smenu_entry_t **rentry)
     510{
     511        smenu_entry_t *entry;
     512        errno_t rc;
     513
     514        entry = calloc(1, sizeof(smenu_entry_t));
     515        if (entry == NULL) {
     516                rc = ENOMEM;
     517                goto error;
     518        }
     519
     520        entry->nentry = nentry;
     521        entry->separator = true;
     522
     523        entry->smenu = smenu;
     524        list_append(&entry->lentries, &smenu->entries);
     525        if (rentry != NULL)
     526                *rentry = entry;
     527
     528        return EOK;
     529error:
     530        return rc;
     531}
     532
    459533/** Delete start menu entry.
    460534 *
     
    467541{
    468542        list_remove(&entry->lentries);
    469         free(entry->caption);
    470         free(entry->cmd);
     543        if (entry->caption != NULL)
     544                free(entry->caption);
     545        if (entry->cmd != NULL)
     546                free(entry->cmd);
    471547        free(entry);
    472548}
     
    527603}
    528604
     605/** Create new start menu separator entry.
     606 *
     607 * @param smenu Start menu
     608 * @param nentry Backing SIF node
     609 * @param rentry Place to store pointer to new entry or @c NULL
     610 */
     611errno_t smenu_entry_sep_create(tbarcfg_t *smenu, smenu_entry_t **rentry)
     612{
     613        sif_node_t *nentry;
     614        smenu_entry_t *entry;
     615        errno_t rc;
     616        sif_trans_t *trans = NULL;
     617
     618        rc = sif_trans_begin(smenu->repo, &trans);
     619        if (rc != EOK)
     620                goto error;
     621
     622        rc = sif_node_append_child(trans, smenu->nentries, "entry",
     623            &nentry);
     624        if (rc != EOK)
     625                goto error;
     626
     627        rc = sif_node_set_attr(trans, nentry, "separator", "y");
     628        if (rc != EOK)
     629                goto error;
     630
     631        rc = smenu_entry_sep_new(smenu, nentry, &entry);
     632        if (rc != EOK)
     633                goto error;
     634
     635        rc = sif_trans_end(trans);
     636        if (rc != EOK)
     637                goto error;
     638
     639        if (rentry != NULL)
     640                *rentry = entry;
     641        return EOK;
     642error:
     643        if (trans != NULL)
     644                sif_trans_abort(trans);
     645        return rc;
     646}
     647
    529648/** Destroy start menu entry.
    530649 *
Note: See TracChangeset for help on using the changeset viewer.