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

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

27 28
#include "config/gimpguiconfig.h"

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

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

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

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


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

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

Michael Natterer's avatar
Michael Natterer committed
63 64

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

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

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

82 83
  gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
                            GIMP_ZOOM_IN, 0.0);
Michael Natterer's avatar
Michael Natterer committed
84 85
}

86 87 88 89 90 91 92 93 94 95
void
view_zoom_fit_cmd_callback (GtkWidget *widget,
                            gpointer   data)
{
  GimpDisplay *gdisp;
  return_if_no_display (gdisp, data);

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

Michael Natterer's avatar
Michael Natterer committed
96 97 98
void
view_zoom_cmd_callback (GtkWidget *widget,
			gpointer   data,
99
			guint    scale)
Michael Natterer's avatar
Michael Natterer committed
100
{
101 102
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
103
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
104

105 106 107 108 109
  if (! GTK_CHECK_MENU_ITEM (widget)->active)
    return;

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

110 111
  if (fabs (scale - shell->scale) > 0.0001)
    gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) scale / 10000);
Michael Natterer's avatar
Michael Natterer committed
112 113
}

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

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

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

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

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

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

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

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

Michael Natterer's avatar
Michael Natterer committed
166 167
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

Sven Neumann's avatar
Sven Neumann committed
173 174 175 176 177
      /* 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);

178
      info_dialog_present (shell->info_dialog);
Michael Natterer's avatar
Michael Natterer committed
179 180 181
    }
  else
    {
Michael Natterer's avatar
Michael Natterer committed
182
      info_window_follow_auto (gdisp->gimage->gimp);
Michael Natterer's avatar
Michael Natterer committed
183 184 185 186
    }
}

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

Michael Natterer's avatar
Michael Natterer committed
194 195
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

Michael Natterer's avatar
Michael Natterer committed
196
  gimp_dialog_factory_dialog_raise (global_dock_factory,
197
                                    gtk_widget_get_screen (widget),
Michael Natterer's avatar
Michael Natterer committed
198
                                    "gimp-navigation-view", -1);
Michael Natterer's avatar
Michael Natterer committed
199 200
}

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

211 212 213 214 215 216 217 218 219 220
  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));
221 222
}

Michael Natterer's avatar
Michael Natterer committed
223 224 225 226
void
view_toggle_selection_cmd_callback (GtkWidget *widget,
				    gpointer   data)
{
227 228
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
229
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
230

231 232
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

233 234
  gimp_display_shell_set_show_selection (shell,
                                         GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
235 236 237 238 239 240 241 242 243 244 245 246
}

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

247 248
  gimp_display_shell_set_show_layer (shell,
                                     GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
249 250
}

251 252 253 254 255 256 257 258 259 260
void
view_toggle_menubar_cmd_callback (GtkWidget *widget,
                                  gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

261 262
  gimp_display_shell_set_show_menubar (shell,
                                       GTK_CHECK_MENU_ITEM (widget)->active);
263 264
}

Michael Natterer's avatar
Michael Natterer committed
265 266 267 268
void
view_toggle_rulers_cmd_callback (GtkWidget *widget,
				 gpointer   data)
{
269 270
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
271
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
272

Michael Natterer's avatar
Michael Natterer committed
273 274
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

275 276 277
  gimp_display_shell_set_show_rulers (shell,
                                      GTK_CHECK_MENU_ITEM (widget)->active);
}
278

279 280 281 282 283 284 285
void
view_toggle_scrollbars_cmd_callback (GtkWidget *widget,
                                     gpointer   data)
{
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
  return_if_no_display (gdisp, data);
286

287 288 289 290
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_show_scrollbars (shell,
                                          GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
291 292 293 294 295 296
}

void
view_toggle_statusbar_cmd_callback (GtkWidget *widget,
				    gpointer   data)
{
Michael Natterer's avatar
Michael Natterer committed
297 298
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
299
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
300

Michael Natterer's avatar
Michael Natterer committed
301 302
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

303 304
  gimp_display_shell_set_show_statusbar (shell,
                                         GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
305 306 307 308 309 310
}

void
view_toggle_guides_cmd_callback (GtkWidget *widget,
				 gpointer   data)
{
311 312
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
313
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
314

315 316 317 318
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

  gimp_display_shell_set_show_guides (shell,
                                      GTK_CHECK_MENU_ITEM (widget)->active);
Michael Natterer's avatar
Michael Natterer committed
319 320 321 322 323 324
}

void
view_snap_to_guides_cmd_callback (GtkWidget *widget,
				  gpointer   data)
{
325 326
  GimpDisplay      *gdisp;
  GimpDisplayShell *shell;
Michael Natterer's avatar
Michael Natterer committed
327
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
328

329
  shell = GIMP_DISPLAY_SHELL (gdisp->shell);
330

331
  if (shell->snap_to_guides != GTK_CHECK_MENU_ITEM (widget)->active)
332
    {
333
      shell->snap_to_guides = GTK_CHECK_MENU_ITEM (widget)->active;
334 335 336

      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Snap to Guides",
337
                                    shell->snap_to_guides);
338 339 340 341 342

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

346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

}

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Snap to Grid",
                                    shell->snap_to_grid);
379 380 381 382 383

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Snap to Grid",
                                      shell->snap_to_grid);
384 385 386
    }
}

Michael Natterer's avatar
Michael Natterer committed
387 388 389 390
void
view_new_view_cmd_callback (GtkWidget *widget,
			    gpointer   data)
{
391
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
392
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
393

394 395
  gimp_create_display (gdisp->gimage->gimp, gdisp->gimage,
                       GIMP_DISPLAY_SHELL (gdisp->shell)->scale);
Michael Natterer's avatar
Michael Natterer committed
396 397 398 399 400 401
}

void
view_shrink_wrap_cmd_callback (GtkWidget *widget,
			       gpointer   data)
{
402
  GimpDisplay *gdisp;
Michael Natterer's avatar
Michael Natterer committed
403
  return_if_no_display (gdisp, data);
Michael Natterer's avatar
Michael Natterer committed
404

Michael Natterer's avatar
Michael Natterer committed
405
  gimp_display_shell_scale_shrink_wrap (GIMP_DISPLAY_SHELL (gdisp->shell));
Michael Natterer's avatar
Michael Natterer committed
406
}
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428

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

  shell = GIMP_DISPLAY_SHELL (gdisp->shell);

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

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

  if (fullscreen != GTK_CHECK_MENU_ITEM (widget)->active)
    {
      gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->menubar_factory),
                                    "/View/Fullscreen",
                                    fullscreen);
429 430 431 432 433

      if (IS_ACTIVE_DISPLAY (gdisp))
        gimp_item_factory_set_active (GTK_ITEM_FACTORY (shell->popup_factory),
                                      "/View/Fullscreen",
                                      fullscreen);
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
    }
}

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

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

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

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

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

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

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

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

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

  qbox = gimp_query_int_box ("Move Display to Screen",
                             gdisp->shell,
                             NULL, 0,
488
                             "Enter destination screen",
489 490 491 492 493 494 495 496 497 498 499 500 501
                             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);
}