all repos — openbox @ 0d90bd57abe304ffca4bf5cd1a647d30dea882b7

openbox fork - make it a bit more like ryudo

obt/link.c (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-

   obt/link.c for the Openbox window manager
   Copyright (c) 2009        Dana Jansens

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   See the COPYING file for a copy of the GNU General Public License.
*/

#include "obt/link.h"
#include "obt/ddparse.h"
#include <glib.h>

struct _ObtLink {
    guint ref;

    ObtLinkType type;
    gchar *name; /*!< Specific name for the object (eg Firefox) */
    gchar *generic; /*!< Generic name for the object (eg Web Browser) */
    gchar *comment; /*!< Comment/description to display for the object */
    gchar *icon; /*!< Name/path for an icon for the object */

    union _ObtLinkData {
        struct _ObtLinkApp {
            gchar *exec; /*!< Executable to run for the app */
            gchar *wdir; /*!< Working dir to run the app in */
            gboolean term; /*!< Run the app in a terminal or not */
            ObtLinkAppOpen open;

            /* XXX gchar**? or something better, a mime struct.. maybe
               glib has something i can use. */
            gchar **mime; /*!< Mime types the app can open */

            ObtLinkAppStartup startup;
            gchar *startup_wmclass;
        } app;
        struct _ObtLinkLink {
            gchar *url;
        } link;
        struct _ObtLinkDir {
        } dir;
    } d;
};

ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths)
{
    ObtLink *lnk;
    GHashTable *groups, *keys;
    ObtDDParseGroup *g;

    groups = obt_ddparse_file(name, paths);
    if (!groups) return NULL;
    g = g_hash_table_lookup(groups, "Desktop Entry");
    if (!g) {
        g_hash_table_destroy(groups);
        return NULL;
    }

    keys = obt_ddparse_group_keys(g);

    lnk = g_slice_new(ObtLink);
    lnk->ref = 1;
    /* XXX turn the values in the .desktop file into an ObtLink */

    return lnk;
}

void obt_link_ref(ObtLink *dd)
{
    ++dd->ref;
}

void obt_link_unref(ObtLink *dd)
{
    if (--dd->ref < 1) {
        g_slice_free(ObtLink, dd);
    }
}