put in attempted fix for the GTK 1.2 plug/socket screwup, now that my

2002-01-06  Havoc Pennington  <hp@pobox.com>

	* src/window.c (meta_window_notify_focus): put in attempted fix
	for the GTK 1.2 plug/socket screwup, now that my fixed debug spew
	reveals what's actually happening. ;-)

	* src/gradient.c (meta_gradient_description_new): object
	to store gradient descriptions

	* src/window.c (meta_window_notify_focus): fix the debug spew
	that was confusing me

	* src/wm-tester/focus-window.c: add little program to focus
	a window ID
This commit is contained in:
Havoc Pennington 2002-01-07 03:26:09 +00:00 committed by Havoc Pennington
parent ac85e1e225
commit f36ba88085
8 changed files with 144 additions and 114 deletions

View File

@ -1,3 +1,18 @@
2002-01-06 Havoc Pennington <hp@pobox.com>
* src/window.c (meta_window_notify_focus): put in attempted fix
for the GTK 1.2 plug/socket screwup, now that my fixed debug spew
reveals what's actually happening. ;-)
* src/gradient.c (meta_gradient_description_new): object
to store gradient descriptions
* src/window.c (meta_window_notify_focus): fix the debug spew
that was confusing me
* src/wm-tester/focus-window.c: add little program to focus
a window ID
2002-01-06 Havoc Pennington <hp@pobox.com> 2002-01-06 Havoc Pennington <hp@pobox.com>
* src/theme.c (meta_theme_get_gradient): change to use spiffy * src/theme.c (meta_theme_get_gradient): change to use spiffy

View File

@ -736,118 +736,39 @@ meta_gradient_create_multi_diagonal (int width, int height,
return pixbuf; return pixbuf;
} }
#ifdef META_TEST_GRADIENTS MetaGradientDescription*
#include <gtk/gtk.h> meta_gradient_description_new (MetaGradientType type,
const GdkColor *colors,
typedef void (* RenderGradientFunc) (GdkDrawable *drawable, int n_colors)
GdkGC *gc,
int width,
int height);
static void
render_simple (GdkDrawable *drawable,
GdkGC *gc,
int width, int height,
MetaGradientType type)
{ {
GdkPixbuf *pixbuf; MetaGradientDescription *desc;
GdkColor from, to;
gdk_color_parse ("blue", &from); desc = g_new (MetaGradientDescription, 1);
gdk_color_parse ("green", &to);
pixbuf = meta_gradient_create_simple (width, height, desc->type = type;
&from, &to, desc->colors = g_new (GdkColor, n_colors);
type); desc->n_colors = n_colors;
gdk_pixbuf_render_to_drawable (pixbuf, memcpy (desc->colors, colors, sizeof (GdkColor) * n_colors);
drawable,
gc,
0, 0,
0, 0, width, height,
GDK_RGB_DITHER_NORMAL,
0, 0);
g_object_unref (G_OBJECT (pixbuf)); return desc;
}
static void
render_vertical_func (GdkDrawable *drawable,
GdkGC *gc,
int width, int height)
{
render_simple (drawable, gc, width, height, META_GRADIENT_VERTICAL);
}
static void
render_horizontal_func (GdkDrawable *drawable,
GdkGC *gc,
int width, int height)
{
render_simple (drawable, gc, width, height, META_GRADIENT_HORIZONTAL);
}
static void
render_diagonal_func (GdkDrawable *drawable,
GdkGC *gc,
int width, int height)
{
render_simple (drawable, gc, width, height, META_GRADIENT_DIAGONAL);
}
static gboolean
expose_callback (GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
RenderGradientFunc func = data;
(* func) (widget->window,
widget->style->fg_gc[widget->state],
widget->allocation.width,
widget->allocation.height);
return TRUE;
}
static GtkWidget*
create_gradient_window (RenderGradientFunc func)
{
GtkWidget *window;
GtkWidget *drawing_area;
window = gtk_window_new (GTK_WINDOW_POPUP);
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, 175, 175);
g_signal_connect (G_OBJECT (drawing_area),
"expose_event",
G_CALLBACK (expose_callback),
func);
gtk_container_add (GTK_CONTAINER (window), drawing_area);
return window;
} }
void void
meta_gradient_test (void) meta_gradient_description_free (MetaGradientDescription *desc)
{ {
GtkWidget *window; g_return_if_fail (desc != NULL);
window = create_gradient_window (render_vertical_func); g_free (desc->colors);
gtk_window_move (GTK_WINDOW (window), 0, 0); g_free (desc);
gtk_widget_show_all (window);
window = create_gradient_window (render_horizontal_func);
gtk_window_move (GTK_WINDOW (window), 0, 200);
gtk_widget_show_all (window);
window = create_gradient_window (render_diagonal_func);
gtk_window_move (GTK_WINDOW (window), 200, 0);
gtk_widget_show_all (window);
} }
#endif
GdkPixbuf*
meta_gradient_description_render (const MetaGradientDescription *desc,
int width,
int height)
{
return meta_gradient_create_multi (width, height,
desc->colors, desc->n_colors,
desc->type);
}

View File

@ -32,6 +32,26 @@ typedef enum
META_GRADIENT_DIAGONAL META_GRADIENT_DIAGONAL
} MetaGradientType; } MetaGradientType;
typedef struct _MetaGradientDescription MetaGradientDescription;
/* this doesn't support interwoven at the moment, since
* I don't know what interwoven is good for
*/
struct _MetaGradientDescription
{
MetaGradientType type;
GdkColor *colors;
int n_colors;
};
MetaGradientDescription* meta_gradient_description_new (MetaGradientType type,
const GdkColor *colors,
int n_colors);
void meta_gradient_description_free (MetaGradientDescription *desc);
GdkPixbuf* meta_gradient_description_render (const MetaGradientDescription *desc,
int width,
int height);
GdkPixbuf* meta_gradient_create_simple (int width, GdkPixbuf* meta_gradient_create_simple (int width,
int height, int height,

View File

@ -1,5 +1,13 @@
#! /bin/bash #! /bin/bash
if test -z "$XNEST_DISPLAY"; then
XNEST_DISPLAY=:1
fi
if test -z "$CLIENT_DISPLAY"; then
CLIENT_DISPLAY=:1
fi
if test -z "$SCREENS"; then if test -z "$SCREENS"; then
SCREENS=1 SCREENS=1
fi fi
@ -27,33 +35,41 @@ if test -n "$ICON_TEST"; then
fi fi
if test -z "$ONLY_WM"; then if test -z "$ONLY_WM"; then
Xnest -ac :1 -scrns $SCREENS -geometry 640x480 -bw 15 & echo "Launching Xnest"
Xnest -ac $XNEST_DISPLAY -scrns $SCREENS -geometry 640x480 -bw 15 &
## usleep 800000 ## usleep 800000
sleep 1 sleep 1
if test -n "$XMON_DIR"; then
echo "Launching xmond"
$XMON_DIR/xmonui | $XMON_DIR/xmond -server $XNEST_DISPLAY &
sleep 1
fi
echo "Launching clients"
if test -n "$TEST_CLIENT"; then if test -n "$TEST_CLIENT"; then
DISPLAY=:1 $TEST_CLIENT & DISPLAY=$CLIENT_DISPLAY $TEST_CLIENT &
fi fi
if test $CLIENTS != 0; then if test $CLIENTS != 0; then
for I in `seq 1 $CLIENTS`; do for I in `seq 1 $CLIENTS`; do
echo "Launching xterm $I" echo "Launching xterm $I"
DISPLAY=:1 xterm -geometry 25x15 & DISPLAY=$CLIENT_DISPLAY xterm -geometry 25x15 &
done done
fi fi
if test $SM_CLIENTS != 0; then if test $SM_CLIENTS != 0; then
for I in `seq 1 $SM_CLIENTS`; do for I in `seq 1 $SM_CLIENTS`; do
echo "Launching gnome-terminal $I" echo "Launching gnome-terminal $I"
DISPLAY=:1 gnome-terminal --geometry 25x15 & DISPLAY=$CLIENT_DISPLAY gnome-terminal --geometry 25x15 &
done done
fi fi
usleep 50000 usleep 50000
DISPLAY=:1 xsetroot -solid royalblue3 DISPLAY=$CLIENT_DISPLAY xsetroot -solid royalblue3
fi fi
if test -z "$ONLY_SETUP"; then if test -z "$ONLY_SETUP"; then
METACITY_DEBUG_BUTTON_GRABS=1 METACITY_DISPLAY=:1 exec libtool --mode=execute $DEBUG ./metacity $OPTIONS METACITY_DEBUG_BUTTON_GRABS=1 METACITY_DISPLAY=$CLIENT_DISPLAY exec libtool --mode=execute $DEBUG ./metacity $OPTIONS
fi fi

View File

@ -28,7 +28,14 @@
/* theme.[hc] is basically responsible for drawing parts of the UI using /* theme.[hc] is basically responsible for drawing parts of the UI using
* theme data * theme data
*/ */
typedef struct _MetaFrameStyle MetaFrameStyle;
struct _MetaFrameStyle
{
MetaGradientDescription *title_gradient;
};
GdkPixbuf* meta_theme_get_gradient (MetaGradientType type, GdkPixbuf* meta_theme_get_gradient (MetaGradientType type,
const GdkColor *color_one, const GdkColor *color_one,

View File

@ -2683,13 +2683,13 @@ meta_window_notify_focus (MetaWindow *window,
event->type != UnmapNotify ? event->type != UnmapNotify ?
meta_focus_mode_to_string (event->xfocus.mode) : "n/a", meta_focus_mode_to_string (event->xfocus.mode) : "n/a",
event->type != UnmapNotify ? event->type != UnmapNotify ?
meta_focus_detail_to_string (event->xfocus.mode) : "n/a"); meta_focus_detail_to_string (event->xfocus.detail) : "n/a");
if ((event->type == FocusIn || if ((event->type == FocusIn ||
event->type == FocusOut) && event->type == FocusOut) &&
(event->xfocus.mode == NotifyGrab || (event->xfocus.mode == NotifyGrab ||
event->xfocus.mode == NotifyUngrab || event->xfocus.mode == NotifyUngrab ||
/* From WindowMaker */ /* From WindowMaker, ignore all funky pointer root events */
event->xfocus.detail > NotifyNonlinearVirtual)) event->xfocus.detail > NotifyNonlinearVirtual))
{ {
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
@ -2720,6 +2720,16 @@ meta_window_notify_focus (MetaWindow *window,
else if (event->type == FocusOut || else if (event->type == FocusOut ||
event->type == UnmapNotify) event->type == UnmapNotify)
{ {
if (event->type == FocusOut &&
event->xfocus.detail == NotifyInferior)
{
/* This event means the client moved focus to a subwindow */
meta_topic (META_DEBUG_FOCUS,
"Ignoring focus out on %s with NotifyInferior\n",
window->desc);
return TRUE;
}
if (window == window->display->focus_window) if (window == window->display->focus_window)
{ {
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,

View File

@ -7,7 +7,11 @@ wm_tester_SOURCES= \
test_gravity_SOURCES= \ test_gravity_SOURCES= \
test-gravity.c test-gravity.c
noinst_PROGRAMS=wm-tester test-gravity focus_window_SOURCES= \
focus-window.c
noinst_PROGRAMS=wm-tester test-gravity focus-window
wm_tester_LDADD= @METACITY_LIBS@ wm_tester_LDADD= @METACITY_LIBS@
test_gravity_LDADD= @METACITY_LIBS@ test_gravity_LDADD= @METACITY_LIBS@
focus_window_LDADD= @METACITY_LIBS@

View File

@ -0,0 +1,37 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
Display *d;
Window w;
const char *w_str;
char *end;
if (argc != 2)
{
fprintf (stderr, "Usage: focus-window WINDOWID\n");
exit (1);
}
d = XOpenDisplay (NULL);
w_str = argv[1];
end = NULL;
w = strtoul (w_str, &end, 16);
if (end == w_str)
{
fprintf (stderr, "Usage: focus-window WINDOWID\n");
exit (1);
}
printf ("Setting input focus to 0x%lx\n", w);
XSetInputFocus (d, w, RevertToPointerRoot, CurrentTime);
XFlush (d);
return 0;
}