436 lines
10 KiB
C
436 lines
10 KiB
C
#include "menu.h"
|
|
#include "border.h"
|
|
#include "desktops.h"
|
|
#include "debug.h"
|
|
#include "util.h"
|
|
#include "icccm.h"
|
|
#include "bordermenu.h"
|
|
|
|
static void e_bordermenu_cb_close(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_kill(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_raise(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_lower(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_sticky(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_iconify(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_max(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_zoom(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_remember_location(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_remember_size(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_remember_desktop(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_remember_sticky(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_remember_prog_location_ignore(E_Menu *m, E_Menu_Item *mi, void *data);
|
|
static void e_bordermenu_cb_menu_hide(E_Menu *m, void *data);
|
|
|
|
static void
|
|
e_bordermenu_cb_close(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (b->win.client) e_icccm_delete(b->win.client);
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_kill(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (b->win.client) ecore_window_kill_client(b->win.client);
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_raise(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
e_border_raise(b);
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_lower(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
e_border_lower(b);
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_sticky(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.sticky = mi->on;
|
|
b->changed = 1;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_iconify(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_max(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (b->client.is_desktop) D_RETURN;
|
|
if (b->current.shaded > 0) D_RETURN;
|
|
if ((b->mode.move) || (b->mode.resize)) D_RETURN;
|
|
b->mode.move = 0;
|
|
b->mode.resize = 0;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
if (mi->on)
|
|
{
|
|
b->max.x = b->current.x;
|
|
b->max.y = b->current.y;
|
|
b->max.w = b->current.w;
|
|
b->max.h = b->current.h;
|
|
b->current.requested.x = 0;
|
|
b->current.requested.y = 0;
|
|
b->current.requested.w = b->desk->real.w;
|
|
b->current.requested.h = b->desk->real.h;
|
|
b->changed = 1;
|
|
b->max.is = mi->on;
|
|
e_border_adjust_limits(b);
|
|
b->current.requested.x = b->current.x;
|
|
b->current.requested.y = b->current.y;
|
|
b->current.requested.w = b->current.w;
|
|
b->current.requested.h = b->current.h;
|
|
}
|
|
else
|
|
{
|
|
b->current.requested.x = b->max.x;
|
|
b->current.requested.y = b->max.y;
|
|
b->current.requested.w = b->max.w;
|
|
b->current.requested.h = b->max.h;
|
|
b->changed = 1;
|
|
b->max.is = mi->on;
|
|
e_border_adjust_limits(b);
|
|
b->current.requested.x = b->current.x;
|
|
b->current.requested.y = b->current.y;
|
|
b->current.requested.w = b->current.w;
|
|
b->current.requested.h = b->current.h;
|
|
}
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_zoom(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
UN(mi);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_remember_location(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.matched.matched = 1;
|
|
b->client.matched.location.matched = mi->on;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_remember_size(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.matched.matched = 1;
|
|
b->client.matched.size.matched = mi->on;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_remember_desktop(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.matched.matched = 1;
|
|
b->client.matched.desktop.matched = mi->on;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_remember_sticky(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.matched.matched = 1;
|
|
b->client.matched.sticky.matched = mi->on;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_remember_prog_location_ignore(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
if (mi->on) e_menu_item_set_state(mi, 0);
|
|
else e_menu_item_set_state(mi, 1);
|
|
e_menu_set_state(m, mi);
|
|
|
|
b->client.matched.matched = 1;
|
|
b->client.matched.prog_location.matched = mi->on;
|
|
b->client.matched.prog_location.ignore = 1;
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
static void
|
|
e_bordermenu_cb_menu_hide(E_Menu *m, void *data)
|
|
{
|
|
E_Border *b;
|
|
|
|
D_ENTER;
|
|
|
|
b = data;
|
|
|
|
while (b->menus)
|
|
{
|
|
m = b->menus->data;
|
|
m->delete_me = 1;
|
|
b->menus = evas_list_remove(b->menus, m);
|
|
}
|
|
|
|
D_RETURN;
|
|
UN(m);
|
|
}
|
|
|
|
void
|
|
e_bordermenu_do(E_Border *b)
|
|
{
|
|
E_Menu *menu;
|
|
E_Menu_Item *menuitem;
|
|
|
|
D_ENTER;
|
|
|
|
if (!b->menus)
|
|
{
|
|
menu = e_menu_new();
|
|
b->menus = evas_list_append(b->menus, menu);
|
|
e_menu_set_padding_icon(menu, 2);
|
|
e_menu_set_padding_state(menu, 2);
|
|
e_menu_hide_callback(menu, e_bordermenu_cb_menu_hide, b);
|
|
|
|
menuitem = e_menu_item_new("Close");
|
|
/* e_menu_item_set_icon(menuitem, icon); */
|
|
/* e_menu_item_set_scale_icon(menuitem, 1);*/
|
|
/* e_menu_item_set_separator(menuitem, 1);*/
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_close, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Raise");
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_raise, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Lower");
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_lower, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Iconify");
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_iconify, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Zoom");
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_zoom, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Maximise");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->max.is);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_max, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Sticky");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.sticky);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_sticky, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("");
|
|
e_menu_item_set_separator(menuitem, 1);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Kill");
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_kill, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("");
|
|
e_menu_item_set_separator(menuitem, 1);
|
|
e_menu_add_item(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Remember Location");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.matched.location.matched);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_remember_location, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
e_menu_set_state(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Remember Size");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.matched.size.matched);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_remember_size, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
e_menu_set_state(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Remember Desktop");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.matched.desktop.matched);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_remember_desktop, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
e_menu_set_state(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Remember Stickiness");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.matched.sticky.matched);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_remember_sticky, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
e_menu_set_state(menu, menuitem);
|
|
|
|
menuitem = e_menu_item_new("Ignore Program Specified Position");
|
|
e_menu_item_set_check(menuitem, 1);
|
|
e_menu_item_set_state(menuitem, b->client.matched.prog_location.matched);
|
|
e_menu_item_set_callback(menuitem, e_bordermenu_cb_remember_prog_location_ignore, b);
|
|
e_menu_add_item(menu, menuitem);
|
|
e_menu_set_state(menu, menuitem);
|
|
}
|
|
|
|
{
|
|
int pl, pr, pt, pb;
|
|
int crx, cry, crw, crh;
|
|
int mx, my;
|
|
|
|
menu = b->menus->data;
|
|
pl = pr = pt = pb = 0;
|
|
if (b->bits.t) ebits_get_insets(b->bits.t, &pl, &pr, &pt, &pb);
|
|
crx = b->current.x + pl;
|
|
cry = b->current.y + pt;
|
|
crw = b->client.w;
|
|
crh = b->client.h;
|
|
ecore_pointer_xy_get(&mx, &my);
|
|
if (mx + menu->current.w > crx + crw) mx = crx + crw - menu->current.w;
|
|
if (my + menu->current.h > cry + crh) my = cry + crh - menu->current.h;
|
|
if (mx < crx) mx = crx;
|
|
if (my < cry) my = cry;
|
|
e_menu_show_at_mouse(menu, mx, my, CurrentTime);
|
|
}
|
|
|
|
D_RETURN;
|
|
}
|