diff options
author | Gediminas Liktaras <gliktaras@gmail.com> | 2011-12-08 13:34:09 (GMT) |
---|---|---|
committer | Paul Tagliamonte <paultag@fluxbox.org> | 2011-12-10 16:13:19 (GMT) |
commit | cd339169d1961eb508ea89cee2609ec6d0fc0c15 (patch) | |
tree | 01acd158a03fb17a72e067ff0b36701da75e49dc /src | |
parent | 85ac5c4b2c6a526992f483a6e91867dc2f82a19e (diff) | |
download | fluxbox_paul-cd339169d1961eb508ea89cee2609ec6d0fc0c15.zip fluxbox_paul-cd339169d1961eb508ea89cee2609ec6d0fc0c15.tar.bz2 |
fbcompose - A compositing addon for fluxbox window manager.
fbcompose(1) is an optional compositing addon for fluxbox window manager. It
augments fluxbox with a number of graphical features. Most notably, fbcompose
allows fluxbox to properly display applications that require compositing
(docky, for example), adds support for true window transparency (as opposed to
fluxbox's pseudo transparency) and provides a plugin framework to extend the
compositor's functionality.
As this is still a beta version of the compositor, the bugs are likely.
Diffstat (limited to 'src')
-rw-r--r-- | src/FbAtoms.cc | 2 | ||||
-rw-r--r-- | src/FbAtoms.hh | 4 | ||||
-rw-r--r-- | src/FbTk/FbWindow.cc | 11 | ||||
-rw-r--r-- | src/IconButton.cc | 9 | ||||
-rw-r--r-- | src/IconButton.hh | 2 | ||||
-rw-r--r-- | src/Window.cc | 25 | ||||
-rw-r--r-- | src/Window.hh | 3 |
7 files changed, 50 insertions, 6 deletions
diff --git a/src/FbAtoms.cc b/src/FbAtoms.cc index 409a99f..95a89a7 100644 --- a/src/FbAtoms.cc +++ b/src/FbAtoms.cc | |||
@@ -40,6 +40,8 @@ FbAtoms::FbAtoms() { | |||
40 | motif_wm_hints = XInternAtom(dpy, "_MOTIF_WM_HINTS", False); | 40 | motif_wm_hints = XInternAtom(dpy, "_MOTIF_WM_HINTS", False); |
41 | 41 | ||
42 | blackbox_attributes = XInternAtom(dpy, "_BLACKBOX_ATTRIBUTES", False); | 42 | blackbox_attributes = XInternAtom(dpy, "_BLACKBOX_ATTRIBUTES", False); |
43 | current_iconbar_item = XInternAtom(dpy, "_FLUXBOX_CURRENT_ICONBAR_ITEM", False); | ||
44 | resize_rect = XInternAtom(dpy, "_FLUXBOX_RECONFIGURE_RECT", False); | ||
43 | 45 | ||
44 | s_singleton = this; | 46 | s_singleton = this; |
45 | } | 47 | } |
diff --git a/src/FbAtoms.hh b/src/FbAtoms.hh index 3ed52a5..09920f3 100644 --- a/src/FbAtoms.hh +++ b/src/FbAtoms.hh | |||
@@ -42,12 +42,16 @@ public: | |||
42 | // these atoms are for normal app->WM interaction beyond the scope of the | 42 | // these atoms are for normal app->WM interaction beyond the scope of the |
43 | // ICCCM... | 43 | // ICCCM... |
44 | Atom getFluxboxAttributesAtom() const { return blackbox_attributes; } | 44 | Atom getFluxboxAttributesAtom() const { return blackbox_attributes; } |
45 | Atom getFluxboxCurrentIconbarItemAtom() const { return current_iconbar_item; } | ||
46 | Atom getFluxboxResizeRectAtom() const { return resize_rect; } | ||
45 | 47 | ||
46 | private: | 48 | private: |
47 | FbAtoms(); | 49 | FbAtoms(); |
48 | 50 | ||
49 | Atom blackbox_attributes; | 51 | Atom blackbox_attributes; |
52 | Atom current_iconbar_item; | ||
50 | Atom motif_wm_hints; | 53 | Atom motif_wm_hints; |
54 | Atom resize_rect; | ||
51 | Atom xa_wm_protocols; | 55 | Atom xa_wm_protocols; |
52 | Atom xa_wm_state; | 56 | Atom xa_wm_state; |
53 | Atom xa_wm_delete_window; | 57 | Atom xa_wm_delete_window; |
diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc index 8362733..cf2d348 100644 --- a/src/FbTk/FbWindow.cc +++ b/src/FbTk/FbWindow.cc | |||
@@ -64,7 +64,7 @@ FbWindow::FbWindow(const FbWindow& the_copy): | |||
64 | m_width(the_copy.width()), m_height(the_copy.height()), | 64 | m_width(the_copy.width()), m_height(the_copy.height()), |
65 | m_border_width(the_copy.borderWidth()), | 65 | m_border_width(the_copy.borderWidth()), |
66 | m_border_color(the_copy.borderColor()), | 66 | m_border_color(the_copy.borderColor()), |
67 | m_depth(the_copy.depth()), m_destroy(true), | 67 | m_depth(the_copy.depth()), m_destroy(the_copy.m_destroy), |
68 | m_lastbg_color_set(false), m_lastbg_color(0), m_lastbg_pm(0), | 68 | m_lastbg_color_set(false), m_lastbg_color(0), m_lastbg_pm(0), |
69 | m_renderer(the_copy.m_renderer) { | 69 | m_renderer(the_copy.m_renderer) { |
70 | the_copy.m_window = 0; | 70 | the_copy.m_window = 0; |
@@ -413,7 +413,6 @@ void FbWindow::setNew(Window win) { | |||
413 | m_window = win; | 413 | m_window = win; |
414 | 414 | ||
415 | if (m_window != 0) { | 415 | if (m_window != 0) { |
416 | updateGeometry(); | ||
417 | XWindowAttributes attr; | 416 | XWindowAttributes attr; |
418 | attr.screen = 0; | 417 | attr.screen = 0; |
419 | //get screen number | 418 | //get screen number |
@@ -622,16 +621,16 @@ bool FbWindow::updateGeometry() { | |||
622 | return false; | 621 | return false; |
623 | 622 | ||
624 | int old_x = m_x, old_y = m_y; | 623 | int old_x = m_x, old_y = m_y; |
625 | unsigned int old_width = m_width, old_height = m_height; | 624 | unsigned int old_border_width = m_border_width, old_width = m_width, old_height = m_height; |
626 | 625 | ||
627 | Window root; | 626 | Window root; |
628 | unsigned int border_width, depth; | 627 | unsigned int depth; |
629 | if (XGetGeometry(display(), m_window, &root, &m_x, &m_y, | 628 | if (XGetGeometry(display(), m_window, &root, &m_x, &m_y, |
630 | &m_width, &m_height, &border_width, &depth)) | 629 | &m_width, &m_height, &m_border_width, &depth)) |
631 | m_depth = depth; | 630 | m_depth = depth; |
632 | 631 | ||
633 | return (old_x != m_x || old_y != m_y || old_width != m_width || | 632 | return (old_x != m_x || old_y != m_y || old_width != m_width || |
634 | old_height != m_height); | 633 | old_height != m_height || old_border_width != m_border_width); |
635 | } | 634 | } |
636 | 635 | ||
637 | void FbWindow::create(Window parent, int x, int y, | 636 | void FbWindow::create(Window parent, int x, int y, |
diff --git a/src/IconButton.cc b/src/IconButton.cc index 7c70a63..6e7294e 100644 --- a/src/IconButton.cc +++ b/src/IconButton.cc | |||
@@ -24,7 +24,9 @@ | |||
24 | #include "IconbarTool.hh" | 24 | #include "IconbarTool.hh" |
25 | #include "IconbarTheme.hh" | 25 | #include "IconbarTheme.hh" |
26 | 26 | ||
27 | #include "FbAtoms.hh" | ||
27 | #include "Screen.hh" | 28 | #include "Screen.hh" |
29 | #include "Window.hh" | ||
28 | 30 | ||
29 | #include "FbTk/App.hh" | 31 | #include "FbTk/App.hh" |
30 | #include "FbTk/Command.hh" | 32 | #include "FbTk/Command.hh" |
@@ -36,6 +38,7 @@ | |||
36 | #include "config.h" | 38 | #include "config.h" |
37 | #endif // HAVE_CONFIG_H | 39 | #endif // HAVE_CONFIG_H |
38 | 40 | ||
41 | #include <X11/Xatom.h> | ||
39 | #include <X11/Xutil.h> | 42 | #include <X11/Xutil.h> |
40 | #ifdef SHAPE | 43 | #ifdef SHAPE |
41 | #include <X11/extensions/shape.h> | 44 | #include <X11/extensions/shape.h> |
@@ -86,11 +89,13 @@ void IconButton::exposeEvent(XExposeEvent &event) { | |||
86 | 89 | ||
87 | void IconButton::enterNotifyEvent(XCrossingEvent &ev) { | 90 | void IconButton::enterNotifyEvent(XCrossingEvent &ev) { |
88 | m_has_tooltip = true; | 91 | m_has_tooltip = true; |
92 | setCurrentIconbarItem(m_win.fbwindow()->clientWindow()); | ||
89 | showTooltip(); | 93 | showTooltip(); |
90 | } | 94 | } |
91 | 95 | ||
92 | void IconButton::leaveNotifyEvent(XCrossingEvent &ev) { | 96 | void IconButton::leaveNotifyEvent(XCrossingEvent &ev) { |
93 | m_has_tooltip = false; | 97 | m_has_tooltip = false; |
98 | setCurrentIconbarItem(None); | ||
94 | m_win.screen().hideTooltip(); | 99 | m_win.screen().hideTooltip(); |
95 | } | 100 | } |
96 | 101 | ||
@@ -282,3 +287,7 @@ bool IconButton::setOrientation(FbTk::Orientation orient) { | |||
282 | } | 287 | } |
283 | } | 288 | } |
284 | 289 | ||
290 | void IconButton::setCurrentIconbarItem(Window xid) { | ||
291 | m_win.screen().rootWindow().changeProperty(FbAtoms::instance()->getFluxboxCurrentIconbarItemAtom(), | ||
292 | XA_WINDOW, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&xid), 1); | ||
293 | } | ||
diff --git a/src/IconButton.hh b/src/IconButton.hh index 4f1587b..afb97bf 100644 --- a/src/IconButton.hh +++ b/src/IconButton.hh | |||
@@ -79,6 +79,8 @@ private: | |||
79 | /// Called when client title changed. | 79 | /// Called when client title changed. |
80 | void clientTitleChanged(); | 80 | void clientTitleChanged(); |
81 | 81 | ||
82 | void setCurrentIconbarItem(Window xid); | ||
83 | |||
82 | Focusable &m_win; | 84 | Focusable &m_win; |
83 | FbTk::FbWindow m_icon_window; | 85 | FbTk::FbWindow m_icon_window; |
84 | FbTk::FbPixmap m_icon_pixmap; | 86 | FbTk::FbPixmap m_icon_pixmap; |
diff --git a/src/Window.cc b/src/Window.cc index a8e4534..f390fc5 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1882,6 +1882,16 @@ bool FluxboxWindow::getState() { | |||
1882 | return ret; | 1882 | return ret; |
1883 | } | 1883 | } |
1884 | 1884 | ||
1885 | void FluxboxWindow::setReconfigureRectProperty(int x, int y, int width, int height) { | ||
1886 | long data[4] = { x, y, width, height }; | ||
1887 | winClient().screen().rootWindow().changeProperty(FbAtoms::instance()->getFluxboxResizeRectAtom(), | ||
1888 | XA_CARDINAL, 32, PropModeReplace, reinterpret_cast<unsigned char*>(data), 4); | ||
1889 | } | ||
1890 | |||
1891 | void FluxboxWindow::clearReconfigureRectProperty() { | ||
1892 | setReconfigureRectProperty(0, 0, 0, 0); | ||
1893 | } | ||
1894 | |||
1885 | /** | 1895 | /** |
1886 | Show the window menu at pos x, y | 1896 | Show the window menu at pos x, y |
1887 | */ | 1897 | */ |
@@ -2579,6 +2589,10 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2579 | m_last_resize_w - 1 + 2 * frame().window().borderWidth(), | 2589 | m_last_resize_w - 1 + 2 * frame().window().borderWidth(), |
2580 | m_last_resize_h - 1 + 2 * frame().window().borderWidth()); | 2590 | m_last_resize_h - 1 + 2 * frame().window().borderWidth()); |
2581 | 2591 | ||
2592 | setReconfigureRectProperty(m_last_resize_x, m_last_resize_y, | ||
2593 | m_last_resize_w + 2 * frame().window().borderWidth() - 1, | ||
2594 | m_last_resize_h + 2 * frame().window().borderWidth() - 1); | ||
2595 | |||
2582 | } | 2596 | } |
2583 | } else if (m_attaching_tab != 0) { | 2597 | } else if (m_attaching_tab != 0) { |
2584 | // | 2598 | // |
@@ -2596,6 +2610,8 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2596 | dx, dy, | 2610 | dx, dy, |
2597 | m_last_resize_w, m_last_resize_h); | 2611 | m_last_resize_w, m_last_resize_h); |
2598 | 2612 | ||
2613 | setReconfigureRectProperty(dx, dy, m_last_resize_w, m_last_resize_h); | ||
2614 | |||
2599 | // change remembered position of rectangle | 2615 | // change remembered position of rectangle |
2600 | m_last_move_x = dx; | 2616 | m_last_move_x = dx; |
2601 | m_last_move_y = dy; | 2617 | m_last_move_y = dy; |
@@ -3096,6 +3112,10 @@ void FluxboxWindow::startResizing(int x, int y, ReferenceCorner dir) { | |||
3096 | m_last_resize_x, m_last_resize_y, | 3112 | m_last_resize_x, m_last_resize_y, |
3097 | m_last_resize_w - 1 + 2 * frame().window().borderWidth(), | 3113 | m_last_resize_w - 1 + 2 * frame().window().borderWidth(), |
3098 | m_last_resize_h - 1 + 2 * frame().window().borderWidth()); | 3114 | m_last_resize_h - 1 + 2 * frame().window().borderWidth()); |
3115 | |||
3116 | setReconfigureRectProperty(m_last_resize_x, m_last_resize_y, | ||
3117 | m_last_resize_w + 2 * frame().window().borderWidth() - 1, | ||
3118 | m_last_resize_h + 2 * frame().window().borderWidth() - 1); | ||
3099 | } | 3119 | } |
3100 | 3120 | ||
3101 | void FluxboxWindow::stopResizing(bool interrupted) { | 3121 | void FluxboxWindow::stopResizing(bool interrupted) { |
@@ -3116,6 +3136,7 @@ void FluxboxWindow::stopResizing(bool interrupted) { | |||
3116 | } | 3136 | } |
3117 | 3137 | ||
3118 | ungrabPointer(CurrentTime); | 3138 | ungrabPointer(CurrentTime); |
3139 | clearReconfigureRectProperty(); | ||
3119 | } | 3140 | } |
3120 | 3141 | ||
3121 | WinClient* FluxboxWindow::winClientOfLabelButtonWindow(Window window) { | 3142 | WinClient* FluxboxWindow::winClientOfLabelButtonWindow(Window window) { |
@@ -3172,6 +3193,8 @@ void FluxboxWindow::startTabbing(const XButtonEvent &be) { | |||
3172 | m_last_resize_w, m_last_resize_h); | 3193 | m_last_resize_w, m_last_resize_h); |
3173 | 3194 | ||
3174 | menu().hide(); | 3195 | menu().hide(); |
3196 | |||
3197 | setReconfigureRectProperty(m_last_move_x, m_last_move_y, m_last_resize_w, m_last_resize_h); | ||
3175 | } | 3198 | } |
3176 | 3199 | ||
3177 | void FluxboxWindow::attachTo(int x, int y, bool interrupted) { | 3200 | void FluxboxWindow::attachTo(int x, int y, bool interrupted) { |
@@ -3182,6 +3205,8 @@ void FluxboxWindow::attachTo(int x, int y, bool interrupted) { | |||
3182 | m_last_move_x, m_last_move_y, | 3205 | m_last_move_x, m_last_move_y, |
3183 | m_last_resize_w, m_last_resize_h); | 3206 | m_last_resize_w, m_last_resize_h); |
3184 | 3207 | ||
3208 | clearReconfigureRectProperty(); | ||
3209 | |||
3185 | ungrabPointer(CurrentTime); | 3210 | ungrabPointer(CurrentTime); |
3186 | 3211 | ||
3187 | Fluxbox::instance()->ungrab(); | 3212 | Fluxbox::instance()->ungrab(); |
diff --git a/src/Window.hh b/src/Window.hh index 6117d48..a826378 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -499,6 +499,9 @@ private: | |||
499 | void setFullscreenLayer(); | 499 | void setFullscreenLayer(); |
500 | void attachWorkAreaSig(); | 500 | void attachWorkAreaSig(); |
501 | 501 | ||
502 | void setReconfigureRectProperty(int x, int y, int width, int height); | ||
503 | void clearReconfigureRectProperty(); | ||
504 | |||
502 | // modifies left and top if snap is necessary | 505 | // modifies left and top if snap is necessary |
503 | void doSnapping(int &left, int &top); | 506 | void doSnapping(int &left, int &top); |
504 | // user_w/h return the values that should be shown to the user | 507 | // user_w/h return the values that should be shown to the user |