self->trtresize = createWindow(self->title, NULL, mask, &attrib);
self->trrresize = createWindow(self->title, NULL, mask, &attrib);
+ attrib.cursor = ob_cursor(OB_CURSOR_WEST);
+ self->leftresize = createWindow(self->inner, NULL, mask, &attrib);
+ attrib.cursor = ob_cursor(OB_CURSOR_EAST);
+ self->rightresize = createWindow(self->inner, NULL, mask, &attrib);
+
mask &= ~CWCursor;
self->label = createWindow(self->title, NULL, mask, &attrib);
self->max = createWindow(self->title, NULL, mask, &attrib);
static void set_theme_statics(ObFrame *self)
{
+ gint handle_height;
+
+ if (ob_rr_theme->handle_height > 0)
+ handle_height = ob_rr_theme->handle_height;
+ else
+ handle_height = 1;
+
+
/* set colors/appearance/sizes for stuff that doesn't change */
XResizeWindow(ob_display, self->max,
ob_rr_theme->button_size, ob_rr_theme->button_size);
ob_rr_theme->button_size, ob_rr_theme->button_size);
XResizeWindow(ob_display, self->shade,
ob_rr_theme->button_size, ob_rr_theme->button_size);
- if (ob_rr_theme->handle_height > 0) {
- XResizeWindow(ob_display, self->lgrip,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
- XResizeWindow(ob_display, self->rgrip,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
- }
+ XResizeWindow(ob_display, self->lgrip,
+ ob_rr_theme->grip_width, handle_height);
+ XResizeWindow(ob_display, self->rgrip,
+ ob_rr_theme->grip_width, handle_height);
XResizeWindow(ob_display, self->tltresize,
ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1);
XResizeWindow(ob_display, self->trtresize,
XSetWindowBorderWidth(ob_display, self->handle, self->rbwidth);
XSetWindowBorderWidth(ob_display, self->lgrip, self->rbwidth);
XSetWindowBorderWidth(ob_display, self->rgrip, self->rbwidth);
+ XSetWindowBorderWidth(ob_display, self->leftresize, self->bwidth);
+ XSetWindowBorderWidth(ob_display, self->rightresize, self->bwidth);
}
if (self->decorations & OB_FRAME_DECOR_TITLEBAR)
XMoveWindow(ob_display, self->trrresize,
self->width - ob_rr_theme->paddingx - 1, 0);
+ XMoveResizeWindow(ob_display, self->leftresize,
+ -(ob_rr_theme->fbwidth * 2) - 1,
+ 0,
+ 1,
+ self->client->area.height +
+ self->cbwidth_y * 2);
+ XMoveResizeWindow(ob_display, self->rightresize,
+ self->client->area.width +
+ self->cbwidth_x * 2,
+ 0,
+ 1,
+ self->client->area.height +
+ self->cbwidth_y * 2);
+
XMapWindow(ob_display, self->topresize);
XMapWindow(ob_display, self->tltresize);
XMapWindow(ob_display, self->tllresize);
XMapWindow(ob_display, self->trtresize);
XMapWindow(ob_display, self->trrresize);
+ XMapWindow(ob_display, self->leftresize);
+ XMapWindow(ob_display, self->rightresize);
} else {
XUnmapWindow(ob_display, self->topresize);
XUnmapWindow(ob_display, self->tltresize);
XUnmapWindow(ob_display, self->tllresize);
XUnmapWindow(ob_display, self->trtresize);
XUnmapWindow(ob_display, self->trrresize);
+ XUnmapWindow(ob_display, self->leftresize);
+ XUnmapWindow(ob_display, self->rightresize);
}
} else
XUnmapWindow(ob_display, self->title);
layout_title(self);
if (!fake) {
- if (self->decorations & OB_FRAME_DECOR_HANDLE &&
- ob_rr_theme->handle_height > 0)
+ if (self->decorations & OB_FRAME_DECOR_HANDLE)
{
+ gint handle_height;
+
+ if (ob_rr_theme->handle_height > 0)
+ handle_height = ob_rr_theme->handle_height;
+ else
+ handle_height = 1;
+
XMoveResizeWindow(ob_display, self->handle,
-self->bwidth, FRAME_HANDLE_Y(self),
- self->width, ob_rr_theme->handle_height);
+ self->width, handle_height);
XMapWindow(ob_display, self->handle);
if (self->decorations & OB_FRAME_DECOR_GRIPS) {
{
/* reparent the client to the frame */
XReparentWindow(ob_display, self->client->window, self->plate, 0, 0);
+
/*
When reparenting the client window, it is usually not mapped yet, since
this occurs from a MapRequest. However, in the case where Openbox is
g_hash_table_insert(window_map, &self->tllresize, self->client);
g_hash_table_insert(window_map, &self->trtresize, self->client);
g_hash_table_insert(window_map, &self->trrresize, self->client);
+ g_hash_table_insert(window_map, &self->leftresize, self->client);
+ g_hash_table_insert(window_map, &self->rightresize, self->client);
}
void frame_release_client(ObFrame *self)
g_hash_table_remove(window_map, &self->tllresize);
g_hash_table_remove(window_map, &self->trtresize);
g_hash_table_remove(window_map, &self->trrresize);
+ g_hash_table_remove(window_map, &self->leftresize);
+ g_hash_table_remove(window_map, &self->rightresize);
ob_main_loop_timeout_remove_data(ob_main_loop, flash_timeout, self, TRUE);
}
{
if (!g_ascii_strcasecmp("Desktop", name))
return OB_FRAME_CONTEXT_DESKTOP;
+ else if (!g_ascii_strcasecmp("Root", name))
+ return OB_FRAME_CONTEXT_ROOT;
else if (!g_ascii_strcasecmp("Client", name))
return OB_FRAME_CONTEXT_CLIENT;
else if (!g_ascii_strcasecmp("Titlebar", name))
return OB_FRAME_CONTEXT_BOTTOM;
else if (!g_ascii_strcasecmp("Bottom", name))
return OB_FRAME_CONTEXT_BOTTOM;
+ else if (!g_ascii_strcasecmp("Left", name))
+ return OB_FRAME_CONTEXT_LEFT;
+ else if (!g_ascii_strcasecmp("Right", name))
+ return OB_FRAME_CONTEXT_RIGHT;
else if (!g_ascii_strcasecmp("Maximize", name))
return OB_FRAME_CONTEXT_MAXIMIZE;
else if (!g_ascii_strcasecmp("AllDesktops", name))
return OB_FRAME_CONTEXT_MOVE_RESIZE;
if (win == RootWindow(ob_display, ob_screen))
- return OB_FRAME_CONTEXT_DESKTOP;
+ return OB_FRAME_CONTEXT_ROOT ;
if (client == NULL) return OB_FRAME_CONTEXT_NONE;
if (win == client->window) {
/* conceptually, this is the desktop, as far as users are
if (win == self->tllresize) return OB_FRAME_CONTEXT_TLCORNER;
if (win == self->trtresize) return OB_FRAME_CONTEXT_TRCORNER;
if (win == self->trrresize) return OB_FRAME_CONTEXT_TRCORNER;
+ if (win == self->leftresize) return OB_FRAME_CONTEXT_LEFT;
+ if (win == self->rightresize) return OB_FRAME_CONTEXT_RIGHT;
if (win == self->max) return OB_FRAME_CONTEXT_MAXIMIZE;
if (win == self->iconify) return OB_FRAME_CONTEXT_ICONIFY;
if (win == self->close) return OB_FRAME_CONTEXT_CLOSE;
static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS];
ObFrameContext mouse_button_frame_context(ObFrameContext context,
- guint button)
+ guint button,
+ guint state)
{
GSList *it;
ObFrameContext x = context;
for (it = bound_contexts[context]; it; it = g_slist_next(it)) {
ObMouseBinding *b = it->data;
- if (b->button == button)
+ if (b->button == button && b->state == state)
return context;
}
case OB_FRAME_CONTEXT_TITLEBAR:
case OB_FRAME_CONTEXT_FRAME:
case OB_FRAME_CONTEXT_MOVE_RESIZE:
+ case OB_FRAME_CONTEXT_LEFT:
+ case OB_FRAME_CONTEXT_RIGHT:
+ break;
+ case OB_FRAME_CONTEXT_ROOT:
+ x = OB_FRAME_CONTEXT_DESKTOP;
break;
case OB_FRAME_CONTEXT_BOTTOM:
case OB_FRAME_CONTEXT_BLCORNER:
g_assert_not_reached();
}
- return x;
+ /* allow for multiple levels of fall-through */
+ if (x != context)
+ return mouse_button_frame_context(x, button, state);
+ else
+ return x;
}
void mouse_grab_for_client(ObClient *client, gboolean grab)
case ButtonPress:
context = frame_context(client, e->xbutton.window,
e->xbutton.x, e->xbutton.y);
- context = mouse_button_frame_context(context, e->xbutton.button);
+ context = mouse_button_frame_context(context, e->xbutton.button,
+ e->xbutton.state);
px = e->xbutton.x_root;
py = e->xbutton.y_root;
case ButtonRelease:
/* use where the press occured in the window */
context = frame_context(client, e->xbutton.window, pwx, pwy);
- context = mouse_button_frame_context(context, e->xbutton.button);
+ context = mouse_button_frame_context(context, e->xbutton.button,
+ e->xbutton.state);
if (e->xbutton.button == button)
pwx = pwy = -1;
case MotionNotify:
if (button) {
context = frame_context(client, e->xmotion.window, pwx, pwy);
- context = mouse_button_frame_context(context, button);
+ context = mouse_button_frame_context(context, button, state);
if (ABS(e->xmotion.x_root - px) >= config_mouse_threshold ||
ABS(e->xmotion.y_root - py) >= config_mouse_threshold) {