static void matewnck_selector_set_window_icon (MatewnckSelector *selector, GtkWidget *image, MatewnckWindow *window, gboolean use_icon_size) { GdkPixbuf *pixbuf, *freeme, *freeme2; int width, height; int icon_size = -1; pixbuf = NULL; freeme = NULL; freeme2 = NULL; if (window) pixbuf = matewnck_window_get_mini_icon (window); if (!pixbuf) pixbuf = matewnck_selector_get_default_window_icon (); if (!use_icon_size && selector->priv->size > 1) icon_size = selector->priv->size; if (icon_size == -1) gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &icon_size); width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); if (icon_size != -1 && (width > icon_size || height > icon_size)) { double scale; scale = ((double) icon_size) / MAX (width, height); pixbuf = gdk_pixbuf_scale_simple (pixbuf, width * scale, height * scale, GDK_INTERP_BILINEAR); freeme = pixbuf; } if (window && matewnck_window_is_minimized (window)) { pixbuf = matewnck_selector_dimm_icon (pixbuf); freeme2 = pixbuf; } gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf); if (freeme) g_object_unref (freeme); if (freeme2) g_object_unref (freeme2); }
static gboolean update_menu_state (MatewnckActionMenu *menu) { MatewnckActionMenuPrivate *priv; MatewnckWindowActions actions; MatewnckScreen *screen; MatewnckWorkspace *workspace; gboolean viewport_mode; gboolean move_workspace_sensitive; priv = menu->priv; priv->idle_handler = 0; actions = matewnck_window_get_actions (priv->window); screen = matewnck_window_get_screen (priv->window); viewport_mode = matewnck_screen_get_workspace_count (screen) == 1 && matewnck_workspace_is_virtual (matewnck_screen_get_workspace (screen, 0)); move_workspace_sensitive = viewport_mode || (actions & MATEWNCK_WINDOW_ACTION_CHANGE_WORKSPACE) != 0; if (matewnck_window_is_minimized (priv->window)) { set_item_text (priv->minimize_item, _("Unmi_nimize")); set_item_stock (priv->minimize_item, NULL); gtk_widget_set_sensitive (priv->minimize_item, (actions & MATEWNCK_WINDOW_ACTION_UNMINIMIZE) != 0); } else { set_item_text (priv->minimize_item, _("Mi_nimize")); set_item_stock (priv->minimize_item, MATEWNCK_STOCK_MINIMIZE); gtk_widget_set_sensitive (priv->minimize_item, (actions & MATEWNCK_WINDOW_ACTION_MINIMIZE) != 0); } if (matewnck_window_is_maximized (priv->window)) { set_item_text (priv->maximize_item, _("Unma_ximize")); set_item_stock (priv->maximize_item, NULL); gtk_widget_set_sensitive (priv->maximize_item, (actions & MATEWNCK_WINDOW_ACTION_UNMAXIMIZE) != 0); } else { set_item_text (priv->maximize_item, _("Ma_ximize")); set_item_stock (priv->maximize_item, MATEWNCK_STOCK_MAXIMIZE); gtk_widget_set_sensitive (priv->maximize_item, (actions & MATEWNCK_WINDOW_ACTION_MAXIMIZE) != 0); } g_signal_handlers_block_by_func (G_OBJECT (priv->above_item), item_activated_callback, GINT_TO_POINTER (ABOVE)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->above_item), matewnck_window_is_above (priv->window)); g_signal_handlers_unblock_by_func (G_OBJECT (priv->above_item), item_activated_callback, GINT_TO_POINTER (ABOVE)); gtk_widget_set_sensitive (priv->above_item, (actions & MATEWNCK_WINDOW_ACTION_ABOVE) != 0); g_signal_handlers_block_by_func (G_OBJECT (priv->pin_item), item_activated_callback, GINT_TO_POINTER (PIN)); g_signal_handlers_block_by_func (G_OBJECT (priv->unpin_item), item_activated_callback, GINT_TO_POINTER (UNPIN)); if ((viewport_mode && matewnck_window_is_sticky (priv->window)) || (!viewport_mode && matewnck_window_is_pinned (priv->window))) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->pin_item), TRUE); else gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->unpin_item), TRUE); g_signal_handlers_unblock_by_func (G_OBJECT (priv->pin_item), item_activated_callback, GINT_TO_POINTER (PIN)); g_signal_handlers_unblock_by_func (G_OBJECT (priv->unpin_item), item_activated_callback, GINT_TO_POINTER (UNPIN)); gtk_widget_set_sensitive (priv->pin_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->unpin_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->close_item, (actions & MATEWNCK_WINDOW_ACTION_CLOSE) != 0); gtk_widget_set_sensitive (priv->move_item, (actions & MATEWNCK_WINDOW_ACTION_MOVE) != 0); gtk_widget_set_sensitive (priv->resize_item, (actions & MATEWNCK_WINDOW_ACTION_RESIZE) != 0); gtk_widget_set_sensitive (priv->workspace_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->left_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->right_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->up_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->down_item, move_workspace_sensitive); workspace = matewnck_window_get_workspace (priv->window); if (viewport_mode && !matewnck_window_is_sticky (priv->window)) { int window_x, window_y; int viewport_x, viewport_y; int viewport_width, viewport_height; int screen_width, screen_height; if (!workspace) workspace = matewnck_screen_get_workspace (screen, 0); matewnck_window_get_geometry (priv->window, &window_x, &window_y, NULL, NULL); viewport_x = matewnck_workspace_get_viewport_x (workspace); viewport_y = matewnck_workspace_get_viewport_y (workspace); window_x += viewport_x; window_y += viewport_y; viewport_width = matewnck_workspace_get_width (workspace); viewport_height = matewnck_workspace_get_height (workspace); screen_width = matewnck_screen_get_width (screen); screen_height = matewnck_screen_get_height (screen); if (window_x >= screen_width) gtk_widget_show (priv->left_item); else gtk_widget_hide (priv->left_item); if (window_x < viewport_width - screen_width) gtk_widget_show (priv->right_item); else gtk_widget_hide (priv->right_item); if (window_y >= screen_height) gtk_widget_show (priv->up_item); else gtk_widget_hide (priv->up_item); if (window_y < viewport_height - screen_height) gtk_widget_show (priv->down_item); else gtk_widget_hide (priv->down_item); } else if (!viewport_mode && workspace && !matewnck_window_is_pinned (priv->window)) { if (matewnck_workspace_get_neighbor (workspace, MATEWNCK_MOTION_LEFT)) gtk_widget_show (priv->left_item); else gtk_widget_hide (priv->left_item); if (matewnck_workspace_get_neighbor (workspace, MATEWNCK_MOTION_RIGHT)) gtk_widget_show (priv->right_item); else gtk_widget_hide (priv->right_item); if (matewnck_workspace_get_neighbor (workspace, MATEWNCK_MOTION_UP)) gtk_widget_show (priv->up_item); else gtk_widget_hide (priv->up_item); if (matewnck_workspace_get_neighbor (workspace, MATEWNCK_MOTION_DOWN)) gtk_widget_show (priv->down_item); else gtk_widget_hide (priv->down_item); } else { gtk_widget_hide (priv->left_item); gtk_widget_hide (priv->right_item); gtk_widget_hide (priv->up_item); gtk_widget_hide (priv->down_item); } if (viewport_mode) { int viewport_width, viewport_height; int screen_width, screen_height; viewport_width = matewnck_workspace_get_width (workspace); viewport_height = matewnck_workspace_get_height (workspace); screen_width = matewnck_screen_get_width (screen); screen_height = matewnck_screen_get_height (screen); gtk_widget_show (priv->workspace_separator); gtk_widget_show (priv->pin_item); gtk_widget_show (priv->unpin_item); if (viewport_width >= 2 * screen_width || viewport_height >= 2 * screen_height) { gtk_widget_show (priv->workspace_item); refill_submenu_viewport (menu); } else { gtk_widget_hide (priv->workspace_item); gtk_menu_popdown (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (priv->workspace_item)))); } } else if (matewnck_screen_get_workspace_count (screen) > 1) { gtk_widget_show (priv->workspace_separator); gtk_widget_show (priv->pin_item); gtk_widget_show (priv->unpin_item); gtk_widget_show (priv->workspace_item); refill_submenu_workspace (menu); } else { gtk_widget_hide (priv->workspace_separator); gtk_widget_hide (priv->pin_item); gtk_widget_hide (priv->unpin_item); gtk_widget_hide (priv->workspace_item); gtk_menu_popdown (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (priv->workspace_item)))); } gtk_menu_reposition (GTK_MENU (menu)); return FALSE; }
static void item_activated_callback (GtkWidget *menu_item, gpointer data) { MatewnckActionMenu *menu; MatewnckWindow *window; WindowAction action = GPOINTER_TO_INT (data); MatewnckScreen *screen; gboolean viewport_mode; menu = get_action_menu (menu_item); if (menu == NULL) return; window = menu->priv->window; screen = matewnck_window_get_screen (window); viewport_mode = matewnck_screen_get_workspace_count (screen) == 1 && matewnck_workspace_is_virtual (matewnck_screen_get_workspace (screen, 0)); switch (action) { case CLOSE: /* In an activate callback, so gtk_get_current_event_time() suffices */ matewnck_window_close (window, gtk_get_current_event_time ()); break; case MINIMIZE: if (matewnck_window_is_minimized (window)) matewnck_window_unminimize (window, gtk_get_current_event_time ()); else matewnck_window_minimize (window); break; case MAXIMIZE: if (matewnck_window_is_maximized (window)) matewnck_window_unmaximize (window); else matewnck_window_maximize (window); break; case ABOVE: if (matewnck_window_is_above (window)) matewnck_window_unmake_above (window); else matewnck_window_make_above (window); break; case MOVE: matewnck_window_keyboard_move (window); break; case RESIZE: matewnck_window_keyboard_size (window); break; case PIN: if (!viewport_mode) matewnck_window_pin (window); else matewnck_window_stick (window); break; case UNPIN: if (!viewport_mode) matewnck_window_unpin (window); else matewnck_window_unstick (window); break; case LEFT: if (!viewport_mode) { MatewnckWorkspace *workspace; workspace = matewnck_workspace_get_neighbor (matewnck_window_get_workspace (window), MATEWNCK_MOTION_LEFT); matewnck_window_move_to_workspace (window, workspace); } else { int width, xw, yw, ww, hw; width = matewnck_screen_get_width (screen); matewnck_window_get_geometry (window, &xw, &yw, &ww, &hw); matewnck_window_unstick (window); matewnck_window_set_geometry (window, 0, MATEWNCK_WINDOW_CHANGE_X | MATEWNCK_WINDOW_CHANGE_Y, xw - width, yw, ww, hw); } break; case RIGHT: if (!viewport_mode) { MatewnckWorkspace *workspace; workspace = matewnck_workspace_get_neighbor (matewnck_window_get_workspace (window), MATEWNCK_MOTION_RIGHT); matewnck_window_move_to_workspace (window, workspace); } else { int width, xw, yw, ww, hw; width = matewnck_screen_get_width (screen); matewnck_window_get_geometry (window, &xw, &yw, &ww, &hw); matewnck_window_unstick (window); matewnck_window_set_geometry (window, 0, MATEWNCK_WINDOW_CHANGE_X | MATEWNCK_WINDOW_CHANGE_Y, xw + width, yw, ww, hw); } break; case UP: if (!viewport_mode) { MatewnckWorkspace *workspace; workspace = matewnck_workspace_get_neighbor (matewnck_window_get_workspace (window), MATEWNCK_MOTION_UP); matewnck_window_move_to_workspace (window, workspace); } else { int height, xw, yw, ww, hw; height = matewnck_screen_get_height (screen); matewnck_window_get_geometry (window, &xw, &yw, &ww, &hw); matewnck_window_unstick (window); matewnck_window_set_geometry (window, 0, MATEWNCK_WINDOW_CHANGE_X | MATEWNCK_WINDOW_CHANGE_Y, xw, yw - height, ww, hw); } break; case DOWN: if (!viewport_mode) { MatewnckWorkspace *workspace; workspace = matewnck_workspace_get_neighbor (matewnck_window_get_workspace (window), MATEWNCK_MOTION_DOWN); matewnck_window_move_to_workspace (window, workspace); } else { int height, xw, yw, ww, hw; height = matewnck_screen_get_height (screen); matewnck_window_get_geometry (window, &xw, &yw, &ww, &hw); matewnck_window_unstick (window); matewnck_window_set_geometry (window, 0, MATEWNCK_WINDOW_CHANGE_X | MATEWNCK_WINDOW_CHANGE_Y, xw, yw + height, ww, hw); } break; case MOVE_TO_WORKSPACE: if (!viewport_mode) { int workspace_index; MatewnckWorkspace *workspace; workspace_index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), "workspace")); workspace = matewnck_screen_get_workspace (screen, workspace_index); matewnck_window_move_to_workspace (window, workspace); } else { MatewnckWorkspace *workspace; int new_viewport_x, new_viewport_y; int width, height; int xw, yw, ww, hw; int viewport_x, viewport_y; new_viewport_x = GPOINTER_TO_INT ( g_object_get_data (G_OBJECT (menu_item), "viewport_x")); new_viewport_y = GPOINTER_TO_INT ( g_object_get_data (G_OBJECT (menu_item), "viewport_y")); workspace = matewnck_screen_get_workspace (screen, 0); width = matewnck_screen_get_width (screen); height = matewnck_screen_get_height (screen); matewnck_window_get_geometry (window, &xw, &yw, &ww, &hw); viewport_x = matewnck_workspace_get_viewport_x (workspace); viewport_y = matewnck_workspace_get_viewport_y (workspace); matewnck_window_unstick (window); matewnck_window_set_geometry (window, 0, MATEWNCK_WINDOW_CHANGE_X | MATEWNCK_WINDOW_CHANGE_Y, xw + new_viewport_x - viewport_x, yw + new_viewport_y - viewport_y, ww, hw); } break; default: g_assert_not_reached (); } }