view-commands.c 13.5 KB
Newer Older
Michael Natterer's avatar
Michael Natterer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/* The GIMP -- an image manipulation program
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "config.h"

#include <gtk/gtk.h>

#include "libgimpwidgets/gimpwidgets.h"

25
#include "gui-types.h"
Michael Natterer's avatar
Michael Natterer committed
26

27 28
#include "config/gimpguiconfig.h"

29 30
#include "core/gimp.h"
#include "core/gimpcontext.h"
Michael Natterer's avatar
Michael Natterer committed
31 32
#include "core/gimpimage.h"

33
#include "display/gimpdisplay.h"
34
#include "display/gimpdisplay-foreach.h"
Michael Natterer's avatar
Michael Natterer committed
35
#include "display/gimpdisplayshell.h"
36
#include "display/gimpdisplayshell-appearance.h"
37
#include "display/gimpdisplayshell-scale.h"
38

39
#include "widgets/gimpdialogfactory.h"
40
#include "widgets/gimpitemfactory.h"
41 42

#include "dialogs.h"
Michael Natterer's avatar
Michael Natterer committed
43 44 45 46 47
#include "info-dialog.h"
#include "info-window.h"
#include "view-commands.h"


Michael Natterer's avatar
Michael Natterer committed
48
#define return_if_no_display(gdisp, data) \
49 50 51 52 53 54
  if (GIMP_IS_DISPLAY (data)) \
    gdisp = data; \
  else if (GIMP_IS_GIMP (data)) \
    gdisp = gimp_context_get_display (gimp_get_user_context (GIMP (data))); \
  else \
    gdisp = NULL; \
Michael Natterer's avatar
Michael Natterer committed
55 56
  if (! gdisp) \
    return
Michael Natterer's avatar
Michael Natterer committed
57

58 59 60 61
#define IS_ACTIVE_DISPLAY(gdisp) \
  ((gdisp) == \
   gimp_context_get_display (gimp_get_user_context ((gdisp)->gimage->gimp)))

Michael Natterer's avatar
Michael Natterer committed
62 63

void
64 65
view_zoom_out_cmd_callback (GtkWidget *widget,
                            gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
66
{
67
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
68
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
69

70
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_OUT);
Michael Natterer's avatar
Michael Natterer committed
71 72 73
}

void
74 75
view_zoom_in_cmd_callback (GtkWidget *widget,
                           gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
76
{
77
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
78
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
79

80
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_IN);
Michael Natterer's avatar
Michael Natterer committed
81 82
}

83 84 85 86 87 88 89 90 91 92
void
view_zoom_fit_cmd_callback (GtkWidget *widget,
                            gpointer   data)
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

  gimp_display_shell_scale_fit (GIMP_DISPLAY_SHELL (gdisp->shell));
}

Michael Natterer's avatar
Michael Natterer committed
93 94 95 96 97
void
view_zoom_cmd_callback (GtkWidget *widget,
			gpointer   data,
			guint      action)
{
98 99 100 101
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  guchar            scalesrc;
  guchar            scaledest;
Michael Natterer's avatar
Michael Natterer committed
102
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
103

104 105 106 107 108 109 110 111 112 113
  if (! GTK_CHECK_MENU_ITEM (widget)->active)
    return;

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  scalesrc  = CLAMP (action % 100, 1, 0xFF);
  scaledest = CLAMP (action / 100, 1, 0xFF);

  if (scalesrc != SCALESRC (shell) || scaledest != SCALEDEST (shell))
    gimp_display_shell_scale (shell, action);
Michael Natterer's avatar
Michael Natterer committed
114 115
}

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
void
view_zoom_other_cmd_callback (GtkWidget *widget,
                              gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  if (! GTK_CHECK_MENU_ITEM (widget)->active)
    return;

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  /*  check if we are activated by the user or from image_menu_set_zoom()  */
  if (shell->scale != shell->other_scale)
    gimp_display_shell_scale_dialog (shell);
}

Michael Natterer's avatar
Michael Natterer committed
134 135 136 137
void
view_dot_for_dot_cmd_callback (GtkWidget *widget,
			       gpointer   data)
{
138 139
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
140
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
141

142 143 144 145 146 147 148 149 150 151
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  if (shell->dot_for_dot != GTK_CHECK_MENU_ITEM (widget)->active)
    {
      gimp_display_shell_scale_set_dot_for_dot (shell,
                                                GTK_CHECK_MENU_ITEM (widget)->active);

      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Dot for Dot",
                                    shell->dot_for_dot);
152 153 154 155 156

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Dot for Dot",
                                      shell->dot_for_dot);
157
    }
Michael Natterer's avatar
Michael Natterer committed
158 159 160 161 162 163
}

void
view_info_window_cmd_callback (GtkWidget *widget,
			       gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
164 165
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
166
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
167

Michael Natterer's avatar
Michael Natterer committed
168 169
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

170
  if (GIMP_GUI_CONFIG (gdisp->gimage->gimp->config)->info_window_per_display)
Michael Natterer's avatar
Michael Natterer committed
171
    {
Michael Natterer's avatar
Michael Natterer committed
172 173
      if (! shell->info_dialog)
	shell->info_dialog = info_window_create (gdisp);
Michael Natterer's avatar
Michael Natterer committed
174

Michael Natterer's avatar
Michael Natterer committed
175
      info_dialog_popup (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
176 177 178
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
179
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
180 181 182 183
    }
}

void
184 185
view_navigation_window_cmd_callback (GtkWidget *widget,
                                     gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
186
{
Michael Natterer's avatar
Michael Natterer committed
187 188
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
189
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
190

Michael Natterer's avatar
Michael Natterer committed
191 192
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
193
  gimp_dialog_factory_dialog_raise (global_dock_factory,
194
                                    gtk_widget_get_screen (widget),
Michael Natterer's avatar
Michael Natterer committed
195
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
196 197
}

198 199 200 201 202 203 204 205 206 207 208
void
view_display_filters_cmd_callback (GtkWidget *widget,
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_dialog_factory_dialog_new (global_dialog_factory,
209
                                  gtk_widget_get_screen (widget),
210
                                  "gimp-display-filters-dialog", -1);
211 212
}

Michael Natterer's avatar
Michael Natterer committed
213 214 215 216
void
view_toggle_selection_cmd_callback (GtkWidget *widget,
				    gpointer   data)
{
217 218
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
219
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
220

221 222
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

223 224
  gimp_display_shell_set_show_selection (shell,
                                         GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
225 226 227 228 229 230 231 232 233 234 235 236
}

void
view_toggle_layer_boundary_cmd_callback (GtkWidget *widget,
                                         gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

237 238
  gimp_display_shell_set_show_layer (shell,
                                     GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
239 240
}

241 242 243 244 245 246 247 248 249 250
void
view_toggle_menubar_cmd_callback (GtkWidget *widget,
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

251 252
  gimp_display_shell_set_show_menubar (shell,
                                       GTK_CHECK_MENU_ITEM (widget)->active);
253 254
}

Michael Natterer's avatar
Michael Natterer committed
255 256 257 258
void
view_toggle_rulers_cmd_callback (GtkWidget *widget,
				 gpointer   data)
{
259 260
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
261
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
262

Michael Natterer's avatar
Michael Natterer committed
263 264
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

265 266 267
  gimp_display_shell_set_show_rulers (shell,
                                      GTK_CHECK_MENU_ITEM (widget)->active);
}
268

269 270 271 272 273 274 275
void
view_toggle_scrollbars_cmd_callback (GtkWidget *widget,
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);
276

277 278 279 280
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_show_scrollbars (shell,
                                          GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
281 282 283 284 285 286
}

void
view_toggle_statusbar_cmd_callback (GtkWidget *widget,
				    gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
287 288
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
289
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
290

Michael Natterer's avatar
Michael Natterer committed
291 292
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

293 294
  gimp_display_shell_set_show_statusbar (shell,
                                         GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
295 296 297 298 299 300
}

void
view_toggle_guides_cmd_callback (GtkWidget *widget,
				 gpointer   data)
{
301 302
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
303
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
304

305 306 307 308
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_show_guides (shell,
                                      GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
309 310 311 312 313 314
}

void
view_snap_to_guides_cmd_callback (GtkWidget *widget,
				  gpointer   data)
{
315 316
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
317
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
318

319
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
320

321
  if (shell->snap_to_guides != GTK_CHECK_MENU_ITEM (widget)->active)
322
    {
323
      shell->snap_to_guides = GTK_CHECK_MENU_ITEM (widget)->active;
324 325 326

      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Snap to Guides",
327
                                    shell->snap_to_guides);
328 329 330 331 332

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Snap to Guides",
                                      shell->snap_to_guides);
333
    }
Michael Natterer's avatar
Michael Natterer committed
334 335
}

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368

void
view_toggle_grid_cmd_callback (GtkWidget *widget,
                               gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_show_grid (shell,
                                    GTK_CHECK_MENU_ITEM (widget)->active);

}

void
view_snap_to_grid_cmd_callback (GtkWidget *widget,
                                gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  if (shell->snap_to_grid != GTK_CHECK_MENU_ITEM (widget)->active)
    {
      shell->snap_to_grid = GTK_CHECK_MENU_ITEM (widget)->active;

      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Snap to Grid",
                                    shell->snap_to_grid);
369 370 371 372 373

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Snap to Grid",
                                      shell->snap_to_grid);
374 375 376
    }
}

Michael Natterer's avatar
Michael Natterer committed
377 378 379 380
void
view_new_view_cmd_callback (GtkWidget *widget,
			    gpointer   data)
{
381
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
382
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
383

384 385
  gimp_create_display (gdisp->gimage->gimp, gdisp->gimage,
                       GIMP_DISPLAY_SHELL (gdisp->shell)->scale);
Michael Natterer's avatar
Michael Natterer committed
386 387 388 389 390 391
}

void
view_shrink_wrap_cmd_callback (GtkWidget *widget,
			       gpointer   data)
{
392
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
393
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
394

Michael Natterer's avatar
Michael Natterer committed
395
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
396
}
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418

void
view_fullscreen_cmd_callback (GtkWidget *widget,
			      gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gboolean          fullscreen;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_fullscreen (shell,
                                     GTK_CHECK_MENU_ITEM (widget)->active);

  fullscreen = (shell->window_state & GDK_WINDOW_STATE_FULLSCREEN) != 0;

  if (fullscreen != GTK_CHECK_MENU_ITEM (widget)->active)
    {
      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Fullscreen",
                                    fullscreen);
419 420 421 422 423

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Fullscreen",
                                      fullscreen);
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
    }
}

static void
view_change_screen_confirm_callback (GtkWidget *query_box,
                                     gint       value,
                                     gpointer   data)
{
  GdkScreen *screen;

  screen = gdk_display_get_screen (gtk_widget_get_display (GTK_WIDGET (data)),
                                   value);

  if (screen)
    gtk_window_set_screen (GTK_WINDOW (data), screen);
}

static void
view_change_screen_destroy_callback (GtkWidget *query_box,
                                     GtkWidget *shell)
{
  g_object_set_data (G_OBJECT (shell), "gimp-change-screen-dialog", NULL);
}

void
view_change_screen_cmd_callback (GtkWidget *widget,
                                 gpointer   data)
{
  GimpDisplay *gdisp;
  GdkScreen   *screen;
  GdkDisplay  *display;
  gint         cur_screen;
  gint         num_screens;
  GtkWidget   *qbox;
  return_if_no_display (gdisp, data);

  qbox = g_object_get_data (G_OBJECT (gdisp->shell),
                            "gimp-change-screen-dialog");

  if (qbox)
    {
      gtk_window_present (GTK_WINDOW (qbox));
      return;
    }

  screen  = gtk_widget_get_screen (gdisp->shell);
  display = gtk_widget_get_display (gdisp->shell);

  cur_screen  = gdk_screen_get_number (screen);
  num_screens = gdk_display_get_n_screens (display);

  qbox = gimp_query_int_box ("Move Display to Screen",
                             gdisp->shell,
                             NULL, 0,
478
                             "Enter destination screen",
479 480 481 482 483 484 485 486 487 488 489 490 491
                             cur_screen, 0, num_screens - 1,
                             G_OBJECT (gdisp->shell), "destroy",
                             view_change_screen_confirm_callback,
                             gdisp->shell);

  g_object_set_data (G_OBJECT (gdisp->shell), "gimp-change-screen-dialog", qbox);

  g_signal_connect (qbox, "destroy",
                    G_CALLBACK (view_change_screen_destroy_callback),
                    gdisp->shell);

  gtk_widget_show (qbox);
}