1
0
Fork 0
This commit is contained in:
rhp 2001-06-21 03:40:14 +00:00
parent 12f01149dd
commit f845819c1d
13 changed files with 443 additions and 102 deletions

View file

@ -18,6 +18,8 @@ metacity_SOURCES= \
keybindings.h \ keybindings.h \
main.c \ main.c \
main.h \ main.h \
menu.c \
menu.h \
screen.c \ screen.c \
screen.h \ screen.h \
session.c \ session.c \

View file

@ -35,7 +35,8 @@ typedef enum
META_FRAME_TRANSIENT = 1 << 5, META_FRAME_TRANSIENT = 1 << 5,
META_FRAME_HAS_FOCUS = 1 << 6, META_FRAME_HAS_FOCUS = 1 << 6,
META_FRAME_SHADED = 1 << 7, META_FRAME_SHADED = 1 << 7,
META_FRAME_STUCK = 1 << 8 META_FRAME_STUCK = 1 << 8,
META_FRAME_MAXIMIZED = 1 << 9
} MetaFrameFlags; } MetaFrameFlags;
#endif #endif

View file

@ -94,6 +94,41 @@ meta_core_user_move (Display *xdisplay,
meta_window_move (window, x, y); meta_window_move (window, x, y);
} }
void
meta_core_user_resize (Display *xdisplay,
Window frame_xwindow,
int width,
int height)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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);
window->user_has_resized = TRUE;
meta_window_resize (window, width, height);
}
void
meta_core_user_raise (Display *xdisplay,
Window frame_xwindow)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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_window_raise (window);
}
void void
meta_core_get_position (Display *xdisplay, meta_core_get_position (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
@ -112,3 +147,90 @@ meta_core_get_position (Display *xdisplay,
meta_window_get_position (window, x, y); meta_window_get_position (window, x, y);
} }
void
meta_core_get_size (Display *xdisplay,
Window frame_xwindow,
int *width,
int *height)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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);
if (width)
*width = window->rect.width;
if (height)
*height = window->rect.height;
}
void
meta_core_minimize (Display *xdisplay,
Window frame_xwindow)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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_window_minimize (window);
}
void
meta_core_maximize (Display *xdisplay,
Window frame_xwindow)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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_window_maximize (window);
}
void
meta_core_unmaximize (Display *xdisplay,
Window frame_xwindow)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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_window_unmaximize (window);
}
void
meta_core_delete (Display *xdisplay,
Window frame_xwindow,
guint32 timestamp)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_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_window_delete (window, timestamp);
}

View file

@ -44,12 +44,54 @@ void meta_core_user_move (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
int x, int x,
int y); int y);
void meta_core_user_resize (Display *xdisplay,
Window frame_xwindow,
int width,
int height);
void meta_core_user_raise (Display *xdisplay,
Window frame_xwindow);
/* get position of client, same coord space expected by move */ /* get position of client, same coord space expected by move */
void meta_core_get_position (Display *xdisplay, void meta_core_get_position (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
int *x, int *x,
int *y); int *y);
void meta_core_get_size (Display *xdisplay,
Window frame_xwindow,
int *width,
int *height);
void meta_core_minimize (Display *xdisplay,
Window frame_xwindow);
void meta_core_unmaximize (Display *xdisplay,
Window frame_xwindow);
void meta_core_maximize (Display *xdisplay,
Window frame_xwindow);
void meta_core_delete (Display *xdisplay,
Window frame_xwindow,
guint32 timestamp);
void meta_core_unshade (Display *xdisplay,
Window frame_xwindow);
void meta_core_shade (Display *xdisplay,
Window frame_xwindow);
void meta_core_unstick (Display *xdisplay,
Window frame_xwindow);
void meta_core_stick (Display *xdisplay,
Window frame_xwindow);
void meta_core_change_workspace (Display *xdisplay,
Window frame_xwindow,
int new_workspace);
int meta_core_get_num_workspaces (Display *xdisplay,
Screen *xscreen);
int meta_core_get_active_workspace (Display *xdisplay,
Screen *xscreen);
int meta_core_get_frame_workspace (Display *xdisplay,
Window frame_xwindow);
#endif #endif

View file

@ -22,6 +22,7 @@
#include "errors.h" #include "errors.h"
#include <errno.h> #include <errno.h>
#include <gdk/gdk.h>
typedef struct _ErrorTrap ErrorTrap; typedef struct _ErrorTrap ErrorTrap;
@ -46,6 +47,10 @@ meta_error_trap_push (MetaDisplay *display)
{ {
ErrorTrap *et; ErrorTrap *et;
gdk_error_trap_push ();
return;
/* below here is old method */
et = g_new (ErrorTrap, 1); et = g_new (ErrorTrap, 1);
et->error_code = Success; et->error_code = Success;
@ -58,6 +63,9 @@ meta_error_trap_pop (MetaDisplay *display)
int result; int result;
ErrorTrap *et; ErrorTrap *et;
GSList *next; GSList *next;
return gdk_error_trap_pop ();
/* below here is old method */
if (display->error_traps == NULL) if (display->error_traps == NULL)
meta_bug ("No error trap to pop\n"); meta_bug ("No error trap to pop\n");

View file

@ -160,6 +160,9 @@ meta_frame_get_flags (MetaFrame *frame)
flags = flags =
META_FRAME_ALLOWS_MENU | META_FRAME_ALLOWS_RESIZE; META_FRAME_ALLOWS_MENU | META_FRAME_ALLOWS_RESIZE;
if (frame->window->maximized)
flags |= META_FRAME_MAXIMIZED;
if (frame->window->has_close_func) if (frame->window->has_close_func)
flags |= META_FRAME_ALLOWS_DELETE; flags |= META_FRAME_ALLOWS_DELETE;

View file

@ -23,26 +23,6 @@
#include "util.h" #include "util.h"
#include "core.h" #include "core.h"
#if 0
struct _MetaFrameActionGrab
{
MetaFrameAction action;
/* initial mouse position for drags */
int start_root_x, start_root_y;
/* initial window size or initial window position for drags */
int start_window_x, start_window_y;
/* button doing the dragging */
int start_button;
};
#endif
struct _MetaUIFrame
{
Window xwindow;
GdkWindow *window;
PangoLayout *layout;
};
struct _MetaFrameProperties struct _MetaFrameProperties
{ {
/* Size of left/right/bottom sides */ /* Size of left/right/bottom sides */
@ -255,14 +235,14 @@ meta_frames_class_init (MetaFramesClass *class)
INT_PROPERTY ("spacer_padding", 3, _("Spacer padding"), _("Padding on either side of spacer")); INT_PROPERTY ("spacer_padding", 3, _("Spacer padding"), _("Padding on either side of spacer"));
INT_PROPERTY ("spacer_width", 2, _("Spacer width"), _("Width of spacer")); INT_PROPERTY ("spacer_width", 2, _("Spacer width"), _("Width of spacer"));
INT_PROPERTY ("spacer_height", 10, _("Spacer height"), _("Height of spacer")); INT_PROPERTY ("spacer_height", 11, _("Spacer height"), _("Height of spacer"));
/* same as right_width left_width by default */ /* same as right_width left_width by default */
INT_PROPERTY ("right_inset", 6, _("Right inset"), _("Distance of buttons from right edge of frame")); INT_PROPERTY ("right_inset", 6, _("Right inset"), _("Distance of buttons from right edge of frame"));
INT_PROPERTY ("left_inset", 6, _("Left inset"), _("Distance of menu button from left edge of frame")); INT_PROPERTY ("left_inset", 6, _("Left inset"), _("Distance of menu button from left edge of frame"));
INT_PROPERTY ("button_width", 14, _("Button width"), _("Width of buttons")); INT_PROPERTY ("button_width", 15, _("Button width"), _("Width of buttons"));
INT_PROPERTY ("button_height", 14, _("Button height"), _("Height of buttons")); INT_PROPERTY ("button_height", 15, _("Button height"), _("Height of buttons"));
BORDER_PROPERTY ("button_border", _("Button border"), _("Border around buttons")); BORDER_PROPERTY ("button_border", _("Button border"), _("Border around buttons"));
BORDER_PROPERTY ("inner_button_border", _("Inner button border"), _("Border around the icon inside buttons")); BORDER_PROPERTY ("inner_button_border", _("Inner button border"), _("Border around the icon inside buttons"));
@ -709,11 +689,13 @@ meta_frames_unmanage_window (MetaFrames *frames,
if (frame) if (frame)
{ {
gdk_window_set_user_data (frame->window, NULL);
if (frames->grab_frame == frame) if (frames->grab_frame == frame)
meta_frames_end_grab (frames, GDK_CURRENT_TIME); meta_frames_end_grab (frames, GDK_CURRENT_TIME);
g_hash_table_remove (frames->frames, &frame->xwindow); g_hash_table_remove (frames->frames, &frame->xwindow);
g_object_unref (G_OBJECT (frame->window)); g_object_unref (G_OBJECT (frame->window));
if (frame->layout) if (frame->layout)
@ -898,6 +880,46 @@ update_move (MetaFrames *frames,
frames->start_window_y + dy); frames->start_window_y + dy);
} }
static void
update_resize_se (MetaFrames *frames,
MetaUIFrame *frame,
int x, int y)
{
int dx, dy;
dx = x - frames->start_root_x;
dy = y - frames->start_root_y;
meta_core_user_resize (gdk_display,
frame->xwindow,
frames->start_window_x + dx,
frames->start_window_y + dy);
}
static void
redraw_control (MetaFrames *frames,
MetaUIFrame *frame,
MetaFrameControl control)
{
MetaFrameGeometry fgeom;
GdkRectangle *rect;
meta_frames_calc_geometry (frames, frame, &fgeom);
rect = control_rect (control, &fgeom);
gdk_window_invalidate_rect (frame->window, rect, FALSE);
}
static gboolean
point_in_control (MetaFrames *frames,
MetaUIFrame *frame,
MetaFrameControl control,
int x, int y)
{
return control == get_control (frames, frame, x, y);
}
gboolean gboolean
meta_frames_button_press_event (GtkWidget *widget, meta_frames_button_press_event (GtkWidget *widget,
GdkEventButton *event) GdkEventButton *event)
@ -916,11 +938,68 @@ meta_frames_button_press_event (GtkWidget *widget,
return FALSE; return FALSE;
control = get_control (frames, frame, event->x, event->y); control = get_control (frames, frame, event->x, event->y);
if (((control == META_FRAME_CONTROL_TITLE || if (event->button == 1)
control == META_FRAME_CONTROL_NONE) && meta_core_user_raise (gdk_display, frame->xwindow);
event->button == 1) ||
event->button == 2) if (event->button == 1 &&
(control == META_FRAME_CONTROL_MAXIMIZE ||
control == META_FRAME_CONTROL_MINIMIZE ||
control == META_FRAME_CONTROL_DELETE ||
control == META_FRAME_CONTROL_MENU))
{
MetaFrameStatus status = META_FRAME_STATUS_NORMAL;
switch (control)
{
case META_FRAME_CONTROL_MINIMIZE:
status = META_FRAME_STATUS_CLICKING_MINIMIZE;
break;
case META_FRAME_CONTROL_MAXIMIZE:
status = META_FRAME_STATUS_CLICKING_MAXIMIZE;
break;
case META_FRAME_CONTROL_DELETE:
status = META_FRAME_STATUS_CLICKING_DELETE;
break;
case META_FRAME_CONTROL_MENU:
status = META_FRAME_STATUS_CLICKING_MENU;
break;
default:
g_assert_not_reached ();
break;
}
g_assert (status != META_FRAME_STATUS_NORMAL);
meta_frames_begin_grab (frames, frame,
status,
event->button,
0, 0, 0, 0, /* not needed */
event->time);
redraw_control (frames, frame, control);
}
else if (control == META_FRAME_CONTROL_RESIZE_SE &&
event->button == 1)
{
int w, h;
meta_core_get_size (gdk_display,
frame->xwindow,
&w, &h);
meta_frames_begin_grab (frames, frame,
META_FRAME_STATUS_RESIZING_SE,
event->button,
event->x_root,
event->y_root,
w, h,
event->time);
}
else if (((control == META_FRAME_CONTROL_TITLE ||
control == META_FRAME_CONTROL_NONE) &&
event->button == 1) ||
event->button == 2)
{ {
int x, y; int x, y;
@ -956,14 +1035,66 @@ meta_frames_button_release_event (GtkWidget *widget,
if (frames->grab_frame == frame && if (frames->grab_frame == frame &&
frames->start_button == event->button) frames->start_button == event->button)
{ {
MetaFrameStatus status;
status = frames->grab_status;
meta_frames_end_grab (frames, event->time); meta_frames_end_grab (frames, event->time);
switch (frames->grab_status) switch (status)
{ {
case META_FRAME_STATUS_MOVING: case META_FRAME_STATUS_MOVING:
update_move (frames, frame, event->x_root, event->y_root); update_move (frames, frame, event->x_root, event->y_root);
break; break;
case META_FRAME_STATUS_RESIZING_SE:
update_resize_se (frames, frame, event->x_root, event->y_root);
break;
case META_FRAME_STATUS_CLICKING_MINIMIZE:
if (point_in_control (frames, frame,
META_FRAME_CONTROL_MINIMIZE,
event->x, event->y))
meta_core_minimize (gdk_display, frame->xwindow);
redraw_control (frames, frame,
META_FRAME_CONTROL_MINIMIZE);
break;
case META_FRAME_STATUS_CLICKING_MAXIMIZE:
if (point_in_control (frames, frame,
META_FRAME_CONTROL_MAXIMIZE,
event->x, event->y))
{
if (meta_core_get_frame_flags (gdk_display, frame->xwindow) &
META_FRAME_MAXIMIZED)
meta_core_unmaximize (gdk_display, frame->xwindow);
else
meta_core_maximize (gdk_display, frame->xwindow);
}
redraw_control (frames, frame,
META_FRAME_CONTROL_MAXIMIZE);
break;
case META_FRAME_STATUS_CLICKING_DELETE:
if (point_in_control (frames, frame,
META_FRAME_CONTROL_DELETE,
event->x, event->y))
meta_core_delete (gdk_display, frame->xwindow, event->time);
redraw_control (frames, frame,
META_FRAME_CONTROL_DELETE);
break;
case META_FRAME_STATUS_CLICKING_MENU:
if (point_in_control (frames, frame,
META_FRAME_CONTROL_MENU,
event->x, event->y))
/* FIXME */ ;
redraw_control (frames, frame,
META_FRAME_CONTROL_MENU);
break;
case META_FRAME_STATUS_NORMAL: case META_FRAME_STATUS_NORMAL:
break; break;
} }
@ -985,11 +1116,29 @@ meta_frames_motion_notify_event (GtkWidget *widget,
if (frame == NULL) if (frame == NULL)
return FALSE; return FALSE;
if (frames->grab_status == META_FRAME_STATUS_MOVING) switch (frames->grab_status)
{ {
int x, y; case META_FRAME_STATUS_MOVING:
frame_query_root_pointer (frame, &x, &y); {
update_move (frames, frame, x, y); int x, y;
frame_query_root_pointer (frame, &x, &y);
update_move (frames, frame, x, y);
}
break;
case META_FRAME_STATUS_RESIZING_SE:
{
int x, y;
frame_query_root_pointer (frame, &x, &y);
update_resize_se (frames, frame, x, y);
}
break;
case META_FRAME_STATUS_CLICKING_MENU:
case META_FRAME_STATUS_CLICKING_DELETE:
case META_FRAME_STATUS_CLICKING_MINIMIZE:
case META_FRAME_STATUS_CLICKING_MAXIMIZE:
case META_FRAME_STATUS_NORMAL:
break;
} }
return TRUE; return TRUE;
@ -1015,45 +1164,36 @@ meta_frames_destroy_event (GtkWidget *widget,
} }
static void static void
draw_current_control_bg (MetaFrames *frames, draw_control_bg (MetaFrames *frames,
MetaUIFrame *frame, MetaUIFrame *frame,
MetaFrameGeometry *fgeom) MetaFrameControl control,
MetaFrameGeometry *fgeom)
{ {
GdkRectangle *rect; GdkRectangle *rect;
#if 0 GtkWidget *widget;
rect = control_rect (frames->current_control, fgeom);
widget = GTK_WIDGET (frames);
rect = control_rect (control, fgeom);
if (rect == NULL) if (rect == NULL)
return; return;
if (frames->current_control == META_FRAME_CONTROL_TITLE) switch (frames->grab_status)
return;
switch (frames->current_control_state)
{ {
/* FIXME turn this off after testing */ case META_FRAME_STATUS_CLICKING_MENU:
case META_STATE_PRELIGHT: case META_FRAME_STATUS_CLICKING_DELETE:
XFillRectangle (info->display, case META_FRAME_STATUS_CLICKING_MAXIMIZE:
info->drawable, case META_FRAME_STATUS_CLICKING_MINIMIZE:
screen_data->prelight_gc, gtk_paint_box (widget->style, frame->window,
xoff + rect->x, GTK_STATE_ACTIVE,
yoff + rect->y, GTK_SHADOW_IN, NULL,
rect->width, rect->height); widget, "button",
rect->x, rect->y, rect->width, rect->height);
break; break;
case META_STATE_ACTIVE:
XFillRectangle (info->display,
info->drawable,
screen_data->active_gc,
xoff + rect->x,
yoff + rect->y,
rect->width, rect->height);
break;
default: default:
break; break;
} }
#endif
} }
gboolean gboolean
@ -1116,8 +1256,6 @@ meta_frames_expose_event (GtkWidget *widget,
height - fgeom.bottom_height - fgeom.top_height + 1); height - fgeom.bottom_height - fgeom.top_height + 1);
} }
draw_current_control_bg (frames, frame, &fgeom);
if (event->area.y < fgeom.top_height && if (event->area.y < fgeom.top_height &&
fgeom.title_rect.width > 0 && fgeom.title_rect.height > 0) fgeom.title_rect.width > 0 && fgeom.title_rect.height > 0)
{ {
@ -1160,31 +1298,35 @@ meta_frames_expose_event (GtkWidget *widget,
if (fgeom.close_rect.width > 0 && fgeom.close_rect.height > 0) if (fgeom.close_rect.width > 0 && fgeom.close_rect.height > 0)
{ {
draw_control_bg (frames, frame, META_FRAME_CONTROL_DELETE, &fgeom);
gdk_draw_line (frame->window, gdk_draw_line (frame->window,
widget->style->fg_gc[GTK_STATE_NORMAL], widget->style->fg_gc[GTK_STATE_NORMAL],
fgeom.close_rect.x + inner.left, fgeom.close_rect.x + inner.left,
fgeom.close_rect.y + inner.top, fgeom.close_rect.y + inner.top,
fgeom.close_rect.x + fgeom.close_rect.width - inner.right, fgeom.close_rect.x + fgeom.close_rect.width - inner.right - 1,
fgeom.close_rect.y + fgeom.close_rect.height - inner.bottom); fgeom.close_rect.y + fgeom.close_rect.height - inner.bottom - 1);
gdk_draw_line (frame->window, gdk_draw_line (frame->window,
widget->style->fg_gc[GTK_STATE_NORMAL], widget->style->fg_gc[GTK_STATE_NORMAL],
fgeom.close_rect.x + inner.left, fgeom.close_rect.x + inner.left,
fgeom.close_rect.y + fgeom.close_rect.height - inner.bottom, fgeom.close_rect.y + fgeom.close_rect.height - inner.bottom - 1,
fgeom.close_rect.x + fgeom.close_rect.width - inner.right, fgeom.close_rect.x + fgeom.close_rect.width - inner.right - 1,
fgeom.close_rect.y + inner.top); fgeom.close_rect.y + inner.top);
} }
#define THICK_LINE_WIDTH 3 #define THICK_LINE_WIDTH 3
if (fgeom.max_rect.width > 0 && fgeom.max_rect.height > 0) if (fgeom.max_rect.width > 0 && fgeom.max_rect.height > 0)
{ {
draw_control_bg (frames, frame, META_FRAME_CONTROL_MAXIMIZE, &fgeom);
gdk_draw_rectangle (frame->window, gdk_draw_rectangle (frame->window,
widget->style->fg_gc[GTK_STATE_NORMAL], widget->style->fg_gc[GTK_STATE_NORMAL],
FALSE, FALSE,
fgeom.max_rect.x + inner.left, fgeom.max_rect.x + inner.left,
fgeom.max_rect.y + inner.top, fgeom.max_rect.y + inner.top,
fgeom.max_rect.width - inner.left - inner.right, fgeom.max_rect.width - inner.left - inner.right - 1,
fgeom.max_rect.height - inner.top - inner.bottom); fgeom.max_rect.height - inner.top - inner.bottom - 1);
vals.line_width = THICK_LINE_WIDTH; vals.line_width = THICK_LINE_WIDTH;
gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL], gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL],
@ -1194,9 +1336,9 @@ meta_frames_expose_event (GtkWidget *widget,
gdk_draw_line (frame->window, gdk_draw_line (frame->window,
widget->style->fg_gc[GTK_STATE_NORMAL], widget->style->fg_gc[GTK_STATE_NORMAL],
fgeom.max_rect.x + inner.left, fgeom.max_rect.x + inner.left,
fgeom.max_rect.y + inner.top, fgeom.max_rect.y + inner.top + 1,
fgeom.max_rect.x + fgeom.max_rect.width - inner.right, fgeom.max_rect.x + fgeom.max_rect.width - inner.right,
fgeom.max_rect.y + inner.top); fgeom.max_rect.y + inner.top + 1);
vals.line_width = 0; vals.line_width = 0;
gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL], gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL],
@ -1206,6 +1348,7 @@ meta_frames_expose_event (GtkWidget *widget,
if (fgeom.min_rect.width > 0 && fgeom.min_rect.height > 0) if (fgeom.min_rect.width > 0 && fgeom.min_rect.height > 0)
{ {
draw_control_bg (frames, frame, META_FRAME_CONTROL_MINIMIZE, &fgeom);
vals.line_width = THICK_LINE_WIDTH; vals.line_width = THICK_LINE_WIDTH;
gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL], gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL],
@ -1215,9 +1358,9 @@ meta_frames_expose_event (GtkWidget *widget,
gdk_draw_line (frame->window, gdk_draw_line (frame->window,
widget->style->fg_gc[GTK_STATE_NORMAL], widget->style->fg_gc[GTK_STATE_NORMAL],
fgeom.min_rect.x + inner.left, fgeom.min_rect.x + inner.left,
fgeom.min_rect.y + fgeom.min_rect.height - inner.bottom - THICK_LINE_WIDTH, fgeom.min_rect.y + fgeom.min_rect.height - inner.bottom - THICK_LINE_WIDTH + 1,
fgeom.min_rect.x + fgeom.min_rect.width - inner.right, fgeom.min_rect.x + fgeom.min_rect.width - inner.right,
fgeom.min_rect.y + fgeom.min_rect.height - inner.bottom - THICK_LINE_WIDTH); fgeom.min_rect.y + fgeom.min_rect.height - inner.bottom - THICK_LINE_WIDTH + 1);
vals.line_width = 0; vals.line_width = 0;
gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL], gdk_gc_set_values (widget->style->fg_gc[GTK_STATE_NORMAL],
@ -1242,10 +1385,15 @@ meta_frames_expose_event (GtkWidget *widget,
if (fgeom.menu_rect.width > 0 && fgeom.menu_rect.height > 0) if (fgeom.menu_rect.width > 0 && fgeom.menu_rect.height > 0)
{ {
int x, y; int x, y;
#define ARROW_WIDTH 7
#define ARROW_HEIGHT 5
draw_control_bg (frames, frame, META_FRAME_CONTROL_MENU, &fgeom);
x = fgeom.menu_rect.x; x = fgeom.menu_rect.x;
y = fgeom.menu_rect.y; y = fgeom.menu_rect.y;
x += (fgeom.menu_rect.width - 7) / 2; x += (fgeom.menu_rect.width - ARROW_WIDTH) / 2;
y += (fgeom.menu_rect.height - 5) / 2; y += (fgeom.menu_rect.height - ARROW_HEIGHT) / 2;
gtk_paint_arrow (widget->style, gtk_paint_arrow (widget->style,
frame->window, frame->window,
@ -1256,7 +1404,7 @@ meta_frames_expose_event (GtkWidget *widget,
"metacity_menu_button", "metacity_menu_button",
GTK_ARROW_DOWN, GTK_ARROW_DOWN,
TRUE, TRUE,
x, y, 7, 5); x, y, ARROW_WIDTH, ARROW_HEIGHT);
} }
return TRUE; return TRUE;

View file

@ -47,8 +47,12 @@ typedef enum
typedef enum typedef enum
{ {
META_FRAME_STATUS_NORMAL, META_FRAME_STATUS_NORMAL,
META_FRAME_STATUS_MOVING META_FRAME_STATUS_MOVING,
META_FRAME_STATUS_CLICKING_MINIMIZE,
META_FRAME_STATUS_CLICKING_MAXIMIZE,
META_FRAME_STATUS_CLICKING_DELETE,
META_FRAME_STATUS_CLICKING_MENU,
META_FRAME_STATUS_RESIZING_SE
} MetaFrameStatus; } MetaFrameStatus;
/* This is one widget that manages all the window frames /* This is one widget that manages all the window frames
@ -68,6 +72,13 @@ typedef struct _MetaFramesClass MetaFramesClass;
typedef struct _MetaUIFrame MetaUIFrame; typedef struct _MetaUIFrame MetaUIFrame;
typedef struct _MetaFrameProperties MetaFrameProperties; typedef struct _MetaFrameProperties MetaFrameProperties;
struct _MetaUIFrame
{
Window xwindow;
GdkWindow *window;
PangoLayout *layout;
};
struct _MetaFrames struct _MetaFrames
{ {
GtkWindow parent_instance; GtkWindow parent_instance;

View file

@ -58,10 +58,6 @@ main (int argc, char **argv)
meta_set_debugging (TRUE); meta_set_debugging (TRUE);
meta_set_syncing (g_getenv ("METACITY_SYNC") != NULL); meta_set_syncing (g_getenv ("METACITY_SYNC") != NULL);
g_type_init (0); /* grumble */
meta_errors_init ();
if (g_getenv ("METACITY_DISPLAY")) if (g_getenv ("METACITY_DISPLAY"))
{ {
meta_verbose ("Using METACITY_DISPLAY %s\n", meta_verbose ("Using METACITY_DISPLAY %s\n",
@ -72,6 +68,11 @@ main (int argc, char **argv)
/* DO NOT FREE display_name, putenv() sucks */ /* DO NOT FREE display_name, putenv() sucks */
} }
/* gtk_init() below overrides this, so it can be removed */
meta_errors_init ();
g_type_init (0); /* grumble */
meta_ui_init (&argc, &argv); meta_ui_init (&argc, &argv);
if (!meta_display_open (NULL)) if (!meta_display_open (NULL))

View file

@ -21,19 +21,26 @@
#include "menu.h" #include "menu.h"
#include "main.h" #include "main.h"
#include <gdk/gdkx.h>
#include <X11/Xatom.h>
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
typedef struct _MenuItem MenuItem; typedef struct _MenuItem MenuItem;
typedef struct _MenuData MenuData; typedef struct _MenuData MenuData;
typedef enum
{
META_MENU_OP_DELETE = 1 << 0,
META_MENU_OP_MINIMIZE = 1 << 1,
META_MENU_OP_UNMAXIMIZE = 1 << 2,
META_MENU_OP_MAXIMIZE = 1 << 3,
META_MENU_OP_UNSHADE = 1 << 4,
META_MENU_OP_SHADE = 1 << 5,
META_MENU_OP_UNSTICK = 1 << 6,
META_MENU_OP_STICK = 1 << 7,
META_MENU_OP_WORKSPACES = 1 << 8
} MetaMenuOp;
struct _MenuItem struct _MenuItem
{ {
MetaMessageWindowMenuOps op; MetaMenuOp op;
const char *stock_id; const char *stock_id;
const char *label; const char *label;
}; };

View file

@ -23,13 +23,13 @@
#define META_MENU_H #define META_MENU_H
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "messages.h" #include "frames.h"
void meta_window_menu_show (gulong xwindow,
void meta_window_menu_show (MetaFrames *frames,
MetaUIFrame *frame,
int root_x, int root_x,
int root_y, int root_y,
int button, int button,
MetaMessageWindowMenuOps ops,
MetaMessageWindowMenuOps insensitive,
guint32 timestamp); guint32 timestamp);
void meta_window_menu_hide (void); void meta_window_menu_hide (void);

View file

@ -29,5 +29,5 @@ if test -z "$ONLY_WM"; then
fi fi
if test -z "$ONLY_SETUP"; then if test -z "$ONLY_SETUP"; then
METACITY_UISLAVE_DIR=./uislave METACITY_DISPLAY=:1 exec unst libtool --mode=execute $DEBUG ./metacity METACITY_UISLAVE_DIR=./uislave METACITY_DISPLAY=:1 exec unst libtool --mode=execute $DEBUG ./metacity $OPTIONS
fi fi

View file

@ -1212,9 +1212,6 @@ meta_window_send_icccm_message (MetaWindow *window,
*/ */
XClientMessageEvent ev; XClientMessageEvent ev;
/* This should always be error trapped. */
g_return_if_fail (window->display->error_traps != NULL);
ev.type = ClientMessage; ev.type = ClientMessage;
ev.window = window->xwindow; ev.window = window->xwindow;
@ -1227,7 +1224,6 @@ meta_window_send_icccm_message (MetaWindow *window,
window->xwindow, False, 0, (XEvent*) &ev); window->xwindow, False, 0, (XEvent*) &ev);
} }
gboolean gboolean
meta_window_configure_request (MetaWindow *window, meta_window_configure_request (MetaWindow *window,
XEvent *event) XEvent *event)