enlightenment/src/bordermenu.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;
}