/* vim: set et sw=2: */ #include #include #include #include "gpager.h" #include "gconfig.h" #include "callback.h" GpagerConfig *config; GtkWidget *window, *wnck_pager; gboolean ret_val; GtkWidget* gpager_create (GConfClient *client) { config = malloc (sizeof (GpagerConfig)); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); wnck_pager = wnck_pager_new (wnck_screen_get_default ()); g_object_set_data (G_OBJECT (window), "client", client); g_object_set_data_full (G_OBJECT (window), "config", config, free); load_config (client, config); /* set widgets properties */ g_object_set (window, "skip-pager-hint", TRUE, NULL); g_object_set (window, "skip-taskbar-hint", TRUE, NULL); g_object_set (wnck_pager, "can-focus", FALSE, NULL); gtk_window_stick (GTK_WINDOW (window)); gtk_window_set_decorated (GTK_WINDOW (window), FALSE); gpager_set_border_width (config->border_width); gpager_keep_above (config->keep_above); /* set the number of rows */ if (config->rows <= 0) config->rows = 1; ret_val = wnck_pager_set_n_rows ((WnckPager*)wnck_pager, config->rows); //printf("set rows to %d returns %d\n",config->rows,ret_val); gtk_container_add (GTK_CONTAINER (window), wnck_pager); /* draw the pager */ gpager_update_geometry (); gpager_redraw (); /* move the window */ gtk_window_move (GTK_WINDOW (window), config->pos_x, config->pos_y); /* connect the signals */ g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy_callback), NULL); g_signal_connect (G_OBJECT (window), "button-press-event", G_CALLBACK (button_press_callback), window); g_signal_connect (G_OBJECT (window), "leave-notify-event", G_CALLBACK (leave_notify_callback), window); g_signal_connect (G_OBJECT (wnck_pager), "scroll-event", G_CALLBACK (mouse_scroll_callback), NULL); return window; } void gpager_update_geometry () { int width, height, cols, rows; double aspect; if (config->dynamic_rows) { rows = sqrt(config->workspaces); while (rows > 0 && config->workspaces % rows != 0) { rows--; } cols = config->workspaces / rows; } else { rows = config->rows; cols = ceil((double) config->workspaces / rows); } aspect = (double) gdk_screen_width() * cols / ((double) gdk_screen_height() * rows); /* keep the length of the diagonal */ height = rint(cos(atan(aspect)) * sqrt((double) (config->width * config->width) + (double) (config->height * config->height))); width = rint(height * aspect); config->width = width; config->height = height; wnck_pager_set_n_rows (WNCK_PAGER (wnck_pager), rows); } void gpager_redraw () { GdkGeometry geometry; double aspect; aspect = (double) config->width / config->height; geometry.min_width = 10; geometry.min_height = 10; geometry.min_aspect = aspect; geometry.max_aspect = aspect; gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL, &geometry, GDK_HINT_ASPECT | GDK_HINT_MIN_SIZE); gtk_window_resize (GTK_WINDOW (window), config->width, config->height); } void gpager_set_border_width (guint width) { gtk_container_set_border_width (GTK_CONTAINER (window), width); } void gpager_keep_above (gboolean setting) { gtk_window_set_keep_above ((GtkWindow*)window, setting); }