move focus_cycle_popup into its own file
This commit is contained in:
parent
eb09b1873d
commit
83eb922012
4 changed files with 34 additions and 164 deletions
|
@ -177,6 +177,8 @@ openbox_openbox_SOURCES = \
|
|||
openbox/focus_cycle.h \
|
||||
openbox/focus_cycle_indicator.c \
|
||||
openbox/focus_cycle_indicator.h \
|
||||
openbox/focus_cycle_popup.c \
|
||||
openbox/focus_cycle_popup.h \
|
||||
openbox/frame.c \
|
||||
openbox/frame.h \
|
||||
openbox/framerender.c \
|
||||
|
|
|
@ -19,54 +19,23 @@
|
|||
|
||||
#include "focus_cycle.h"
|
||||
#include "focus_cycle_indicator.h"
|
||||
#include "focus_cycle_popup.h"
|
||||
#include "client.h"
|
||||
#include "frame.h"
|
||||
#include "focus.h"
|
||||
#include "screen.h"
|
||||
#include "openbox.h"
|
||||
#include "popup.h"
|
||||
#include "debug.h"
|
||||
#include "group.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <glib.h>
|
||||
|
||||
#define FOCUS_CYCLE_ICON_SIZE 48
|
||||
|
||||
struct _ObFocusCyclePopup
|
||||
{
|
||||
ObWindow obwin;
|
||||
Window bg;
|
||||
|
||||
Window text;
|
||||
|
||||
RrAppearance *a_bg;
|
||||
RrAppearance *a_text;
|
||||
gint textw;
|
||||
gint h;
|
||||
gint minw;
|
||||
gint maxw;
|
||||
gboolean mapped;
|
||||
};
|
||||
|
||||
ObClient *focus_cycle_target = NULL;
|
||||
|
||||
static ObIconPopup *focus_cycle_popup;
|
||||
|
||||
static void focus_cycle_destroy_notify (ObClient *client, gpointer data);
|
||||
static gboolean focus_target_valid (ObClient *ft,
|
||||
gboolean all_desktops,
|
||||
gboolean dock_windows,
|
||||
gboolean desktop_windows);
|
||||
static gboolean focus_target_has_siblings (ObClient *ft,
|
||||
gboolean all_desktops);
|
||||
static gchar *popup_get_name (ObClient *c,
|
||||
ObClient **nametarget);
|
||||
static void popup_cycle (ObClient *c,
|
||||
gboolean show,
|
||||
gboolean all_desktops,
|
||||
gboolean dock_windows,
|
||||
gboolean desktop_windows);
|
||||
static ObClient *focus_find_directional (ObClient *c,
|
||||
ObDirection dir,
|
||||
gboolean dock_windows,
|
||||
|
@ -78,18 +47,16 @@ static ObClient *focus_find_directional (ObClient *c,
|
|||
|
||||
void focus_cycle_startup(gboolean reconfig)
|
||||
{
|
||||
focus_cycle_popup = icon_popup_new(TRUE);
|
||||
if (reconfig) return;
|
||||
|
||||
if (!reconfig)
|
||||
client_add_destroy_notify(focus_cycle_destroy_notify, NULL);
|
||||
client_add_destroy_notify(focus_cycle_destroy_notify, NULL);
|
||||
}
|
||||
|
||||
void focus_cycle_shutdown(gboolean reconfig)
|
||||
{
|
||||
icon_popup_free(focus_cycle_popup);
|
||||
if (reconfig) return;
|
||||
|
||||
if (!reconfig)
|
||||
client_remove_destroy_notify(focus_cycle_destroy_notify);
|
||||
client_remove_destroy_notify(focus_cycle_destroy_notify);
|
||||
}
|
||||
|
||||
void focus_cycle_stop()
|
||||
|
@ -98,110 +65,6 @@ void focus_cycle_stop()
|
|||
focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
|
||||
}
|
||||
|
||||
|
||||
static gchar *popup_get_name(ObClient *c, ObClient **nametarget)
|
||||
{
|
||||
ObClient *p;
|
||||
gchar *title = NULL;
|
||||
const gchar *desk = NULL;
|
||||
gchar *ret;
|
||||
|
||||
/* find our highest direct parent, including non-normal windows */
|
||||
for (p = c; p->transient_for && p->transient_for != OB_TRAN_GROUP;
|
||||
p = p->transient_for);
|
||||
|
||||
if (c->desktop != DESKTOP_ALL && c->desktop != screen_desktop)
|
||||
desk = screen_desktop_names[c->desktop];
|
||||
|
||||
/* use the transient's parent's title/icon if we don't have one */
|
||||
if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title)))
|
||||
title = g_strdup(p->iconic ? p->icon_title : p->title);
|
||||
|
||||
if (title == NULL)
|
||||
title = g_strdup(c->iconic ? c->icon_title : c->title);
|
||||
|
||||
if (desk)
|
||||
ret = g_strdup_printf("%s [%s]", title, desk);
|
||||
else {
|
||||
ret = title;
|
||||
title = NULL;
|
||||
}
|
||||
g_free(title);
|
||||
|
||||
/* set this only if we're returning true and they asked for it */
|
||||
if (ret && nametarget) *nametarget = p;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void popup_cycle(ObClient *c, gboolean show,
|
||||
gboolean all_desktops, gboolean dock_windows,
|
||||
gboolean desktop_windows)
|
||||
{
|
||||
gchar *showtext = NULL;
|
||||
ObClient *showtarget;
|
||||
|
||||
if (!show) {
|
||||
icon_popup_hide(focus_cycle_popup);
|
||||
return;
|
||||
}
|
||||
|
||||
/* do this stuff only when the dialog is first showing */
|
||||
if (!focus_cycle_popup->popup->mapped &&
|
||||
!focus_cycle_popup->popup->delay_mapped)
|
||||
{
|
||||
Rect *a;
|
||||
gchar **names;
|
||||
GList *targets = NULL, *it;
|
||||
gint n = 0, i;
|
||||
|
||||
/* position the popup */
|
||||
a = screen_physical_area_monitor(0);
|
||||
icon_popup_position(focus_cycle_popup, CenterGravity,
|
||||
a->x + a->width / 2, a->y + a->height / 2);
|
||||
icon_popup_height(focus_cycle_popup, POPUP_HEIGHT);
|
||||
icon_popup_min_width(focus_cycle_popup, POPUP_WIDTH);
|
||||
icon_popup_max_width(focus_cycle_popup,
|
||||
MAX(a->width/3, POPUP_WIDTH));
|
||||
|
||||
|
||||
/* make its width to be the width of all the possible titles */
|
||||
|
||||
/* build a list of all the valid focus targets */
|
||||
for (it = focus_order; it; it = g_list_next(it)) {
|
||||
ObClient *ft = it->data;
|
||||
if (focus_target_valid(ft, all_desktops, dock_windows
|
||||
, desktop_windows))
|
||||
{
|
||||
targets = g_list_prepend(targets, ft);
|
||||
++n;
|
||||
}
|
||||
}
|
||||
/* make it null terminated so we can use g_strfreev */
|
||||
names = g_new(char*, n+1);
|
||||
for (it = targets, i = 0; it; it = g_list_next(it), ++i) {
|
||||
ObClient *ft = it->data, *t;
|
||||
names[i] = popup_get_name(ft, &t);
|
||||
|
||||
/* little optimization.. save this text and client, so we dont
|
||||
have to get it again */
|
||||
if (ft == c) {
|
||||
showtext = g_strdup(names[i]);
|
||||
showtarget = t;
|
||||
}
|
||||
}
|
||||
names[n] = NULL;
|
||||
|
||||
icon_popup_text_width_to_strings(focus_cycle_popup, names, n);
|
||||
g_strfreev(names);
|
||||
}
|
||||
|
||||
|
||||
if (!showtext) showtext = popup_get_name(c, &showtarget);
|
||||
icon_popup_show(focus_cycle_popup, showtext,
|
||||
client_icon(showtarget, 48, 48));
|
||||
g_free(showtext);
|
||||
}
|
||||
|
||||
static void focus_cycle_destroy_notify(ObClient *client, gpointer data)
|
||||
{
|
||||
/* end cycling if the target disappears. CurrentTime is fine, time won't
|
||||
|
@ -224,7 +87,7 @@ static gboolean focus_target_has_siblings(ObClient *ft, gboolean all_desktops)
|
|||
ObClient *c = it->data;
|
||||
/* check that it's not a helper window to avoid infinite recursion */
|
||||
if (c != ft && !client_helper(c) &&
|
||||
focus_target_valid(c, all_desktops, FALSE, FALSE))
|
||||
focus_cycle_target_valid(c, all_desktops, FALSE, FALSE))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -232,12 +95,10 @@ static gboolean focus_target_has_siblings(ObClient *ft, gboolean all_desktops)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/*! @param allow_helpers This is used for calling itself recursively while
|
||||
checking helper windows. */
|
||||
static gboolean focus_target_valid(ObClient *ft,
|
||||
gboolean all_desktops,
|
||||
gboolean dock_windows,
|
||||
gboolean desktop_windows)
|
||||
gboolean focus_cycle_target_valid(ObClient *ft,
|
||||
gboolean all_desktops,
|
||||
gboolean dock_windows,
|
||||
gboolean desktop_windows)
|
||||
{
|
||||
gboolean ok = FALSE;
|
||||
|
||||
|
@ -329,17 +190,18 @@ void focus_cycle(gboolean forward, gboolean all_desktops,
|
|||
if (it == NULL) it = g_list_last(list);
|
||||
}
|
||||
ft = it->data;
|
||||
if (focus_target_valid(ft, all_desktops, dock_windows,
|
||||
desktop_windows))
|
||||
if (focus_cycle_target_valid(ft, all_desktops, dock_windows,
|
||||
desktop_windows))
|
||||
{
|
||||
if (interactive) {
|
||||
if (ft != focus_cycle_target) { /* prevents flicker */
|
||||
focus_cycle_target = ft;
|
||||
focus_cycle_draw_indicator(ft);
|
||||
}
|
||||
/* same arguments as focus_target_valid */
|
||||
popup_cycle(ft, dialog, all_desktops, dock_windows,
|
||||
desktop_windows);
|
||||
if (dialog)
|
||||
/* same arguments as focus_target_valid */
|
||||
focus_cycle_popup_show(ft, all_desktops, dock_windows,
|
||||
desktop_windows);
|
||||
return;
|
||||
} else if (ft != focus_cycle_target) {
|
||||
focus_cycle_target = ft;
|
||||
|
@ -361,7 +223,7 @@ done_cycle:
|
|||
|
||||
if (interactive) {
|
||||
focus_cycle_draw_indicator(NULL);
|
||||
popup_cycle(ft, FALSE, FALSE, FALSE, FALSE);
|
||||
focus_cycle_popup_hide();
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -505,8 +367,8 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
|
|||
GList *it;
|
||||
|
||||
for (it = focus_order; it; it = g_list_next(it))
|
||||
if (focus_target_valid(it->data, FALSE, dock_windows,
|
||||
desktop_windows))
|
||||
if (focus_cycle_target_valid(it->data, FALSE, dock_windows,
|
||||
desktop_windows))
|
||||
ft = it->data;
|
||||
}
|
||||
|
||||
|
@ -516,15 +378,13 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
|
|||
focus_cycle_draw_indicator(ft);
|
||||
}
|
||||
}
|
||||
if (focus_cycle_target) {
|
||||
if (focus_cycle_target && dialog) {
|
||||
/* same arguments as focus_target_valid */
|
||||
popup_cycle(focus_cycle_target, dialog, FALSE, dock_windows,
|
||||
desktop_windows);
|
||||
if (dialog)
|
||||
return;
|
||||
focus_cycle_popup_show(focus_cycle_target, FALSE, dock_windows,
|
||||
desktop_windows);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
done_cycle:
|
||||
if (done && focus_cycle_target)
|
||||
client_activate(focus_cycle_target, FALSE, TRUE);
|
||||
|
@ -533,7 +393,7 @@ done_cycle:
|
|||
focus_cycle_target = NULL;
|
||||
|
||||
focus_cycle_draw_indicator(NULL);
|
||||
popup_cycle(ft, FALSE, FALSE, FALSE, FALSE);
|
||||
focus_cycle_popup_hide();
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -44,4 +44,9 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
|
|||
|
||||
void focus_cycle_stop();
|
||||
|
||||
gboolean focus_cycle_target_valid(struct _ObClient *ft,
|
||||
gboolean all_desktops,
|
||||
gboolean dock_windows,
|
||||
gboolean desktop_windows);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "focus.h"
|
||||
#include "focus_cycle.h"
|
||||
#include "focus_cycle_indicator.h"
|
||||
#include "focus_cycle_popup.h"
|
||||
#include "moveresize.h"
|
||||
#include "frame.h"
|
||||
#include "keyboard.h"
|
||||
|
@ -287,6 +288,7 @@ gint main(gint argc, gchar **argv)
|
|||
focus_startup(reconfigure);
|
||||
focus_cycle_startup(reconfigure);
|
||||
focus_cycle_indicator_startup(reconfigure);
|
||||
focus_cycle_popup_startup(reconfigure);
|
||||
window_startup(reconfigure);
|
||||
sn_startup(reconfigure);
|
||||
screen_startup(reconfigure);
|
||||
|
@ -352,6 +354,7 @@ gint main(gint argc, gchar **argv)
|
|||
propwin_shutdown(reconfigure);
|
||||
grab_shutdown(reconfigure);
|
||||
screen_shutdown(reconfigure);
|
||||
focus_cycle_popup_shutdown(reconfigure);
|
||||
focus_cycle_indicator_shutdown(reconfigure);
|
||||
focus_cycle_shutdown(reconfigure);
|
||||
focus_shutdown(reconfigure);
|
||||
|
|
Loading…
Reference in a new issue