Only in .: config.h Only in .: config.log Only in .: config.status Only in ./doc: Makefile Only in .: intltool-extract Only in .: intltool-merge Only in .: intltool-update Only in .: libtool Only in ./libwnck: application.lo Only in ./libwnck: application.o Only in ./libwnck: class-group.lo Only in ./libwnck: class-group.o Only in ./libwnck: .deps Only in ./libwnck: .libs Only in ./libwnck: libwnck-1.la Only in ./libwnck: Makefile Only in ./libwnck: pager-accessible-factory.lo Only in ./libwnck: pager-accessible-factory.o Only in ./libwnck: pager-accessible.lo Only in ./libwnck: pager-accessible.o Only in ./libwnck: pager.lo Only in ./libwnck: pager.o Only in ./libwnck: screen.lo Only in ./libwnck: screen.o Only in ./libwnck: selector.lo Only in ./libwnck: selector.o Only in ./libwnck: stamp-wnck-enum-types.h Only in ./libwnck: stamp-wnck-marshal.h Only in ./libwnck: tasklist.lo Only in ./libwnck: tasklist.o Only in ./libwnck: test-pager Only in ./libwnck: test-pager.o Only in ./libwnck: test-selector Only in ./libwnck: test-selector.o Only in ./libwnck: test-tasklist Only in ./libwnck: test-tasklist.o Only in ./libwnck: test-wnck Only in ./libwnck: test-wnck.o Only in ./libwnck: util.lo Only in ./libwnck: util.o Index: libwnck/window-action-menu.c =================================================================== --- libwnck/window-action-menu.c.orig +++ libwnck/window-action-menu.c @@ -56,7 +56,13 @@ typedef enum RIGHT, UP, DOWN, - MOVE_TO_WORKSPACE + MOVE_TO_WORKSPACE, + STICK, + VIEWPORT_LEFT, + VIEWPORT_RIGHT, + VIEWPORT_UP, + VIEWPORT_DOWN, + MOVE_TO_VIEWPORT } WindowAction; typedef struct _ActionMenuData ActionMenuData; @@ -80,6 +86,13 @@ struct _ActionMenuData GtkWidget *up_item; GtkWidget *down_item; GtkWidget *workspace_item; + GtkWidget *viewport_separator; + GtkWidget *stick_item; + GtkWidget *viewport_left_item; + GtkWidget *viewport_right_item; + GtkWidget *viewport_up_item; + GtkWidget *viewport_down_item; + GtkWidget *viewport_item; guint idle_handler; }; @@ -331,8 +344,74 @@ item_activated_callback (GtkWidget *menu ww, hw); } break; + case STICK: + if (wnck_window_is_sticky (amd->window)) + wnck_window_unstick (amd->window); + else + wnck_window_stick (amd->window); + break; + case VIEWPORT_LEFT: + { + int width, xw, yw; + + width = wnck_screen_get_width (wnck_window_get_screen (amd->window)); + wnck_window_get_geometry (amd->window, &xw, &yw, NULL, NULL); + wnck_window_move (amd->window, xw - width, yw); + break; + } + case VIEWPORT_RIGHT: + { + int width, xw, yw; + + width = wnck_screen_get_width (wnck_window_get_screen (amd->window)); + wnck_window_get_geometry (amd->window, &xw, &yw, NULL, NULL); + wnck_window_move (amd->window, xw + width, yw); + break; + } + case VIEWPORT_UP: + { + int height, xw, yw; + + height = wnck_screen_get_height (wnck_window_get_screen (amd->window)); + wnck_window_get_geometry (amd->window, &xw, &yw, NULL, NULL); + wnck_window_move (amd->window, xw, yw - height); + break; + } + case VIEWPORT_DOWN: + { + int height, xw, yw; + + height = wnck_screen_get_height (wnck_window_get_screen (amd->window)); + wnck_window_get_geometry (amd->window, &xw, &yw, NULL, NULL); + wnck_window_move (amd->window, xw, yw + height); + break; + } + case MOVE_TO_VIEWPORT: + { + WnckWorkspace *workspace; + int viewport_x, viewport_y, xw, yw, x, y; + + workspace = wnck_window_get_workspace (amd->window); + if (!workspace) + workspace = wnck_screen_get_workspace (wnck_window_get_screen (amd->window), 0); + viewport_x = wnck_workspace_get_viewport_x (workspace); + viewport_y = wnck_workspace_get_viewport_y (workspace); + + x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), "x")); + y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), "y")); + + wnck_window_get_geometry (amd->window, &xw, &yw, NULL, NULL); + + if (wnck_window_is_sticky (amd->window)) + wnck_window_unstick (amd->window); + + wnck_window_move (amd->window, + xw + x - viewport_x, + yw + y - viewport_y); + break; + } default: - g_assert_not_reached (); + g_assert_not_reached (); } } @@ -601,6 +680,58 @@ update_menu_state (ActionMenuData *amd) gtk_menu_popdown (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (amd->workspace_item)))); } + if (wnck_window_is_sticky (amd->window)) + { + set_item_text (amd->stick_item, _("_Only in This Viewport")); + set_item_stock (amd->stick_item, NULL); + gtk_widget_set_sensitive (amd->stick_item, + (actions & WNCK_WINDOW_ACTION_STICK) != 0); + } + else + { + set_item_text (amd->stick_item, _("_Always in Visible Viewport")); + set_item_stock (amd->stick_item, NULL); + gtk_widget_set_sensitive (amd->stick_item, + (actions & WNCK_WINDOW_ACTION_STICK) != 0); + } + + if (!wnck_window_is_sticky (amd->window)) + { + if (amd->viewport_item) + gtk_widget_set_sensitive (amd->viewport_item, + (actions & WNCK_WINDOW_ACTION_MOVE) != 0); + + if (amd->viewport_left_item) + gtk_widget_set_sensitive (amd->viewport_left_item, + (actions & WNCK_WINDOW_ACTION_MOVE) != 0); + + if (amd->viewport_right_item) + gtk_widget_set_sensitive (amd->viewport_right_item, + (actions & WNCK_WINDOW_ACTION_MOVE) != 0); + + if (amd->viewport_up_item) + gtk_widget_set_sensitive (amd->viewport_up_item, + (actions & WNCK_WINDOW_ACTION_MOVE) != 0); + + if (amd->viewport_down_item) + gtk_widget_set_sensitive (amd->viewport_down_item, + (actions & WNCK_WINDOW_ACTION_MOVE) != 0); + } + if (wnck_workspace_is_virtual (wnck_screen_get_active_workspace (screen))) + { + gtk_widget_show (amd->viewport_separator); + gtk_widget_show (amd->stick_item); + gtk_widget_show (amd->viewport_item); + } + else + { + gtk_widget_hide (amd->viewport_separator); + gtk_widget_hide (amd->stick_item); + gtk_widget_hide (amd->viewport_item); + } + + + gtk_menu_reposition (GTK_MENU (amd->menu)); return FALSE; @@ -970,6 +1101,12 @@ wnck_create_window_action_menu (WnckWind GtkWidget *separator; GSList *pin_group; WnckScreen *screen; + WnckWorkspace *workspace; + int i; + + int viewport_x, viewport_y, viewport_width, viewport_height; + int screen_width, screen_height; + int x, y; g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL); @@ -1070,9 +1207,113 @@ wnck_create_window_action_menu (WnckWind gtk_menu_shell_append (GTK_MENU_SHELL (menu), amd->workspace_item); - if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window), - "_NET_WM_WINDOW_OPACITY")) - { + amd->viewport_separator = separator = gtk_separator_menu_item_new (); + gtk_widget_show (separator); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + separator); + + amd->stick_item = make_menu_item (amd, STICK); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->stick_item); + set_item_stock (amd->stick_item, NULL); + + workspace = wnck_window_get_workspace (amd->window); + if (!workspace) + workspace = wnck_screen_get_workspace (wnck_window_get_screen (amd->window), 0); + + viewport_x = wnck_workspace_get_viewport_x (workspace); + viewport_y = wnck_workspace_get_viewport_y (workspace); + viewport_width = wnck_workspace_get_width (workspace); + viewport_height = wnck_workspace_get_height (workspace); + + screen_width = wnck_screen_get_width (wnck_window_get_screen (amd->window)); + screen_height = wnck_screen_get_height (wnck_window_get_screen (amd->window)); + + if (!wnck_window_is_sticky (amd->window)) + { + if (viewport_x >= screen_width) + { + amd->viewport_left_item = make_menu_item (amd, VIEWPORT_LEFT); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->viewport_left_item); + set_item_text (amd->viewport_left_item, _("Move to Viewport _Left")); + set_item_stock (amd->viewport_left_item, NULL); + } + else + amd->viewport_left_item = NULL; + + if (viewport_x <= viewport_width - 2 * screen_width) + { + amd->viewport_right_item = make_menu_item (amd, VIEWPORT_RIGHT); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->viewport_right_item); + set_item_text (amd->viewport_right_item, _("Move to Viewport R_ight")); + set_item_stock (amd->viewport_right_item, NULL); + } + else + amd->viewport_right_item = NULL; + + if (viewport_y >= screen_height) + { + amd->viewport_up_item = make_menu_item (amd, VIEWPORT_UP); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->viewport_up_item); + set_item_text (amd->viewport_up_item, _("Move to Viewport _Up")); + set_item_stock (amd->viewport_up_item, NULL); + } + else + amd->viewport_up_item = NULL; + + if (viewport_y <= viewport_height - 2 * screen_height) + { + amd->viewport_down_item = make_menu_item (amd, VIEWPORT_DOWN); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->viewport_down_item); + set_item_text (amd->viewport_down_item, _("Move to Viewport _Down")); + set_item_stock (amd->viewport_down_item, NULL); + } + else + amd->viewport_down_item = NULL; + } + + amd->viewport_item = gtk_menu_item_new_with_mnemonic (_("Move to Another _Viewport")); + gtk_widget_show (amd->viewport_item); + + submenu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (amd->viewport_item), + submenu); + + i = 1; + for (y = 0; y < viewport_height; y += screen_height) + { + char *label; + GtkWidget *item; + + for (x = 0; x < viewport_width; x += screen_width) + { + label = g_strdup_printf (_("Viewport _%d"), i++); + + item = make_menu_item (amd, MOVE_TO_VIEWPORT); + g_object_set_data (G_OBJECT (item), "x", GINT_TO_POINTER (x)); + g_object_set_data (G_OBJECT (item), "y", GINT_TO_POINTER (y)); + + if (x == viewport_x && y == viewport_y) + gtk_widget_set_sensitive (item, FALSE); + + gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item); + set_item_text (item, label); + set_item_stock (item, NULL); + + g_free (label); + } + } + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + amd->viewport_item); + + if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window), + "_NET_WM_WINDOW_OPACITY")) + { guint present_opacity; gint j;