view-commands.c 20.9 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"

Michael Natterer's avatar
Michael Natterer committed
25
#include "actions-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"
35
#include "display/gimpdisplayoptions.h"
Michael Natterer's avatar
Michael Natterer committed
36
#include "display/gimpdisplayshell.h"
37
#include "display/gimpdisplayshell-appearance.h"
38
#include "display/gimpdisplayshell-close.h"
39
#include "display/gimpdisplayshell-filter-dialog.h"
40
#include "display/gimpdisplayshell-scale.h"
41

42
#include "widgets/gimpactiongroup.h"
43
#include "widgets/gimpcolordialog.h"
44
#include "widgets/gimpdock.h"
45
#include "widgets/gimpdialogfactory.h"
46
#include "widgets/gimpuimanager.h"
47

48 49 50
#include "dialogs/dialogs.h"
#include "dialogs/info-dialog.h"
#include "dialogs/info-window.h"
Michael Natterer's avatar
Michael Natterer committed
51

52
#include "actions.h"
Michael Natterer's avatar
Michael Natterer committed
53 54
#include "view-commands.h"

55
#include "gimp-intl.h"
Michael Natterer's avatar
Michael Natterer committed
56

57 58

#define SET_ACTIVE(manager,action_name,active) \
59
  { GimpActionGroup *group = \
60
      gimp_ui_manager_get_action_group (manager, "view"); \
61 62
    gimp_action_group_set_action_active (group, action_name, active); }

63 64 65 66
#define IS_ACTIVE_DISPLAY(gdisp) \
  ((gdisp) == \
   gimp_context_get_display (gimp_get_user_context ((gdisp)->gimage->gimp)))

Michael Natterer's avatar
Michael Natterer committed
67

68 69
/*  local function prototypes  */

70 71 72 73
static void   view_padding_color_dialog_update (GimpColorDialog      *dialog,
                                                const GimpRGB        *color,
                                                GimpColorDialogState  state,
                                                GimpDisplayShell     *shell);
74 75


76 77
/*  public functions  */

78 79
void
view_new_view_cmd_callback (GtkAction *action,
80
                            gpointer   data)
81
{
82 83
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
84 85
  return_if_no_display (gdisp, data);

86 87 88 89 90
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_create_display (gdisp->gimage->gimp,
                       gdisp->gimage,
                       shell->unit, shell->scale);
91 92 93 94 95 96 97 98 99 100 101 102
}

void
view_close_view_cmd_callback (GtkAction *action,
                              gpointer   data)
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

  gimp_display_shell_close (GIMP_DISPLAY_SHELL (gdisp->shell), FALSE);
}

Michael Natterer's avatar
Michael Natterer committed
103
void
104 105
view_zoom_fit_in_cmd_callback (GtkAction *action,
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
106
{
107
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
108
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
109

110
  gimp_display_shell_scale_fit_in (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
111 112 113
}

void
114 115
view_zoom_fit_to_cmd_callback (GtkAction *action,
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
116
{
117
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
118
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
119

120
  gimp_display_shell_scale_fit_to (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
121 122
}

123
void
124 125 126
view_zoom_cmd_callback (GtkAction *action,
                        gint       value,
                        gpointer   data)
127
{
128 129 130
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gdouble           scale;
131 132
  return_if_no_display (gdisp, data);

133
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
134

135
  scale = shell->scale;
136

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
  switch ((GimpActionSelectType) value)
    {
    case GIMP_ACTION_SELECT_FIRST:
      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, 1.0 / 256.0);
      break;

    case GIMP_ACTION_SELECT_LAST:
      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, 256.0);
      break;

    case GIMP_ACTION_SELECT_PREVIOUS:
      gimp_display_shell_scale (shell, GIMP_ZOOM_OUT, 0.0);
      break;

    case GIMP_ACTION_SELECT_NEXT:
      gimp_display_shell_scale (shell, GIMP_ZOOM_IN, 0.0);
      break;

    case GIMP_ACTION_SELECT_SKIP_PREVIOUS:
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT, scale);
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT, scale);
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT, scale);
      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale);
      break;

    case GIMP_ACTION_SELECT_SKIP_NEXT:
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN, scale);
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN, scale);
      scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN, scale);
      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale);
      break;

    default:
      scale = action_select_value ((GimpActionSelectType) value,
                                   scale,
172
                                   0.0, 512.0,
173 174 175
                                   1.0, 16.0,
                                   FALSE);

176 177 178
      /* min = 1.0 / 256,  max = 256.0                */
      /* scale = min *  (max / min)**(i/n), i = 0..n  */
      scale = pow (65536.0, scale / 512.0) / 256.0;
179 180 181 182

      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale);
      break;
    }
183 184
}

Michael Natterer's avatar
Michael Natterer committed
185
void
186 187 188
view_zoom_explicit_cmd_callback (GtkAction *action,
                                 GtkAction *current,
                                 gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
189
{
190 191
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
192
  gint              value;
Michael Natterer's avatar
Michael Natterer committed
193
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
194

195 196
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

197
  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
198

199
  if (value != 0 /* not Other... */)
200 201 202 203
    {
      if (fabs (value - shell->scale) > 0.0001)
        gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) value / 10000);
    }
204 205
}

206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
void
view_zoom_other_cmd_callback (GtkAction *action,
                              gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  /* check if we are activated by the user or from
   * view_actions_set_zoom()
   */
  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) &&
      shell->scale != shell->other_scale)
    {
      gimp_display_shell_scale_dialog (shell);
    }
}

Michael Natterer's avatar
Michael Natterer committed
226
void
227
view_dot_for_dot_cmd_callback (GtkAction *action,
228
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
229
{
230 231
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
232
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
233
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
234

235 236
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

237 238 239
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  if (active != shell->dot_for_dot)
240
    {
241
      gimp_display_shell_scale_set_dot_for_dot (shell, active);
242

243
      SET_ACTIVE (shell->menubar_manager, "view-dot-for-dot",
244
                  shell->dot_for_dot);
245 246

      if (IS_ACTIVE_DISPLAY (gdisp))
247
        SET_ACTIVE (shell->popup_manager, "view-dot-for-dot",
248
                    shell->dot_for_dot);
249
    }
Michael Natterer's avatar
Michael Natterer committed
250 251
}

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
void
view_scroll_horizontal_cmd_callback (GtkAction *action,
                                     gint       value,
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gdouble           offset;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  offset = action_select_value ((GimpActionSelectType) value,
                                shell->hsbdata->value,
                                shell->hsbdata->lower,
                                shell->hsbdata->upper -
                                shell->hsbdata->page_size,
                                shell->hsbdata->step_increment,
                                shell->hsbdata->page_increment,
                                FALSE);
  gtk_adjustment_set_value (shell->hsbdata, offset);
}

void
view_scroll_vertical_cmd_callback (GtkAction *action,
                                   gint       value,
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gdouble           offset;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  offset = action_select_value ((GimpActionSelectType) value,
                                shell->vsbdata->value,
                                shell->vsbdata->lower,
                                shell->vsbdata->upper -
                                shell->vsbdata->page_size,
                                shell->vsbdata->step_increment,
                                shell->vsbdata->page_increment,
                                FALSE);
  gtk_adjustment_set_value (shell->vsbdata, offset);
}

Michael Natterer's avatar
Michael Natterer committed
298
void
299
view_info_window_cmd_callback (GtkAction *action,
300
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
301
{
Michael Natterer's avatar
Michael Natterer committed
302 303
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
304
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
305

Michael Natterer's avatar
Michael Natterer committed
306 307
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

308
  if (GIMP_GUI_CONFIG (gdisp->gimage->gimp->config)->info_window_per_display)
Michael Natterer's avatar
Michael Natterer committed
309
    {
Michael Natterer's avatar
Michael Natterer committed
310
      if (! shell->info_dialog)
311
        shell->info_dialog = info_window_create (gdisp);
Michael Natterer's avatar
Michael Natterer committed
312

Sven Neumann's avatar
Sven Neumann committed
313 314 315 316 317
      /* To update the fields of the info window for the first time. *
       * It's no use updating it in info_window_create() because the *
       * pointer of the info window is not present in the shell yet. */
      info_window_update (gdisp);

318
      info_dialog_present (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
319 320 321
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
322
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
323 324 325 326
    }
}

void
327
view_navigation_window_cmd_callback (GtkAction *action,
328
                                     gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
329
{
Michael Natterer's avatar
Michael Natterer committed
330 331
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
332
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
333

Michael Natterer's avatar
Michael Natterer committed
334 335
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
336
  gimp_dialog_factory_dialog_raise (global_dock_factory,
337
                                    gtk_widget_get_screen (gdisp->shell),
Michael Natterer's avatar
Michael Natterer committed
338
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
339 340
}

341
void
342
view_display_filters_cmd_callback (GtkAction *action,
343 344 345 346 347 348 349 350
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

351 352 353 354 355 356 357 358 359 360
  if (! shell->filters_dialog)
    {
      shell->filters_dialog = gimp_display_shell_filter_dialog_new (shell);

      g_signal_connect (shell->filters_dialog, "destroy",
                        G_CALLBACK (gtk_widget_destroyed),
                        &shell->filters_dialog);
    }

  gtk_window_present (GTK_WINDOW (shell->filters_dialog));
361 362
}

Michael Natterer's avatar
Michael Natterer committed
363
void
364
view_toggle_selection_cmd_callback (GtkAction *action,
365
                                    gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
366
{
367 368
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
369
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
370
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
371

372 373
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

374 375 376
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_selection (shell, active);
Michael Natterer's avatar
Michael Natterer committed
377 378 379
}

void
380
view_toggle_layer_boundary_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
381 382 383 384
                                         gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
385
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
386 387 388 389
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

390 391 392
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_layer (shell, active);
Michael Natterer's avatar
Michael Natterer committed
393 394
}

395
void
396
view_toggle_menubar_cmd_callback (GtkAction *action,
397 398 399 400
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
401
  gboolean          active;
402 403 404 405
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

406 407 408
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_menubar (shell, active);
409 410
}

Michael Natterer's avatar
Michael Natterer committed
411
void
412
view_toggle_rulers_cmd_callback (GtkAction *action,
413
                                 gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
414
{
415 416
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
417
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
418
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
419

Michael Natterer's avatar
Michael Natterer committed
420 421
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

422 423 424
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_rulers (shell, active);
425
}
426

427
void
428
view_toggle_scrollbars_cmd_callback (GtkAction *action,
429 430 431 432
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
433
  gboolean          active;
434
  return_if_no_display (gdisp, data);
435

436 437
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

438 439 440
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_scrollbars (shell, active);
Michael Natterer's avatar
Michael Natterer committed
441 442 443
}

void
444
view_toggle_statusbar_cmd_callback (GtkAction *action,
445
                                    gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
446
{
Michael Natterer's avatar
Michael Natterer committed
447 448
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
449
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
450
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
451

Michael Natterer's avatar
Michael Natterer committed
452 453
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

454 455 456
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_statusbar (shell, active);
Michael Natterer's avatar
Michael Natterer committed
457 458 459
}

void
460
view_toggle_guides_cmd_callback (GtkAction *action,
461
                                 gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
462
{
463 464
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
465
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
466
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
467

468 469
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

470 471 472
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_guides (shell, active);
Michael Natterer's avatar
Michael Natterer committed
473 474
}

475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
void
view_toggle_sample_points_cmd_callback (GtkAction *action,
                                        gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gboolean          active;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_sample_points (shell, active);
}

Michael Natterer's avatar
Michael Natterer committed
491
void
492 493
view_toggle_grid_cmd_callback (GtkAction *action,
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
494
{
495 496
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
497
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
498
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
499

500
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
501

502
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
503

504
  gimp_display_shell_set_show_grid (shell, active);
Michael Natterer's avatar
Michael Natterer committed
505 506
}

507
void
508 509
view_snap_to_guides_cmd_callback (GtkAction *action,
                                  gpointer   data)
510 511 512
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
513
  gboolean          active;
514 515 516 517
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

518
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
519

520
  gimp_display_shell_set_snap_to_guides (shell, active);
521 522 523
}

void
524
view_snap_to_grid_cmd_callback (GtkAction *action,
525 526 527 528
                                gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
529
  gboolean          active;
530 531 532 533
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

534
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
535

536
  gimp_display_shell_set_snap_to_grid (shell, active);
537 538
}

539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
void
view_snap_to_canvas_cmd_callback (GtkAction *action,
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gboolean          active;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_snap_to_canvas (shell, active);
}

void
view_snap_to_vectors_cmd_callback (GtkAction *action,
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gboolean          active;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_snap_to_vectors (shell, active);
}

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
void
view_padding_color_cmd_callback (GtkAction *action,
                                 gint       value,
                                 gpointer   data)
{
  GimpDisplay        *gdisp;
  GimpDisplayShell   *shell;
  GimpDisplayOptions *options;
  gboolean            fullscreen;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  fullscreen = gimp_display_shell_get_fullscreen (shell);

  if (fullscreen)
    options = shell->fullscreen_options;
  else
    options = shell->options;

  switch ((GimpCanvasPaddingMode) value)
    {
    case GIMP_CANVAS_PADDING_MODE_DEFAULT:
    case GIMP_CANVAS_PADDING_MODE_LIGHT_CHECK:
    case GIMP_CANVAS_PADDING_MODE_DARK_CHECK:
596
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
597 598 599 600 601 602 603 604 605

      options->padding_mode_set = TRUE;

      gimp_display_shell_set_padding (shell, (GimpCanvasPaddingMode) value,
                                      &options->padding_color);
      break;

    case GIMP_CANVAS_PADDING_MODE_CUSTOM:
      {
606
        GtkWidget *color_dialog;
607

608
        color_dialog = g_object_get_data (G_OBJECT (shell),
609
                                          "padding-color-dialog");
610

611
        if (! color_dialog)
612
          {
613 614 615 616 617 618 619 620 621 622 623 624 625
            color_dialog = gimp_color_dialog_new (GIMP_VIEWABLE (gdisp->gimage),
                                                  _("Set Canvas Padding Color"),
                                                  GTK_STOCK_SELECT_COLOR,
                                                  _("Set Custom Canvas Padding Color"),
                                                  gdisp->shell,
                                                  NULL, NULL,
                                                  &options->padding_color,
                                                  FALSE, FALSE);

            g_signal_connect (color_dialog, "update",
                              G_CALLBACK (view_padding_color_dialog_update),
                              gdisp->shell);

626 627
            g_object_set_data_full (G_OBJECT (shell), "padding-color-dialog",
                                    color_dialog,
628
                                    (GDestroyNotify) gtk_widget_destroy);
629 630
          }

631
        gtk_window_present (GTK_WINDOW (color_dialog));
632 633 634 635
      }
      break;

    case GIMP_CANVAS_PADDING_MODE_RESET:
636
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658

      {
        GimpDisplayConfig  *config;
        GimpDisplayOptions *default_options;

        config = GIMP_DISPLAY_CONFIG (gdisp->gimage->gimp->config);

        options->padding_mode_set = FALSE;

        if (fullscreen)
          default_options = config->default_fullscreen_view;
        else
          default_options = config->default_view;

        gimp_display_shell_set_padding (shell,
                                        default_options->padding_mode,
                                        &default_options->padding_color);
      }
      break;
    }
}

Michael Natterer's avatar
Michael Natterer committed
659
void
660
view_shrink_wrap_cmd_callback (GtkAction *action,
661
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
662
{
663
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
664
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
665

Michael Natterer's avatar
Michael Natterer committed
666
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
667
}
668 669

void
670
view_fullscreen_cmd_callback (GtkAction *action,
671
                              gpointer   data)
672 673 674
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
675
  gboolean          active;
676 677 678 679
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

680 681 682
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_fullscreen (shell, active);
683 684 685
}

void
686 687 688
view_move_to_screen_cmd_callback (GtkAction *action,
                                  GtkAction *current,
                                  gpointer   data)
689 690
{
  GimpDisplay *gdisp;
691
  gint         value;
692 693
  return_if_no_display (gdisp, data);

694
  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
695

696
  if (value != gdk_screen_get_number (gtk_widget_get_screen (gdisp->shell)))
697
    {
698 699
      GdkDisplay *display;
      GdkScreen  *screen;
700

701 702
      display = gtk_widget_get_display (gdisp->shell);
      screen  = gdk_display_get_screen (display, value);
703

704 705 706
      if (screen)
        gtk_window_set_screen (GTK_WINDOW (gdisp->shell), screen);
    }
707
}
708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744


/*  private functions  */

static void
view_padding_color_dialog_update (GimpColorDialog      *dialog,
                                  const GimpRGB        *color,
                                  GimpColorDialogState  state,
                                  GimpDisplayShell     *shell)
{
  GimpDisplayOptions *options;
  gboolean            fullscreen;

  fullscreen = gimp_display_shell_get_fullscreen (shell);

  if (fullscreen)
    options = shell->fullscreen_options;
  else
    options = shell->options;

  switch (state)
    {
    case GIMP_COLOR_DIALOG_OK:
      options->padding_mode_set = TRUE;

      gimp_display_shell_set_padding (shell, GIMP_CANVAS_PADDING_MODE_CUSTOM,
                                      color);
      /* fallthru */

    case GIMP_COLOR_DIALOG_CANCEL:
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
      break;

    default:
      break;
    }
}