2
* @file geis_ugsubscription_store.cpp
3
* @brief grail subscription storage
6
* Copyright 2012 Canonical Ltd.
8
* This library is free software: you can redistribute it and/or modify it
9
* under the terms of the GNU Lesser General Public License version 3
10
* as published by the Free Software Foundation.
12
* This library is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranties of
14
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
15
* PURPOSE. See the GNU Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public License
18
* along with this library. If not, see <http://www.gnu.org/licenses/>.
20
#include "geis_config.h"
21
#include "geis_ugsubscription_store.h"
24
#include "geis_logging.h"
25
#include <oif/frame_x11.h>
29
typedef struct GeisUGSubscription
33
GeisInteger region_id;
35
} *GeisUGSubscription;
37
static const GeisSize _geis_grail_ugsubscription_store_default_size = 2;
38
static const GeisFloat _geis_grail_ugsubscription_store_growth_factor = 1.7;
42
* Creates a new, empty grail subscription store.
44
GeisUGSubscriptionStore
45
geis_ugsubscription_store_new()
47
GeisUGSubscriptionStore store = geis_bag_new(sizeof(struct GeisUGSubscription),
48
_geis_grail_ugsubscription_store_default_size,
49
_geis_grail_ugsubscription_store_growth_factor);
55
* Destroys a grail subscription store.
58
geis_ugsubscription_delete(GeisUGSubscriptionStore store)
60
for (GeisSize i = 0; i < geis_bag_count(store); ++i)
62
grail_subscription_delete(*(UGSubscription*)geis_bag_at(store, i));
64
geis_bag_delete(store);
69
* Gets a count of the number of ugsubs in the store.
72
geis_ugsubscription_count(GeisUGSubscriptionStore store)
74
return geis_bag_count(store);
79
* Gets a UGSubscription from the store.
82
geis_ugsubscription_get_ugsubscription_at(GeisUGSubscriptionStore store,
85
assert(index < geis_bag_count(store));
86
return ((GeisUGSubscription)geis_bag_at(store, index))->ugsub;
91
* Gets a UGSubscription from the store.
94
geis_ugsubscription_get_ugsubscription(GeisUGSubscriptionStore store,
97
GeisInteger region_id)
99
UGSubscription ugsub = NULL;
100
for (GeisSize i = 0; i < geis_bag_count(store); ++i)
102
GeisUGSubscription s = (GeisUGSubscription)geis_bag_at(store, i);
103
if (s->filter == filter && s->device == device && s->region_id == region_id)
112
UGStatus ugstatus = grail_subscription_new(&ugsub);
113
if (ugstatus != UGStatusSuccess)
115
geis_error("failed to create grail subscription");
119
ugstatus = grail_subscription_set_property(ugsub,
120
UGSubscriptionPropertyDevice,
122
if (ugstatus != UGStatusSuccess)
124
geis_error("failed to set UGSubscription device property");
127
UFWindowId window_id = frame_x11_create_window_id(region_id);
128
ugstatus = grail_subscription_set_property(ugsub,
129
UGSubscriptionPropertyWindow,
131
if (ugstatus != UGStatusSuccess)
133
geis_error("failed to set UGSubscription window property");
136
struct GeisUGSubscription s = {
139
.region_id = region_id,
142
geis_bag_append(store, &s);
151
geis_ugsubscription_release_for_device(GeisUGSubscriptionStore store,
154
GeisGrailWindowGrabStore window_grabs)
157
while (i < geis_bag_count(store))
159
GeisUGSubscription s = (GeisUGSubscription)geis_bag_at(store, i);
160
if (s->filter == filter && s->device == device)
164
ugstatus = grail_subscription_get_property(s->ugsub,
165
UGSubscriptionPropertyWindow,
167
if (ugstatus != UGStatusSuccess)
169
geis_warning("error %d getting subscription window", ugstatus);
173
Window window_id = frame_x11_get_window_id(ufwindow);
174
geis_grail_window_grab_store_ungrab(window_grabs, window_id);
177
grail_subscription_delete(s->ugsub);
178
geis_bag_remove(store, i);
189
* Releses a UGSubscription from the store.
192
geis_ugsubscription_release_ugsubscription(GeisUGSubscriptionStore store GEIS_UNUSED,
193
UGSubscription ugsub GEIS_UNUSED)