g_hash_table_replace(menu_hash, self->name, self);
+ /* Each menu has a single more_menu. When the menu spills past what
+ can fit on the screen, a new menu frame entry is created from this
+ more_menu, and a new menu frame for the submenu is created for this
+ menu, also pointing to the more_menu.
+
+ This can be done multiple times using the same more_menu.
+
+ more_menu->more_menu will always be NULL, since there is only 1 for
+ each menu. */
self->more_menu = g_new0(ObMenu, 1);
self->more_menu->name = _("More...");
self->more_menu->title = _("More...");
void menu_set_show_func(ObMenu *self, ObMenuShowFunc func)
{
- do {
- self->show_func = func;
- self = self->more_menu;
- } while (self);
+ self->show_func = func;
+ self->more_menu->show_func = func; /* keep it in sync */
}
void menu_set_hide_func(ObMenu *self, ObMenuHideFunc func)
{
- do {
- self->hide_func = func;
- self = self->more_menu;
- } while (self);
+ self->hide_func = func;
+ self->more_menu->hide_func = func; /* keep it in sync */
}
void menu_set_update_func(ObMenu *self, ObMenuUpdateFunc func)
{
- do {
- self->update_func = func;
- self = self->more_menu;
- } while (self);
+ self->update_func = func;
+ self->more_menu->update_func = func; /* keep it in sync */
}
void menu_set_execute_func(ObMenu *self, ObMenuExecuteFunc func)
{
- do {
- self->execute_func = func;
- self = self->more_menu;
- } while (self);
+ self->execute_func = func;
+ self->more_menu->execute_func = func; /* keep it in sync */
}
void menu_set_destroy_func(ObMenu *self, ObMenuDestroyFunc func)
{
- do {
- self->destroy_func = func;
- self = self->more_menu;
- } while (self);
+ self->destroy_func = func;
+ self->more_menu->destroy_func = func; /* keep it in sync */
}
void menu_set_place_func(ObMenu *self, ObMenuPlaceFunc func)
{
- do {
- self->place_func = func;
- self = self->more_menu;
- } while (self);
+ self->place_func = func;
+ self->more_menu->place_func = func; /* keep it in sync */
}
ObMenuEntry* menu_find_entry_id(ObMenu *self, gint id)
showhide
modal2
skiptaskbar
+skiptaskbar2
modal3
override
grouptran
/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
- modal.c for the Openbox window manager
+ skiptaskbar.c for the Openbox window manager
Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
int main () {
Display *display;
- Window parent, child;
+ Window win;
XEvent report;
- Atom state, modal;
+ Atom state, skip;
int x=10,y=10,h=400,w=400;
display = XOpenDisplay(NULL);
}
state = XInternAtom(display, "_NET_WM_STATE", True);
- modal = XInternAtom(display, "_NET_WM_STATE_MODAL", True);
+ skip = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", True);
- parent = XCreateWindow(display, RootWindow(display, 0),
- x, y, w, h, 10, CopyFromParent, CopyFromParent,
+ win = XCreateWindow(display, RootWindow(display, 0),
+ x, y, w, h, 10, CopyFromParent, CopyFromParent,
CopyFromParent, 0, 0);
- child = XCreateWindow(display, RootWindow(display, 0),
- x, y, w/2, h/2, 10, CopyFromParent, CopyFromParent,
- CopyFromParent, 0, 0);
- XSetWindowBackground(display,parent,WhitePixel(display,0));
- XSetWindowBackground(display,child,BlackPixel(display,0));
+ XSetWindowBackground(display,win,WhitePixel(display,0));
- XSetTransientForHint(display, child, parent);
- XChangeProperty(display, child, state, XA_ATOM, 32,
- PropModeReplace, (unsigned char*)&modal, 1);
-
- XMapWindow(display, parent);
- XMapWindow(display, child);
+ XChangeProperty(display, win, state, XA_ATOM, 32,
+ PropModeReplace, (unsigned char*)&skip, 1);
+
+ XMapWindow(display, win);
XFlush(display);
while (1) {
--- /dev/null
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+ skiptaskbar2.c for the Openbox window manager
+ Copyright (c) 2007 Dana Jansens
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+int main () {
+ Display *display;
+ Window win;
+ XEvent report, ce;
+ Atom state, skip;
+ int x=10,y=10,h=400,w=400;
+
+ display = XOpenDisplay(NULL);
+
+ if (display == NULL) {
+ fprintf(stderr, "couldn't connect to X server :0\n");
+ return 0;
+ }
+
+ state = XInternAtom(display, "_NET_WM_STATE", True);
+ skip = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", True);
+
+ win = XCreateWindow(display, RootWindow(display, 0),
+ x, y, w, h, 10, CopyFromParent, CopyFromParent,
+ CopyFromParent, 0, 0);
+
+ XSetWindowBackground(display,win,WhitePixel(display,0));
+
+ XMapWindow(display, win);
+ XFlush(display);
+
+ sleep(1);
+
+ ce.xclient.type = ClientMessage;
+ ce.xclient.message_type = state;
+ ce.xclient.display = display;
+ ce.xclient.window = win;
+ ce.xclient.format = 32;
+ ce.xclient.data.l[0] = 1;
+ ce.xclient.data.l[1] = skip;
+ ce.xclient.data.l[2] = 0;
+ XSendEvent(display, RootWindow(display, DefaultScreen(display)),
+ False, SubstructureNotifyMask | SubstructureRedirectMask, &ce);
+
+ while (1) {
+ XNextEvent(display, &report);
+ }
+
+ return 1;
+}