Add "client_menu" to pluginrc to use.
mbind Frame Click C-A-Down SendToPreviousDesktopWrap
mbind Root Click Right ShowMenu "root"
+mbind Frame Click Right ShowMenu "client-menu"
#include "openbox.h"
#include "group.h"
#include "config.h"
+#include "menu.h"
#include "render/render.h"
#include <glib.h>
client_unmanage(client_list->data);
}
+/* called by client_unmanage() to close any menus referencing this client */
+void client_close_menus(gpointer key, gpointer value, gpointer self)
+{
+ if (((Menu *)value)->client == (Client *)self)
+ menu_hide((Menu *)value);
+}
+
void client_unmanage(Client *self)
{
int j;
if (moveresize_client == self)
moveresize_end(TRUE);
+ /* close any windows that are attached to this window */
+ g_hash_table_foreach(menu_hash, client_close_menus, self);
+
+
if (focus_client == self) {
XEvent e;
static void event_handle_dock(Dock *s, XEvent *e);
static void event_handle_dockapp(DockApp *app, XEvent *e);
static void event_handle_client(Client *c, XEvent *e);
-static void event_handle_menu(Menu *menu, XEvent *e);
+static void event_handle_menu(Menu *menu, Client *c, XEvent *e);
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
/* deal with it in the kernel */
if (menu) {
- event_handle_menu(menu, e);
+ event_handle_menu(menu, client, e);
return;
} else if (client)
event_handle_client(client, e);
}
}
-static void event_handle_menu(Menu *menu, XEvent *e)
+static void event_handle_menu(Menu *menu, Client *client, XEvent *e)
{
MenuEntry *entry;
#include "geom.h"
#include "plugin.h"
-static GHashTable *menu_hash = NULL;
+GHashTable *menu_hash = NULL;
#define FRAME_EVENTMASK (ButtonPressMask |ButtonMotionMask | EnterWindowMask | \
LeaveWindowMask)
void menu_control_show(Menu *self, int x, int y, Client *client);
-void menu_destroy_hash_key(gpointer data)
+void menu_destroy_hash_key(Menu *menu)
{
- g_free(data);
+ g_free(menu);
}
void menu_destroy_hash_value(Menu *self)
menu_destroy_hash_key,
(GDestroyNotify)menu_destroy_hash_value);
- m = menu_new(NULL, "root", NULL);
+ m = menu_new("sex menu", "root", NULL);
a = action_from_string("execute");
a->data.execute.path = g_strdup("xterm");
menu_add_entry(m, menu_entry_new_separator("--"));
a = action_from_string("exit");
menu_add_entry(m, menu_entry_new("exit", a));
+
+ /*
s = menu_new("subsex menu", "submenu", m);
a = action_from_string("execute");
a->data.execute.path = g_strdup("xclock");
menu_add_entry(m, menu_entry_new_submenu("subz", s));
- t = (Menu *)plugin_create("timed_menu");
- if (t) {
- a = action_from_string("execute");
- a->data.execute.path = g_strdup("xeyes");
- menu_add_entry(t, menu_entry_new("xeyes", a));
- menu_add_entry(m, menu_entry_new_submenu("timed", t));
- }
-
- t = (Menu *)plugin_create("fifo_menu");
- if (t) {
- menu_add_entry(m, menu_entry_new_submenu("fifo", t));
- }
-
s = menu_new("empty", "chub", m);
menu_add_entry(m, menu_entry_new_submenu("empty", s));
menu_add_entry(s, menu_entry_new("exit", a));
menu_add_entry(m, menu_entry_new_submenu("long", s));
-
- m = menu_new(NULL, "client", NULL);
- a = action_from_string("iconify");
- menu_add_entry(m, menu_entry_new("iconify", a));
- a = action_from_string("toggleshade");
- menu_add_entry(m, menu_entry_new("(un)shade", a));
- a = action_from_string("togglemaximizefull");
- menu_add_entry(m, menu_entry_new("(un)maximize", a));
- a = action_from_string("close");
- menu_add_entry(m, menu_entry_new("close", a));
-
+ */
}
void menu_shutdown()
theme_bevel;
menu_show_full(self->submenu, x,
- self->parent->location.y + self->y, NULL);
+ self->parent->location.y + self->y,
+ self->parent->client);
}
}
}
typedef void(*menu_controller_show)(struct Menu *self, int x, int y, Client *);
typedef void(*menu_controller_update)(struct Menu *self);
-typedef void(*menu_controller_mouseover)(struct MenuEntry *self,
+typedef void(*menu_controller_mouseover)(struct MenuEntry *self,
gboolean enter);
+extern GHashTable *menu_hash;
+
typedef struct Menu {
ObWindow obwin;
void menu_entry_fire(MenuEntry *self);
void menu_render(Menu *self);
+void menu_render_full(Menu *self);
void menu_control_mouseover(MenuEntry *entry, gboolean enter);
#endif
INCLUDES=-I../..
-plugin_LTLIBRARIES=timed_menu.la fifo_menu.la
+plugin_LTLIBRARIES=timed_menu.la fifo_menu.la client_menu.la
timed_menu_la_LDFLAGS=-module -avoid-version
timed_menu_la_SOURCES=timed_menu.c
fifo_menu_la_LDFLAGS=-module -avoid-version
fifo_menu_la_SOURCES=fifo_menu.c
+client_menu_la_LDFLAGS=-module -avoid-version
+client_menu_la_SOURCES=client_menu.c
+
noinst_HEADERS=timed_menu.h fifo_menu.h
MAINTAINERCLEANFILES=Makefile.in
--- /dev/null
+#include <glib.h>
+
+#include "kernel/menu.h"
+#include "kernel/screen.h"
+
+static char *PLUGIN_NAME = "client_menu";
+static Menu *send_to_menu;
+
+typedef struct {
+
+} Client_Menu_Data;
+
+#define CLIENT_MENU(m) ((Menu *)m)
+#define CLIENT_MENU_DATA(m) ((Client_Menu_Data *)((Menu *)m)->plugin_data)
+
+
+void client_menu_clean_up(Menu *m) {
+}
+
+void client_send_to_update(Menu *self)
+{
+ guint i;
+ g_message("yo!");
+
+ for (i = 0; i < screen_num_desktops; ++i) {
+ MenuEntry *e;
+ Action *a = action_from_string("sendtodesktop");
+ a->data.sendto.desk = i;
+ a->data.sendto.follow = FALSE;
+ e = menu_entry_new(screen_desktop_names[i], a);
+ menu_add_entry(self, e);
+ }
+
+ menu_render_full(self);
+}
+
+void plugin_setup_config() { }
+
+void plugin_shutdown() { }
+
+void plugin_destroy (Menu *m)
+{
+}
+
+void *plugin_create() /* TODO: need config */
+{
+ Menu *m = menu_new(NULL, "client-menu", NULL);
+ menu_add_entry(m, menu_entry_new_submenu("Send To Workspace",
+ send_to_menu));
+ send_to_menu->parent = m;
+
+ menu_add_entry(m, menu_entry_new("Iconify",
+ action_from_string("iconify")));
+ menu_add_entry(m, menu_entry_new("Raise",
+ action_from_string("raise")));
+ menu_add_entry(m, menu_entry_new("Lower",
+ action_from_string("lower")));
+ menu_add_entry(m, menu_entry_new("Close",
+ action_from_string("close")));
+ menu_add_entry(m, menu_entry_new("Shade",
+ action_from_string("toggleshade")));
+ menu_add_entry(m, menu_entry_new("Omnipresent",
+ action_from_string("toggleomnipresent")));
+
+ /* send to desktop
+ iconify
+ raise
+ lower
+ close
+ kill
+ shade
+ omnipresent
+ decorations
+ */
+ return (void *)m;
+}
+
+void plugin_startup()
+{
+ Menu *t;
+ /* create a Send To Workspace Menu */
+ send_to_menu = menu_new_full("Send To Workspace", "send-to-workspace",
+ NULL, NULL, client_send_to_update);
+
+ t = (Menu *)plugin_create("client_menu");
+}
+