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

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 70 71 72 73 74 75 76 77 78 79 80
/*  local function prototypes  */

static void   view_padding_color_dialog_update    (GimpColorDialog      *dialog,
                                                   const GimpRGB        *color,
                                                   GimpColorDialogState  state,
                                                   GimpDisplayShell     *shell);
static void   view_change_screen_confirm_callback (GtkWidget            *query_box,
                                                   gint                  value,
                                                   gpointer              data);
static void   view_change_screen_destroy_callback (GtkWidget            *query_box,
                                                   GtkWidget            *shell);


81 82
/*  public functions  */

83 84 85 86
void
view_new_view_cmd_callback (GtkAction *action,
			    gpointer   data)
{
87 88
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
89 90
  return_if_no_display (gdisp, data);

91 92 93 94 95
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_create_display (gdisp->gimage->gimp,
                       gdisp->gimage,
                       shell->unit, shell->scale);
96 97 98 99 100 101 102 103 104 105 106 107
}

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
108
void
109 110
view_zoom_fit_in_cmd_callback (GtkAction *action,
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
111
{
112
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
113
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
114

115
  gimp_display_shell_scale_fit_in (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
116 117 118
}

void
119 120
view_zoom_fit_to_cmd_callback (GtkAction *action,
                               gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
121
{
122
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
123
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
124

125
  gimp_display_shell_scale_fit_to (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
126 127
}

128
void
129 130 131
view_zoom_cmd_callback (GtkAction *action,
                        gint       value,
                        gpointer   data)
132
{
133 134 135
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  gdouble           scale;
136 137
  return_if_no_display (gdisp, data);

138
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
139

140
  scale = shell->scale;
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 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
  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 = (scale >= 1) ? (scale + 256.0) : (scale * 256.0);

      scale = action_select_value ((GimpActionSelectType) value,
                                   scale,
                                   1.0, 512.0,
                                   1.0, 16.0,
                                   FALSE);

      if (scale > 256.0)
        scale -= 256.0;
      else
        scale /= 256.0;

      gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale);
      break;
    }
191 192
}

Michael Natterer's avatar
Michael Natterer committed
193
void
194 195 196
view_zoom_explicit_cmd_callback (GtkAction *action,
                                 GtkAction *current,
                                 gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
197
{
198 199
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
200
  gint              value;
Michael Natterer's avatar
Michael Natterer committed
201
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
202

203 204
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

205
  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
206

207
  if (value != 0 /* not Other... */)
208 209 210 211
    {
      if (fabs (value - shell->scale) > 0.0001)
        gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) value / 10000);
    }
212 213
}

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
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
234
void
235
view_dot_for_dot_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
236 237
			       gpointer   data)
{
238 239
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
240
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
241
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
242

243 244
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

245 246 247
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  if (active != shell->dot_for_dot)
248
    {
249
      gimp_display_shell_scale_set_dot_for_dot (shell, active);
250

251
      SET_ACTIVE (shell->menubar_manager, "view-dot-for-dot",
252
                  shell->dot_for_dot);
253 254

      if (IS_ACTIVE_DISPLAY (gdisp))
255
        SET_ACTIVE (shell->popup_manager, "view-dot-for-dot",
256
                    shell->dot_for_dot);
257
    }
Michael Natterer's avatar
Michael Natterer committed
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 298 299 300 301 302 303 304 305
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
306
void
307
view_info_window_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
308 309
			       gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
310 311
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
312
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
313

Michael Natterer's avatar
Michael Natterer committed
314 315
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

316
  if (GIMP_GUI_CONFIG (gdisp->gimage->gimp->config)->info_window_per_display)
Michael Natterer's avatar
Michael Natterer committed
317
    {
Michael Natterer's avatar
Michael Natterer committed
318 319
      if (! shell->info_dialog)
	shell->info_dialog = info_window_create (gdisp);
Michael Natterer's avatar
Michael Natterer committed
320

Sven Neumann's avatar
Sven Neumann committed
321 322 323 324 325
      /* 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);

326
      info_dialog_present (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
327 328 329
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
330
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
331 332 333 334
    }
}

void
335
view_navigation_window_cmd_callback (GtkAction *action,
336
                                     gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
337
{
Michael Natterer's avatar
Michael Natterer committed
338 339
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
340
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
341

Michael Natterer's avatar
Michael Natterer committed
342 343
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
344
  gimp_dialog_factory_dialog_raise (global_dock_factory,
345
                                    gtk_widget_get_screen (gdisp->shell),
Michael Natterer's avatar
Michael Natterer committed
346
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
347 348
}

349
void
350
view_display_filters_cmd_callback (GtkAction *action,
351 352 353 354 355 356 357 358
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

359 360 361 362 363 364 365 366 367 368
  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));
369 370
}

Michael Natterer's avatar
Michael Natterer committed
371
void
372
view_toggle_selection_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
373 374
				    gpointer   data)
{
375 376
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
377
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
378
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
379

380 381
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

382 383 384
  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
385 386 387
}

void
388
view_toggle_layer_boundary_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
389 390 391 392
                                         gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
393
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
394 395 396 397
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

398 399 400
  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
401 402
}

403
void
404
view_toggle_menubar_cmd_callback (GtkAction *action,
405 406 407 408
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
409
  gboolean          active;
410 411 412 413
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

414 415 416
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_menubar (shell, active);
417 418
}

Michael Natterer's avatar
Michael Natterer committed
419
void
420
view_toggle_rulers_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
421 422
				 gpointer   data)
{
423 424
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
425
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
426
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
427

Michael Natterer's avatar
Michael Natterer committed
428 429
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

430 431 432
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_rulers (shell, active);
433
}
434

435
void
436
view_toggle_scrollbars_cmd_callback (GtkAction *action,
437 438 439 440
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
441
  gboolean          active;
442
  return_if_no_display (gdisp, data);
443

444 445
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

446 447 448
  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
449 450 451
}

void
452
view_toggle_statusbar_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
453 454
				    gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
455 456
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
457
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
458
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
459

Michael Natterer's avatar
Michael Natterer committed
460 461
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

462 463 464
  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
465 466 467
}

void
468
view_toggle_guides_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
469 470
				 gpointer   data)
{
471 472
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
473
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
474
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
475

476 477
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

478 479 480
  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
481 482 483
}

void
484
view_snap_to_guides_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
485 486
				  gpointer   data)
{
487 488
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
489
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
490
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
491

492
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
493

494
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
495

496
  gimp_display_shell_set_snap_to_guides (shell, active);
Michael Natterer's avatar
Michael Natterer committed
497 498
}

499 500

void
501
view_toggle_grid_cmd_callback (GtkAction *action,
502 503 504 505
                               gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
506
  gboolean          active;
507 508 509 510
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

511
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
512

513
  gimp_display_shell_set_show_grid (shell, active);
514 515 516
}

void
517
view_snap_to_grid_cmd_callback (GtkAction *action,
518 519 520 521
                                gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
522
  gboolean          active;
523 524 525 526
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

527
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
528

529
  gimp_display_shell_set_snap_to_grid (shell, active);
530 531
}

532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
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:
557
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
558 559 560 561 562 563 564 565 566

      options->padding_mode_set = TRUE;

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

    case GIMP_CANVAS_PADDING_MODE_CUSTOM:
      {
567
        GtkWidget *color_dialog;
568

569
        color_dialog = g_object_get_data (G_OBJECT (shell),
570
                                          "padding-color-dialog");
571

572
        if (! color_dialog)
573
          {
574 575 576 577 578 579 580 581 582 583 584 585 586
            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);

587 588
            g_object_set_data_full (G_OBJECT (shell), "padding-color-dialog",
                                    color_dialog,
589
                                    (GDestroyNotify) gtk_widget_destroy);
590 591
          }

592
        gtk_window_present (GTK_WINDOW (color_dialog));
593 594 595 596
      }
      break;

    case GIMP_CANVAS_PADDING_MODE_RESET:
597
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619

      {
        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
620
void
621
view_shrink_wrap_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
622 623
			       gpointer   data)
{
624
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
625
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
626

Michael Natterer's avatar
Michael Natterer committed
627
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
628
}
629 630

void
631
view_fullscreen_cmd_callback (GtkAction *action,
632 633 634 635
			      gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
636
  gboolean          active;
637 638 639 640 641
  gboolean          fullscreen;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

642 643 644
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_fullscreen (shell, active);
645 646 647

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

648
  if (active != fullscreen)
649
    {
650
      SET_ACTIVE (shell->menubar_manager, "view-fullscreen",
651
                  fullscreen);
652 653

      if (IS_ACTIVE_DISPLAY (gdisp))
654
        SET_ACTIVE (shell->popup_manager, "view-fullscreen",
655
                    fullscreen);
656 657 658 659
    }
}

void
660
view_change_screen_cmd_callback (GtkAction *action,
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
                                 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,
689
                             "Enter destination screen",
690 691 692 693 694 695 696 697 698 699 700 701 702
                             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);
}
703 704 705 706 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 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760


/*  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;
    }
}

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);
}