mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 09:30:45 -05:00
verbose-log on startup whether we were compiled with various extensions
2002-05-30 Havoc Pennington <hp@redhat.com> * src/main.c (main): verbose-log on startup whether we were compiled with various extensions * src/display.c (meta_display_queue_retheme_all_windows): reapply shape mask when changing themes, sucks to do it here though, makes theme changing slower. Needs fixing. * src/theme-parser.c (parse_toplevel_element): parse rounded corner options to frame_geometry * src/frames.c (meta_frames_apply_shapes): apply rounded corners if requested by the theme * configure.in (HAVE_SHAPE): check for shape extension
This commit is contained in:
parent
3d62f360fe
commit
3a745537f0
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
2002-05-30 Havoc Pennington <hp@redhat.com>
|
||||||
|
|
||||||
|
* src/main.c (main): verbose-log on startup whether we were
|
||||||
|
compiled with various extensions
|
||||||
|
|
||||||
|
* src/display.c (meta_display_queue_retheme_all_windows): reapply
|
||||||
|
shape mask when changing themes, sucks to do it here though, makes
|
||||||
|
theme changing slower. Needs fixing.
|
||||||
|
|
||||||
|
* src/theme-parser.c (parse_toplevel_element): parse rounded
|
||||||
|
corner options to frame_geometry
|
||||||
|
|
||||||
|
* src/frames.c (meta_frames_apply_shapes): apply rounded corners
|
||||||
|
if requested by the theme
|
||||||
|
|
||||||
|
* configure.in (HAVE_SHAPE): check for shape extension
|
||||||
|
|
||||||
2002-05-30 Stephen Browne <stephen.browne@sun.com>
|
2002-05-30 Stephen Browne <stephen.browne@sun.com>
|
||||||
|
|
||||||
* src/tools/metacity-properties.c:
|
* src/tools/metacity-properties.c:
|
||||||
|
@ -11,3 +11,4 @@
|
|||||||
#undef HAVE_XFT
|
#undef HAVE_XFT
|
||||||
#undef HAVE_SM
|
#undef HAVE_SM
|
||||||
#undef HAVE_XINERAMA
|
#undef HAVE_XINERAMA
|
||||||
|
#undef HAVE_SHAPE
|
||||||
|
12
configure.in
12
configure.in
@ -110,6 +110,18 @@ if test "$found_xinerama" = "true"; then
|
|||||||
AC_DEFINE(HAVE_XINERAMA)
|
AC_DEFINE(HAVE_XINERAMA)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
SHAPE_LIBS=
|
||||||
|
found_shape=false
|
||||||
|
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||||
|
[AC_CHECK_HEADERS(X11/extensions/shape.h,
|
||||||
|
SHAPE_LIBS=-lXext found_shape=true)],
|
||||||
|
, -lXext $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS)
|
||||||
|
|
||||||
|
if test "$found_shape" = "true"; then
|
||||||
|
AC_DEFINE(HAVE_SHAPE)
|
||||||
|
fi
|
||||||
|
|
||||||
|
## we don't put SHAPE_LIBS in here, they should be in X_EXTRA_LIBS I think. we'll see
|
||||||
METACITY_LIBS="$XINERAMA_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_LIBS"
|
METACITY_LIBS="$XINERAMA_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_LIBS"
|
||||||
METACITY_MESSAGE_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_MESSAGE_LIBS"
|
METACITY_MESSAGE_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_MESSAGE_LIBS"
|
||||||
METACITY_WINDOW_DEMO_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_WINDOW_DEMO_LIBS"
|
METACITY_WINDOW_DEMO_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_WINDOW_DEMO_LIBS"
|
||||||
|
@ -2543,8 +2543,22 @@ meta_display_queue_retheme_all_windows (MetaDisplay *display)
|
|||||||
|
|
||||||
meta_window_queue_move_resize (window);
|
meta_window_queue_move_resize (window);
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
|
{
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
|
|
||||||
|
/* FIXME this sucks and is slooooooooow. Do it in the idle with the
|
||||||
|
* redraw or the window resize.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* in case the theme doesn't affect the frame size */
|
||||||
|
meta_ui_apply_frame_shape (window->screen->ui,
|
||||||
|
window->frame->xwindow,
|
||||||
|
window->frame->rect.width,
|
||||||
|
window->frame->rect.height);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
src/frame.c
20
src/frame.c
@ -138,6 +138,12 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
/* Move keybindings to frame instead of window */
|
/* Move keybindings to frame instead of window */
|
||||||
meta_window_grab_keys (window);
|
meta_window_grab_keys (window);
|
||||||
|
|
||||||
|
/* Shape mask */
|
||||||
|
meta_ui_apply_frame_shape (frame->window->screen->ui,
|
||||||
|
frame->xwindow,
|
||||||
|
frame->rect.width,
|
||||||
|
frame->rect.height);
|
||||||
|
|
||||||
meta_display_ungrab (window->display);
|
meta_display_ungrab (window->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,11 +286,25 @@ meta_frame_sync_to_window (MetaFrame *frame,
|
|||||||
|
|
||||||
/* set bg to none to avoid flicker */
|
/* set bg to none to avoid flicker */
|
||||||
if (need_resize)
|
if (need_resize)
|
||||||
|
{
|
||||||
meta_ui_unflicker_frame_bg (frame->window->screen->ui,
|
meta_ui_unflicker_frame_bg (frame->window->screen->ui,
|
||||||
frame->xwindow,
|
frame->xwindow,
|
||||||
frame->rect.width,
|
frame->rect.width,
|
||||||
frame->rect.height);
|
frame->rect.height);
|
||||||
|
|
||||||
|
/* Done before the window resize, because doing it before means
|
||||||
|
* part of the window being resized becomes unshaped, which may
|
||||||
|
* be sort of hard to see with bg = None. If we did it after
|
||||||
|
* window resize, part of the window being resized would become
|
||||||
|
* shaped, which might be more visible.
|
||||||
|
*/
|
||||||
|
|
||||||
|
meta_ui_apply_frame_shape (frame->window->screen->ui,
|
||||||
|
frame->xwindow,
|
||||||
|
frame->rect.width,
|
||||||
|
frame->rect.height);
|
||||||
|
}
|
||||||
|
|
||||||
if (need_move && need_resize)
|
if (need_move && need_resize)
|
||||||
XMoveResizeWindow (frame->window->display->xdisplay,
|
XMoveResizeWindow (frame->window->display->xdisplay,
|
||||||
frame->xwindow,
|
frame->xwindow,
|
||||||
|
156
src/frames.c
156
src/frames.c
@ -28,6 +28,10 @@
|
|||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SHAPE
|
||||||
|
#include <X11/extensions/shape.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_INNER_BUTTON_BORDER 3
|
#define DEFAULT_INNER_BUTTON_BORDER 3
|
||||||
|
|
||||||
static void meta_frames_class_init (MetaFramesClass *klass);
|
static void meta_frames_class_init (MetaFramesClass *klass);
|
||||||
@ -618,6 +622,158 @@ meta_frames_unflicker_bg (MetaFrames *frames,
|
|||||||
set_background_none (gdk_display, frame->xwindow);
|
set_background_none (gdk_display, frame->xwindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_frames_apply_shapes (MetaFrames *frames,
|
||||||
|
Window xwindow,
|
||||||
|
int new_window_width,
|
||||||
|
int new_window_height)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_SHAPE
|
||||||
|
/* Apply shapes as if window had new_window_width, new_window_height */
|
||||||
|
GtkWidget *widget;
|
||||||
|
MetaUIFrame *frame;
|
||||||
|
MetaFrameGeometry fgeom;
|
||||||
|
XRectangle xrect;
|
||||||
|
Region corners_xregion;
|
||||||
|
Region window_xregion;
|
||||||
|
|
||||||
|
widget = GTK_WIDGET (frames);
|
||||||
|
|
||||||
|
frame = meta_frames_lookup_window (frames, xwindow);
|
||||||
|
g_return_if_fail (frame != NULL);
|
||||||
|
|
||||||
|
meta_frames_calc_geometry (frames, frame, &fgeom);
|
||||||
|
|
||||||
|
if (!(fgeom.top_left_corner_rounded ||
|
||||||
|
fgeom.top_right_corner_rounded ||
|
||||||
|
fgeom.bottom_left_corner_rounded ||
|
||||||
|
fgeom.bottom_right_corner_rounded))
|
||||||
|
{
|
||||||
|
XShapeCombineMask (gdk_display, frame->xwindow,
|
||||||
|
ShapeBounding, 0, 0, None, ShapeSet);
|
||||||
|
|
||||||
|
return; /* nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
corners_xregion = XCreateRegion ();
|
||||||
|
|
||||||
|
if (fgeom.top_left_corner_rounded)
|
||||||
|
{
|
||||||
|
xrect.x = 0;
|
||||||
|
xrect.y = 0;
|
||||||
|
xrect.width = 5;
|
||||||
|
xrect.height = 1;
|
||||||
|
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 1;
|
||||||
|
xrect.width = 3;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 2;
|
||||||
|
xrect.width = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 3;
|
||||||
|
xrect.width = 1;
|
||||||
|
xrect.height = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgeom.top_right_corner_rounded)
|
||||||
|
{
|
||||||
|
xrect.x = new_window_width - 5;
|
||||||
|
xrect.y = 0;
|
||||||
|
xrect.width = 5;
|
||||||
|
xrect.height = 1;
|
||||||
|
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 1;
|
||||||
|
xrect.x = new_window_width - 3;
|
||||||
|
xrect.width = 3;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 2;
|
||||||
|
xrect.x = new_window_width - 2;
|
||||||
|
xrect.width = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = 3;
|
||||||
|
xrect.x = new_window_width - 1;
|
||||||
|
xrect.width = 1;
|
||||||
|
xrect.height = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgeom.bottom_left_corner_rounded)
|
||||||
|
{
|
||||||
|
xrect.x = 0;
|
||||||
|
xrect.y = new_window_height - 1;
|
||||||
|
xrect.width = 5;
|
||||||
|
xrect.height = 1;
|
||||||
|
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 2;
|
||||||
|
xrect.width = 3;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 3;
|
||||||
|
xrect.width = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 5;
|
||||||
|
xrect.width = 1;
|
||||||
|
xrect.height = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgeom.bottom_right_corner_rounded)
|
||||||
|
{
|
||||||
|
xrect.x = new_window_width - 5;
|
||||||
|
xrect.y = new_window_height - 1;
|
||||||
|
xrect.width = 5;
|
||||||
|
xrect.height = 1;
|
||||||
|
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 2;
|
||||||
|
xrect.x = new_window_width - 3;
|
||||||
|
xrect.width = 3;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 3;
|
||||||
|
xrect.x = new_window_width - 2;
|
||||||
|
xrect.width = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
|
||||||
|
xrect.y = new_window_height - 5;
|
||||||
|
xrect.x = new_window_width - 1;
|
||||||
|
xrect.width = 1;
|
||||||
|
xrect.height = 2;
|
||||||
|
XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
|
||||||
|
}
|
||||||
|
|
||||||
|
window_xregion = XCreateRegion ();
|
||||||
|
|
||||||
|
xrect.x = 0;
|
||||||
|
xrect.y = 0;
|
||||||
|
xrect.width = new_window_width;
|
||||||
|
xrect.height = new_window_height;
|
||||||
|
|
||||||
|
XUnionRectWithRegion (&xrect, window_xregion, window_xregion);
|
||||||
|
|
||||||
|
XSubtractRegion (window_xregion, corners_xregion, window_xregion);
|
||||||
|
|
||||||
|
XShapeCombineRegion (gdk_display, frame->xwindow,
|
||||||
|
ShapeBounding, 0, 0, window_xregion, ShapeSet);
|
||||||
|
|
||||||
|
XDestroyRegion (window_xregion);
|
||||||
|
XDestroyRegion (corners_xregion);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_frames_queue_draw (MetaFrames *frames,
|
meta_frames_queue_draw (MetaFrames *frames,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
|
@ -124,6 +124,11 @@ void meta_frames_unflicker_bg (MetaFrames *frames,
|
|||||||
int target_width,
|
int target_width,
|
||||||
int target_height);
|
int target_height);
|
||||||
|
|
||||||
|
void meta_frames_apply_shapes (MetaFrames *frames,
|
||||||
|
Window xwindow,
|
||||||
|
int new_window_width,
|
||||||
|
int new_window_height);
|
||||||
|
|
||||||
void meta_frames_queue_draw (MetaFrames *frames,
|
void meta_frames_queue_draw (MetaFrames *frames,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
|
11
src/main.c
11
src/main.c
@ -225,6 +225,17 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
g_type_init ();
|
g_type_init ();
|
||||||
|
|
||||||
|
#ifdef HAVE_SHAPE
|
||||||
|
meta_verbose ("Compiled with shape extension\n");
|
||||||
|
#else
|
||||||
|
meta_verbose ("Compiled without shape extension\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_XINERAMA
|
||||||
|
meta_verbose ("Compiled with Xinerama extension\n");
|
||||||
|
#else
|
||||||
|
meta_verbose ("Compiled without Xinerama extension\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Load prefs */
|
/* Load prefs */
|
||||||
meta_prefs_init ();
|
meta_prefs_init ();
|
||||||
meta_prefs_add_listener (prefs_changed_callback, NULL);
|
meta_prefs_add_listener (prefs_changed_callback, NULL);
|
||||||
|
@ -718,7 +718,15 @@ parse_toplevel_element (GMarkupParseContext *context,
|
|||||||
const char *parent = NULL;
|
const char *parent = NULL;
|
||||||
const char *has_title = NULL;
|
const char *has_title = NULL;
|
||||||
const char *title_scale = NULL;
|
const char *title_scale = NULL;
|
||||||
|
const char *rounded_top_left = NULL;
|
||||||
|
const char *rounded_top_right = NULL;
|
||||||
|
const char *rounded_bottom_left = NULL;
|
||||||
|
const char *rounded_bottom_right = NULL;
|
||||||
gboolean has_title_val;
|
gboolean has_title_val;
|
||||||
|
gboolean rounded_top_left_val;
|
||||||
|
gboolean rounded_top_right_val;
|
||||||
|
gboolean rounded_bottom_left_val;
|
||||||
|
gboolean rounded_bottom_right_val;
|
||||||
double title_scale_val;
|
double title_scale_val;
|
||||||
MetaFrameLayout *parent_layout;
|
MetaFrameLayout *parent_layout;
|
||||||
|
|
||||||
@ -726,6 +734,10 @@ parse_toplevel_element (GMarkupParseContext *context,
|
|||||||
error,
|
error,
|
||||||
"name", &name, "parent", &parent,
|
"name", &name, "parent", &parent,
|
||||||
"has_title", &has_title, "title_scale", &title_scale,
|
"has_title", &has_title, "title_scale", &title_scale,
|
||||||
|
"rounded_top_left", &rounded_top_left,
|
||||||
|
"rounded_top_right", &rounded_top_right,
|
||||||
|
"rounded_bottom_left", &rounded_bottom_left,
|
||||||
|
"rounded_bottom_right", &rounded_bottom_right,
|
||||||
NULL))
|
NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -741,6 +753,20 @@ parse_toplevel_element (GMarkupParseContext *context,
|
|||||||
if (has_title && !parse_boolean (has_title, &has_title_val, context, error))
|
if (has_title && !parse_boolean (has_title, &has_title_val, context, error))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
rounded_top_left_val = FALSE;
|
||||||
|
rounded_top_right_val = FALSE;
|
||||||
|
rounded_bottom_left_val = FALSE;
|
||||||
|
rounded_bottom_right_val = FALSE;
|
||||||
|
|
||||||
|
if (rounded_top_left && !parse_boolean (rounded_top_left, &rounded_top_left_val, context, error))
|
||||||
|
return;
|
||||||
|
if (rounded_top_right && !parse_boolean (rounded_top_right, &rounded_top_right_val, context, error))
|
||||||
|
return;
|
||||||
|
if (rounded_bottom_left && !parse_boolean (rounded_bottom_left, &rounded_bottom_left_val, context, error))
|
||||||
|
return;
|
||||||
|
if (rounded_bottom_right && !parse_boolean (rounded_bottom_right, &rounded_bottom_right_val, context, error))
|
||||||
|
return;
|
||||||
|
|
||||||
title_scale_val = 1.0;
|
title_scale_val = 1.0;
|
||||||
if (title_scale && !parse_title_scale (title_scale, &title_scale_val, context, error))
|
if (title_scale && !parse_title_scale (title_scale, &title_scale_val, context, error))
|
||||||
return;
|
return;
|
||||||
@ -779,6 +805,18 @@ parse_toplevel_element (GMarkupParseContext *context,
|
|||||||
if (title_scale)
|
if (title_scale)
|
||||||
info->layout->title_scale = title_scale_val;
|
info->layout->title_scale = title_scale_val;
|
||||||
|
|
||||||
|
if (rounded_top_left)
|
||||||
|
info->layout->top_left_corner_rounded = rounded_top_left_val;
|
||||||
|
|
||||||
|
if (rounded_top_right)
|
||||||
|
info->layout->top_right_corner_rounded = rounded_top_right_val;
|
||||||
|
|
||||||
|
if (rounded_bottom_left)
|
||||||
|
info->layout->bottom_left_corner_rounded = rounded_bottom_left_val;
|
||||||
|
|
||||||
|
if (rounded_bottom_right)
|
||||||
|
info->layout->bottom_right_corner_rounded = rounded_bottom_right_val;
|
||||||
|
|
||||||
meta_theme_insert_layout (info->theme, name, info->layout);
|
meta_theme_insert_layout (info->theme, name, info->layout);
|
||||||
|
|
||||||
push_state (info, STATE_FRAME_GEOMETRY);
|
push_state (info, STATE_FRAME_GEOMETRY);
|
||||||
|
@ -659,6 +659,11 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
|||||||
fgeom->title_rect.width = 0;
|
fgeom->title_rect.width = 0;
|
||||||
fgeom->title_rect.height = 0;
|
fgeom->title_rect.height = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fgeom->top_left_corner_rounded = layout->top_left_corner_rounded;
|
||||||
|
fgeom->top_right_corner_rounded = layout->top_right_corner_rounded;
|
||||||
|
fgeom->bottom_left_corner_rounded = layout->bottom_left_corner_rounded;
|
||||||
|
fgeom->bottom_right_corner_rounded = layout->bottom_right_corner_rounded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
12
src/theme.h
12
src/theme.h
@ -84,6 +84,12 @@ struct _MetaFrameLayout
|
|||||||
|
|
||||||
/* Whether title text will be displayed */
|
/* Whether title text will be displayed */
|
||||||
guint has_title : 1;
|
guint has_title : 1;
|
||||||
|
|
||||||
|
/* Round corners */
|
||||||
|
guint top_left_corner_rounded : 1;
|
||||||
|
guint top_right_corner_rounded : 1;
|
||||||
|
guint bottom_left_corner_rounded : 1;
|
||||||
|
guint bottom_right_corner_rounded : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -108,6 +114,12 @@ struct _MetaFrameGeometry
|
|||||||
int right_titlebar_edge;
|
int right_titlebar_edge;
|
||||||
int top_titlebar_edge;
|
int top_titlebar_edge;
|
||||||
int bottom_titlebar_edge;
|
int bottom_titlebar_edge;
|
||||||
|
|
||||||
|
/* Round corners */
|
||||||
|
guint top_left_corner_rounded : 1;
|
||||||
|
guint top_right_corner_rounded : 1;
|
||||||
|
guint bottom_left_corner_rounded : 1;
|
||||||
|
guint bottom_right_corner_rounded : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,9 @@ metacity_window_demo_SOURCES= \
|
|||||||
metacity_mag_SOURCES= \
|
metacity_mag_SOURCES= \
|
||||||
metacity-mag.c
|
metacity-mag.c
|
||||||
|
|
||||||
|
metacity_grayscale_SOURCES= \
|
||||||
|
metacity-grayscale.c
|
||||||
|
|
||||||
metacity_properties_SOURCES= \
|
metacity_properties_SOURCES= \
|
||||||
metacity-properties.c
|
metacity-properties.c
|
||||||
|
|
||||||
@ -35,13 +38,14 @@ desktop_DATA=$(Desktop_in_files:.desktop.in=.desktop)
|
|||||||
|
|
||||||
bin_PROGRAMS=metacity-message metacity-window-demo metacity-properties
|
bin_PROGRAMS=metacity-message metacity-window-demo metacity-properties
|
||||||
|
|
||||||
## cheesy hack I use, doesn't really have any business existing. ;-)
|
## cheesy hacks I use, don't really have any business existing. ;-)
|
||||||
noinst_PROGRAMS=metacity-mag
|
noinst_PROGRAMS=metacity-mag metacity-grayscale
|
||||||
|
|
||||||
metacity_message_LDADD= @METACITY_MESSAGE_LIBS@
|
metacity_message_LDADD= @METACITY_MESSAGE_LIBS@
|
||||||
metacity_window_demo_LDADD= @METACITY_WINDOW_DEMO_LIBS@
|
metacity_window_demo_LDADD= @METACITY_WINDOW_DEMO_LIBS@
|
||||||
metacity_properties_LDADD= @METACITY_PROPS_LIBS@
|
metacity_properties_LDADD= @METACITY_PROPS_LIBS@
|
||||||
metacity_mag_LDADD= @METACITY_WINDOW_DEMO_LIBS@
|
metacity_mag_LDADD= @METACITY_WINDOW_DEMO_LIBS@
|
||||||
|
metacity_grayscale_LDADD = @METACITY_WINDOW_DEMO_LIBS@
|
||||||
|
|
||||||
EXTRA_DIST=$(icon_DATA) $(ui_DATA) $(propicon_DATA) $(Desktop_in_files)
|
EXTRA_DIST=$(icon_DATA) $(ui_DATA) $(propicon_DATA) $(Desktop_in_files)
|
||||||
|
|
||||||
|
109
src/tools/metacity-grayscale.c
Normal file
109
src/tools/metacity-grayscale.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/* Hack for grayscaling an image */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* 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 <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
|
||||||
|
|
||||||
|
static GdkPixbuf*
|
||||||
|
grayscale_pixbuf (GdkPixbuf *pixbuf)
|
||||||
|
{
|
||||||
|
GdkPixbuf *gray;
|
||||||
|
guchar *pixels;
|
||||||
|
int rowstride;
|
||||||
|
int pixstride;
|
||||||
|
int row;
|
||||||
|
int n_rows;
|
||||||
|
int width;
|
||||||
|
|
||||||
|
gray = gdk_pixbuf_copy (pixbuf);
|
||||||
|
rowstride = gdk_pixbuf_get_rowstride (gray);
|
||||||
|
pixstride = gdk_pixbuf_get_has_alpha (gray) ? 4 : 3;
|
||||||
|
|
||||||
|
pixels = gdk_pixbuf_get_pixels (gray);
|
||||||
|
n_rows = gdk_pixbuf_get_height (gray);
|
||||||
|
width = gdk_pixbuf_get_width (gray);
|
||||||
|
|
||||||
|
row = 0;
|
||||||
|
while (row < n_rows)
|
||||||
|
{
|
||||||
|
guchar *p = pixels + row * rowstride;
|
||||||
|
guchar *end = p + (pixstride * width);
|
||||||
|
|
||||||
|
while (p != end)
|
||||||
|
{
|
||||||
|
double v = INTENSITY (p[0], p[1], p[2]);
|
||||||
|
|
||||||
|
p[0] = (guchar) v;
|
||||||
|
p[1] = (guchar) v;
|
||||||
|
p[2] = (guchar) v;
|
||||||
|
|
||||||
|
p += pixstride;
|
||||||
|
}
|
||||||
|
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
GdkPixbuf *gray;
|
||||||
|
GError *err;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
g_printerr ("specify a single image on the command line\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_type_init ();
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
pixbuf = gdk_pixbuf_new_from_file (argv[1], &err);
|
||||||
|
if (err != NULL)
|
||||||
|
{
|
||||||
|
g_printerr ("failed to load image: %s\n", err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gray = grayscale_pixbuf (pixbuf);
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
gdk_pixbuf_save (gray, "grayscale.png", "png", &err, NULL);
|
||||||
|
if (err != NULL)
|
||||||
|
{
|
||||||
|
g_printerr ("failed to save image: %s\n", err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_print ("wrote grayscale.png\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
9
src/ui.c
9
src/ui.c
@ -230,6 +230,15 @@ meta_ui_reset_frame_bg (MetaUI *ui,
|
|||||||
meta_frames_reset_bg (ui->frames, xwindow);
|
meta_frames_reset_bg (ui->frames, xwindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_ui_apply_frame_shape (MetaUI *ui,
|
||||||
|
Window xwindow,
|
||||||
|
int new_window_width,
|
||||||
|
int new_window_height)
|
||||||
|
{
|
||||||
|
meta_frames_apply_shapes (ui->frames, xwindow, new_window_width, new_window_height);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_ui_queue_frame_draw (MetaUI *ui,
|
meta_ui_queue_frame_draw (MetaUI *ui,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
|
5
src/ui.h
5
src/ui.h
@ -73,6 +73,11 @@ void meta_ui_unflicker_frame_bg (MetaUI *ui,
|
|||||||
void meta_ui_reset_frame_bg (MetaUI *ui,
|
void meta_ui_reset_frame_bg (MetaUI *ui,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
|
void meta_ui_apply_frame_shape (MetaUI *ui,
|
||||||
|
Window xwindow,
|
||||||
|
int new_window_width,
|
||||||
|
int new_window_height);
|
||||||
|
|
||||||
void meta_ui_queue_frame_draw (MetaUI *ui,
|
void meta_ui_queue_frame_draw (MetaUI *ui,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user