mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-02 17:05:58 +01:00
basic window rounded corners
This commit is contained in:
parent
2313de589e
commit
27c06758e4
5 changed files with 68 additions and 8 deletions
|
@ -22,6 +22,8 @@ CConfigManager::CConfigManager() {
|
||||||
configValues["general:col.active_border"].intValue = 0xffffffff;
|
configValues["general:col.active_border"].intValue = 0xffffffff;
|
||||||
configValues["general:col.inactive_border"].intValue = 0xff444444;
|
configValues["general:col.inactive_border"].intValue = 0xff444444;
|
||||||
|
|
||||||
|
configValues["decoration:rounding"].intValue = 1;
|
||||||
|
|
||||||
configValues["dwindle:pseudotile"].intValue = 0;
|
configValues["dwindle:pseudotile"].intValue = 0;
|
||||||
|
|
||||||
configValues["animations:enabled"].intValue = 1;
|
configValues["animations:enabled"].intValue = 1;
|
||||||
|
|
|
@ -163,13 +163,13 @@ void CHyprOpenGLImpl::renderRect(wlr_box* box, const CColor& col) {
|
||||||
glDisableVertexAttribArray(m_shQUAD.posAttrib);
|
glDisableVertexAttribArray(m_shQUAD.posAttrib);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprOpenGLImpl::renderTexture(wlr_texture* tex,float matrix[9], float alpha) {
|
void CHyprOpenGLImpl::renderTexture(wlr_texture* tex,float matrix[9], float alpha, int round) {
|
||||||
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
|
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
|
||||||
|
|
||||||
renderTexture(CTexture(tex), matrix, alpha);
|
renderTexture(CTexture(tex), matrix, alpha, round);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float alpha) {
|
void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float alpha, int round) {
|
||||||
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
|
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
|
||||||
RASSERT((tex.m_iTexID > 0), "Attempted to draw NULL texture!");
|
RASSERT((tex.m_iTexID > 0), "Attempted to draw NULL texture!");
|
||||||
|
|
||||||
|
@ -210,6 +210,19 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float
|
||||||
glUniform1i(shader->tex, 0);
|
glUniform1i(shader->tex, 0);
|
||||||
glUniform1f(shader->alpha, alpha / 255.f);
|
glUniform1f(shader->alpha, alpha / 255.f);
|
||||||
|
|
||||||
|
// round is in px
|
||||||
|
// so we need to do some maf
|
||||||
|
|
||||||
|
const auto TOPLEFT = Vector2D(round, round);
|
||||||
|
const auto BOTTOMRIGHT = Vector2D(tex.m_vSize.x - round, tex.m_vSize.y - round);
|
||||||
|
const auto FULLSIZE = tex.m_vSize;
|
||||||
|
|
||||||
|
// Rounded corners
|
||||||
|
glUniform2f(glGetUniformLocation(shader->program, "topLeft"), (float)TOPLEFT.x, (float)TOPLEFT.y);
|
||||||
|
glUniform2f(glGetUniformLocation(shader->program, "bottomRight"), (float)BOTTOMRIGHT.x, (float)BOTTOMRIGHT.y);
|
||||||
|
glUniform2f(glGetUniformLocation(shader->program, "fullSize"), (float)FULLSIZE.x, (float)FULLSIZE.y);
|
||||||
|
glUniform1f(glGetUniformLocation(shader->program, "radius"), round);
|
||||||
|
|
||||||
glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
||||||
glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,8 @@ public:
|
||||||
void end();
|
void end();
|
||||||
|
|
||||||
void renderRect(wlr_box*, const CColor&);
|
void renderRect(wlr_box*, const CColor&);
|
||||||
void renderTexture(wlr_texture*, float matrix[9], float a);
|
void renderTexture(wlr_texture*, float matrix[9], float a, int round = 0);
|
||||||
void renderTexture(const CTexture&, float matrix[9], float a);
|
void renderTexture(const CTexture&, float matrix[9], float a, int round = 0);
|
||||||
|
|
||||||
void clear(const CColor&);
|
void clear(const CColor&);
|
||||||
void scissor(const wlr_box*);
|
void scissor(const wlr_box*);
|
||||||
|
|
|
@ -31,7 +31,7 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) {
|
||||||
float matrix[9];
|
float matrix[9];
|
||||||
wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, RDATA->output->transform_matrix);
|
wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, RDATA->output->transform_matrix);
|
||||||
|
|
||||||
g_pHyprOpenGL->renderTexture(TEXTURE, matrix, 255.f); // TODO: fadeinout
|
g_pHyprOpenGL->renderTexture(TEXTURE, matrix, 255.f, g_pConfigManager->getInt("decoration:rounding")); // TODO: fadeinout
|
||||||
|
|
||||||
wlr_surface_send_frame_done(surface, RDATA->when);
|
wlr_surface_send_frame_done(surface, RDATA->when);
|
||||||
|
|
||||||
|
@ -395,6 +395,10 @@ void CHyprRenderer::arrangeLayersForMonitor(const int& monitor) {
|
||||||
|
|
||||||
void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor) {
|
void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor) {
|
||||||
const auto BORDERSIZE = g_pConfigManager->getInt("general:border_size");
|
const auto BORDERSIZE = g_pConfigManager->getInt("general:border_size");
|
||||||
|
|
||||||
|
if (BORDERSIZE < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
const auto BORDERCOL = pWindow->m_cRealBorderColor;
|
const auto BORDERCOL = pWindow->m_cRealBorderColor;
|
||||||
|
|
||||||
Vector2D correctPos = pWindow->m_vRealPosition - pMonitor->vecPosition;
|
Vector2D correctPos = pWindow->m_vRealPosition - pMonitor->vecPosition;
|
||||||
|
|
|
@ -38,11 +38,52 @@ void main() {
|
||||||
|
|
||||||
inline const std::string TEXFRAGSRCRGBA = R"#(
|
inline const std::string TEXFRAGSRCRGBA = R"#(
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
varying vec2 v_texcoord;
|
varying vec2 v_texcoord; // is in 0-1
|
||||||
uniform sampler2D tex;
|
uniform sampler2D tex;
|
||||||
uniform float alpha;
|
uniform float alpha;
|
||||||
|
|
||||||
|
uniform vec2 topLeft;
|
||||||
|
uniform vec2 bottomRight;
|
||||||
|
uniform vec2 fullSize;
|
||||||
|
uniform float radius;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
||||||
|
vec2 pixCoord = fullSize * v_texcoord;
|
||||||
|
|
||||||
|
if (pixCoord[0] < topLeft[0]) {
|
||||||
|
// we're close left
|
||||||
|
if (pixCoord[1] < topLeft[1]) {
|
||||||
|
// top
|
||||||
|
if (distance(topLeft, pixCoord) > radius) {
|
||||||
|
gl_FragColor = vec4(0,0,0,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (pixCoord[1] > bottomRight[1]) {
|
||||||
|
// bottom
|
||||||
|
if (distance(vec2(topLeft[0], bottomRight[1]), pixCoord) > radius) {
|
||||||
|
gl_FragColor = vec4(0,0,0,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pixCoord[0] > bottomRight[0]) {
|
||||||
|
// we're close right
|
||||||
|
if (pixCoord[1] < topLeft[1]) {
|
||||||
|
// top
|
||||||
|
if (distance(vec2(bottomRight[0], topLeft[1]), pixCoord) > radius) {
|
||||||
|
gl_FragColor = vec4(0,0,0,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (pixCoord[1] > bottomRight[1]) {
|
||||||
|
// bottom
|
||||||
|
if (distance(bottomRight, pixCoord) > radius) {
|
||||||
|
gl_FragColor = vec4(0,0,0,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gl_FragColor = texture2D(tex, v_texcoord) * alpha;
|
gl_FragColor = texture2D(tex, v_texcoord) * alpha;
|
||||||
})#";
|
})#";
|
||||||
|
|
||||||
|
@ -66,4 +107,4 @@ uniform float alpha;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_FragColor = texture2D(texture0, v_texcoord) * alpha;
|
gl_FragColor = texture2D(texture0, v_texcoord) * alpha;
|
||||||
})#";
|
})#";
|
Loading…
Reference in a new issue