From 1ffc0021325e30db7bb7f8b2a17ca7f5546b3324 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Sat, 26 Jun 2010 15:55:40 +0200 Subject: [PATCH] Make the dock a context and add actions LowerDock and RaiseDock --- Makefile.am | 1 + openbox/actions/all.c | 1 + openbox/actions/all.h | 1 + openbox/actions/dock.c | 38 ++++++++++++++++++++++++++++++++++++++ openbox/dock.c | 10 ++++++++++ openbox/dock.h | 3 +++ openbox/event.c | 8 +------- openbox/frame.c | 11 ++++++++++- openbox/frame.h | 1 + openbox/mouse.c | 1 + 10 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 openbox/actions/dock.c diff --git a/Makefile.am b/Makefile.am index 12176d6..765ffaa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -188,6 +188,7 @@ openbox_openbox_SOURCES = \ openbox/actions/debug.c \ openbox/actions/decorations.c \ openbox/actions/desktop.c \ + openbox/actions/dock.c \ openbox/actions/dockautohide.c \ openbox/actions/directionalwindows.c \ openbox/actions/execute.c \ diff --git a/openbox/actions/all.c b/openbox/actions/all.c index 4563e65..332e79c 100644 --- a/openbox/actions/all.c +++ b/openbox/actions/all.c @@ -30,6 +30,7 @@ void action_all_startup(void) action_resize_startup(); action_decorations_startup(); action_desktop_startup(); + action_dock_startup(); action_resizerelative_startup(); action_addremovedesktop_startup(); action_dockautohide_startup(); diff --git a/openbox/actions/all.h b/openbox/actions/all.h index 6acbc9c..54d6319 100644 --- a/openbox/actions/all.h +++ b/openbox/actions/all.h @@ -31,6 +31,7 @@ void action_directionalwindows_startup(void); void action_resize_startup(void); void action_decorations_startup(void); void action_desktop_startup(void); +void action_dock_startup(void); void action_resizerelative_startup(void); void action_addremovedesktop_startup(void); void action_dockautohide_startup(void); diff --git a/openbox/actions/dock.c b/openbox/actions/dock.c new file mode 100644 index 0000000..a1f6837 --- /dev/null +++ b/openbox/actions/dock.c @@ -0,0 +1,38 @@ +#include "openbox/actions.h" +#include "openbox/stacking.h" +#include "openbox/window.h" +#include "openbox/dock.h" + +static gboolean raise_func(ObActionsData *data, gpointer options); +static gboolean lower_func(ObActionsData *data, gpointer options); + +void action_dock_startup(void) +{ + actions_register("RaiseDock", + NULL, NULL, + raise_func); + actions_register("LowerDock", + NULL, NULL, + lower_func); +} + +/* Always return FALSE because its not interactive */ +static gboolean raise_func(ObActionsData *data, gpointer options) +{ + actions_client_move(data, TRUE); + dock_raise_dock(); + actions_client_move(data, FALSE); + + return FALSE; +} + +/* Always return FALSE because its not interactive */ +static gboolean lower_func(ObActionsData *data, gpointer options) +{ + actions_client_move(data, TRUE); + dock_lower_dock(); + actions_client_move(data, FALSE); + + return FALSE; +} + diff --git a/openbox/dock.c b/openbox/dock.c index 64406d9..b8a5ff5 100644 --- a/openbox/dock.c +++ b/openbox/dock.c @@ -677,6 +677,16 @@ void dock_get_area(Rect *a) dock->area.width, dock->area.height); } +void dock_raise_dock(void) +{ + stacking_raise(DOCK_AS_WINDOW(dock)); +} + +void dock_lower_dock(void) +{ + stacking_lower(DOCK_AS_WINDOW(dock)); +} + ObDockApp* dock_find_dockapp(Window xwin) { return g_hash_table_lookup(dock->dock_map, &xwin); diff --git a/openbox/dock.h b/openbox/dock.h index 8bc735e..cb4fd6c 100644 --- a/openbox/dock.h +++ b/openbox/dock.h @@ -80,6 +80,9 @@ void dock_app_configure(ObDockApp *app, gint w, gint h); void dock_get_area(Rect *a); +void dock_raise_dock(void); +void dock_lower_dock(void); + ObDockApp* dock_find_dockapp(Window xwin); #endif diff --git a/openbox/event.c b/openbox/event.c index 46baa6d..eb69d09 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -709,7 +709,7 @@ static void event_process(const XEvent *ec, gpointer data) /* ...or it if it was physically on an openbox internal window... */ ((w = window_find(e->xbutton.subwindow)) && - WINDOW_IS_INTERNAL(w))) + (WINDOW_IS_INTERNAL(w) || WINDOW_IS_DOCK(w)))) /* ...then process the event, otherwise ignore it */ { used = event_handle_user_input(client, e); @@ -1712,12 +1712,6 @@ static void event_handle_client(ObClient *client, XEvent *e) static void event_handle_dock(ObDock *s, XEvent *e) { switch (e->type) { - case ButtonPress: - if (e->xbutton.button == 1) - stacking_raise(DOCK_AS_WINDOW(s)); - else if (e->xbutton.button == 2) - stacking_lower(DOCK_AS_WINDOW(s)); - break; case EnterNotify: dock_hide(FALSE); break; diff --git a/openbox/frame.c b/openbox/frame.c index 9c065c7..bd9527b 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -1368,18 +1368,27 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_CLOSE; else if (!g_ascii_strcasecmp("MoveResize", name)) return OB_FRAME_CONTEXT_MOVE_RESIZE; + else if (!g_ascii_strcasecmp("Dock", name)) + return OB_FRAME_CONTEXT_DOCK; + return OB_FRAME_CONTEXT_NONE; } ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) { ObFrame *self; + ObWindow *obwin; if (moveresize_in_progress) return OB_FRAME_CONTEXT_MOVE_RESIZE; if (win == obt_root(ob_screen)) - return OB_FRAME_CONTEXT_ROOT ; + return OB_FRAME_CONTEXT_ROOT; + if ((obwin = window_find(win))) { + if (WINDOW_IS_DOCK(obwin)) { + return OB_FRAME_CONTEXT_DOCK; + } + } if (client == NULL) return OB_FRAME_CONTEXT_NONE; if (win == client->window) { /* conceptually, this is the desktop, as far as users are diff --git a/openbox/frame.h b/openbox/frame.h index 0e28b9f..915c08d 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -53,6 +53,7 @@ typedef enum { /*! This is a special context, which occurs while dragging a window in a move/resize */ OB_FRAME_CONTEXT_MOVE_RESIZE, + OB_FRAME_CONTEXT_DOCK, OB_FRAME_NUM_CONTEXTS } ObFrameContext; diff --git a/openbox/mouse.c b/openbox/mouse.c index 567ec4d..ddf6851 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -66,6 +66,7 @@ ObFrameContext mouse_button_frame_context(ObFrameContext context, case OB_FRAME_CONTEXT_MOVE_RESIZE: case OB_FRAME_CONTEXT_LEFT: case OB_FRAME_CONTEXT_RIGHT: + case OB_FRAME_CONTEXT_DOCK: break; case OB_FRAME_CONTEXT_ROOT: x = OB_FRAME_CONTEXT_DESKTOP; -- 1.9.1