|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
Packit Service |
fa4841 |
* X11 Windows
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* Licensed under the Apache License, Version 2.0 (the "License");n
|
|
Packit Service |
fa4841 |
* you may not use this file except in compliance with the License.
|
|
Packit Service |
fa4841 |
* You may obtain a copy of the License at
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit Service |
fa4841 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit Service |
fa4841 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit Service |
fa4841 |
* See the License for the specific language governing permissions and
|
|
Packit Service |
fa4841 |
* limitations under the License.
|
|
Packit Service |
fa4841 |
*/
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include <X11/Xlib.h>
|
|
Packit Service |
fa4841 |
#include <X11/Xutil.h>
|
|
Packit Service |
fa4841 |
#include <X11/Xatom.h>
|
|
Packit Service |
fa4841 |
#include <X11/extensions/shape.h>
|
|
Packit Service |
bb5c11 |
#include <X11/extensions/Xfixes.h>
|
|
Packit Service |
fa4841 |
#include <X11/cursorfont.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include "xf_floatbar.h"
|
|
Packit Service |
fa4841 |
#include "resource/close.xbm"
|
|
Packit Service |
fa4841 |
#include "resource/lock.xbm"
|
|
Packit Service |
fa4841 |
#include "resource/unlock.xbm"
|
|
Packit Service |
fa4841 |
#include "resource/minimize.xbm"
|
|
Packit Service |
fa4841 |
#include "resource/restore.xbm"
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#define TAG CLIENT_TAG("x11")
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_HEIGHT 26
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_DEFAULT_WIDTH 576
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_MIN_WIDTH 200
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_BORDER 24
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_BUTTON_WIDTH 24
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_COLOR_BACKGROUND "RGB:31/6c/a9"
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_COLOR_BORDER "RGB:75/9a/c8"
|
|
Packit Service |
bb5c11 |
#define FLOATBAR_COLOR_FOREGROUND "RGB:FF/FF/FF"
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#ifdef WITH_DEBUG_X11
|
|
Packit Service |
fa4841 |
#define DEBUG_X11(...) WLog_DBG(TAG, __VA_ARGS__)
|
|
Packit Service |
fa4841 |
#else
|
|
Packit Service |
bb5c11 |
#define DEBUG_X11(...) do { } while (0)
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_MODE_NONE 0
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_MODE_DRAGGING 1
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_MODE_RESIZE_LEFT 2
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_MODE_RESIZE_RIGHT 3
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_BUTTON_CLOSE 1
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_BUTTON_RESTORE 2
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_BUTTON_MINIMIZE 3
|
|
Packit Service |
bb5c11 |
#define XF_FLOATBAR_BUTTON_LOCKED 4
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
typedef struct xf_floatbar_button xfFloatbarButton;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
struct xf_floatbar
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int x;
|
|
Packit Service |
fa4841 |
int y;
|
|
Packit Service |
fa4841 |
int width;
|
|
Packit Service |
fa4841 |
int height;
|
|
Packit Service |
fa4841 |
int mode;
|
|
Packit Service |
fa4841 |
int last_motion_x_root;
|
|
Packit Service |
fa4841 |
int last_motion_y_root;
|
|
Packit Service |
fa4841 |
bool locked;
|
|
Packit Service |
fa4841 |
xfFloatbarButton* buttons[4];
|
|
Packit Service |
fa4841 |
Window handle;
|
|
Packit Service |
fa4841 |
};
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
struct xf_floatbar_button
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int x;
|
|
Packit Service |
fa4841 |
int y;
|
|
Packit Service |
fa4841 |
int type;
|
|
Packit Service |
fa4841 |
bool focus;
|
|
Packit Service |
fa4841 |
bool clicked;
|
|
Packit Service |
fa4841 |
OnClick onclick;
|
|
Packit Service |
fa4841 |
Window handle;
|
|
Packit Service |
fa4841 |
};
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_onclick_close(xfContext* xfc)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
ExitProcess(EXIT_SUCCESS);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_onclick_minimize(xfContext* xfc)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xf_SetWindowMinimized(xfc, xfc->window);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_onclick_restore(xfContext* xfc)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xf_toggle_fullscreen(xfc);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_onclick_locked(xfContext* xfc)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
floatbar->locked = (floatbar->locked) ? FALSE : TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
void xf_floatbar_set_root_y(xfContext* xfc, int y)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
floatbar->last_motion_y_root = y;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
void xf_floatbar_hide_and_show(xfContext* xfc)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!floatbar->locked)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
if ((floatbar->mode == 0) && (floatbar->last_motion_y_root > 10) &&
|
|
Packit Service |
fa4841 |
(floatbar->y > (FLOATBAR_HEIGHT * -1)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
floatbar->y = floatbar->y - 1;
|
|
Packit Service |
fa4841 |
XMoveWindow(xfc->display, floatbar->handle, floatbar->x, floatbar->y);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (floatbar->y < 0 && (floatbar->last_motion_y_root < 10))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
floatbar->y = floatbar->y + 1;
|
|
Packit Service |
fa4841 |
XMoveWindow(xfc->display, floatbar->handle, floatbar->x, floatbar->y);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
void xf_floatbar_toggle_visibility(xfContext* xfc, bool visible)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
int i, size;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (visible)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XMapWindow(xfc->display, floatbar->handle);
|
|
Packit Service |
fa4841 |
size = ARRAYSIZE(floatbar->buttons);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < size; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XMapWindow(xfc->display, floatbar->buttons[i]->handle);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
bb5c11 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XUnmapSubwindows(xfc->display, floatbar->handle);
|
|
Packit Service |
fa4841 |
XUnmapWindow(xfc->display, floatbar->handle);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static xfFloatbarButton* xf_floatbar_new_button(xfContext* xfc, xfFloatbar* floatbar, int type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
bb5c11 |
button = (xfFloatbarButton*) calloc(1, sizeof(xfFloatbarButton));
|
|
Packit Service |
fa4841 |
button->type = type;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
switch (type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_CLOSE:
|
|
Packit Service |
fa4841 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * type;
|
|
Packit Service |
fa4841 |
button->onclick = xf_floatbar_button_onclick_close;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_RESTORE:
|
|
Packit Service |
fa4841 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * type;
|
|
Packit Service |
fa4841 |
button->onclick = xf_floatbar_button_onclick_restore;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_MINIMIZE:
|
|
Packit Service |
fa4841 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * type;
|
|
Packit Service |
fa4841 |
button->onclick = xf_floatbar_button_onclick_minimize;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_LOCKED:
|
|
Packit Service |
fa4841 |
button->x = FLOATBAR_BORDER;
|
|
Packit Service |
fa4841 |
button->onclick = xf_floatbar_button_onclick_locked;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
button->y = 0;
|
|
Packit Service |
fa4841 |
button->focus = FALSE;
|
|
Packit Service |
bb5c11 |
button->handle = XCreateWindow(xfc->display, floatbar->handle, button->x, 0, FLOATBAR_BUTTON_WIDTH,
|
|
Packit Service |
bb5c11 |
FLOATBAR_BUTTON_WIDTH, 0, CopyFromParent, InputOutput, CopyFromParent, 0, NULL);
|
|
Packit Service |
bb5c11 |
XSelectInput(xfc->display, button->handle, ExposureMask | ButtonPressMask | ButtonReleaseMask |
|
|
Packit Service |
bb5c11 |
FocusChangeMask | LeaveWindowMask | EnterWindowMask | StructureNotifyMask);
|
|
Packit Service |
fa4841 |
return button;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
xfFloatbar* xf_floatbar_new(xfContext* xfc, Window window)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
XWindowAttributes attr;
|
|
Packit Service |
bb5c11 |
int i, width;
|
|
Packit Service |
fa4841 |
if (!xfc)
|
|
Packit Service |
fa4841 |
return NULL;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
floatbar = (xfFloatbar*) calloc(1, sizeof(xfFloatbar));
|
|
Packit Service |
bb5c11 |
floatbar->locked = TRUE;
|
|
Packit Service |
bb5c11 |
XGetWindowAttributes(xfc->display, window, &attr);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
for (i = 0; i < xfc->vscreen.nmonitors; i++)
|
|
Packit Service |
bb5c11 |
{
|
|
Packit Service |
bb5c11 |
if (attr.x >= xfc->vscreen.monitors[i].area.left && attr.x <= xfc->vscreen.monitors[i].area.right)
|
|
Packit Service |
bb5c11 |
{
|
|
Packit Service |
bb5c11 |
width = xfc->vscreen.monitors[i].area.right - xfc->vscreen.monitors[i].area.left;
|
|
Packit Service |
bb5c11 |
floatbar->x = width / 2 + xfc->vscreen.monitors[i].area.left - FLOATBAR_DEFAULT_WIDTH / 2;
|
|
Packit Service |
bb5c11 |
}
|
|
Packit Service |
bb5c11 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
floatbar->y = 0;
|
|
Packit Service |
bb5c11 |
floatbar->handle = XCreateWindow(xfc->display, window, floatbar->x, 0, FLOATBAR_DEFAULT_WIDTH,
|
|
Packit Service |
bb5c11 |
FLOATBAR_HEIGHT, 0,
|
|
Packit Service |
bb5c11 |
CopyFromParent, InputOutput, CopyFromParent, 0, NULL);
|
|
Packit Service |
bb5c11 |
floatbar->width = FLOATBAR_DEFAULT_WIDTH;
|
|
Packit Service |
bb5c11 |
floatbar->height = FLOATBAR_HEIGHT;
|
|
Packit Service |
bb5c11 |
floatbar->mode = XF_FLOATBAR_MODE_NONE;
|
|
Packit Service |
bb5c11 |
floatbar->buttons[0] = xf_floatbar_new_button(xfc, floatbar, XF_FLOATBAR_BUTTON_CLOSE);
|
|
Packit Service |
bb5c11 |
floatbar->buttons[1] = xf_floatbar_new_button(xfc, floatbar, XF_FLOATBAR_BUTTON_RESTORE);
|
|
Packit Service |
bb5c11 |
floatbar->buttons[2] = xf_floatbar_new_button(xfc, floatbar, XF_FLOATBAR_BUTTON_MINIMIZE);
|
|
Packit Service |
bb5c11 |
floatbar->buttons[3] = xf_floatbar_new_button(xfc, floatbar, XF_FLOATBAR_BUTTON_LOCKED);
|
|
Packit Service |
bb5c11 |
XSelectInput(xfc->display, floatbar->handle, ExposureMask | ButtonPressMask | ButtonReleaseMask |
|
|
Packit Service |
bb5c11 |
PointerMotionMask | FocusChangeMask | LeaveWindowMask | EnterWindowMask | StructureNotifyMask |
|
|
Packit Service |
bb5c11 |
PropertyChangeMask);
|
|
Packit Service |
fa4841 |
return floatbar;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static unsigned long xf_floatbar_get_color(xfContext* xfc, char* rgb_value)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
Colormap cmap;
|
|
Packit Service |
fa4841 |
XColor color;
|
|
Packit Service |
bb5c11 |
cmap = DefaultColormap(xfc->display, XDefaultScreen(xfc->display));
|
|
Packit Service |
bb5c11 |
XParseColor(xfc->display, cmap, rgb_value, &color;;
|
|
Packit Service |
bb5c11 |
XAllocColor(xfc->display, cmap, &color;;
|
|
Packit Service |
bb5c11 |
XFreeColormap(xfc->display, cmap);
|
|
Packit Service |
fa4841 |
return color.pixel;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_event_expose(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
GC gc, shape_gc;
|
|
Packit Service |
fa4841 |
Pixmap pmap;
|
|
Packit Service |
fa4841 |
XPoint shape[5], border[5];
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
int len;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
/* create the pixmap that we'll use for shaping the window */
|
|
Packit Service |
bb5c11 |
pmap = XCreatePixmap(xfc->display, floatbar->handle, floatbar->width, floatbar->height, 1);
|
|
Packit Service |
bb5c11 |
gc = XCreateGC(xfc->display, floatbar->handle, 0, 0);
|
|
Packit Service |
bb5c11 |
shape_gc = XCreateGC(xfc->display, pmap, 0, 0);
|
|
Packit Service |
fa4841 |
/* points for drawing the floatbar */
|
|
Packit Service |
fa4841 |
shape[0].x = 0;
|
|
Packit Service |
fa4841 |
shape[0].y = 0;
|
|
Packit Service |
fa4841 |
shape[1].x = floatbar->width;
|
|
Packit Service |
fa4841 |
shape[1].y = 0;
|
|
Packit Service |
fa4841 |
shape[2].x = shape[1].x - FLOATBAR_BORDER;
|
|
Packit Service |
fa4841 |
shape[2].y = FLOATBAR_HEIGHT;
|
|
Packit Service |
fa4841 |
shape[3].x = shape[0].x + FLOATBAR_BORDER;
|
|
Packit Service |
fa4841 |
shape[3].y = FLOATBAR_HEIGHT;
|
|
Packit Service |
fa4841 |
shape[4].x = shape[0].x;
|
|
Packit Service |
fa4841 |
shape[4].y = shape[0].y;
|
|
Packit Service |
fa4841 |
/* points for drawing the border of the floatbar */
|
|
Packit Service |
fa4841 |
border[0].x = shape[0].x;
|
|
Packit Service |
fa4841 |
border[0].y = shape[0].y - 1;
|
|
Packit Service |
fa4841 |
border[1].x = shape[1].x - 1;
|
|
Packit Service |
fa4841 |
border[1].y = shape[1].y - 1;
|
|
Packit Service |
fa4841 |
border[2].x = shape[2].x;
|
|
Packit Service |
fa4841 |
border[2].y = shape[2].y - 1;
|
|
Packit Service |
fa4841 |
border[3].x = shape[3].x - 1;
|
|
Packit Service |
fa4841 |
border[3].y = shape[3].y - 1;
|
|
Packit Service |
fa4841 |
border[4].x = border[0].x;
|
|
Packit Service |
fa4841 |
border[4].y = border[0].y;
|
|
Packit Service |
fa4841 |
/* Fill all pixels with 0 */
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, shape_gc, 0);
|
|
Packit Service |
bb5c11 |
XFillRectangle(xfc->display, pmap, shape_gc, 0, 0, floatbar->width,
|
|
Packit Service |
bb5c11 |
floatbar->height);
|
|
Packit Service |
fa4841 |
/* Fill all pixels which should be shown with 1 */
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, shape_gc, 1);
|
|
Packit Service |
bb5c11 |
XFillPolygon(xfc->display, pmap, shape_gc, shape, 5, 0, CoordModeOrigin);
|
|
Packit Service |
bb5c11 |
XShapeCombineMask(xfc->display, floatbar->handle, ShapeBounding, 0, 0, pmap, ShapeSet);
|
|
Packit Service |
fa4841 |
/* draw the float bar */
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_BACKGROUND));
|
|
Packit Service |
bb5c11 |
XFillPolygon(xfc->display, floatbar->handle, gc, shape, 4, 0, CoordModeOrigin);
|
|
Packit Service |
fa4841 |
/* draw an border for the floatbar */
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_BORDER));
|
|
Packit Service |
bb5c11 |
XDrawLines(xfc->display, floatbar->handle, gc, border, 5, CoordModeOrigin);
|
|
Packit Service |
bb5c11 |
/* draw the host name connected to */
|
|
Packit Service |
bb5c11 |
len = strlen(xfc->context.settings->ServerHostname);
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_FOREGROUND));
|
|
Packit Service |
bb5c11 |
XDrawString(xfc->display, floatbar->handle, gc, floatbar->width / 2 - len * 2, 15,
|
|
Packit Service |
bb5c11 |
xfc->context.settings->ServerHostname, len);
|
|
Packit Service |
bb5c11 |
XFreeGC(xfc->display, gc);
|
|
Packit Service |
bb5c11 |
XFreeGC(xfc->display, shape_gc);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static xfFloatbarButton* xf_floatbar_get_button(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
int i, size;
|
|
Packit Service |
fa4841 |
size = ARRAYSIZE(floatbar->buttons);
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < size; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
if (floatbar->buttons[i]->handle == event->xany.window)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
return floatbar->buttons[i];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return NULL;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_update_positon(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
fa4841 |
int i, size;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
size = ARRAYSIZE(floatbar->buttons);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < size; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
button = floatbar->buttons[i];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
switch (button->type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_CLOSE:
|
|
Packit Service |
bb5c11 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * button->type;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_RESTORE:
|
|
Packit Service |
bb5c11 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * button->type;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_MINIMIZE:
|
|
Packit Service |
bb5c11 |
button->x = floatbar->width - FLOATBAR_BORDER - FLOATBAR_BUTTON_WIDTH * button->type;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
XMoveWindow(xfc->display, button->handle, button->x, button->y);
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_expose(xfc, event);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_event_expose(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
xfFloatbarButton* button;
|
|
Packit Service |
fa4841 |
static unsigned char* bits;
|
|
Packit Service |
fa4841 |
GC gc;
|
|
Packit Service |
fa4841 |
Pixmap pattern;
|
|
Packit Service |
bb5c11 |
button = xf_floatbar_get_button(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!button)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
gc = XCreateGC(xfc->display, button->handle, 0, 0);
|
|
Packit Service |
fa4841 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
switch (button->type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_CLOSE:
|
|
Packit Service |
fa4841 |
bits = close_bits;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_RESTORE:
|
|
Packit Service |
fa4841 |
bits = restore_bits;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_MINIMIZE:
|
|
Packit Service |
fa4841 |
bits = minimize_bits;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case XF_FLOATBAR_BUTTON_LOCKED:
|
|
Packit Service |
fa4841 |
if (floatbar->locked)
|
|
Packit Service |
fa4841 |
bits = lock_bits;
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
bits = unlock_bits;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
pattern = XCreateBitmapFromData(xfc->display, button->handle, (const char*)bits,
|
|
Packit Service |
fa4841 |
FLOATBAR_BUTTON_WIDTH, FLOATBAR_BUTTON_WIDTH);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!(button->focus))
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_BACKGROUND));
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
bb5c11 |
XSetForeground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_BORDER));
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
XSetBackground(xfc->display, gc, xf_floatbar_get_color(xfc, FLOATBAR_COLOR_FOREGROUND));
|
|
Packit Service |
fa4841 |
XCopyPlane(xfc->display, pattern, button->handle, gc, 0, 0, FLOATBAR_BUTTON_WIDTH,
|
|
Packit Service |
fa4841 |
FLOATBAR_BUTTON_WIDTH, 0, 0, 1);
|
|
Packit Service |
fa4841 |
XFreePixmap(xfc->display, pattern);
|
|
Packit Service |
fa4841 |
XFreeGC(xfc->display, gc);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_event_buttonpress(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbarButton* button;
|
|
Packit Service |
bb5c11 |
button = xf_floatbar_get_button(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (button)
|
|
Packit Service |
fa4841 |
button->clicked = TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_event_buttonrelease(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
bb5c11 |
button = xf_floatbar_get_button(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (button->clicked)
|
|
Packit Service |
bb5c11 |
button->onclick(xfc);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_event_buttonpress(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
bb5c11 |
|
|
Packit Service |
bb5c11 |
switch (event->xbutton.button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case Button1:
|
|
Packit Service |
bb5c11 |
if (event->xmotion.x <= FLOATBAR_BORDER)
|
|
Packit Service |
fa4841 |
floatbar->mode = XF_FLOATBAR_MODE_RESIZE_LEFT;
|
|
Packit Service |
bb5c11 |
else if (event->xmotion.x >= (floatbar->width - FLOATBAR_BORDER))
|
|
Packit Service |
fa4841 |
floatbar->mode = XF_FLOATBAR_MODE_RESIZE_RIGHT;
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
floatbar->mode = XF_FLOATBAR_MODE_DRAGGING;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_event_buttonrelease(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
switch (event->xbutton.button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case Button1:
|
|
Packit Service |
bb5c11 |
xfc->window->floatbar->mode = XF_FLOATBAR_MODE_NONE;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_resize(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
int x, width, movement;
|
|
Packit Service |
fa4841 |
/* calculate movement which happened on the root window */
|
|
Packit Service |
bb5c11 |
movement = event->xmotion.x_root - floatbar->last_motion_x_root;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* set x and width depending if movement happens on the left or right */
|
|
Packit Service |
fa4841 |
if (floatbar->mode == XF_FLOATBAR_MODE_RESIZE_LEFT)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
x = floatbar->x + movement;
|
|
Packit Service |
fa4841 |
width = floatbar->width + movement * -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
x = floatbar->x;
|
|
Packit Service |
fa4841 |
width = floatbar->width + movement;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* only resize and move window if still above minimum width */
|
|
Packit Service |
fa4841 |
if (FLOATBAR_MIN_WIDTH < width)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XMoveResizeWindow(xfc->display, floatbar->handle, x, 0, width, floatbar->height);
|
|
Packit Service |
fa4841 |
floatbar->x = x;
|
|
Packit Service |
fa4841 |
floatbar->width = width;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_dragging(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
int x, movement;
|
|
Packit Service |
fa4841 |
/* calculate movement and new x position */
|
|
Packit Service |
bb5c11 |
movement = event->xmotion.x_root - floatbar->last_motion_x_root;
|
|
Packit Service |
fa4841 |
x = floatbar->x + movement;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* do nothing if floatbar would be moved out of the window */
|
|
Packit Service |
fa4841 |
if (x < 0 || (x + floatbar->width) > xfc->window->width)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* move window to new x position */
|
|
Packit Service |
fa4841 |
XMoveWindow(xfc->display, floatbar->handle, x, 0);
|
|
Packit Service |
fa4841 |
/* update struct values for the next event */
|
|
Packit Service |
fa4841 |
floatbar->last_motion_x_root = floatbar->last_motion_x_root + movement;
|
|
Packit Service |
fa4841 |
floatbar->x = x;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_event_motionnotify(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int mode;
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
Cursor cursor;
|
|
Packit Service |
bb5c11 |
mode = xfc->window->floatbar->mode;
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
cursor = XCreateFontCursor(xfc->display, XC_arrow);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
if ((event->xmotion.state & Button1Mask) && (mode > XF_FLOATBAR_MODE_DRAGGING))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xf_floatbar_resize(xfc, event);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
bb5c11 |
else if ((event->xmotion.state & Button1Mask) && (mode == XF_FLOATBAR_MODE_DRAGGING))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xf_floatbar_dragging(xfc, event);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
if (event->xmotion.x <= FLOATBAR_BORDER ||
|
|
Packit Service |
bb5c11 |
event->xmotion.x >= xfc->window->floatbar->width - FLOATBAR_BORDER)
|
|
Packit Service |
fa4841 |
cursor = XCreateFontCursor(xfc->display, XC_sb_h_double_arrow);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
XDefineCursor(xfc->display, xfc->window->handle, cursor);
|
|
Packit Service |
fa4841 |
XFreeCursor(xfc->display, cursor);
|
|
Packit Service |
bb5c11 |
xfc->window->floatbar->last_motion_x_root = event->xmotion.x_root;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_event_focusin(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
bb5c11 |
button = xf_floatbar_get_button(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
button->focus = TRUE;
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_expose(xfc, event);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_button_event_focusout(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
bb5c11 |
button = xf_floatbar_get_button(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
button->focus = FALSE;
|
|
Packit Service |
bb5c11 |
button->clicked = FALSE;
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_expose(xfc, event);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static void xf_floatbar_event_focusout(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
Cursor cursor;
|
|
Packit Service |
bb5c11 |
cursor = XCreateFontCursor(xfc->display, XC_arrow);
|
|
Packit Service |
bb5c11 |
XDefineCursor(xfc->display, xfc->window->handle, cursor);
|
|
Packit Service |
bb5c11 |
XFreeCursor(xfc->display, cursor);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
BOOL xf_floatbar_check_event(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
xfFloatbarButton* button;
|
|
Packit Service |
fa4841 |
size_t i, size;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
if (!xfc || !event || !xfc->window)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
size = ARRAYSIZE(floatbar->buttons);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < size; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
button = floatbar->buttons[i];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (event->xany.window == button->handle)
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
BOOL xf_floatbar_event_process(xfContext* xfc, XEvent* event)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
xfFloatbar* floatbar;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
if (!xfc || !xfc->window || !event)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
floatbar = xfc->window->floatbar;
|
|
Packit Service |
bb5c11 |
|
|
Packit Service |
fa4841 |
switch (event->type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case Expose:
|
|
Packit Service |
bb5c11 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_expose(xfc, event);
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_expose(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case MotionNotify:
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_motionnotify(xfc, event);
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case ButtonPress:
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_buttonpress(xfc, event);
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_buttonpress(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case ButtonRelease:
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_buttonrelease(xfc, event);
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_buttonrelease(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case EnterNotify:
|
|
Packit Service |
fa4841 |
case FocusIn:
|
|
Packit Service |
fa4841 |
if (event->xany.window != floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_focusin(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case LeaveNotify:
|
|
Packit Service |
fa4841 |
case FocusOut:
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_event_focusout(xfc, event);
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_event_focusout(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case ConfigureNotify:
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_update_positon(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case PropertyNotify:
|
|
Packit Service |
fa4841 |
if (event->xany.window == floatbar->handle)
|
|
Packit Service |
bb5c11 |
xf_floatbar_button_update_positon(xfc, event);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
default:
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return floatbar->handle == event->xany.window;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static void xf_floatbar_button_free(xfContext* xfc, xfFloatbarButton* button)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!button)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (button->handle)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XUnmapWindow(xfc->display, button->handle);
|
|
Packit Service |
fa4841 |
XDestroyWindow(xfc->display, button->handle);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
free(button);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
void xf_floatbar_free(xfContext* xfc, xfWindow* window, xfFloatbar* floatbar)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
size_t i, size;
|
|
Packit Service |
bb5c11 |
size = ARRAYSIZE(floatbar->buttons);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!floatbar)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
if (window->floatbar == floatbar)
|
|
Packit Service |
bb5c11 |
window->floatbar = NULL;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < size; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
xf_floatbar_button_free(xfc, floatbar->buttons[i]);
|
|
Packit Service |
fa4841 |
floatbar->buttons[i] = NULL;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (floatbar->handle)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
XUnmapWindow(xfc->display, floatbar->handle);
|
|
Packit Service |
fa4841 |
XDestroyWindow(xfc->display, floatbar->handle);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
free(floatbar);
|
|
Packit Service |
fa4841 |
}
|