view-commands.c 19.2 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-filter-dialog.h"
39
#include "display/gimpdisplayshell-scale.h"
40

41
#include "widgets/gimpactiongroup.h"
42
#include "widgets/gimpdock.h"
43
#include "widgets/gimpdialogfactory.h"
44
#include "widgets/gimpuimanager.h"
45

46
#include "gui/color-notebook.h"
Michael Natterer's avatar
Michael Natterer committed
47 48 49 50
#include "gui/dialogs.h"
#include "gui/info-dialog.h"
#include "gui/info-window.h"

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

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

56 57

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

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

Michael Natterer's avatar
Michael Natterer committed
66

67 68
/*  public functions  */

69 70 71 72
void
view_new_view_cmd_callback (GtkAction *action,
			    gpointer   data)
{
73 74
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
75 76
  return_if_no_display (gdisp, data);

77 78 79 80 81
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_create_display (gdisp->gimage->gimp,
                       gdisp->gimage,
                       shell->unit, shell->scale);
82 83 84 85 86 87 88 89 90 91 92 93
}

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
94
void
95
view_zoom_out_cmd_callback (GtkAction *action,
96
                            gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
97
{
98
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
99
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
100

101 102
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
                            GIMP_ZOOM_OUT, 0.0);
Michael Natterer's avatar
Michael Natterer committed
103 104 105
}

void
106
view_zoom_in_cmd_callback (GtkAction *action,
107
                           gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
108
{
109
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
110
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
111

112 113
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
                            GIMP_ZOOM_IN, 0.0);
Michael Natterer's avatar
Michael Natterer committed
114 115
}

116
void
117 118 119 120 121 122 123 124 125 126 127 128
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)
129 130 131 132
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

133
  gimp_display_shell_scale_fit_to (GIMP_DISPLAY_SHELL (gdisp->shell));
134 135
}

Michael Natterer's avatar
Michael Natterer committed
136
void
137 138 139
view_zoom_cmd_callback (GtkAction *action,
                        GtkAction *current,
			gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
140
{
141 142
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
143
  gint              value;
Michael Natterer's avatar
Michael Natterer committed
144
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
145

146 147
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

148
  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
149

150
  if (value != 0 /* not Other... */)
151 152 153 154
    {
      if (fabs (value - shell->scale) > 0.0001)
        gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) value / 10000);
    }
155 156
}

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
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
177
void
178
view_dot_for_dot_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
179 180
			       gpointer   data)
{
181 182
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
183
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
184
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
185

186 187
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

188 189 190
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  if (active != shell->dot_for_dot)
191
    {
192
      gimp_display_shell_scale_set_dot_for_dot (shell, active);
193

194
      SET_ACTIVE (shell->menubar_manager, "view-dot-for-dot",
195
                  shell->dot_for_dot);
196 197

      if (IS_ACTIVE_DISPLAY (gdisp))
198
        SET_ACTIVE (shell->popup_manager, "view-dot-for-dot",
199
                    shell->dot_for_dot);
200
    }
Michael Natterer's avatar
Michael Natterer committed
201 202
}

203 204 205 206 207 208 209 210 211 212 213 214 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
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
249
void
250
view_info_window_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
251 252
			       gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
253 254
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
255
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
256

Michael Natterer's avatar
Michael Natterer committed
257 258
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

259
  if (GIMP_GUI_CONFIG (gdisp->gimage->gimp->config)->info_window_per_display)
Michael Natterer's avatar
Michael Natterer committed
260
    {
Michael Natterer's avatar
Michael Natterer committed
261 262
      if (! shell->info_dialog)
	shell->info_dialog = info_window_create (gdisp);
Michael Natterer's avatar
Michael Natterer committed
263

Sven Neumann's avatar
Sven Neumann committed
264 265 266 267 268
      /* 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);

269
      info_dialog_present (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
270 271 272
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
273
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
274 275 276 277
    }
}

void
278
view_navigation_window_cmd_callback (GtkAction *action,
279
                                     gpointer   data)
Michael Natterer's avatar
Michael Natterer committed
280
{
Michael Natterer's avatar
Michael Natterer committed
281 282
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
283
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
284

Michael Natterer's avatar
Michael Natterer committed
285 286
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
287
  gimp_dialog_factory_dialog_raise (global_dock_factory,
288
                                    gtk_widget_get_screen (gdisp->shell),
Michael Natterer's avatar
Michael Natterer committed
289
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
290 291
}

292
void
293
view_display_filters_cmd_callback (GtkAction *action,
294 295 296 297 298 299 300 301
                                   gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

302 303 304 305 306 307 308 309 310 311
  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));
312 313
}

Michael Natterer's avatar
Michael Natterer committed
314
void
315
view_toggle_selection_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
316 317
				    gpointer   data)
{
318 319
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
320
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
321
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
322

323 324
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

325 326 327
  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
328 329 330
}

void
331
view_toggle_layer_boundary_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
332 333 334 335
                                         gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
336
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
337 338 339 340
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

346
void
347
view_toggle_menubar_cmd_callback (GtkAction *action,
348 349 350 351
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
352
  gboolean          active;
353 354 355 356
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

357 358 359
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_show_menubar (shell, active);
360 361
}

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

Michael Natterer's avatar
Michael Natterer committed
371 372
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

  gimp_display_shell_set_show_rulers (shell, active);
376
}
377

378
void
379
view_toggle_scrollbars_cmd_callback (GtkAction *action,
380 381 382 383
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
384
  gboolean          active;
385
  return_if_no_display (gdisp, data);
386

387 388
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

389 390 391
  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
392 393 394
}

void
395
view_toggle_statusbar_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
396 397
				    gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
398 399
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
400
  gboolean          active;
Michael Natterer's avatar
Michael Natterer committed
401
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
402

Michael Natterer's avatar
Michael Natterer committed
403 404
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

405 406 407
  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
408 409 410
}

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

419 420
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

421 422 423
  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
424 425 426
}

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

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

437
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
438

439
  gimp_display_shell_set_snap_to_guides (shell, active);
Michael Natterer's avatar
Michael Natterer committed
440 441
}

442 443

void
444
view_toggle_grid_cmd_callback (GtkAction *action,
445 446 447 448
                               gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
449
  gboolean          active;
450 451 452 453
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

456
  gimp_display_shell_set_show_grid (shell, active);
457 458 459
}

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

472
  gimp_display_shell_set_snap_to_grid (shell, active);
473 474
}

475 476 477 478 479 480 481 482 483 484 485 486 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 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 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 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594
static void
view_padding_color_callback (ColorNotebook      *cnb,
                             const GimpRGB      *color,
                             ColorNotebookState  state,
                             gpointer            data)
{
  GimpDisplayShell   *shell = GIMP_DISPLAY_SHELL (data);
  GimpDisplayOptions *options;
  gboolean            fullscreen;

  fullscreen = gimp_display_shell_get_fullscreen (shell);

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

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

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

    case COLOR_NOTEBOOK_CANCEL:
      g_object_set_data (G_OBJECT (shell), "padding-color-notebook", NULL);
      break;

    default:
      break;
    }
}

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:
      g_object_set_data (G_OBJECT (shell), "padding-color-notebook", NULL);

      options->padding_mode_set = TRUE;

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

    case GIMP_CANVAS_PADDING_MODE_CUSTOM:
      {
        ColorNotebook *color_notebook;

        color_notebook = g_object_get_data (G_OBJECT (shell),
                                            "padding-color-notebook");

        if (! color_notebook)
          {
            color_notebook = color_notebook_new (GIMP_VIEWABLE (gdisp->gimage),
                                                 _("Set Canvas Padding Color"),
                                                 GTK_STOCK_SELECT_COLOR,
                                                 NULL,
                                                 gdisp->shell,
                                                 NULL, NULL,
                                                 &options->padding_color,
                                                 view_padding_color_callback,
                                                 shell,
                                                 FALSE, FALSE);
            g_object_set_data_full (G_OBJECT (shell), "padding-color-notebook",
                                    color_notebook,
                                    (GDestroyNotify) color_notebook_free);
          }

        color_notebook_show (color_notebook);
      }
      break;

    case GIMP_CANVAS_PADDING_MODE_RESET:
      g_object_set_data (G_OBJECT (shell), "padding-color-notebook", NULL);

      {
        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
595
void
596
view_shrink_wrap_cmd_callback (GtkAction *action,
Michael Natterer's avatar
Michael Natterer committed
597 598
			       gpointer   data)
{
599
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
600
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
601

Michael Natterer's avatar
Michael Natterer committed
602
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
603
}
604 605

void
606
view_fullscreen_cmd_callback (GtkAction *action,
607 608 609 610
			      gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
611
  gboolean          active;
612 613 614 615 616
  gboolean          fullscreen;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

617 618 619
  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));

  gimp_display_shell_set_fullscreen (shell, active);
620 621 622

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

623
  if (active != fullscreen)
624
    {
625
      SET_ACTIVE (shell->menubar_manager, "view-fullscreen",
626
                  fullscreen);
627 628

      if (IS_ACTIVE_DISPLAY (gdisp))
629
        SET_ACTIVE (shell->popup_manager, "view-fullscreen",
630
                    fullscreen);
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
    }
}

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
656
view_change_screen_cmd_callback (GtkAction *action,
657 658 659 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
                                 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,
685
                             "Enter destination screen",
686 687 688 689 690 691 692 693 694 695 696 697 698
                             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);
}