view-commands.c 20 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
view_zoom_out_cmd_callback (GtkAction *action,
110
                            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 116
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
                            GIMP_ZOOM_OUT, 0.0);
Michael Natterer's avatar
Michael Natterer committed
117 118 119
}

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

126 127
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
                            GIMP_ZOOM_IN, 0.0);
Michael Natterer's avatar
Michael Natterer committed
128 129
}

130
void
131 132 133 134 135 136 137 138 139 140 141 142
view_zoom_fit_in_cmd_callback (GtkAction *action,
                               gpointer   data)
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

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

void
view_zoom_fit_to_cmd_callback (GtkAction *action,
                               gpointer   data)
143 144 145 146
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

147
  gimp_display_shell_scale_fit_to (GIMP_DISPLAY_SHELL (gdisp->shell));
148 149
}

Michael Natterer's avatar
Michael Natterer committed
150
void
151 152 153
view_zoom_cmd_callback (GtkAction *action,
                        GtkAction *current,
			gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
154
{
155 156
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
157
  gint              value;
Michael Natterer's avatar
Michael Natterer committed
158
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
159

160 161
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

162
  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
163

164
  if (value != 0 /* not Other... */)
165 166 167 168
    {
      if (fabs (value - shell->scale) > 0.0001)
        gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) value / 10000);
    }
169 170
}

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
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
191
void
192
view_dot_for_dot_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
193 194
			       gpointer   data)
{
195 196
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
197
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
198
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
199

200 201
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

202 203 204
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  if (active != shell->dot_for_dot)
205
    {
206
      gimp_display_shell_scale_set_dot_for_dot (shell, active);
207

208
      SET_ACTIVE (shell->menubar_manager, "view-dot-for-dot",
209
                  shell->dot_for_dot);
210 211

      if (IS_ACTIVE_DISPLAY (gdisp))
212
        SET_ACTIVE (shell->popup_manager, "view-dot-for-dot",
213
                    shell->dot_for_dot);
214
    }
Michael Natterer's avatar
Michael Natterer committed
215 216
}

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
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
263
void
264
view_info_window_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
265 266
			       gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
267 268
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
269
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
270

Michael Natterer's avatar
Michael Natterer committed
271 272
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

273
  if (GIMP_GUI_CONFIG (gdisp->gimage->gimp->config)->info_window_per_display)
Michael Natterer's avatar
Michael Natterer committed
274
    {
Michael Natterer's avatar
Michael Natterer committed
275 276
      if (! shell->info_dialog)
	shell->info_dialog = info_window_create (gdisp);
Michael Natterer's avatar
Michael Natterer committed
277

Sven Neumann's avatar
Sven Neumann committed
278 279 280 281 282
      /* 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);

283
      info_dialog_present (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
284 285 286
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
287
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
288 289 290 291
    }
}

void
292
view_navigation_window_cmd_callback (GtkAction *action,
293
                                     gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
294
{
Michael Natterer's avatar
Michael Natterer committed
295 296
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
297
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
298

Michael Natterer's avatar
Michael Natterer committed
299 300
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
301
  gimp_dialog_factory_dialog_raise (global_dock_factory,
302
                                    gtk_widget_get_screen (gdisp->shell),
Michael Natterer's avatar
Michael Natterer committed
303
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
304 305
}

306
void
307
view_display_filters_cmd_callback (GtkAction *action,
308 309 310 311 312 313 314 315
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

316 317 318 319 320 321 322 323 324 325
  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));
326 327
}

Michael Natterer's avatar
Michael Natterer committed
328
void
329
view_toggle_selection_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
330 331
				    gpointer   data)
{
332 333
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
334
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
335
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
336

337 338
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

339 340 341
  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
342 343 344
}

void
345
view_toggle_layer_boundary_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
346 347 348 349
                                         gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
350
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
351 352 353 354
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

355 356 357
  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
358 359
}

360
void
361
view_toggle_menubar_cmd_callback (GtkAction *action,
362 363 364 365
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
366
  gboolean          active;
367 368 369 370
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

371 372 373
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_menubar (shell, active);
374 375
}

Michael Natterer's avatar
Michael Natterer committed
376
void
377
view_toggle_rulers_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
378 379
				 gpointer   data)
{
380 381
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
382
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
383
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
384

Michael Natterer's avatar
Michael Natterer committed
385 386
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

387 388 389
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_rulers (shell, active);
390
}
391

392
void
393
view_toggle_scrollbars_cmd_callback (GtkAction *action,
394 395 396 397
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
398
  gboolean          active;
399
  return_if_no_display (gdisp, data);
400

401 402
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

403 404 405
  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
406 407 408
}

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

Michael Natterer's avatar
Michael Natterer committed
417 418
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

419 420 421
  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
422 423 424
}

void
425
view_toggle_guides_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
426 427
				 gpointer   data)
{
428 429
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
430
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
431
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
432

433 434
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

435 436 437
  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
438 439 440
}

void
441
view_snap_to_guides_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
442 443
				  gpointer   data)
{
444 445
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
446
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
447
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
448

449
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
450

451
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
452

453
  gimp_display_shell_set_snap_to_guides (shell, active);
Michael Natterer's avatar
Michael Natterer committed
454 455
}

456 457

void
458
view_toggle_grid_cmd_callback (GtkAction *action,
459 460 461 462
                               gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
463
  gboolean          active;
464 465 466 467
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

468
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
469

470
  gimp_display_shell_set_show_grid (shell, active);
471 472 473
}

void
474
view_snap_to_grid_cmd_callback (GtkAction *action,
475 476 477 478
                                gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
479
  gboolean          active;
480 481 482 483
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

484
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
485

486
  gimp_display_shell_set_snap_to_grid (shell, active);
487 488
}

489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
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:
514
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
515 516 517 518 519 520 521 522 523

      options->padding_mode_set = TRUE;

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

    case GIMP_CANVAS_PADDING_MODE_CUSTOM:
      {
524
        GtkWidget *color_dialog;
525

526
        color_dialog = g_object_get_data (G_OBJECT (shell),
527
                                          "padding-color-dialog");
528

529
        if (! color_dialog)
530
          {
531 532 533 534 535 536 537 538 539 540 541 542 543
            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);

544 545
            g_object_set_data_full (G_OBJECT (shell), "padding-color-dialog",
                                    color_dialog,
546
                                    (GDestroyNotify) gtk_widget_destroy);
547 548
          }

549
        gtk_window_present (GTK_WINDOW (color_dialog));
550 551 552 553
      }
      break;

    case GIMP_CANVAS_PADDING_MODE_RESET:
554
      g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL);
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576

      {
        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
577
void
578
view_shrink_wrap_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
579 580
			       gpointer   data)
{
581
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
582
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
583

Michael Natterer's avatar
Michael Natterer committed
584
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
585
}
586 587

void
588
view_fullscreen_cmd_callback (GtkAction *action,
589 590 591 592
			      gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
593
  gboolean          active;
594 595 596 597 598
  gboolean          fullscreen;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

599 600 601
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_fullscreen (shell, active);
602 603 604

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

605
  if (active != fullscreen)
606
    {
607
      SET_ACTIVE (shell->menubar_manager, "view-fullscreen",
608
                  fullscreen);
609 610

      if (IS_ACTIVE_DISPLAY (gdisp))
611
        SET_ACTIVE (shell->popup_manager, "view-fullscreen",
612
                    fullscreen);
613 614 615 616
    }
}

void
617
view_change_screen_cmd_callback (GtkAction *action,
618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
                                 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,
646
                             "Enter destination screen",
647 648 649 650 651 652 653 654 655 656 657 658 659
                             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);
}
660 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 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717


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