diff options
author | Kristian Høgsberg <krh@redhat.com> | 2006-07-08 17:26:44 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2006-07-08 17:26:44 -0400 |
commit | 420b48e001a0cbf1d51661ef4deba4979451561c (patch) | |
tree | 7aac71c0ab854703c612bdf8eec651e4b27743b3 | |
parent | e06b4cc6b24eec039e5902948158394ca0906128 (diff) |
Read out position from gconf and update when value changes.
-rw-r--r-- | dock.c | 211 | ||||
-rw-r--r-- | kiba.schemas | 16 |
2 files changed, 163 insertions, 64 deletions
@@ -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> |