Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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 ();
    }
}