This commit is contained in:
rhp 2001-06-20 03:01:26 +00:00
parent 5fd26a273d
commit ca69bef032
13 changed files with 220 additions and 50 deletions

View File

@ -70,9 +70,8 @@ meta_core_queue_frame_resize (Display *xdisplay,
window = meta_display_lookup_x_window (display, frame_xwindow);
if (window == NULL || window->frame == NULL)
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
g_warning ("FIXME");
meta_window_queue_move_resize (window);
}

View File

@ -31,11 +31,14 @@
#include <X11/Xatom.h>
#include <string.h>
#define USE_GDK_DISPLAY
static GSList *all_displays = NULL;
static void meta_spew_event (MetaDisplay *display,
XEvent *event);
static void event_queue_callback (MetaEventQueue *queue,
XEvent *event,
static void event_queue_callback (XEvent *event,
gpointer data);
static gboolean event_callback (XEvent *event,
gpointer data);
static Window event_get_modified_window (MetaDisplay *display,
XEvent *event);
@ -126,9 +129,13 @@ meta_display_open (const char *name)
Atom atoms[G_N_ELEMENTS(atom_names)];
meta_verbose ("Opening display '%s'\n", XDisplayName (name));
xdisplay = XOpenDisplay (name);
#ifdef USE_GDK_DISPLAY
xdisplay = meta_ui_get_display (name);
#else
xdisplay = XOpenDisplay (name);
#endif
if (xdisplay == NULL)
{
meta_warning (_("Failed to open X Window System display '%s'\n"),
@ -225,7 +232,9 @@ meta_display_open (const char *name)
/* This would typically happen because all the screens already
* have window managers
*/
#ifndef USE_GDK_DISPLAY
XCloseDisplay (xdisplay);
#endif
all_displays = g_slist_remove (all_displays, display);
g_free (display->name);
g_free (display);
@ -233,11 +242,20 @@ meta_display_open (const char *name)
}
display->screens = screens;
#ifdef USE_GDK_DISPLAY
display->events = NULL;
/* Get events */
meta_ui_add_event_func (display->xdisplay,
event_callback,
display);
#else
display->events = meta_event_queue_new (display->xdisplay,
event_queue_callback,
display);
#endif
display->window_ids = g_hash_table_new (unsigned_long_hash, unsigned_long_equal);
display->double_click_time = 250;
@ -312,6 +330,13 @@ meta_display_close (MetaDisplay *display)
g_slist_free (winlist);
meta_display_ungrab (display);
#ifdef USE_GDK_DISPLAY
/* Stop caring about events */
meta_ui_remove_event_func (display->xdisplay,
event_callback,
display);
#endif
/* Must be after all calls to meta_window_free() since they
* unregister windows
*/
@ -319,9 +344,11 @@ meta_display_close (MetaDisplay *display)
if (display->leader_window != None)
XDestroyWindow (display->xdisplay, display->leader_window);
#ifndef USE_GDK_DISPLAY
meta_event_queue_free (display->events);
XCloseDisplay (display->xdisplay);
#endif
g_free (display->name);
all_displays = g_slist_remove (all_displays, display);
@ -444,10 +471,17 @@ meta_display_is_double_click (MetaDisplay *display)
static gboolean dump_events = TRUE;
static void
event_queue_callback (MetaEventQueue *queue,
XEvent *event,
event_queue_callback (XEvent *event,
gpointer data)
{
event_callback (event, data);
}
static gboolean
event_callback (XEvent *event,
gpointer data)
{
MetaWindow *window;
MetaDisplay *display;
@ -457,7 +491,7 @@ event_queue_callback (MetaEventQueue *queue,
if (dump_events)
meta_spew_event (display, event);
/* mark double click events, kind of a hack, oh well. */
if (event->type == ButtonPress)
{
@ -490,7 +524,7 @@ event_queue_callback (MetaEventQueue *queue,
modified == window->frame->xwindow)
{
meta_frame_event (window->frame, event);
return;
return FALSE;
}
switch (event->type)
@ -677,6 +711,8 @@ event_queue_callback (MetaEventQueue *queue,
default:
break;
}
return FALSE;
}
/* Return the window this has to do with, if any, rather

View File

@ -151,7 +151,7 @@ eq_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
event = g_queue_pop_head (eq->events);
func = (MetaEventQueueFunc) callback;
(* func) (eq, event, user_data);
(* func) (event, user_data);
g_free (event);
}

View File

@ -27,8 +27,7 @@
typedef struct _MetaEventQueue MetaEventQueue;
typedef void (* MetaEventQueueFunc) (MetaEventQueue *queue,
XEvent *event,
typedef void (* MetaEventQueueFunc) (XEvent *event,
gpointer data);
MetaEventQueue* meta_event_queue_new (Display *display,

View File

@ -22,6 +22,13 @@
#include "frame.h"
#include "errors.h"
#define EVENT_MASK (SubstructureRedirectMask | \
StructureNotifyMask | SubstructureNotifyMask | \
ExposureMask | \
ButtonPressMask | ButtonReleaseMask | \
PointerMotionMask | PointerMotionHintMask | \
EnterWindowMask | LeaveWindowMask)
void
meta_window_ensure_frame (MetaWindow *window)
{
@ -46,9 +53,7 @@ meta_window_ensure_frame (MetaWindow *window)
frame->mapped = FALSE;
attrs.event_mask = SubstructureRedirectMask |
StructureNotifyMask | SubstructureNotifyMask |
EnterWindowMask | LeaveWindowMask;
attrs.event_mask = EVENT_MASK;
frame->xwindow = XCreateWindow (window->display->xdisplay,
window->screen->xroot,
@ -92,10 +97,15 @@ meta_window_ensure_frame (MetaWindow *window)
window->rect.y);
meta_error_trap_pop (window->display);
meta_ui_add_frame (window->screen->ui, frame->xwindow);
/* stick frame to the window */
window->frame = frame;
meta_ui_add_frame (window->screen->ui, frame->xwindow);
if (window->title)
meta_ui_set_frame_title (window->screen->ui,
window->frame->xwindow,
window->title);
}
void

View File

@ -34,17 +34,6 @@ struct _MetaFrameActionGrab
/* button doing the dragging */
int start_button;
};
/* This lacks ButtonReleaseMask to avoid the auto-grab
* since it breaks our popup menu
*/
#define EVENT_MASK (SubstructureRedirectMask | \
StructureNotifyMask | SubstructureNotifyMask | \
ExposureMask | \
ButtonPressMask | ButtonReleaseMask | \
PointerMotionMask | PointerMotionHintMask | \
EnterWindowMask | LeaveWindowMask)
#endif
struct _MetaUIFrame
@ -232,7 +221,7 @@ meta_frames_get_type (void)
(GtkClassInitFunc) NULL,
};
frames_type = gtk_type_unique (GTK_TYPE_WIDGET, &frames_info);
frames_type = gtk_type_unique (GTK_TYPE_WINDOW, &frames_info);
}
return frames_type;
@ -494,7 +483,7 @@ meta_frames_style_set (GtkWidget *widget,
g_object_unref (G_OBJECT (font));
frames->text_height = metrics.ascent + metrics.descent;
frames->text_height = PANGO_PIXELS (metrics.ascent + metrics.descent);
}
/* Queue a draw/resize on all frames */
@ -694,7 +683,9 @@ meta_frames_manage_window (MetaFrames *frames,
}
gdk_window_set_user_data (frame->window, frames);
#if 0
/* Add events in frame.c */
gdk_window_set_events (frame->window,
GDK_EXPOSURE_MASK |
GDK_POINTER_MOTION_MASK |
@ -702,7 +693,8 @@ meta_frames_manage_window (MetaFrames *frames,
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_STRUCTURE_MASK);
#endif
/* This shouldn't be required if we don't select for button
* press in frame.c?
*/
@ -1025,13 +1017,16 @@ meta_frames_expose_event (GtkWidget *widget,
fgeom.title_rect.height);
}
gdk_gc_set_clip_rectangle (layout_gc, &clip);
gdk_draw_layout (frame->window,
layout_gc,
fgeom.title_rect.x + frames->props->text_border.left,
fgeom.title_rect.y + frames->props->text_border.top,
frame->layout);
gdk_gc_set_clip_rectangle (layout_gc, NULL);
if (frame->layout)
{
gdk_gc_set_clip_rectangle (layout_gc, &clip);
gdk_draw_layout (frame->window,
layout_gc,
fgeom.title_rect.x + frames->props->text_border.left,
fgeom.title_rect.y + frames->props->text_border.top,
frame->layout);
gdk_gc_set_clip_rectangle (layout_gc, NULL);
}
}
inner = frames->props->inner_button_border;

View File

@ -25,7 +25,7 @@
#include "errors.h"
#include "ui.h"
#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <sys/types.h>

View File

@ -14,7 +14,7 @@ if test -z "$CLIENTS"; then
fi
if test -z "$ONLY_WM"; then
Xnest :1 -scrns $SCREENS -geometry 640x480 -bw 15 &
Xnest -ac :1 -scrns $SCREENS -geometry 640x480 -bw 15 &
usleep 50000
if test $CLIENTS != 0; then

View File

@ -349,6 +349,17 @@ meta_screen_queue_frame_redraws (MetaScreen *screen)
meta_screen_foreach_window (screen, queue_draw, NULL);
}
static void
queue_resize (MetaScreen *screen, MetaWindow *window, gpointer data)
{
meta_window_queue_move_resize (window);
}
void
meta_screen_queue_window_resizes (MetaScreen *screen)
{
meta_screen_foreach_window (screen, queue_resize, NULL);
}
int
meta_screen_get_n_workspaces (MetaScreen *screen)

View File

@ -52,6 +52,7 @@ void meta_screen_foreach_window (MetaScreen *scree
MetaScreenWindowFunc func,
gpointer data);
void meta_screen_queue_frame_redraws (MetaScreen *screen);
void meta_screen_queue_window_resizes (MetaScreen *screen);
int meta_screen_get_n_workspaces (MetaScreen *screen);

View File

@ -37,6 +37,68 @@ meta_ui_init (int *argc, char ***argv)
meta_fatal ("Unable to open X display %s\n", gdk_display_name);
}
Display*
meta_ui_get_display (const char *name)
{
if (name == NULL)
return gdk_display;
else
return NULL;
}
typedef struct _EventFunc EventFunc;
struct _EventFunc
{
MetaEventFunc func;
gpointer data;
};
static GdkFilterReturn
filter_func (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
EventFunc *ef;
ef = data;
if ((* ef->func) (xevent, ef->data))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
}
static EventFunc *ef = NULL;
void
meta_ui_add_event_func (Display *xdisplay,
MetaEventFunc func,
gpointer data)
{
g_return_if_fail (ef == NULL);
ef = g_new (EventFunc, 1);
ef->func = func;
ef->data = data;
gdk_window_add_filter (NULL, filter_func, ef);
}
/* removal is by data due to proxy function */
void
meta_ui_remove_event_func (Display *xdisplay,
MetaEventFunc func,
gpointer data)
{
g_return_if_fail (ef != NULL);
gdk_window_remove_filter (NULL, filter_func, ef);
g_free (ef);
ef = NULL;
}
MetaUI*
meta_ui_new (Display *xdisplay,
Screen *screen)
@ -88,6 +150,30 @@ meta_ui_remove_frame (MetaUI *ui,
meta_frames_unmanage_window (ui->frames, xwindow);
}
void
meta_ui_map_frame (MetaUI *ui,
Window xwindow)
{
GdkWindow *window;
window = gdk_xid_table_lookup (xwindow);
if (window)
gdk_x11_window_map (window);
}
void
meta_ui_unmap_frame (MetaUI *ui,
Window xwindow)
{
GdkWindow *window;
window = gdk_xid_table_lookup (xwindow);
if (window)
gdk_window_hide (window);
}
void
meta_ui_reset_frame_bg (MetaUI *ui,
Window xwindow)
@ -103,4 +189,12 @@ meta_ui_queue_frame_draw (MetaUI *ui,
}
void
meta_ui_set_frame_title (MetaUI *ui,
Window xwindow,
const char *title)
{
meta_frames_set_title (ui->frames, xwindow, title);
}

View File

@ -24,11 +24,24 @@
/* Don't include gtk.h here */
#include "common.h"
#include <X11/Xlib.h>
#include <glib.h>
typedef struct _MetaUI MetaUI;
typedef gboolean (* MetaEventFunc) (XEvent *xevent, gpointer data);
void meta_ui_init (int *argc, char ***argv);
Display* meta_ui_get_display (const char *name);
void meta_ui_add_event_func (Display *xdisplay,
MetaEventFunc func,
gpointer data);
void meta_ui_remove_event_func (Display *xdisplay,
MetaEventFunc func,
gpointer data);
MetaUI* meta_ui_new (Display *xdisplay,
Screen *screen);
void meta_ui_free (MetaUI *ui);
@ -42,6 +55,11 @@ void meta_ui_add_frame (MetaUI *ui,
void meta_ui_remove_frame (MetaUI *ui,
Window xwindow);
/* GDK insists on tracking map/unmap */
void meta_ui_map_frame (MetaUI *ui,
Window xwindow);
void meta_ui_unmap_frame (MetaUI *ui,
Window xwindow);
void meta_ui_reset_frame_bg (MetaUI *ui,
Window xwindow);
@ -49,4 +67,8 @@ void meta_ui_reset_frame_bg (MetaUI *ui,
void meta_ui_queue_frame_draw (MetaUI *ui,
Window xwindow);
void meta_ui_set_frame_title (MetaUI *ui,
Window xwindow,
const char *title);
#endif

View File

@ -479,7 +479,7 @@ meta_window_show (MetaWindow *window)
{
meta_verbose ("Frame actually needs map\n");
window->frame->mapped = TRUE;
XMapWindow (window->display->xdisplay, window->frame->xwindow);
meta_ui_map_frame (window->screen->ui, window->frame->xwindow);
}
if (window->shaded)
@ -528,7 +528,7 @@ meta_window_hide (MetaWindow *window)
{
meta_verbose ("Frame actually needs unmap\n");
window->frame->mapped = FALSE;
XUnmapWindow (window->display->xdisplay, window->frame->xwindow);
meta_ui_unmap_frame (window->screen->ui, window->frame->xwindow);
}
if (window->mapped)
@ -1422,8 +1422,6 @@ process_property_notify (MetaWindow *window,
event->atom == window->display->atom_net_wm_name)
{
update_title (window);
meta_window_queue_move_resize (window);
}
else if (event->atom == XA_WM_NORMAL_HINTS)
{
@ -1788,6 +1786,11 @@ update_title (MetaWindow *window)
g_free (window->desc);
window->desc = g_strdup_printf ("0x%lx (%.10s)", window->xwindow, window->title);
if (window->frame)
meta_ui_set_frame_title (window->screen->ui,
window->frame->xwindow,
window->title);
return meta_error_trap_pop (window->display);
}