mirror of
https://github.com/brl/mutter.git
synced 2024-11-24 17:10:40 -05:00
...
This commit is contained in:
parent
12f01149dd
commit
f845819c1d
@ -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 \
|
||||||
|
@ -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
|
||||||
|
122
src/core.c
122
src/core.c
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
42
src/core.h
42
src/core.h
@ -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
|
||||||
|
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
306
src/frames.c
306
src/frames.c
@ -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;
|
||||||
|
15
src/frames.h
15
src/frames.h
@ -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;
|
||||||
|
@ -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))
|
||||||
|
21
src/menu.c
21
src/menu.c
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user