From 7a024a1f0404b4781c5d71d0afaaba14d5661cc6 Mon Sep 17 00:00:00 2001 From: Benoit Gschwind (Noth Date: Sat, 16 Feb 2008 14:03:26 +0100 Subject: [PATCH] Implement exemple of trigger function use. --- engines/default/plugin.c | 111 ++++++++++++++++++++++++++----------------- openbox/client.c | 52 ++++++++++++++------ openbox/engine_interface.h | 22 +++++++-- 3 files changed, 121 insertions(+), 64 deletions(-) diff --git a/engines/default/plugin.c b/engines/default/plugin.c index 9040fb3..1f5f689 100644 --- a/engines/default/plugin.c +++ b/engines/default/plugin.c @@ -729,7 +729,7 @@ void frame_begin_iconify_animation(gpointer _self, gboolean iconifying) if (new_anim) { obt_main_loop_timeout_remove_data(plugin.ob_main_loop, frame_animate_iconify, self, FALSE); - obt_main_loop_timeout_add(plugin.ob_main_loop, + obt_main_loop_timeout_add(plugin.ob_main_loop, FRAME_ANIMATE_ICONIFY_STEP_TIME, frame_animate_iconify, self, g_direct_equal, NULL); @@ -1093,7 +1093,7 @@ void frame_update_layout(gpointer _self, gboolean is_resize, gboolean is_fake) if (self->decorations & OB_FRAME_DECOR_HANDLE && theme_config.handle_height > 0) { XMoveResizeWindow(plugin.ob_display, self->handletop, - theme_config.grip_width + self->bwidth + sidebwidth, + theme_config.grip_width + self->bwidth + sidebwidth, FRAME_HANDLE_Y(self), self->width - (theme_config.grip_width + sidebwidth) * 2, self->bwidth); XMapWindow(plugin.ob_display, self->handletop); @@ -1108,13 +1108,13 @@ void frame_update_layout(gpointer _self, gboolean is_resize, gboolean is_fake) theme_config.handle_height); XMoveResizeWindow(plugin.ob_display, self->lgriptop, - sidebwidth, + sidebwidth, FRAME_HANDLE_Y(self), theme_config.grip_width + self->bwidth, self->bwidth); XMoveResizeWindow(plugin.ob_display, self->rgriptop, self->size.left + self->client_area.width + self->size.right - self->bwidth - - sidebwidth - theme_config.grip_width, + - sidebwidth - theme_config.grip_width, FRAME_HANDLE_Y(self), theme_config.grip_width + self->bwidth, self->bwidth); @@ -1156,7 +1156,7 @@ void frame_update_layout(gpointer _self, gboolean is_resize, gboolean is_fake) if (self->decorations & OB_FRAME_DECOR_HANDLE && theme_config.handle_height > 0) { - XMoveResizeWindow(plugin.ob_display, self->handle, sidebwidth, + XMoveResizeWindow(plugin.ob_display, self->handle, sidebwidth, FRAME_HANDLE_Y(self) + self->bwidth, self->width, theme_config.handle_height); XMapWindow(plugin.ob_display, self->handle); @@ -1778,45 +1778,68 @@ void layout_title(ObDefaultFrame * self) XUnmapWindow(plugin.ob_display, self->label); } -void frame_trigger(gpointer frame, ObFrameTrigger trigger_name) +void trigger_none (gpointer self) {} +void trigger_iconify(gpointer self) {} +void trigger_uniconnity(gpointer self) {} +void trigger_iconify_toggle(gpointer self) {} +void trigger_shade(gpointer self) {} +void trigger_unshade(gpointer self) {} +void trigger_shade_toggle(gpointer self) {} +void trigger_max(gpointer self) {} +void trigger_unmax(gpointer self) {} +void trigger_max_troggle(gpointer self) {} +void trigger_max_vert(gpointer self) {OBDEFAULTFRAME(self)->max_vert = TRUE;} +void trigger_unmax_vert(gpointer self) {OBDEFAULTFRAME(self)->max_vert = FALSE;} +void trigger_max_toggle(gpointer self) {} +void trigger_max_horz(gpointer self) {OBDEFAULTFRAME(self)->max_horz = TRUE;} +void trigger_unmax_horz(gpointer self) {OBDEFAULTFRAME(self)->max_horz = FALSE;} +void trigger_max_horz_toggle(gpointer self) {} +void trigger_plugin1(gpointer self) {} +void trigger_plugin2(gpointer self) {} +void trigger_plugin3(gpointer self) {} +void trigger_plugin4(gpointer self) {} +void trigger_plugin5(gpointer self) {} +void trigger_plugin6(gpointer self) {} +void trigger_plugin7(gpointer self) {} +void trigger_plugin8(gpointer self) {} +void trigger_plugin9(gpointer self) {} + +void frame_trigger(gpointer self, ObFrameTrigger trigger_name) { - switch(trigger_name) + + static void (*trigger_func[64])(gpointer) = { + trigger_none, + trigger_iconify, + trigger_uniconnity, + trigger_iconify_toggle, + trigger_shade, + trigger_unshade, + trigger_shade_toggle, + trigger_max, + trigger_unmax, + trigger_max_troggle, + trigger_max_vert, + trigger_unmax_vert, + trigger_max_toggle, + trigger_max_horz, + trigger_unmax_horz, + trigger_max_horz_toggle, + trigger_plugin1, + trigger_plugin2, + trigger_plugin3, + trigger_plugin4, + trigger_plugin5, + trigger_plugin6, + trigger_plugin7, + trigger_plugin8, + trigger_plugin9, + NULL, + }; + + void (*call_trigger_func)(gpointer) = trigger_func[trigger_name]; + if(!call_trigger_func) { - case OB_TRIGGER_NORMAL: - /* TODO */ - break; - case OB_TRIGGER_INCONIFIED: - /* TODO */ - break; - case OB_TRIGGER_SHADED: - /* TODO */ - break; - case OB_TRIGGER_MAX: - /* TODO */ - break; - case OB_TRIGGER_MAX_VERT: - /* TODO */ - break; - case OB_TRIGGER_MAX_HORZ: - /* TODO */ - break; - case OB_TRIGGER_NO_BORDER: - /* TODO */ - break; - case OB_TRIGGER_PLUGIN1: - /* TODO */ - break; - case OB_TRIGGER_PLUGIN2: - /* TODO */ - break; - case OB_TRIGGER_PLUGIN3: - /* TODO */ - break; - case OB_TRIGGER_PLUGIN4: - /* TODO */ - break; - default: - break; + call_trigger_func (self); } } @@ -1863,8 +1886,8 @@ ObFramePlugin plugin = { 0, //gpointer handler; frame_is_visible, /* */ frame_is_max_horz, /* */ frame_is_max_vert, /* */ - - NULL, /* */ + + frame_trigger, /* */ load_theme_config, /* */ diff --git a/openbox/client.c b/openbox/client.c index c6b5781..fcfd854 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -696,6 +696,8 @@ void client_unmanage(ObClient *self) } self->fullscreen = self->max_horz = self->max_vert = FALSE; + render_plugin->frame_trigger(self, OB_TRIGGER_UNMAX_VERT); + render_plugin->frame_trigger(self, OB_TRIGGER_UNMAX_HORZ); /* let it be moved and resized no matter what */ self->functions = OB_CLIENT_FUNC_MOVE | OB_CLIENT_FUNC_RESIZE; self->decorations = 0; /* unmanaged windows have no decor */ @@ -885,8 +887,19 @@ static void client_restore_session_state(ObClient *self) self->max_vert = self->session->max_vert; self->undecorated = self->session->undecorated; - render_plugin->frame_set_is_max_horz (self->frame, self->max_horz); - render_plugin->frame_set_is_max_vert (self->frame, self->max_vert); + if (self->session->max_horz) { + render_plugin->frame_trigger(self->frame, OB_TRIGGER_MAX_HORZ); + } + else { + render_plugin->frame_trigger(self->frame, OB_TRIGGER_UNMAX_HORZ); + } + + if (self->session->max_vert) { + render_plugin->frame_trigger(self->frame, OB_TRIGGER_MAX_VERT); + } + else { + render_plugin->frame_trigger(self->frame, OB_TRIGGER_UNMAX_VERT); + } } static gboolean client_restore_session_stacking(ObClient *self) @@ -1200,10 +1213,14 @@ static void client_get_state(ObClient *self) self->skip_pager = TRUE; else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN)) self->fullscreen = TRUE; - else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT)) + else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT)) { self->max_vert = TRUE; - else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ)) + render_plugin->frame_trigger(self->frame, OB_TRIGGER_MAX_VERT); + } + else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ)) { self->max_horz = TRUE; + render_plugin->frame_trigger(self->frame, OB_TRIGGER_MAX_HORZ); + } else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_ABOVE)) self->above = TRUE; else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_BELOW)) @@ -1809,9 +1826,12 @@ static void client_change_allowed_actions(ObClient *self) if (!(self->functions & OB_CLIENT_FUNC_MAXIMIZE) && (self->max_horz || self->max_vert)) { if (self->frame) client_maximize(self, FALSE, 0); - else self->max_vert = self->max_horz = FALSE; - render_plugin->frame_set_is_max_horz (self->frame, self->max_horz); - render_plugin->frame_set_is_max_vert (self->frame, self->max_vert); + else { + self->max_vert = self->max_horz = FALSE; + render_plugin->frame_trigger (self->frame, OB_TRIGGER_UNMAX_VERT); + render_plugin->frame_trigger (self->frame, OB_TRIGGER_UNMAX_HORZ); + } + } } @@ -2348,7 +2368,7 @@ static void client_change_state(ObClient *self) OBT_PROP_SETA32(self->window, NET_WM_STATE, ATOM, netstate, num); if (self->frame) - render_plugin->frame_update_layout (self->frame, FALSE, FALSE); + render_plugin->frame_update_layout (self->frame, FALSE, FALSE); } ObClient *client_search_focus_tree(ObClient *self) @@ -2692,8 +2712,6 @@ static void client_apply_startup_state(ObClient *self, render_plugin->frame_set_client_area (self->frame, self->area); render_plugin->frame_set_decorations (self->frame, self->decorations); render_plugin->frame_update_layout (self->frame, FALSE, FALSE); - render_plugin->frame_set_is_max_horz (self->frame, self->max_horz); - render_plugin->frame_set_is_max_vert (self->frame, self->max_vert); client_configure(self, x, y, w, h, FALSE, TRUE, FALSE); /* set the desktop hint, to make sure that it always exists */ @@ -3266,13 +3284,15 @@ void client_maximize(ObClient *self, gboolean max, gint dir) } } - if (dir == 0 || dir == 1) /* horz */ - self->max_horz = max; - if (dir == 0 || dir == 2) /* vert */ - self->max_vert = max; + if (dir == 0 || dir == 1) { + self->max_horz = max; /* horz */ + render_plugin->frame_trigger(self->frame, max? OB_TRIGGER_MAX_HORZ : OB_TRIGGER_UNMAX_HORZ); + } - render_plugin->frame_set_is_max_horz (self->frame, self->max_horz); - render_plugin->frame_set_is_max_vert (self->frame, self->max_vert); + if (dir == 0 || dir == 2){ + self->max_vert = max; /* vert */ + render_plugin->frame_trigger(self->frame, max? OB_TRIGGER_MAX_VERT : OB_TRIGGER_UNMAX_VERT); + } client_change_state(self); /* change the state hints on the client */ diff --git a/openbox/engine_interface.h b/openbox/engine_interface.h index 6909eb2..28f0408 100644 --- a/openbox/engine_interface.h +++ b/openbox/engine_interface.h @@ -91,17 +91,31 @@ typedef enum * It's mimic signal (USR1 and USR2) */ typedef enum { - OB_TRIGGER_NORMAL, - OB_TRIGGER_INCONIFIED, - OB_TRIGGER_SHADED, + OB_TRIGGER_NONE, + OB_TRIGGER_INCONIFY, + OB_TRIGGER_UNICONIFY, + OB_TRIGGER_INCONIFY_TOGGLE, + OB_TRIGGER_SHADE, + OB_TRIGGER_UNSHADE, + OB_TRIGGER_SHADE_TOGGLE, OB_TRIGGER_MAX, + OB_TRIGGER_UNMAX, + OB_TRIGGER_MAX_TOGGLE, OB_TRIGGER_MAX_VERT, + OB_TRIGGER_UNMAX_VERT, + OB_TRIGGER_MAX_VERT_TOGGLE, OB_TRIGGER_MAX_HORZ, - OB_TRIGGER_NO_BORDER, + OB_TRIGGER_UNMAX_HORZ, + OB_TRIGGER_MAX_HORZ_TOGGLE, OB_TRIGGER_PLUGIN1, OB_TRIGGER_PLUGIN2, OB_TRIGGER_PLUGIN3, OB_TRIGGER_PLUGIN4, /* ... */ + OB_TRIGGER_PLUGIN5, /* ... */ + OB_TRIGGER_PLUGIN6, /* ... */ + OB_TRIGGER_PLUGIN7, /* ... */ + OB_TRIGGER_PLUGIN8, /* ... */ + OB_TRIGGER_PLUGIN9, /* ... */ } ObFrameTrigger; struct _ObFramePlugin -- 1.5.3.7