Commit Graph
14 Commits
Author SHA1 Message Date
Lucas de Sena e3f4248e8f remove unused gnome.c
The gnome.c file implemented the protocol used for early versions of
GNOME.  This protocol is deprecated, for it is already covered by the
more general EWMH standard (aka _NET properties) from freedesktop.org
(aka XDG).

In particular:
• Properties in gnome_setup() got deprecated by the _NET_SUPPORT{ED,ING_WM_CHECK}
  properties; already implemented in amiwm.
• Properties in gnome_managed_clients() got deprecated by the _NET_CLIENT_LIST
  property; not implemented in amiwm yet.
• Properties in gnome_multiple_desktops() got deprecated by the _NET_CURRENT_DESKTOP
  and _NET_NUMBER_OF_DESKTOPS properties; not implemented in amiwm yet.

Further EWMH support are be implemented in upcoming commits.

Also, this file was not even compiled and linked into amiwm anyway...
2026-02-24 18:54:52 +00:00
Lucas de Sena 599f0a17b3 localize menu routines
Keep state loal into drag_menu() in menu.c, rather than in global
variables around menu.c and main.c
2026-02-24 00:25:46 +00:00
Lucas de Sena 9354a98208 localize button click routines
Keep state local into click_*() for routines relating to button clicks
than in global variables around frame.c and main.c
2026-02-24 00:25:46 +00:00
Lucas de Sena 7baebf1316 client.c: fix missing member on c->scr 2026-02-23 01:35:12 +00:00
Lucas de Sena bf4806c066 fix broken UTF-8 character 2026-02-20 08:35:40 +00:00
Lucas de Sena beccf8b0fb do not reparent client window; fix amiwm#29
reparenting the client's window creates a few issues:
• We get bogus UnmapNotify and MapNotify events that are ultimately
  generated by amiwm itself.
• We do not get button events from the window, since its frame
  (c->parent) that we have called XGrabButtons(3) onto, is not
  its parent anymore.

To fix this, do not reparent the client window, but its frame window.
And keep the client window always inside the frame.
2026-02-19 20:46:57 +00:00
Lucas de Sena 0c5a2c7648 separate _NET atoms at the end of the array
So when setting the list of supported _NET atoms, we can just pass a
pointer to ATOM[_NET_SUPPORTED] as the beginning of the array of
supported atoms, and NATOMS - _NET_SUPPORTED as its length.
2026-02-19 20:24:51 +00:00
Lucas de Sena ca04f20fec implement a table of atoms defined only once
Previously, adding a new atom into the code required:
1. In <icc.h>, add the line `extern Atom my_new_atom;` declaring the new atom.
2. In <icc.c>, add the line `Atom my_new_atom;` defining the new atom.
3. In <icc.c>, add the line `my_new_atom = XInternAtom(dpy, "MY_NEW_ATOM", False);`
   interning this new atom, and assigning the interned value to the variable.

Now, just add a line with the atom's name in the X-MACRO in <icc.h>, and
a XInternAtoms(3) and a set of macros will do the rest.

All new atoms will be referred to as an entry in the ATOMS[] array.
For example:

	ATOMS[MY_NEW_ATOM]

The exception are for those REALLY OLD atoms that have already a
dedicated compile-time-known value defined at <X11/Xatom.h>.  Those
do not need to be interned; and are referred to with a constant
beginning with the `XA_` prefix.  For example:

	XA_WM_CLASS
2026-02-19 20:22:50 +00:00
Lucas de Sena 6685043266 make dialog clients be iconified/re-screened with their respective leader client 2026-02-04 16:12:48 +00:00
Lucas de Sena 8a59e5cc9e localize control flow and variables
State and control flow for modal mouse actions (dragging/resizing/etc)
was fragmented and scattered through main.c, making code convoluted and
hard to maintain.

I fixed that by applying good structured programming practics:
implementing sub-event-loops for those modal actions, rather than
checking which modal action is currently in action at the main
event-loop.

That commit took me more time than i expected... abstract out all
spaghettish, global-state control flow into a single, encapsulated
scope for each modal action… test if i broke anything… find any dead
code that is not used anymore (implementing that global state we had
before)…

I also put some `static` in global variables and routines, so the
compile can warn whether an unused variable/function is defined (and
help me on removing dead code).
2026-01-31 01:52:24 +00:00
Lucas de Sena 5bbae05fec icc: use compound literal rather than static object to return pointer
thus make mkcmessage reentrant (and a macro, rather than a function)
2026-01-31 01:25:50 +00:00
Lucas de Sena 1212e7a78c document OpaqueResize/OpaqueMove 2026-01-30 01:54:19 +00:00
Lucas de Sena a33d487fab ameliorate and rewrite manual in -mdoc format
The AmiWM manual was kinda incomplete.  It does not describe how the WM
works, does not list all the configuration commands, nor the modules.

This commit rewrites the manual into the mandoc format, fill in the
gaps, and makes its section structure more standardized.
2026-01-16 00:43:57 +00:00
Lucas de Sena a8f92b4e5b Make fullscreen work on GTK applications
This commit implements the _NET_SUPPORTING_WM_CHECK property, defined
by the EWMH[1] (Extended Window Management Hints, aka wm-spec), which
indicates that a EWMH-compliant window manager is running.

A GTK application, when set to go fullscreen, first checks root window's
_NET_SUPPORTING_WM_CHECK property to determine whether a EWMH-compliant
window manager is running; and then checks the _NET_SUPPORTED property
to determine the supported protocols.

_NET_SUPPORTED was previously implemented, but _NET_SUPPORTING_WM_CHECK
was not.


This commit also fixes a misconception of the code related to screens.

The code deals with two different, unrelated concepts of screens: the
X11 screen, and the AmiWM screen.

The X11 screen, created by the X server independently of whether a
window manager is running, is a kind of “subdisplay”.  A X11 display
structure, which describes a connection to the X server, has one or more
screens.  Each X11 screen has its own root window and its own set of
clients that are specific to it, and cannot move to another X11 screen.
The user can even run two different window managers at the same time in
the same display, given that each is run in a different X11 screen.
Usually, there is only one X11 screen.

The _NET_SUPPORTING_WM_CHECK and _NET_SUPPORTED properties must be set
on the root window of each screen that AmiWM is managing.  Previously,
however, they were set everytime an AmiWM screen (a totally different
concept) was realized.  So, if i had 4 AmiWM screens configured in my
~/.amiwmrc file, setsupports() were called four times, even if i only
have a single X11 screen.

[1]: https://specifications.freedesktop.org/wm/latest/index.html
2026-01-10 02:58:39 +00:00