void mb_wm_decor_button_move_to (MBWMDecorButton *button, int x, int y) { /* FIXME: set a sync flag so it know X movewindow is needed */ button->geom.x = x; button->geom.y = y; MBWM_DBG ("####### moving to %i, %i\n", button->geom.x, button->geom.y); }
static void mb_wm_decor_calc_geometry (MBWMDecor *decor) { MBWindowManager *wm; MBWindowManagerClient *client; int n, s, w, e; if (decor->parent_client == NULL) return; client = decor->parent_client; wm = client->wmref; mb_wm_theme_get_decor_dimensions (wm->theme, client, &n, &s, &w, &e); switch (decor->type) { case MBWMDecorTypeNorth: decor->geom.x = 0; decor->geom.y = 0; decor->geom.height = n; decor->geom.width = client->frame_geometry.width; break; case MBWMDecorTypeSouth: decor->geom.x = 0; decor->geom.y = client->window->geometry.height + n; decor->geom.height = s; decor->geom.width = client->frame_geometry.width; break; case MBWMDecorTypeWest: decor->geom.x = 0; decor->geom.y = n; decor->geom.height = client->window->geometry.height; decor->geom.width = w; break; case MBWMDecorTypeEast: decor->geom.x = client->window->geometry.width + w; decor->geom.y = n; decor->geom.height = client->window->geometry.height; decor->geom.width = e; break; default: /* FIXME: some kind of callback for custom types here ? */ break; } MBWM_DBG("geom is +%i+%i %ix%i, Type %i", decor->geom.x, decor->geom.y, decor->geom.width, decor->geom.height, decor->type); return; }
static void mb_wm_client_app_class_init (MBWMObjectClass *klass) { MBWindowManagerClientClass *client; MBWMClientAppClass * client_app; MBWM_MARK(); client = (MBWindowManagerClientClass *)klass; client_app = (MBWMClientAppClass *)klass; MBWM_DBG("client->stack is %p", client->stack); client->client_type = MBWMClientTypeApp; client->geometry = mb_wm_client_app_request_geometry; client->theme_change = mb_wm_client_app_theme_change; client->stacking_layer = mb_wm_client_app_stacking_layer; #if MBWM_WANT_DEBUG klass->klass_name = "MBWMClientApp"; #endif }
static Bool mb_wm_decor_sync_window (MBWMDecor *decor) { MBWindowManager *wm; XSetWindowAttributes attr; if (decor->parent_client == NULL) return False; wm = decor->parent_client->wmref; if (decor->xwin == None) { if (!decor->geom.width || !decor->geom.height) /* Don't bother creating 1-dimension windows, X would reject it * anyway, but we wouldn't notice the error. */ return False; attr.override_redirect = True; /*attr.background_pixel = WhitePixel(wm->xdpy, wm->xscreen);*/ attr.background_pixmap = None; attr.event_mask = ButtonPressMask|ButtonReleaseMask|ButtonMotionMask; XSync(wm->xdpy, False); mb_wm_util_trap_x_errors(); decor->xwin = XCreateWindow(wm->xdpy, wm->root_win->xwindow, decor->geom.x, decor->geom.y, decor->geom.width, decor->geom.height, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect/*|CWBackPixel*/|CWEventMask, &attr); mb_wm_rename_window (wm, decor->xwin, "decor"); MBWM_DBG("g is +%i+%i %ix%i", decor->geom.x, decor->geom.y, decor->geom.width, decor->geom.height); if (mb_wm_util_untrap_x_errors()) return False; mb_wm_decor_resize(decor); mb_wm_util_list_foreach(decor->buttons, (MBWMListForEachCB)mb_wm_decor_button_sync_window, NULL); /* * If this is a decor with buttons, then we install button press handler * so we can drag the window, if it is movable. */ if (decor->type == MBWMDecorTypeNorth && decor->parent_client->layout_hints & LayoutPrefMovable) { /* g_debug ("%s: add ButtonPress handler for %lx", __FUNCTION__, decor->xwin); */ decor->press_cb_id = mb_wm_main_context_x_event_handler_add (wm->main_ctx, decor->xwin, ButtonPress, (MBWMXEventFunc)mb_wm_decor_press_handler, decor); } return mb_wm_decor_reparent (decor); } else { /* Resize */ mb_wm_util_async_trap_x_errors_warn(wm->xdpy, "XMoveResizeWindow"); XMoveResizeWindow(wm->xdpy, decor->xwin, decor->geom.x, decor->geom.y, decor->geom.width, decor->geom.height); mb_wm_util_async_untrap_x_errors(); /* Next up sort buttons */ mb_wm_util_list_foreach(decor->buttons, (MBWMListForEachCB)mb_wm_decor_button_sync_window, NULL); } return True; }