[gnome-todo/wip/selection-mode] project: add initial selection mode prototype
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-todo/wip/selection-mode] project: add initial selection mode prototype
- Date: Sat, 22 Aug 2015 01:00:51 +0000 (UTC)
commit 93b61e12e76ac1667005c67b401ffc8234c4290c
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Fri Aug 21 21:59:24 2015 -0300
project: add initial selection mode prototype
This initial prototyped selection mode actually doesn't
do anything useful besides selecting the task lists and
turning the window blue.
data/theme/Adwaita.css | 4 +
data/ui/task-list-item.ui | 20 +----
data/ui/window.ui | 19 +++---
src/gtd-enums.h | 1 -
src/gtd-task-list-item.c | 111 +++++++++++++++++++++++++----
src/gtd-task-list-item.h | 5 ++
src/gtd-window.c | 176 ++++++++++++++++++++++++++++++++++++++++-----
src/gtd-window.h | 5 ++
8 files changed, 282 insertions(+), 59 deletions(-)
---
diff --git a/data/theme/Adwaita.css b/data/theme/Adwaita.css
index 9e658d2..411f81a 100644
--- a/data/theme/Adwaita.css
+++ b/data/theme/Adwaita.css
@@ -14,6 +14,10 @@ GtdTaskListItem.thumbnail {
font-size: 9px;
}
+GtdTaskListItem {
+ background-color: transparent;
+}
+
GtdTaskListItem,
GtdTaskListView GtdTaskRow {
color: #000003;
diff --git a/data/ui/task-list-item.ui b/data/ui/task-list-item.ui
index a132b00..d700551 100644
--- a/data/ui/task-list-item.ui
+++ b/data/ui/task-list-item.ui
@@ -7,6 +7,10 @@
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <style>
+ <class name="view" />
+ <class name="content-view" />
+ </style>
<child>
<object class="GtkBox" id="box">
<property name="visible">True</property>
@@ -48,22 +52,6 @@
<property name="position">0</property>
</packing>
</child>
- <child>
- <object class="GtkCheckButton" id="selection_check">
- <property name="width_request">32</property>
- <property name="height_request">32</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
</object>
</child>
<style>
diff --git a/data/ui/window.ui b/data/ui/window.ui
index 2a5504b..e62f572 100644
--- a/data/ui/window.ui
+++ b/data/ui/window.ui
@@ -243,16 +243,12 @@
</object>
</child>
<child>
- <object class="GtkButton" id="share_button">
+ <object class="GtkButton" id="cancel_selection_button">
+ <property name="visible" bind-source="select_button" bind-property="active"
bind-flags="default|sync-create"/>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <child>
- <object class="GtkImage" id="share_button_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">send-to-symbolic</property>
- </object>
- </child>
+ <property name="label" translatable="yes">Cancel</property>
+ <signal name="clicked" handler="gtd_window__cancel_selection_button_clicked" object="GtdWindow"
swapped="no" />
</object>
<packing>
<property name="pack_type">end</property>
@@ -261,8 +257,11 @@
</child>
<child>
<object class="GtkToggleButton" id="select_button">
+ <property name="visible" bind-source="back_button" bind-property="visible"
bind-flags="invert-boolean|sync-create"/>
+ <property name="visible" bind-source="select_button" bind-property="active"
bind-flags="invert-boolean|sync-create"/>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
+ <signal name="toggled" handler="gtd_window__select_button_toggled" object="GtdWindow"
swapped="no" />
<child>
<object class="GtkImage" id="select_button_image">
<property name="visible">True</property>
@@ -273,7 +272,7 @@
</object>
<packing>
<property name="pack_type">end</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -291,7 +290,7 @@
</object>
<packing>
<property name="pack_type">end</property>
- <property name="position">3</property>
+ <property name="position">4</property>
</packing>
</child>
<child>
diff --git a/src/gtd-enums.h b/src/gtd-enums.h
index 2b0f095..86c5c2f 100644
--- a/src/gtd-enums.h
+++ b/src/gtd-enums.h
@@ -26,7 +26,6 @@ G_BEGIN_DECLS
typedef enum
{
GTD_WINDOW_MODE_NORMAL,
- GTD_WINDOW_MODE_SEARCH,
GTD_WINDOW_MODE_SELECTION
} GtdWindowMode;
diff --git a/src/gtd-task-list-item.c b/src/gtd-task-list-item.c
index 0a0b60a..03786c0 100644
--- a/src/gtd-task-list-item.c
+++ b/src/gtd-task-list-item.c
@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "gtd-enum-types.h"
#include "gtd-task.h"
#include "gtd-task-list.h"
#include "gtd-task-list-item.h"
@@ -24,7 +25,6 @@
typedef struct
{
- GtkCheckButton *selection_check;
GtkImage *icon_image;
GtkLabel *subtitle_label;
GtkLabel *title_label;
@@ -34,6 +34,9 @@ typedef struct
GtdTaskList *list;
GtdWindowMode mode;
+ /* flags */
+ gint selected : 1;
+
} GtdTaskListItemPrivate;
struct _GtdTaskListItem
@@ -49,10 +52,12 @@ G_DEFINE_TYPE_WITH_PRIVATE (GtdTaskListItem, gtd_task_list_item, GTK_TYPE_FLOW_B
#define LUMINANCE(c) (0.299 * c->red + 0.587 * c->green + 0.114 * c->blue)
#define THUMBNAIL_SIZE 192
+#define CHECK_SIZE 40
enum {
PROP_0,
PROP_MODE,
+ PROP_SELECTED,
PROP_TASK_LIST,
LAST_PROP
};
@@ -247,6 +252,22 @@ gtd_task_list_item__render_thumbnail (GtdTaskListItem *item)
pango_font_description_free (font_desc);
g_object_unref (layout);
+ /* Draws the selection checkbox */
+ if (item->priv->mode == GTD_WINDOW_MODE_SELECTION)
+ {
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK);
+
+ if (item->priv->selected)
+ gtk_style_context_set_state (context, GTK_STATE_FLAG_CHECKED);
+
+ gtk_render_check (context,
+ cr,
+ THUMBNAIL_SIZE - CHECK_SIZE * 1.5,
+ THUMBNAIL_SIZE - CHECK_SIZE,
+ CHECK_SIZE,
+ CHECK_SIZE);
+ }
+
/* Retrieves the pixbuf from the drawed image */
pix = gdk_pixbuf_get_from_surface (surface,
0,
@@ -331,7 +352,11 @@ gtd_task_list_item_get_property (GObject *object,
switch (prop_id)
{
case PROP_MODE:
- g_value_set_int (value, self->priv->mode);
+ g_value_set_enum (value, self->priv->mode);
+ break;
+
+ case PROP_SELECTED:
+ g_value_set_boolean (value, self->priv->selected);
break;
case PROP_TASK_LIST:
@@ -355,9 +380,12 @@ gtd_task_list_item_set_property (GObject *object,
switch (prop_id)
{
case PROP_MODE:
- priv->mode = g_value_get_int (value);
- gtk_widget_set_visible (GTK_WIDGET (priv->selection_check),
- priv->mode == GTD_WINDOW_MODE_SELECTION);
+ priv->mode = g_value_get_enum (value);
+ gtd_task_list_item__update_thumbnail (self);
+ break;
+
+ case PROP_SELECTED:
+ gtd_task_list_item_set_selected (self, g_value_get_boolean (value));
break;
case PROP_TASK_LIST:
@@ -429,13 +457,26 @@ gtd_task_list_item_class_init (GtdTaskListItemClass *klass)
g_object_class_install_property (
object_class,
PROP_MODE,
- g_param_spec_int ("mode",
- _("Mode of this item"),
- _("The mode of this item, inherited from the parent's mode"),
- GTD_WINDOW_MODE_NORMAL,
- GTD_WINDOW_MODE_SELECTION,
- GTD_WINDOW_MODE_NORMAL,
- G_PARAM_READWRITE));
+ g_param_spec_enum ("mode",
+ _("Mode of this item"),
+ _("The mode of this item, inherited from the parent's mode"),
+ GTD_TYPE_WINDOW_MODE,
+ GTD_WINDOW_MODE_NORMAL,
+ G_PARAM_READWRITE));
+
+ /**
+ * GtdTaskListItem::selected:
+ *
+ * Whether this item is selected when in %GTD_WINDOW_MODE_SELECTION.
+ */
+ g_object_class_install_property (
+ object_class,
+ PROP_SELECTED,
+ g_param_spec_boolean ("selected",
+ _("Whether the task list is selected"),
+ _("Whether the task list is selected when in selection mode"),
+ FALSE,
+ G_PARAM_READWRITE));
/**
* GtdTaskListItem::task-list:
@@ -455,7 +496,6 @@ gtd_task_list_item_class_init (GtdTaskListItemClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/task-list-item.ui");
gtk_widget_class_bind_template_child_private (widget_class, GtdTaskListItem, icon_image);
- gtk_widget_class_bind_template_child_private (widget_class, GtdTaskListItem, selection_check);
gtk_widget_class_bind_template_child_private (widget_class, GtdTaskListItem, spinner);
gtk_widget_class_bind_template_child_private (widget_class, GtdTaskListItem, subtitle_label);
gtk_widget_class_bind_template_child_private (widget_class, GtdTaskListItem, title_label);
@@ -484,3 +524,48 @@ gtd_task_list_item_get_list (GtdTaskListItem *item)
return item->priv->list;
}
+
+/**
+ * gtd_task_list_item_get_selected:
+ * @item: a #GtdTaskListItem
+ *
+ * Retrieves whether @item is selected or not.
+ *
+ * Returns: %TRUE if @item is selected, %FALSE otherwise
+ */
+gboolean
+gtd_task_list_item_get_selected (GtdTaskListItem *item)
+{
+ g_return_val_if_fail (GTD_IS_TASK_LIST_ITEM (item), FALSE);
+
+ return item->priv->selected;
+}
+
+/**
+ * gtd_task_list_item_set_selected:
+ * @item: a #GtdTaskListItem
+ * @selected: %TRUE if @item is selected, %FALSE otherwise
+ *
+ * Sets whether @item is selected or not.
+ *
+ * Returns:
+ */
+void
+gtd_task_list_item_set_selected (GtdTaskListItem *item,
+ gboolean selected)
+{
+ GtdTaskListItemPrivate *priv;
+
+ g_return_if_fail (GTD_IS_TASK_LIST_ITEM (item));
+
+ priv = item->priv;
+
+ if (priv->selected != selected)
+ {
+ priv->selected = selected;
+
+ gtd_task_list_item__update_thumbnail (item);
+
+ g_object_notify (G_OBJECT (item), "selected");
+ }
+}
diff --git a/src/gtd-task-list-item.h b/src/gtd-task-list-item.h
index 224daed..5d92936 100644
--- a/src/gtd-task-list-item.h
+++ b/src/gtd-task-list-item.h
@@ -33,6 +33,11 @@ GtkWidget* gtd_task_list_item_new (GtdTaskList
GtdTaskList* gtd_task_list_item_get_list (GtdTaskListItem *item);
+gboolean gtd_task_list_item_get_selected (GtdTaskListItem *item);
+
+void gtd_task_list_item_set_selected (GtdTaskListItem *item,
+ gboolean selected);
+
G_END_DECLS
#endif /* GTD_TASK_LIST_ITEM_H */
diff --git a/src/gtd-window.c b/src/gtd-window.c
index 85f96f9..a7dc758 100644
--- a/src/gtd-window.c
+++ b/src/gtd-window.c
@@ -17,6 +17,7 @@
*/
#include "gtd-application.h"
+#include "gtd-enum-types.h"
#include "gtd-task-list-view.h"
#include "gtd-manager.h"
#include "gtd-notification.h"
@@ -31,17 +32,20 @@
typedef struct
{
+ GtkWidget *action_bar;
GtkButton *back_button;
GtkColorButton *color_button;
GtkHeaderBar *headerbar;
GtkFlowBox *lists_flowbox;
GtkStack *main_stack;
+ GtkWidget *new_list_button;
GtkWidget *new_list_popover;
GtdNotificationWidget *notification_widget;
GtdTaskListView *scheduled_list_view;
GtkSearchBar *search_bar;
GtkToggleButton *search_button;
GtkSearchEntry *search_entry;
+ GtkWidget *select_button;
GtkStack *stack;
GtkStackSwitcher *stack_switcher;
GtdStorageDialog *storage_dialog;
@@ -78,6 +82,7 @@ static const GActionEntry gtd_window_entries[] = {
enum {
PROP_0,
PROP_MANAGER,
+ PROP_MODE,
LAST_PROP
};
@@ -96,6 +101,20 @@ gtd_window__stack_visible_child_cb (GtdWindow *window)
}
static void
+gtd_window__select_button_toggled (GtkToggleButton *button,
+ GtdWindow *window)
+{
+ gtd_window_set_mode (window, gtk_toggle_button_get_active (button) ? GTD_WINDOW_MODE_SELECTION :
GTD_WINDOW_MODE_NORMAL);
+}
+
+static void
+gtd_window__cancel_selection_button_clicked (GtkWidget *button,
+ GtdWindow *window)
+{
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (window->priv->select_button), FALSE);
+}
+
+static void
gtd_window_update_list_counters (GtdTaskList *list,
GtdTask *task,
GtdWindow *window)
@@ -311,30 +330,42 @@ gtd_window__list_selected (GtkFlowBox *flowbox,
g_return_if_fail (GTD_IS_WINDOW (user_data));
g_return_if_fail (GTD_IS_TASK_LIST_ITEM (item));
- list = gtd_task_list_item_get_list (item);
- list_color = gtd_task_list_get_color (list);
+ switch (priv->mode)
+ {
+ case GTD_WINDOW_MODE_SELECTION:
+ gtd_task_list_item_set_selected (item, !gtd_task_list_item_get_selected (item));
+ break;
+
+ case GTD_WINDOW_MODE_NORMAL:
+ list = gtd_task_list_item_get_list (item);
+ list_color = gtd_task_list_get_color (list);
- g_signal_handlers_block_by_func (priv->color_button,
- gtd_window__list_color_set,
- user_data);
+ g_signal_handlers_block_by_func (priv->color_button,
+ gtd_window__list_color_set,
+ user_data);
- gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->color_button), list_color);
+ gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->color_button), list_color);
- gtk_stack_set_visible_child_name (priv->main_stack, "tasks");
- gtk_header_bar_set_title (priv->headerbar, gtd_task_list_get_name (list));
- gtk_header_bar_set_subtitle (priv->headerbar, gtd_task_list_get_origin (list));
- gtk_header_bar_set_custom_title (priv->headerbar, NULL);
- gtk_search_bar_set_search_mode (priv->search_bar, FALSE);
- gtd_task_list_view_set_task_list (priv->list_view, list);
- gtd_task_list_view_set_show_completed (priv->list_view, FALSE);
- gtk_widget_show (GTK_WIDGET (priv->back_button));
- gtk_widget_show (GTK_WIDGET (priv->color_button));
+ gtk_stack_set_visible_child_name (priv->main_stack, "tasks");
+ gtk_header_bar_set_title (priv->headerbar, gtd_task_list_get_name (list));
+ gtk_header_bar_set_subtitle (priv->headerbar, gtd_task_list_get_origin (list));
+ gtk_header_bar_set_custom_title (priv->headerbar, NULL);
+ gtk_search_bar_set_search_mode (priv->search_bar, FALSE);
+ gtd_task_list_view_set_task_list (priv->list_view, list);
+ gtd_task_list_view_set_show_completed (priv->list_view, FALSE);
+ gtk_widget_show (GTK_WIDGET (priv->back_button));
+ gtk_widget_show (GTK_WIDGET (priv->color_button));
- g_signal_handlers_unblock_by_func (priv->color_button,
- gtd_window__list_color_set,
- user_data);
+ g_signal_handlers_unblock_by_func (priv->color_button,
+ gtd_window__list_color_set,
+ user_data);
- gdk_rgba_free (list_color);
+ gdk_rgba_free (list_color);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
}
static void
@@ -346,6 +377,13 @@ gtd_window__list_added (GtdManager *manager,
GtkWidget *item;
item = gtd_task_list_item_new (list);
+
+ g_object_bind_property (user_data,
+ "mode",
+ item,
+ "mode",
+ G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
gtk_widget_show (item);
gtk_flow_box_insert (priv->lists_flowbox,
@@ -411,6 +449,10 @@ gtd_window_get_property (GObject *object,
g_value_set_object (value, self->priv->manager);
break;
+ case PROP_MODE:
+ g_value_set_enum (value, self->priv->mode);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -488,6 +530,10 @@ gtd_window_set_property (GObject *object,
g_object_notify (object, "manager");
break;
+ case PROP_MODE:
+ gtd_window_set_mode (self, g_value_get_enum (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -518,14 +564,31 @@ gtd_window_class_init (GtdWindowClass *klass)
GTD_TYPE_MANAGER,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ /**
+ * GtdWindow::mode:
+ *
+ * The current interaction mode of the window.
+ */
+ g_object_class_install_property (
+ object_class,
+ PROP_MODE,
+ g_param_spec_enum ("mode",
+ _("Mode of this window"),
+ _("The interaction mode of the window"),
+ GTD_TYPE_WINDOW_MODE,
+ GTD_WINDOW_MODE_NORMAL,
+ G_PARAM_READWRITE));
+
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/window.ui");
+ gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, action_bar);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, back_button);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, color_button);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, headerbar);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, lists_flowbox);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, list_view);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, main_stack);
+ gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, new_list_button);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, new_list_popover);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, notification_widget);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, scheduled_list_view);
@@ -533,14 +596,17 @@ gtd_window_class_init (GtdWindowClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, search_bar);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, search_button);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, search_entry);
+ gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, select_button);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, stack_switcher);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, storage_dialog);
gtk_widget_class_bind_template_child_private (widget_class, GtdWindow, today_list_view);
gtk_widget_class_bind_template_callback (widget_class, gtd_window__back_button_clicked);
+ gtk_widget_class_bind_template_callback (widget_class, gtd_window__cancel_selection_button_clicked);
gtk_widget_class_bind_template_callback (widget_class, gtd_window__list_color_set);
gtk_widget_class_bind_template_callback (widget_class, gtd_window__list_selected);
gtk_widget_class_bind_template_callback (widget_class, gtd_window__on_key_press_event);
+ gtk_widget_class_bind_template_callback (widget_class, gtd_window__select_button_toggled);
gtk_widget_class_bind_template_callback (widget_class, gtd_window__stack_visible_child_cb);
}
@@ -620,3 +686,75 @@ gtd_window_cancel_notification (GtdWindow *window,
gtd_notification_widget_cancel (priv->notification_widget, notification);
}
+
+/**
+ * gtd_window_get_mode:
+ * @window: a #GtdWindow
+ *
+ * Retrieves the current mode of @window.
+ *
+ * Returns: the #GtdWindow::mode property value
+ */
+GtdWindowMode
+gtd_window_get_mode (GtdWindow *window)
+{
+ g_return_val_if_fail (GTD_IS_WINDOW (window), GTD_WINDOW_MODE_NORMAL);
+
+ return window->priv->mode;
+}
+
+/**
+ * gtd_window_set_mode:
+ * @window: a #GtdWindow
+ * @mode: a #GtdWindowMode
+ *
+ * Sets the current window mode to @mode.
+ *
+ * Returns:
+ */
+void
+gtd_window_set_mode (GtdWindow *window,
+ GtdWindowMode mode)
+{
+ GtdWindowPrivate *priv;
+
+ g_return_if_fail (GTD_IS_WINDOW (window));
+
+ priv = window->priv;
+
+ if (priv->mode != mode)
+ {
+ GtkStyleContext *context;
+ gboolean is_selection_mode;
+
+ priv->mode = mode;
+ context = gtk_widget_get_style_context (GTK_WIDGET (priv->headerbar));
+ is_selection_mode = (mode == GTD_WINDOW_MODE_SELECTION);
+
+ gtk_widget_set_visible (priv->select_button, is_selection_mode);
+ gtk_widget_set_visible (GTK_WIDGET (priv->new_list_button), !is_selection_mode);
+ gtk_widget_set_visible (GTK_WIDGET (priv->action_bar), is_selection_mode);
+ gtk_header_bar_set_show_close_button (priv->headerbar, !is_selection_mode);
+ gtk_header_bar_set_subtitle (priv->headerbar, NULL);
+
+ if (is_selection_mode)
+ {
+ gtk_style_context_add_class (context, "selection-mode");
+ gtk_header_bar_set_custom_title (priv->headerbar, NULL);
+ gtk_header_bar_set_title (priv->headerbar, _("Click a task list to select"));
+ }
+ else
+ {
+ /* Unselect all items when leaving selection mode */
+ gtk_container_foreach (GTK_CONTAINER (priv->lists_flowbox),
+ (GtkCallback) gtd_task_list_item_set_selected,
+ FALSE);
+
+ gtk_style_context_remove_class (context, "selection-mode");
+ gtk_header_bar_set_custom_title (priv->headerbar, GTK_WIDGET (priv->stack_switcher));
+ gtk_header_bar_set_title (priv->headerbar, _("To Do"));
+ }
+
+ g_object_notify (G_OBJECT (window), "mode");
+ }
+}
diff --git a/src/gtd-window.h b/src/gtd-window.h
index 901f2ce..2c96d36 100644
--- a/src/gtd-window.h
+++ b/src/gtd-window.h
@@ -40,6 +40,11 @@ void gtd_window_notify (GtdWindow
void gtd_window_cancel_notification (GtdWindow *window,
GtdNotification *notification);
+GtdWindowMode gtd_window_get_mode (GtdWindow *window);
+
+void gtd_window_set_mode (GtdWindow *window,
+ GtdWindowMode mode);
+
G_END_DECLS
#endif /* GTD_WINDOW_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]