diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-04-13 07:18:28 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-04-13 07:18:28 +0000 |
| commit | 5cf61ee02354c1c9f80c11f3796afc4b948055d6 (patch) | |
| tree | 5530ecca55e11cc74e57db07d750447c7107f8ed /engines/openbox/obengine.c | |
| parent | fb1696659672386bcfc0f753b67f9eeda74e93b9 (diff) | |
move the openbox engine into librender and the kernel. the theme is loaded and stored inside librender. the frame is decorated and managed inside the kernel.
Diffstat (limited to 'engines/openbox/obengine.c')
| -rw-r--r-- | engines/openbox/obengine.c | 873 |
1 files changed, 0 insertions, 873 deletions
diff --git a/engines/openbox/obengine.c b/engines/openbox/obengine.c deleted file mode 100644 index 75396c8a..00000000 --- a/engines/openbox/obengine.c +++ /dev/null @@ -1,873 +0,0 @@ -#include "obtheme.h" -#include "obrender.h" -#include "obengine.h" -#include "kernel/openbox.h" -#include "kernel/extensions.h" -#include "kernel/dispatch.h" -#include "kernel/config.h" - -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -# include <sys/types.h> -#endif -#include <X11/Xlib.h> -#include <glib.h> - -#define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask) -#define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ - ButtonPressMask | ButtonReleaseMask) -#define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \ - ButtonMotionMask | ExposureMask) - -/* style settings - geometry */ -int ob_s_bevel; -int ob_s_handle_height; -int ob_s_bwidth; -int ob_s_cbwidth; -/* style settings - colors */ -color_rgb *ob_s_b_color; -color_rgb *ob_s_cb_focused_color; -color_rgb *ob_s_cb_unfocused_color; -color_rgb *ob_s_title_focused_color; -color_rgb *ob_s_title_unfocused_color; -color_rgb *ob_s_titlebut_focused_color; -color_rgb *ob_s_titlebut_unfocused_color; -/* style settings - fonts */ -int ob_s_winfont_height; -ObFont *ob_s_winfont; -/* style settings - masks */ -pixmap_mask *ob_s_max_set_mask; -pixmap_mask *ob_s_max_unset_mask; -pixmap_mask *ob_s_iconify_mask; -pixmap_mask *ob_s_desk_set_mask; -pixmap_mask *ob_s_desk_unset_mask; -pixmap_mask *ob_s_shade_set_mask; -pixmap_mask *ob_s_shade_unset_mask; -pixmap_mask *ob_s_close_mask; - -/* global appearances */ -Appearance *ob_a_focused_unpressed_max; -Appearance *ob_a_focused_pressed_max; -Appearance *ob_a_focused_pressed_set_max; -Appearance *ob_a_unfocused_unpressed_max; -Appearance *ob_a_unfocused_pressed_max; -Appearance *ob_a_unfocused_pressed_set_max; -Appearance *ob_a_focused_unpressed_close; -Appearance *ob_a_focused_pressed_close; -Appearance *ob_a_unfocused_unpressed_close; -Appearance *ob_a_unfocused_pressed_close; -Appearance *ob_a_focused_unpressed_desk; -Appearance *ob_a_focused_pressed_desk; -Appearance *ob_a_focused_pressed_set_desk; -Appearance *ob_a_unfocused_unpressed_desk; -Appearance *ob_a_unfocused_pressed_desk; -Appearance *ob_a_unfocused_pressed_set_desk; -Appearance *ob_a_focused_unpressed_shade; -Appearance *ob_a_focused_pressed_shade; -Appearance *ob_a_focused_pressed_set_shade; -Appearance *ob_a_unfocused_unpressed_shade; -Appearance *ob_a_unfocused_pressed_shade; -Appearance *ob_a_unfocused_pressed_set_shade; -Appearance *ob_a_focused_unpressed_iconify; -Appearance *ob_a_focused_pressed_iconify; -Appearance *ob_a_unfocused_unpressed_iconify; -Appearance *ob_a_unfocused_pressed_iconify; -Appearance *ob_a_focused_grip; -Appearance *ob_a_unfocused_grip; -Appearance *ob_a_focused_title; -Appearance *ob_a_unfocused_title; -Appearance *ob_a_focused_label; -Appearance *ob_a_unfocused_label; -Appearance *ob_a_icon; /* always parentrelative, so no focused/unfocused */ -Appearance *ob_a_focused_handle; -Appearance *ob_a_unfocused_handle; - -Appearance *ob_app_hilite_label; -Appearance *ob_app_unhilite_label; - -static void layout_title(ObFrame *self); -static void mouse_event(const ObEvent *e, ObFrame *self); - -gboolean startup() -{ - char *path; - - /* create the ~/.openbox/themes/openbox dir */ - path = g_build_filename(g_get_home_dir(), ".openbox", "themes", "openbox", - NULL); - mkdir(path, (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | - S_IROTH | S_IWOTH | S_IXOTH)); - g_free(path); - - ob_s_b_color = ob_s_cb_unfocused_color = ob_s_cb_focused_color = - ob_s_title_unfocused_color = ob_s_title_focused_color = - ob_s_titlebut_unfocused_color = ob_s_titlebut_focused_color = NULL; - ob_s_winfont = NULL; - ob_s_max_set_mask = ob_s_max_unset_mask = NULL; - ob_s_desk_set_mask = ob_s_desk_unset_mask = NULL; - ob_s_shade_set_mask = ob_s_shade_unset_mask = NULL; - ob_s_iconify_mask = ob_s_close_mask = NULL; - - ob_a_focused_unpressed_max = appearance_new(Surface_Planar, 1); - ob_a_focused_pressed_max = appearance_new(Surface_Planar, 1); - ob_a_focused_pressed_set_max = appearance_new(Surface_Planar, 1); - ob_a_unfocused_unpressed_max = appearance_new(Surface_Planar, 1); - ob_a_unfocused_pressed_max = appearance_new(Surface_Planar, 1); - ob_a_unfocused_pressed_set_max = appearance_new(Surface_Planar, 1); - ob_a_focused_unpressed_close = NULL; - ob_a_focused_pressed_close = NULL; - ob_a_unfocused_unpressed_close = NULL; - ob_a_unfocused_pressed_close = NULL; - ob_a_focused_unpressed_desk = NULL; - ob_a_focused_pressed_desk = NULL; - ob_a_focused_pressed_set_desk = NULL; - ob_a_unfocused_unpressed_desk = NULL; - ob_a_unfocused_pressed_desk = NULL; - ob_a_unfocused_pressed_set_desk = NULL; - ob_a_focused_unpressed_shade = NULL; - ob_a_focused_pressed_shade = NULL; - ob_a_focused_pressed_set_shade = NULL; - ob_a_unfocused_unpressed_shade = NULL; - ob_a_unfocused_pressed_shade = NULL; - ob_a_unfocused_pressed_set_shade = NULL; - ob_a_focused_unpressed_iconify = NULL; - ob_a_focused_pressed_iconify = NULL; - ob_a_unfocused_unpressed_iconify = NULL; - ob_a_unfocused_pressed_iconify = NULL; - ob_a_focused_grip = appearance_new(Surface_Planar, 0); - ob_a_unfocused_grip = appearance_new(Surface_Planar, 0); - ob_a_focused_title = appearance_new(Surface_Planar, 0); - ob_a_unfocused_title = appearance_new(Surface_Planar, 0); - ob_a_focused_label = appearance_new(Surface_Planar, 1); - ob_a_unfocused_label = appearance_new(Surface_Planar, 1); - ob_a_icon = appearance_new(Surface_Planar, 1); - ob_a_focused_handle = appearance_new(Surface_Planar, 0); - ob_a_unfocused_handle = appearance_new(Surface_Planar, 0); - ob_app_hilite_label = appearance_new(Surface_Planar, 1); - ob_app_unhilite_label = appearance_new(Surface_Planar, 1); - - if (obtheme_load()) { - RECT_SET(ob_a_focused_pressed_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_set_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_unpressed_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_set_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_desk->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_set_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_unpressed_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_set_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_shade->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_iconify->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_unpressed_iconify->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_iconify->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_iconify->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_iconify->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_set_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_unpressed_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_set_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_max->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_pressed_close->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_focused_unpressed_close->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_pressed_close->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - RECT_SET(ob_a_unfocused_unpressed_close->area, 0, 0, - BUTTON_SIZE, BUTTON_SIZE); - - RECT_SET(ob_a_focused_grip->area, 0, 0, - GRIP_WIDTH, ob_s_handle_height); - RECT_SET(ob_a_unfocused_grip->area, 0, 0, - GRIP_WIDTH, ob_s_handle_height); - return TRUE; - } else - return FALSE; -} - -void shutdown() -{ - if (ob_s_b_color != NULL) color_free(ob_s_b_color); - if (ob_s_cb_unfocused_color != NULL) color_free(ob_s_cb_unfocused_color); - if (ob_s_cb_focused_color != NULL) color_free(ob_s_cb_focused_color); - if (ob_s_title_unfocused_color != NULL) color_free(ob_s_title_unfocused_color); - if (ob_s_title_focused_color != NULL) color_free(ob_s_title_focused_color); - if (ob_s_titlebut_unfocused_color != NULL) - color_free(ob_s_titlebut_unfocused_color); - if (ob_s_titlebut_focused_color != NULL) - color_free(ob_s_titlebut_focused_color); - - if (ob_s_max_set_mask != NULL) - pixmap_mask_free(ob_s_max_set_mask); - if (ob_s_max_unset_mask != NULL) - pixmap_mask_free(ob_s_max_unset_mask); - if (ob_s_desk_set_mask != NULL) - pixmap_mask_free(ob_s_desk_set_mask); - if (ob_s_desk_unset_mask != NULL) - pixmap_mask_free(ob_s_desk_unset_mask); - if (ob_s_shade_set_mask != NULL) - pixmap_mask_free(ob_s_shade_set_mask); - if (ob_s_shade_unset_mask != NULL) - pixmap_mask_free(ob_s_shade_unset_mask); - if (ob_s_iconify_mask != NULL) - pixmap_mask_free(ob_s_iconify_mask); - if (ob_s_close_mask != NULL) - pixmap_mask_free(ob_s_close_mask); - - if (ob_s_winfont != NULL) font_close(ob_s_winfont); - - appearance_free(ob_a_focused_unpressed_max); - appearance_free(ob_a_focused_pressed_max); - appearance_free(ob_a_focused_pressed_set_max); - appearance_free(ob_a_unfocused_unpressed_max); - appearance_free(ob_a_unfocused_pressed_max); - appearance_free(ob_a_unfocused_pressed_set_max); - if (ob_a_focused_unpressed_close != NULL) - appearance_free(ob_a_focused_unpressed_close); - if (ob_a_focused_pressed_close != NULL) - appearance_free(ob_a_focused_pressed_close); - if (ob_a_unfocused_unpressed_close != NULL) - appearance_free(ob_a_unfocused_unpressed_close); - if (ob_a_unfocused_pressed_close != NULL) - appearance_free(ob_a_unfocused_pressed_close); - if (ob_a_focused_unpressed_desk != NULL) - appearance_free(ob_a_focused_unpressed_desk); - if (ob_a_focused_pressed_desk != NULL) - appearance_free(ob_a_focused_pressed_desk); - if (ob_a_unfocused_unpressed_desk != NULL) - appearance_free(ob_a_unfocused_unpressed_desk); - if (ob_a_unfocused_pressed_desk != NULL) - appearance_free(ob_a_unfocused_pressed_desk); - if (ob_a_focused_unpressed_shade != NULL) - appearance_free(ob_a_focused_unpressed_shade); - if (ob_a_focused_pressed_shade != NULL) - appearance_free(ob_a_focused_pressed_shade); - if (ob_a_unfocused_unpressed_shade != NULL) - appearance_free(ob_a_unfocused_unpressed_shade); - if (ob_a_unfocused_pressed_shade != NULL) - appearance_free(ob_a_unfocused_pressed_shade); - if (ob_a_focused_unpressed_iconify != NULL) - appearance_free(ob_a_focused_unpressed_iconify); - if (ob_a_focused_pressed_iconify != NULL) - appearance_free(ob_a_focused_pressed_iconify); - if (ob_a_unfocused_unpressed_iconify != NULL) - appearance_free(ob_a_unfocused_unpressed_iconify); - if (ob_a_unfocused_pressed_iconify != NULL) - appearance_free(ob_a_unfocused_pressed_iconify); - appearance_free(ob_a_focused_grip); - appearance_free(ob_a_unfocused_grip); - appearance_free(ob_a_focused_title); - appearance_free(ob_a_unfocused_title); - appearance_free(ob_a_focused_label); - appearance_free(ob_a_unfocused_label); - appearance_free(ob_a_icon); - appearance_free(ob_a_focused_handle); - appearance_free(ob_a_unfocused_handle); - appearance_free(ob_app_hilite_label); - appearance_free(ob_app_unhilite_label); -} - -static Window createWindow(Window parent, unsigned long mask, - XSetWindowAttributes *attrib) -{ - return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0, - render_depth, InputOutput, render_visual, - mask, attrib); - -} - -Frame *frame_new() -{ - XSetWindowAttributes attrib; - unsigned long mask; - ObFrame *self; - - self = g_new(ObFrame, 1); - - self->frame.visible = FALSE; - - /* create all of the decor windows */ - mask = CWOverrideRedirect | CWEventMask; - attrib.event_mask = FRAME_EVENTMASK; - attrib.override_redirect = TRUE; - self->frame.window = createWindow(ob_root, mask, &attrib); - - mask = 0; - self->frame.plate = createWindow(self->frame.window, mask, &attrib); - - mask = CWEventMask; - attrib.event_mask = ELEMENT_EVENTMASK; - self->title = createWindow(self->frame.window, mask, &attrib); - self->label = createWindow(self->title, mask, &attrib); - self->max = createWindow(self->title, mask, &attrib); - self->close = createWindow(self->title, mask, &attrib); - self->desk = createWindow(self->title, mask, &attrib); - self->shade = createWindow(self->title, mask, &attrib); - self->icon = createWindow(self->title, mask, &attrib); - self->iconify = createWindow(self->title, mask, &attrib); - self->handle = createWindow(self->frame.window, mask, &attrib); - mask |= CWCursor; - attrib.cursor = ob_cursors.ll_angle; - self->lgrip = createWindow(self->handle, mask, &attrib); - attrib.cursor = ob_cursors.lr_angle; - self->rgrip = createWindow(self->handle, mask, &attrib); - - /* the other stuff is shown based on decor settings */ - XMapWindow(ob_display, self->frame.plate); - XMapWindow(ob_display, self->lgrip); - XMapWindow(ob_display, self->rgrip); - XMapWindow(ob_display, self->label); - - /* set colors/appearance/sizes for stuff that doesn't change */ - XSetWindowBorder(ob_display, self->frame.window, ob_s_b_color->pixel); - XSetWindowBorder(ob_display, self->label, ob_s_b_color->pixel); - XSetWindowBorder(ob_display, self->rgrip, ob_s_b_color->pixel); - XSetWindowBorder(ob_display, self->lgrip, ob_s_b_color->pixel); - - XResizeWindow(ob_display, self->max, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->iconify, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->icon, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->close, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->desk, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->shade, BUTTON_SIZE, BUTTON_SIZE); - XResizeWindow(ob_display, self->lgrip, GRIP_WIDTH, ob_s_handle_height); - XResizeWindow(ob_display, self->rgrip, GRIP_WIDTH, ob_s_handle_height); - - /* set up the dynamic appearances */ - self->a_unfocused_title = appearance_copy(ob_a_unfocused_title); - self->a_focused_title = appearance_copy(ob_a_focused_title); - self->a_unfocused_label = appearance_copy(ob_a_unfocused_label); - self->a_focused_label = appearance_copy(ob_a_focused_label); - self->a_unfocused_handle = appearance_copy(ob_a_unfocused_handle); - self->a_focused_handle = appearance_copy(ob_a_focused_handle); - self->a_icon = appearance_copy(ob_a_icon); - - self->max_press = self->close_press = self->desk_press = - self->iconify_press = self->shade_press = FALSE; - - dispatch_register(Event_X_ButtonPress | Event_X_ButtonRelease, - (EventHandler)mouse_event, self); - - return (Frame*)self; -} - -static void frame_free(ObFrame *self) -{ - appearance_free(self->a_unfocused_title); - appearance_free(self->a_focused_title); - appearance_free(self->a_unfocused_label); - appearance_free(self->a_focused_label); - appearance_free(self->a_unfocused_handle); - appearance_free(self->a_focused_handle); - appearance_free(self->a_icon); - - XDestroyWindow(ob_display, self->frame.window); - - dispatch_register(0, (EventHandler)mouse_event, self); - - g_free(self); -} - -void frame_show(ObFrame *self) -{ - if (!self->frame.visible) { - self->frame.visible = TRUE; - XMapWindow(ob_display, self->frame.window); - } -} - -void frame_hide(ObFrame *self) -{ - if (self->frame.visible) { - self->frame.visible = FALSE; - self->frame.client->ignore_unmaps++; - XUnmapWindow(ob_display, self->frame.window); - } -} - -void frame_adjust_shape(ObFrame *self) -{ -#ifdef SHAPE - int num; - XRectangle xrect[2]; - - if (!self->frame.client->shaped) { - /* clear the shape on the frame window */ - XShapeCombineMask(ob_display, self->frame.window, ShapeBounding, - self->innersize.left, - self->innersize.top, - None, ShapeSet); - } else { - /* make the frame's shape match the clients */ - XShapeCombineShape(ob_display, self->frame.window, ShapeBounding, - self->innersize.left, - self->innersize.top, - self->frame.client->window, - ShapeBounding, ShapeSet); - - num = 0; - if (self->frame.client->decorations & Decor_Titlebar) { - xrect[0].x = -ob_s_bevel; - xrect[0].y = -ob_s_bevel; - xrect[0].width = self->width + self->bwidth * 2; - xrect[0].height = TITLE_HEIGHT + - self->bwidth * 2; - ++num; - } - - if (self->frame.client->decorations & Decor_Handle) { - xrect[1].x = -ob_s_bevel; - xrect[1].y = HANDLE_Y(self); - xrect[1].width = self->width + self->bwidth * 2; - xrect[1].height = ob_s_handle_height + - self->bwidth * 2; - ++num; - } - - XShapeCombineRectangles(ob_display, self->frame.window, - ShapeBounding, 0, 0, xrect, num, - ShapeUnion, Unsorted); - } -#endif -} - -void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized) -{ - if (resized) { - if (self->frame.client->decorations & Decor_Border) { - self->bwidth = ob_s_bwidth; - self->cbwidth = ob_s_cbwidth; - } else { - self->bwidth = self->cbwidth = 0; - } - STRUT_SET(self->innersize, self->cbwidth, self->cbwidth, - self->cbwidth, self->cbwidth); - self->width = self->frame.client->area.width + self->cbwidth * 2; - g_assert(self->width > 0); - - /* set border widths */ - XSetWindowBorderWidth(ob_display, self->frame.plate, self->cbwidth); - XSetWindowBorderWidth(ob_display, self->frame.window, self->bwidth); - XSetWindowBorderWidth(ob_display, self->title, self->bwidth); - XSetWindowBorderWidth(ob_display, self->handle, self->bwidth); - XSetWindowBorderWidth(ob_display, self->lgrip, self->bwidth); - XSetWindowBorderWidth(ob_display, self->rgrip, self->bwidth); - - /* position/size and map/unmap all the windows */ - - /* they all default off, they're turned on in layout_title */ - self->icon_x = -1; - self->desk_x = -1; - self->shade_x = -1; - self->iconify_x = -1; - self->label_x = -1; - self->max_x = -1; - self->close_x = -1; - - if (self->frame.client->decorations & Decor_Titlebar) { - XMoveResizeWindow(ob_display, self->title, - -self->bwidth, -self->bwidth, - self->width, TITLE_HEIGHT); - self->innersize.top += TITLE_HEIGHT + self->bwidth; - XMapWindow(ob_display, self->title); - - RECT_SET(self->a_focused_title->area, 0, 0, - self->width, TITLE_HEIGHT); - RECT_SET(self->a_unfocused_title->area, 0, 0, - self->width, TITLE_HEIGHT); - - /* layout the title bar elements */ - layout_title(self); - } else - XUnmapWindow(ob_display, self->title); - - if (self->frame.client->decorations & Decor_Handle) { - XMoveResizeWindow(ob_display, self->handle, - -self->bwidth, HANDLE_Y(self), - self->width, ob_s_handle_height); - XMoveWindow(ob_display, self->lgrip, - -self->bwidth, -self->bwidth); - XMoveWindow(ob_display, self->rgrip, - -self->bwidth + self->width - - GRIP_WIDTH, -self->bwidth); - self->innersize.bottom += ob_s_handle_height + - self->bwidth; - XMapWindow(ob_display, self->handle); - - if (ob_a_focused_grip->surface.data.planar.grad == - Background_ParentRelative) - RECT_SET(self->a_focused_handle->area, 0, 0, - self->width, ob_s_handle_height); - else - RECT_SET(self->a_focused_handle->area, - GRIP_WIDTH + self->bwidth, 0, - self->width - (GRIP_WIDTH + self->bwidth) * 2, - ob_s_handle_height); - if (ob_a_unfocused_grip->surface.data.planar.grad == - Background_ParentRelative) - RECT_SET(self->a_unfocused_handle->area, 0, 0, - self->width, ob_s_handle_height); - else - RECT_SET(self->a_unfocused_handle->area, - GRIP_WIDTH + self->bwidth, 0, - self->width - (GRIP_WIDTH + self->bwidth) * 2, - ob_s_handle_height); - - } else - XUnmapWindow(ob_display, self->handle); - } - - if (resized) { - /* move and resize the plate */ - XMoveResizeWindow(ob_display, self->frame.plate, - self->innersize.left - self->cbwidth, - self->innersize.top - self->cbwidth, - self->frame.client->area.width, - self->frame.client->area.height); - /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->frame.client->window, 0, 0); - } - - if (resized) { - STRUT_SET(self->frame.size, - self->innersize.left + self->bwidth, - self->innersize.top + self->bwidth, - self->innersize.right + self->bwidth, - self->innersize.bottom + self->bwidth); - } - - /* shading can change without being moved or resized */ - RECT_SET_SIZE(self->frame.area, - self->frame.client->area.width + - self->frame.size.left + self->frame.size.right, - (self->frame.client->shaded ? TITLE_HEIGHT + self->bwidth*2: - self->frame.client->area.height + - self->frame.size.top + self->frame.size.bottom)); - - if (moved) { - /* find the new coordinates, done after setting the frame.size, for - frame_client_gravity. */ - self->frame.area.x = self->frame.client->area.x; - self->frame.area.y = self->frame.client->area.y; - frame_client_gravity((Frame*)self, - &self->frame.area.x, &self->frame.area.y); - } - - /* move and resize the top level frame. - shading can change without being moved or resized */ - XMoveResizeWindow(ob_display, self->frame.window, - self->frame.area.x, self->frame.area.y, - self->width, - self->frame.area.height - self->bwidth * 2); - - if (resized) { - obrender_frame(self); - - frame_adjust_shape(self); - } -} - -void frame_adjust_state(ObFrame *self) -{ - obrender_frame(self); -} - -void frame_adjust_focus(ObFrame *self) -{ - obrender_frame(self); -} - -void frame_adjust_title(ObFrame *self) -{ - obrender_frame(self); -} - -void frame_adjust_icon(ObFrame *self) -{ - obrender_frame(self); -} - -void frame_grab_client(ObFrame *self, Client *client) -{ - self->frame.client = client; - - /* reparent the client to the frame */ - XReparentWindow(ob_display, client->window, self->frame.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 - starting up, the window is already mapped, so we'll see unmap events for - it. There are 2 unmap events generated that we see, one with the 'event' - member set the root window, and one set to the client, but both get - handled and need to be ignored. - */ - if (ob_state == State_Starting) - client->ignore_unmaps += 2; - - /* select the event mask on the client's parent (to receive config/map - req's) the ButtonPress is to catch clicks on the client border */ - XSelectInput(ob_display, self->frame.plate, PLATE_EVENTMASK); - - /* map the client so it maps when the frame does */ - XMapWindow(ob_display, client->window); - - frame_adjust_area(self, TRUE, TRUE); - - /* set all the windows for the frame in the client_map */ - g_hash_table_insert(client_map, &self->frame.window, client); - g_hash_table_insert(client_map, &self->frame.plate, client); - g_hash_table_insert(client_map, &self->title, client); - g_hash_table_insert(client_map, &self->label, client); - g_hash_table_insert(client_map, &self->max, client); - g_hash_table_insert(client_map, &self->close, client); - g_hash_table_insert(client_map, &self->desk, client); - g_hash_table_insert(client_map, &self->shade, client); - g_hash_table_insert(client_map, &self->icon, client); - g_hash_table_insert(client_map, &self->iconify, client); - g_hash_table_insert(client_map, &self->handle, client); - g_hash_table_insert(client_map, &self->lgrip, client); - g_hash_table_insert(client_map, &self->rgrip, client); -} - -void frame_release_client(ObFrame *self, Client *client) -{ - XEvent ev; - - g_assert(self->frame.client == client); - - /* check if the app has already reparented its window away */ - if (XCheckTypedWindowEvent(ob_display, client->window, - ReparentNotify, &ev)) { - XPutBackEvent(ob_display, &ev); - /* re-map the window since the unmanaging process unmaps it */ - XMapWindow(ob_display, client->window); - } else { - /* according to the ICCCM - if the client doesn't reparent itself, - then we will reparent the window to root for them */ - XReparentWindow(ob_display, client->window, ob_root, - client->area.x, - client->area.y); - } - - /* remove all the windows for the frame from the client_map */ - g_hash_table_remove(client_map, &self->frame.window); - g_hash_table_remove(client_map, &self->frame.plate); - g_hash_table_remove(client_map, &self->title); - g_hash_table_remove(client_map, &self->label); - g_hash_table_remove(client_map, &self->max); - g_hash_table_remove(client_map, &self->close); - g_hash_table_remove(client_map, &self->desk); - g_hash_table_remove(client_map, &self->shade); - g_hash_table_remove(client_map, &self->icon); - g_hash_table_remove(client_map, &self->iconify); - g_hash_table_remove(client_map, &self->handle); - g_hash_table_remove(client_map, &self->lgrip); - g_hash_table_remove(client_map, &self->rgrip); - - frame_free(self); -} - -static void layout_title(ObFrame *self) -{ - char *lc; - int x; - gboolean n, d, i, l, m, c, s; - - n = d = i = l = m = c = s = FALSE; - - /* figure out whats being shown, and the width of the label */ - self->label_width = self->width - (ob_s_bevel + 1) * 2; - for (lc = config_engine_layout; *lc != '\0'; ++lc) { - switch (*lc) { - case 'N': - if (!(self->frame.client->decorations & Decor_Icon)) break; - if (n) { *lc = ' '; break; } /* rm duplicates */ - n = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'D': - if (!(self->frame.client->decorations & Decor_AllDesktops)) break; - if (d) { *lc = ' '; break; } /* rm duplicates */ - d = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'S': - if (!(self->frame.client->decorations & Decor_Shade)) break; - if (s) { *lc = ' '; break; } /* rm duplicates */ - s = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'I': - if (!(self->frame.client->decorations & Decor_Iconify)) break; - if (i) { *lc = ' '; break; } /* rm duplicates */ - i = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'L': - if (l) { *lc = ' '; break; } /* rm duplicates */ - l = TRUE; - break; - case 'M': - if (!(self->frame.client->decorations & Decor_Maximize)) break; - if (m) { *lc = ' '; break; } /* rm duplicates */ - m = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'C': - if (!(self->frame.client->decorations & Decor_Close)) break; - if (c) { *lc = ' '; break; } /* rm duplicates */ - c = TRUE; - self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; - break; - } - } - if (self->label_width < 1) self->label_width = 1; - - XResizeWindow(ob_display, self->label, self->label_width, - LABEL_HEIGHT); - - if (!n) XUnmapWindow(ob_display, self->icon); - if (!d) XUnmapWindow(ob_display, self->desk); - if (!s) XUnmapWindow(ob_display, self->shade); - if (!i) XUnmapWindow(ob_display, self->iconify); - if (!l) XUnmapWindow(ob_display, self->label); - if (!m) XUnmapWindow(ob_display, self->max); - if (!c) XUnmapWindow(ob_display, self->close); - - x = ob_s_bevel + 1; - for (lc = config_engine_layout; *lc != '\0'; ++lc) { - switch (*lc) { - case 'N': - if (!n) break; - self->icon_x = x; - RECT_SET(self->a_icon->area, 0, 0, BUTTON_SIZE, BUTTON_SIZE); - XMapWindow(ob_display, self->icon); - XMoveWindow(ob_display, self->icon, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'D': - if (!d) break; - self->desk_x = x; - XMapWindow(ob_display, self->desk); - XMoveWindow(ob_display, self->desk, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'S': - if (!s) break; - self->shade_x = x; - XMapWindow(ob_display, self->shade); - XMoveWindow(ob_display, self->shade, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'I': - if (!i) break; - self->iconify_x = x; - XMapWindow(ob_display, self->iconify); - XMoveWindow(ob_display, self->iconify, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'L': - if (!l) break; - self->label_x = x; - XMapWindow(ob_display, self->label); - XMoveWindow(ob_display, self->label, x, ob_s_bevel); - x += self->label_width + ob_s_bevel + 1; - break; - case 'M': - if (!m) break; - self->max_x = x; - XMapWindow(ob_display, self->max); - XMoveWindow(ob_display, self->max, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - case 'C': - if (!c) break; - self->close_x = x; - XMapWindow(ob_display, self->close); - XMoveWindow(ob_display, self->close, x, ob_s_bevel + 1); - x += BUTTON_SIZE + ob_s_bevel + 1; - break; - } - } - - RECT_SET(self->a_focused_label->area, 0, 0, - self->label_width, LABEL_HEIGHT); - RECT_SET(self->a_unfocused_label->area, 0, 0, - self->label_width, LABEL_HEIGHT); -} - -static void mouse_event(const ObEvent *e, ObFrame *self) -{ - Window win; - gboolean press = e->type == Event_X_ButtonPress; - - win = e->data.x.e->xbutton.window; - if (win == self->max) { - self->max_press = press; - obrender_frame(self); - } else if (win == self->close) { - self->close_press = press; - obrender_frame(self); - } else if (win == self->iconify) { - self->iconify_press = press; - obrender_frame(self); - } else if (win == self->desk) { - self->desk_press = press; - obrender_frame(self); - } else if (win == self->shade) { - self->shade_press = press; - obrender_frame(self); - } -} - -Context get_context(Client *client, Window win) -{ - ObFrame *self; - - if (win == ob_root) return Context_Root; - if (client == NULL) return Context_None; - if (win == client->window) return Context_Client; - - self = (ObFrame*) client->frame; - if (win == self->frame.window) return Context_Frame; - if (win == self->frame.plate) return Context_Client; - if (win == self->title) return Context_Titlebar; - if (win == self->label) return Context_Titlebar; - if (win == self->handle) return Context_Handle; - if (win == self->lgrip) return Context_BLCorner; - if (win == self->rgrip) return Context_BRCorner; - if (win == self->max) return Context_Maximize; - if (win == self->iconify) return Context_Iconify; - if (win == self->close) return Context_Close; - if (win == self->icon) return Context_Icon; - if (win == self->desk) return Context_AllDesktops; - if (win == self->shade) return Context_Shade; - - return Context_None; -} |
