Bill Skaggs <weskaggs@primate.ucdavis.edu>

* configure.in
	* plug-ins/common/screenshot.c: allow option of screenshot
	without decorations if libXmu is present (fixes bug #133626),
	clean up code a bit.
This commit is contained in:
William Skaggs 2005-03-24 23:29:12 +00:00
parent 46a25c2c60
commit 51a539a529
3 changed files with 99 additions and 79 deletions

View File

@ -1,3 +1,10 @@
2005-03-24 Bill Skaggs <weskaggs@primate.ucdavis.edu>
* configure.in
* plug-ins/common/screenshot.c: allow option of screenshot
without decorations if libXmu is present (fixes bug #133626),
clean up code a bit.
2005-03-24 Michael Natterer <mitch@gimp.org> 2005-03-24 Michael Natterer <mitch@gimp.org>
* app/core/core-enums.[ch] * app/core/core-enums.[ch]

View File

@ -879,6 +879,9 @@ fi
dnl Check if building for GTK+-X11 dnl Check if building for GTK+-X11
gdk_target=`$PKG_CONFIG --variable=target gtk+-2.0` gdk_target=`$PKG_CONFIG --variable=target gtk+-2.0`
if test "$gdk_target" = x11; then if test "$gdk_target" = x11; then
dnl screenshot plug-in needs to link to X11 explicitely
LIBSCREENSHOT="$X_LIBS -lX11"
dnl Test for Xmu dnl Test for Xmu
if test -z "$LIBXMU"; then if test -z "$LIBXMU"; then
gimp_save_CFLAGS="$CFLAGS" gimp_save_CFLAGS="$CFLAGS"
@ -894,10 +897,9 @@ if test "$gdk_target" = x11; then
[AC_MSG_WARN(*** gimp-remote will not be built (XMU library not found) ***)], -lXt -lX11) [AC_MSG_WARN(*** gimp-remote will not be built (XMU library not found) ***)], -lXt -lX11)
CFLAGS="$gimp_save_CFLAGS" CFLAGS="$gimp_save_CFLAGS"
LDFLAGS="$gimp_save_LDFLAGS" LDFLAGS="$gimp_save_LDFLAGS"
LIBSCREENSHOT="$LIBXMU"
fi fi
dnl screenshot plug-in needs to link to X11 explicitely
LIBSCREENSHOT="$X_LIBS -lX11"
fi fi
AC_SUBST(LIBXMU) AC_SUBST(LIBXMU)

View File

@ -34,6 +34,11 @@
#if defined(GDK_WINDOWING_X11) #if defined(GDK_WINDOWING_X11)
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#ifdef HAVE_X11_XMU_WINUTIL_H
#include <X11/Xmu/WinUtil.h>
#endif /* HAVE_X11_XMU_WINUTIL_H */
#elif defined(GDK_WINDOWING_WIN32) #elif defined(GDK_WINDOWING_WIN32)
#include <windows.h> #include <windows.h>
#endif #endif
@ -134,13 +139,19 @@ static const guint8 screenshot_icon[] =
#endif #endif
#endif #endif
typedef enum
{
SHOOT_ROOT,
SHOOT_REGION,
SHOOT_WINDOW
} ShootType;
typedef struct typedef struct
{ {
gboolean root; ShootType shoot_type;
gboolean region; gboolean decorate;
guint window_id; guint window_id;
guint select_delay; guint select_delay;
guint grab_delay;
gint x1; gint x1;
gint y1; gint y1;
gint x2; gint x2;
@ -149,11 +160,10 @@ typedef struct
static ScreenShotValues shootvals = static ScreenShotValues shootvals =
{ {
FALSE, /* root window */ SHOOT_ROOT, /* root window */
FALSE, /* use dragged region */ TRUE, /* include WM decorations */
0, /* window ID */ 0, /* window ID */
0, /* select delay */ 0, /* select delay */
0, /* grab delay */
0, /* coords of region dragged out by pointer */ 0, /* coords of region dragged out by pointer */
0, 0,
0, 0,
@ -276,18 +286,19 @@ run (const gchar *name,
case GIMP_RUN_NONINTERACTIVE: case GIMP_RUN_NONINTERACTIVE:
if (nparams == 3) if (nparams == 3)
{ {
shootvals.region = FALSE; gboolean do_root = param[1].data.d_int32;
shootvals.root = param[1].data.d_int32; if (do_root)
shootvals.shoot_type = SHOOT_ROOT;
else
shootvals.shoot_type = SHOOT_WINDOW;
shootvals.window_id = param[2].data.d_int32; shootvals.window_id = param[2].data.d_int32;
shootvals.select_delay = 0; shootvals.select_delay = 0;
shootvals.grab_delay = 0;
} }
else if (nparams == 7) else if (nparams == 7)
{ {
shootvals.root = param[1].data.d_int32; shootvals.shoot_type = SHOOT_REGION;
shootvals.window_id = param[2].data.d_int32; shootvals.window_id = param[2].data.d_int32;
shootvals.select_delay = 0; shootvals.select_delay = 0;
shootvals.grab_delay = 0;
shootvals.x1 = param[3].data.d_int32; shootvals.x1 = param[3].data.d_int32;
shootvals.y1 = param[4].data.d_int32; shootvals.y1 = param[4].data.d_int32;
shootvals.x2 = param[5].data.d_int32; shootvals.x2 = param[5].data.d_int32;
@ -313,8 +324,8 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS) if (status == GIMP_PDB_SUCCESS)
{ {
if (shootvals.grab_delay > 0) if (shootvals.shoot_type == SHOOT_ROOT && shootvals.select_delay > 0)
shoot_delay (shootvals.grab_delay); shoot_delay (shootvals.select_delay);
image_ID = shoot (screen); image_ID = shoot (screen);
@ -369,7 +380,7 @@ select_window_x11 (GdkScreen *screen)
x_cursor = XCreateFontCursor (x_dpy, GDK_CROSSHAIR); x_cursor = XCreateFontCursor (x_dpy, GDK_CROSSHAIR);
buttons = 0; buttons = 0;
if (shootvals.region) if (shootvals.shoot_type == SHOOT_REGION)
{ {
mask |= PointerMotionMask; mask |= PointerMotionMask;
@ -420,6 +431,11 @@ select_window_x11 (GdkScreen *screen)
x_win = x_event.xbutton.subwindow; x_win = x_event.xbutton.subwindow;
if (x_win == None) if (x_win == None)
x_win = x_root; x_win = x_root;
#ifdef HAVE_X11_XMU_WINUTIL_H
else if (! shootvals.decorate)
x_win = XmuClientWindow (x_dpy, x_win);
#endif
shootvals.x2 = shootvals.x1 = x_event.xbutton.x_root; shootvals.x2 = shootvals.x1 = x_event.xbutton.x_root;
shootvals.y2 = shootvals.y1 = x_event.xbutton.y_root; shootvals.y2 = shootvals.y1 = x_event.xbutton.y_root;
} }
@ -429,7 +445,7 @@ select_window_x11 (GdkScreen *screen)
case ButtonRelease: case ButtonRelease:
if (buttons > 0) if (buttons > 0)
buttons--; buttons--;
if (! buttons && shootvals.region) if (! buttons && shootvals.shoot_type == SHOOT_REGION)
{ {
x = MIN (shootvals.x1, shootvals.x2); x = MIN (shootvals.x1, shootvals.x2);
y = MIN (shootvals.y1, shootvals.y2); y = MIN (shootvals.y1, shootvals.y2);
@ -461,7 +477,6 @@ select_window_x11 (GdkScreen *screen)
h = ABS (shootvals.y2 - shootvals.y1); h = ABS (shootvals.y2 - shootvals.y1);
if (w > 0 && h > 0) if (w > 0 && h > 0)
XDrawRectangle (x_dpy, x_root, gc, x, y, w, h); XDrawRectangle (x_dpy, x_root, gc, x, y, w, h);
/* XSync (x_dpy, FALSE); */
} }
break; break;
@ -629,7 +644,8 @@ shoot (GdkScreen *screen)
screen_rect.width = gdk_screen_get_width (screen); screen_rect.width = gdk_screen_get_width (screen);
screen_rect.height = gdk_screen_get_height (screen); screen_rect.height = gdk_screen_get_height (screen);
if (shootvals.region)
if (shootvals.shoot_type == SHOOT_REGION)
{ {
rect.x = MIN (shootvals.x1, shootvals.x2); rect.x = MIN (shootvals.x1, shootvals.x2);
rect.y = MIN (shootvals.y1, shootvals.y2); rect.y = MIN (shootvals.y1, shootvals.y2);
@ -638,9 +654,8 @@ shoot (GdkScreen *screen)
} }
else else
{ {
if (shootvals.root) if (shootvals.shoot_type == SHOOT_ROOT)
{ {
/* entire screen */
window = gdk_screen_get_root_window (screen); window = gdk_screen_get_root_window (screen);
} }
else else
@ -680,7 +695,7 @@ shoot (GdkScreen *screen)
if (!screenshot) if (!screenshot)
{ {
g_message (_("Error obtaining Screen Shot")); g_message (_("Error obtaining Screen shot"));
return -1; return -1;
} }
@ -755,39 +770,78 @@ shoot_dialog (GdkScreen **screen)
button = gtk_radio_button_new_with_mnemonic (radio_group, button = gtk_radio_button_new_with_mnemonic (radio_group,
_("a _Single Window")); _("a _Single Window"));
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), ! shootvals.root); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
shootvals.shoot_type == SHOOT_WINDOW);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button); gtk_widget_show (button);
g_object_set_data (G_OBJECT (button), "gimp-item-data", g_object_set_data (G_OBJECT (button), "gimp-item-data",
GINT_TO_POINTER (FALSE)); GINT_TO_POINTER (SHOOT_WINDOW));
g_signal_connect (button, "toggled", g_signal_connect (button, "toggled",
G_CALLBACK (gimp_radio_button_update), G_CALLBACK (gimp_radio_button_update),
&shootvals.root); &shootvals.shoot_type);
#ifdef HAVE_X11_XMU_WINUTIL_H
hbox = gtk_hbox_new (FALSE, 12);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
button = gtk_check_button_new_with_label (_("Include decoration"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), shootvals.decorate);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 20);
gtk_widget_show (button);
g_signal_connect (button, "toggled",
G_CALLBACK (gimp_toggle_button_update),
&shootvals.decorate);
#endif /* HAVE_X11_XMU_WINUTIL_H */
/* dragged region */ /* dragged region */
button = gtk_radio_button_new_with_mnemonic (radio_group, button = gtk_radio_button_new_with_mnemonic (radio_group,
_("Selected Region")); _("Selected Region"));
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), shootvals.region); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
shootvals.shoot_type == SHOOT_REGION);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
g_object_set_data (G_OBJECT (button), "gimp-item-data", g_object_set_data (G_OBJECT (button), "gimp-item-data",
GINT_TO_POINTER (TRUE)); GINT_TO_POINTER (SHOOT_REGION));
g_signal_connect (button, "toggled", g_signal_connect (button, "toggled",
G_CALLBACK (gimp_radio_button_update), G_CALLBACK (gimp_radio_button_update),
&shootvals.region); &shootvals.shoot_type);
gtk_widget_show (button); gtk_widget_show (button);
/* select window delay */ /* root window */
button = gtk_radio_button_new_with_mnemonic (radio_group,
_("the _Whole Screen"));
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
shootvals.shoot_type == SHOOT_ROOT);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
g_object_set_data (G_OBJECT (button), "gimp-item-data",
GINT_TO_POINTER (SHOOT_ROOT));
g_signal_connect (button, "toggled",
G_CALLBACK (gimp_radio_button_update),
&shootvals.shoot_type);
gtk_widget_show (button);
gtk_widget_show (vbox);
gtk_widget_show (frame);
/* grab delay */
hbox = gtk_hbox_new (FALSE, 6); hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox); gtk_widget_show (hbox);
label = gtk_label_new_with_mnemonic (_("S_elect After")); label = gtk_label_new_with_mnemonic (_("Delay for"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
@ -802,50 +856,7 @@ shoot_dialog (GdkScreen **screen)
G_CALLBACK (gimp_int_adjustment_update), G_CALLBACK (gimp_int_adjustment_update),
&shootvals.select_delay); &shootvals.select_delay);
label = gtk_label_new (_("Seconds Delay")); label = gtk_label_new (_("seconds"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* root window */
button = gtk_radio_button_new_with_mnemonic (radio_group,
_("the _Whole Screen"));
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), shootvals.root);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
g_object_set_data (G_OBJECT (button), "gimp-item-data",
GINT_TO_POINTER (TRUE));
g_signal_connect (button, "toggled",
G_CALLBACK (gimp_radio_button_update),
&shootvals.root);
gtk_widget_show (button);
gtk_widget_show (vbox);
gtk_widget_show (frame);
/* grab delay */
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
label = gtk_label_new_with_mnemonic (_("Grab _After"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
adj = gtk_adjustment_new (shootvals.grab_delay, 0.0, 100.0, 1.0, 5.0, 0.0);
spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, FALSE, 0);
gtk_widget_show (spinner);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinner);
g_signal_connect (adj, "value_changed",
G_CALLBACK (gimp_int_adjustment_update),
&shootvals.grab_delay);
label = gtk_label_new (_("Seconds Delay"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
@ -869,7 +880,7 @@ shoot_dialog (GdkScreen **screen)
g_timeout_add (100, (GSourceFunc) gtk_main_quit, NULL); g_timeout_add (100, (GSourceFunc) gtk_main_quit, NULL);
gtk_main (); gtk_main ();
if (!shootvals.root && !shootvals.window_id) if (shootvals.shoot_type != SHOOT_ROOT && ! shootvals.window_id)
{ {
if (shootvals.select_delay > 0) if (shootvals.select_delay > 0)
shoot_delay (shootvals.select_delay); shoot_delay (shootvals.select_delay);