summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-07-08 17:26:44 -0400
committerKristian Høgsberg <krh@redhat.com>2006-07-08 17:26:44 -0400
commit420b48e001a0cbf1d51661ef4deba4979451561c (patch)
tree7aac71c0ab854703c612bdf8eec651e4b27743b3
parente06b4cc6b24eec039e5902948158394ca0906128 (diff)
Read out position from gconf and update when value changes.
-rw-r--r--dock.c211
-rw-r--r--kiba.schemas16
2 files changed, 163 insertions, 64 deletions
diff --git a/dock.c b/dock.c
index 2220325..d5b620b 100644
--- a/dock.c
+++ b/dock.c
@@ -39,21 +39,21 @@ typedef struct _KibaDockClass KibaDockClass;
typedef struct _KibaLauncher KibaLauncher;
typedef enum {
- KIBA_DOCK_POSITION_LEFT_SIDE_TOP,
- KIBA_DOCK_POSITION_LEFT_SIDE_CENTER,
- KIBA_DOCK_POSITION_LEFT_SIDE_BOTTOM,
+ KIBA_DOCK_POSITION_LEFT_EDGE_TOP,
+ KIBA_DOCK_POSITION_LEFT_EDGE_CENTER,
+ KIBA_DOCK_POSITION_LEFT_EDGE_BOTTOM,
- KIBA_DOCK_POSITION_RIGHT_SIDE_TOP,
- KIBA_DOCK_POSITION_RIGHT_SIDE_CENTER,
- KIBA_DOCK_POSITION_RIGHT_SIDE_BOTTOM,
+ KIBA_DOCK_POSITION_RIGHT_EDGE_TOP,
+ KIBA_DOCK_POSITION_RIGHT_EDGE_CENTER,
+ KIBA_DOCK_POSITION_RIGHT_EDGE_BOTTOM,
- KIBA_DOCK_POSITION_TOP_SIDE_LEFT,
- KIBA_DOCK_POSITION_TOP_SIDE_CENTER,
- KIBA_DOCK_POSITION_TOP_SIDE_RIGHT,
+ KIBA_DOCK_POSITION_TOP_EDGE_LEFT,
+ KIBA_DOCK_POSITION_TOP_EDGE_CENTER,
+ KIBA_DOCK_POSITION_TOP_EDGE_RIGHT,
- KIBA_DOCK_POSITION_BOTTOM_SIDE_LEFT,
- KIBA_DOCK_POSITION_BOTTOM_SIDE_CENTER,
- KIBA_DOCK_POSITION_BOTTOM_SIDE_RIGHT
+ KIBA_DOCK_POSITION_BOTTOM_EDGE_LEFT,
+ KIBA_DOCK_POSITION_BOTTOM_EDGE_CENTER,
+ KIBA_DOCK_POSITION_BOTTOM_EDGE_RIGHT
} KibaDockPosition;
struct _KibaDock
@@ -130,7 +130,7 @@ static void kiba_dock_init_model (KibaDock *dock,
int width,
int height);
-static KibaLauncher *kiba_launcher_new (KibaDock *dock, Object *object,
+static KibaLauncher *kiba_launcher_new (KibaDock *dock,
const char *gconf_path);
static void kiba_launcher_create_window (KibaLauncher *launcher);
static void kiba_dock_add_launcher (KibaDock *dock, KibaLauncher *launcher,
@@ -141,24 +141,25 @@ static gint timeout_callback (gpointer data);
G_DEFINE_TYPE (KibaDock, kiba_dock, GTK_TYPE_WIDGET)
typedef struct {
- GtkOrientation orientation;
- int halignment;
- int valignment;
+ const char *name;
+ GtkOrientation orientation;
+ int halignment;
+ int valignment;
} KibaDockLayoutData;
static const KibaDockLayoutData kiba_dock_layout_data[] = {
- { GTK_ORIENTATION_VERTICAL, 0, 0 },
- { GTK_ORIENTATION_VERTICAL, 0, 1 },
- { GTK_ORIENTATION_VERTICAL, 0, 2 },
- { GTK_ORIENTATION_VERTICAL, 2, 0 },
- { GTK_ORIENTATION_VERTICAL, 2, 1 },
- { GTK_ORIENTATION_VERTICAL, 2, 2 },
- { GTK_ORIENTATION_HORIZONTAL, 0, 0 },
- { GTK_ORIENTATION_HORIZONTAL, 1, 0 },
- { GTK_ORIENTATION_HORIZONTAL, 2, 0 },
- { GTK_ORIENTATION_HORIZONTAL, 0, 2 },
- { GTK_ORIENTATION_HORIZONTAL, 1, 2 },
- { GTK_ORIENTATION_HORIZONTAL, 2, 2 }
+ { "left-edge-top", GTK_ORIENTATION_VERTICAL, 0, 0 },
+ { "left-edge-center", GTK_ORIENTATION_VERTICAL, 0, 1 },
+ { "left-edge-bottom", GTK_ORIENTATION_VERTICAL, 0, 2 },
+ { "right-edge-top", GTK_ORIENTATION_VERTICAL, 2, 0 },
+ { "right-edge-center", GTK_ORIENTATION_VERTICAL, 2, 1 },
+ { "right-edge-bottom", GTK_ORIENTATION_VERTICAL, 2, 2 },
+ { "top-edge-left", GTK_ORIENTATION_HORIZONTAL, 0, 0 },
+ { "top-edge-center", GTK_ORIENTATION_HORIZONTAL, 1, 0 },
+ { "top-edge-right", GTK_ORIENTATION_HORIZONTAL, 2, 0 },
+ { "bottom-edge-left", GTK_ORIENTATION_HORIZONTAL, 0, 2 },
+ { "bottom-edge-center", GTK_ORIENTATION_HORIZONTAL, 1, 2 },
+ { "bottom-edge-right", GTK_ORIENTATION_HORIZONTAL, 2, 2 }
};
static void
@@ -181,11 +182,8 @@ kiba_dock_class_init (KibaDockClass *class)
static void
kiba_dock_init (KibaDock *dock)
{
- GSList *launchers, *l;
- GError *error = NULL;
GdkScreen *screen;
- int width, height, i;
- KibaLauncher *launcher;
+ int width, height;
static const GtkTargetEntry targets[] = {
{ "text/plain", 0, 0 }
};
@@ -195,42 +193,15 @@ kiba_dock_init (KibaDock *dock)
GTK_PRIVATE_SET_FLAG (GTK_WIDGET (dock), GTK_ANCHORED);
- dock->gconf_client = gconf_client_get_default ();
-
- gconf_client_add_dir (dock->gconf_client, KIBA_GCONF_PATH,
- GCONF_CLIENT_PRELOAD_NONE, NULL);
-
- launchers = gconf_client_all_dirs (dock->gconf_client,
- KIBA_GCONF_PATH "/launchers",
- &error);
- if (error != NULL)
- {
- printf ("error getting launchers: %s\n", error->message);
- g_free (error->message);
- }
-
screen = gdk_screen_get_default ();
width = gdk_screen_get_width (screen);
height = gdk_screen_get_height (screen);
- dock->position = KIBA_DOCK_POSITION_BOTTOM_SIDE_CENTER;
+ dock->position = KIBA_DOCK_POSITION_BOTTOM_EDGE_CENTER;
dock->spacing = ICON_SIZE;
kiba_dock_init_model (dock, width, height);
- dock->num_launchers = g_slist_length (launchers);
- for (l = launchers, i = 0; l != NULL; l = l->next, i++)
- {
- char *path = l->data;
- launcher = kiba_launcher_new (dock, &dock->model.objects[i + 1], path);
- if (launcher == NULL)
- continue;
-
- kiba_dock_add_launcher (dock, launcher,
- g_random_int_range (0, width),
- g_random_int_range (0, height));
- }
-
gtk_drag_dest_set (GTK_WIDGET (dock),
GTK_DEST_DEFAULT_ALL,
targets, G_N_ELEMENTS (targets),
@@ -241,9 +212,13 @@ kiba_dock_init (KibaDock *dock)
}
GtkWidget*
-kiba_dock_new (void)
+kiba_dock_new (GConfClient *gconf_client)
{
- return g_object_new (KIBA_TYPE_DOCK, NULL);
+ GtkWidget *dock = g_object_new (KIBA_TYPE_DOCK, NULL);
+
+ KIBA_DOCK (dock)->gconf_client = gconf_client;
+
+ return dock;
}
static KibaLauncher *
@@ -430,6 +405,14 @@ kiba_dock_layout (KibaDock *dock)
}
gtk_widget_size_allocate (GTK_WIDGET (dock), &allocation);
+ gtk_widget_queue_draw (GTK_WIDGET (dock));
+}
+
+static void
+kiba_dock_set_position (KibaDock *dock, KibaDockPosition position)
+{
+ dock->position = position;
+ kiba_dock_layout (dock);
}
static void
@@ -505,6 +488,7 @@ kiba_dock_add_launcher (KibaDock *dock, KibaLauncher *launcher, int x, int y)
dock->object = object;
model_for_each_object (&dock->model, add_spacer, dock);
dock->launchers = g_list_prepend (dock->launchers, launcher);
+ dock->num_launchers++;
launcher->object = object;
launcher->dock = dock;
@@ -771,7 +755,7 @@ kiba_launcher_create_window (KibaLauncher *launcher)
}
static KibaLauncher *
-kiba_launcher_new (KibaDock *dock, Object *object, const char *gconf_path)
+kiba_launcher_new (KibaDock *dock, const char *gconf_path)
{
KibaLauncher *launcher;
GError *error = NULL;
@@ -850,13 +834,112 @@ kiba_dock_drag_data_received(GtkWidget *widget,
g_free (key);
}
+static void
+set_position_from_string (KibaDock *dock, const char *string)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (kiba_dock_layout_data); i++)
+ {
+ if (strcmp (kiba_dock_layout_data[i].name, string) == 0)
+ {
+ kiba_dock_set_position (dock, i);
+ return;
+ }
+ }
+
+ printf ("invalid position\n");
+}
+
+void
+key_changed_callback(GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry,
+ gpointer user_data)
+{
+ KibaDock *dock;
+ const char *value;
+
+ dock = KIBA_DOCK (user_data);
+
+ if (strcmp (entry->key, KIBA_GCONF_PATH "/options/position") == 0)
+ {
+ if (entry->value == NULL || entry->value->type != GCONF_VALUE_STRING)
+ {
+ printf ("unset or wrong type\n");
+ }
+ else
+ {
+ value = gconf_value_get_string (entry->value);
+ set_position_from_string (dock, value);
+ }
+ }
+}
+
+static void
+add_launchers (KibaDock *dock, GConfClient *gconf_client)
+{
+ GSList *launchers, *l;
+ GError *error = NULL;
+ KibaLauncher *launcher;
+ GdkScreen *screen;
+ int width, height;
+
+ screen = gdk_screen_get_default ();
+ width = gdk_screen_get_width (screen);
+ height = gdk_screen_get_height (screen);
+
+ launchers = gconf_client_all_dirs (gconf_client,
+ KIBA_GCONF_PATH "/launchers",
+ &error);
+ if (error != NULL)
+ {
+ printf ("error getting launchers: %s\n", error->message);
+ g_free (error->message);
+ }
+
+ for (l = launchers; l != NULL; l = l->next)
+ {
+ char *path = l->data;
+ launcher = kiba_launcher_new (dock, path);
+ if (launcher == NULL)
+ continue;
+
+ kiba_dock_add_launcher (dock, launcher,
+ g_random_int_range (0, width),
+ g_random_int_range (0, height));
+ }
+}
+
int main (int argc, char *argv[])
{
GtkWidget *dock;
+ GConfClient *gconf_client;
+ GError *error = NULL;
+ char *position;
gtk_init (&argc, &argv);
- dock = kiba_dock_new ();
+ gconf_client = gconf_client_get_default ();
+
+ dock = kiba_dock_new (gconf_client);
+
+ gconf_client_add_dir (gconf_client, KIBA_GCONF_PATH,
+ GCONF_CLIENT_PRELOAD_NONE, &error);
+
+ position = gconf_client_get_string (gconf_client,
+ KIBA_GCONF_PATH "/options/position",
+ &error);
+ set_position_from_string (KIBA_DOCK (dock), position);
+ g_free (position);
+
+ gconf_client_notify_add(gconf_client, KIBA_GCONF_PATH "/options",
+ key_changed_callback,
+ dock,
+ NULL, &error);
+
+ add_launchers (KIBA_DOCK (dock), gconf_client);
+
gtk_widget_show (dock);
gtk_main ();
diff --git a/kiba.schemas b/kiba.schemas
index e8ac109..3edf52f 100644
--- a/kiba.schemas
+++ b/kiba.schemas
@@ -2,6 +2,22 @@
<schemalist>
<schema>
+ <applyto>/apps/kiba/options/position</applyto>
+ <key>/schemas/apps/kiba/options/position</key>
+ <owner>kiba</owner>
+ <type>string</type>
+ <default>bottom-edge-center</default>
+
+ <locale name="C">
+ <short>Position of dock.</short>
+ <long>
+ Can be top-edge-left, top-edge-center, top-edge-right,
+ left-edge-top etc.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
<key>/schemas/apps/kiba/launchers/file</key>
<owner>kiba</owner>
<type>string</type>