1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-04-30 12:34:07 +02:00

Compare commits

..

520 Commits

Author SHA1 Message Date
David Maciejak 5b631cad93 wmaker: fix EmulateAppIcon index from advanced_option
This patch is fixing the EmulateAppIcon index which should be
moreChk[8], moreChk[7] used until now is for DontSaveSession
attribute.
2026-04-06 23:47:47 +01:00
David Maciejak ee9fd77a56 wmaker: fix crash for windows without WM_HINTS
This patch is adding a guard before calling wm_hints->icon_pixmap.
Crash can be reproduced with decoration-less apps when disabling
"Emulate application icon" attribute.

Ref:

Program terminated with signal SIGSEGV, Segmentation fault.
806 if (!getSize(wwin->wm_hints->icon_pixmap, &w, &h, &d)) {
[Current thread is 1 (Thread 0x7ffff660ed40 (LWP 29297))]
2026-04-06 23:47:47 +01:00
David Maciejak 62e341b5cc wmaker: add test for _NET_WM_FULLSCREEN_MONITORS
This patch is adding a small test app to validate that
_NET_WM_FULLSCREEN_MONITORS is working as expected.
2026-04-05 21:47:05 +01:00
David Maciejak fa49b7c003 WINGs: avoid splitting UTF-8 characters when wrapping text
This patch is to split UTF-8 word by characters and not bytes.
Issue reported at https://github.com/window-maker/wmaker/issues/65
2026-04-04 21:35:36 +01:00
David Maciejak 6dbc6c95ab WINGs: make UTF-8 functions global
This patch is moving the existing UTF-8 functions from wtextfield.c
to WINGsP.h.in to be available to all modules.
2026-04-04 21:35:36 +01:00
David Maciejak 4babc0e422 Doc: fix typos in NEWS and README 2026-04-04 15:41:07 +01:00
David Maciejak 33fba87ed1 wmaker: add directional window focus
This patch is adding directional window focus
(like in openbox), where the focus can be passed to
the current window neighboors with a shortcut key.
Comparisons are performed using window centres.

New options are FocusWindowLeftKey, FocusWindowRightKey,
FocusWindowUpKey, FocusWindowDownKey.
Other WM are setting those to SUPER+LEFT/RIGHT/UP/DOWN keys
but currently those are not set by default.

CirculateRaise option which is described in WPrefs as
'Raise window when switching focus with keyboard' is also
used to raise/not raise windows that are fully covered by
other windows.
2026-04-03 10:35:39 +01:00
David Maciejak a3c02a22bd NEWS: add new feature descriptions 2026-04-03 10:35:39 +01:00
David Maciejak 0d74066aea wmaker: treat _NET_WM_WINDOW_TYPE property as a list
This patch is treating the _NET_WM_WINDOW_TYPE property as an array
of atoms as defined in X11. Currently, we are only getting the first one,
while the client can set multiple window types ordered from most specific
to least specific.
2026-04-02 08:57:25 +01:00
David Maciejak 26a296db23 wmaker: dynamic vim-like window marking feature
This patch is adding vim-like window marking, like in i3.
A window can be dynamically assigned a mark label.
Then a marked window can be pulled or jumped to.
Or the current focused window can be swapped with a marked window.

The mark label appears in the Window List in between the window
title and the workspace name.

Those new options in WindowMaker conf file are used to control
the actions: MarkSetKey, MarkUnsetKey, MarkBringKey, MarkJumpKey
and MarkSwapKey.

Those actions are set to None by default.
2026-04-02 08:57:25 +01:00
David Maciejak ac1fa7fc6d wmaker: fix client repositioning on frame moves
This patch is preventing X server gravity adjustments from offsetting
the client windows esp when the gravity is non standard as seen
in openoffice with xprop: 'window gravity: Static'.
Also fixing _NET_WM_STATE property query request as in X11 it can
contain multiple atoms simultaneously, acting as an array.
2026-03-29 20:05:17 +01:00
David Maciejak 1f03c13f4d wmaker: improve support for RandR
This patch is improving the support for RandR.
It uses version 1.3 released in March 2009.
Most of the support is done in randr.c/randr.h
It is built on top of the mature Xinerama structure
but Xinerama lib is not required.
Like for Xinerama, RandR is now auto enabled if the
library is found at compiled time.

RandR support can be used in 2 modes:
A static mode (which is the default) is to define manually
your setup with external tools like xrandr or arandr,
like for example what Openbox is doing.

A dynamic mode, which is triggered on hotplug events,
like for example what GNOME is doing.
If a new monitor is detected, it will select the best mode
available and add it to the right on the existing monitors.

The mode can be switched with a new option available in WindowMaker
conf file (or via WPrefs expert panel):

HotplugMonitor = NO;
2026-03-28 10:50:23 +00:00
David Maciejak 8e84264036 WPrefs: add hotplug monitor option in expert panel
This patch is adding a new HotplugMonitor option
to automatically (de)activate monitors on randr hotplug events.
It is disabled by default.
2026-03-28 10:50:23 +00:00
David Maciejak 4b4abf4c50 wmaker: update callback function checks
This patch is adding the check for the getString function
that was added in commit be495bedbc.
2026-03-27 23:30:05 +00:00
David Maciejak a631e3060e wmaker: remove apercu struct check artefact
This patch is removing the check for the legacy_minipreview_config struct
which was removed in commit fa8121ee61
Without it we can see the error below when running make check:

Error: structure "legacy_minipreview_config" was not found in ./defaults.c
2026-03-27 23:30:05 +00:00
David Maciejak 6c5c3e6181 wmaker: fix wire frame drawing when snapping
This patch is fixing the wire frame dimension which
was computed wrongly when FrameBorderWidth was set
and the window snapped top half or bottom half.
In such case, drawTransparentFrame was passed the
width and height of the screen while it should have
used an inner frame size (meaning without frame border).
The result bug was that the wire frame width was too large
and the right edge displayed out of the monitor head.
2026-03-27 23:30:05 +00:00
David Maciejak 329f82f6e7 WPrefs: set the PID of the application to the window
This patch is setting the _NET_WM_PID atom for WPrefs
to report its PID.

Before the patch, the PID reported is unset (0)
$ wmctrl -lp|grep 'Window Maker Preferences'
0x00a000b0  0 0      Linux Window Maker Preferences

After the patch, the PID is set (20110 in the example below)
0x00a000b0  0 20110  Linux Window Maker Preference
2026-03-23 20:43:42 +00:00
David Maciejak 60a900be28 wmaker: make sure reloaded saved window position is in visible space
This patch is checking if the session saved window positions fall
in dead space, for example when a monitor no longer exists.
If it's the case the window position is moved to the nearest active
head.
2026-03-22 22:21:00 +00:00
David Maciejak c7c736e283 wmaker: set proper group window class when hint is empty
This patch is a follow up of commit
073235ada4
as it appears there is the same issue with the WMState
configuration file when a session state is saved.

For example, with terminator, the file will contain:
  ...
  Applications = (
    {
      Dock = Dock;
      Maximized = 0x0000;
      Name = terminator.;
      ...

After the patch:
  ...
  Applications = (
    {
      Dock = Dock;
      Maximized = 0x0000;
      Name = terminator.Terminator;
      ...
2026-03-20 10:11:02 +00:00
David Maciejak 752a949492 wmaker: fix window position issues with dockapps
The patch with commit 839061a25a
introduces an issue with dockapps that are creating their main
windows with size 1x1. That new patch is moving the existing
code further below in the wManageWindow function to be able
to check if the window flag is_dockapp is set.
Issue was seen with wmsystemtray and wmmemload.
2026-03-20 10:11:02 +00:00
David Maciejak be495bedbc wmaker: allow the screenshot filename template to be set
This patch is adding a new option ScreenshotFilenameTemplate for users
to change the default strftime format "screenshot_%Y-%m-%d_at_%H:%M:%S".
For example, Teams is not allowing the ':' char in the filename of file
to be shared so I always have to rename the file.
2026-03-20 10:11:02 +00:00
gryf 412b3eace2 Make border opaque.
When composite manager (like picom or xcompmgr) is used together with
Window Maker, some of the windows (i.e. terminator) might have
transparent border. This patch will prevent from such situation.

Closes: https://github.com/window-maker/wmaker/issues/58
2026-03-20 10:11:02 +00:00
David Maciejak 0aeba6064b WPrefs: improve capture_shortcut function
This patch is improving the capture_shortcut function to be able
to capture a sequence of multiple key pressed.
2026-03-14 16:20:49 +00:00
David Maciejak ec115fedf7 wmaker: revamp titlebar language button
This patch is replacing the modelock legacy hardcoded language dropdown
icons with a compact titlebar button based on the current locale.
(it adds also a detection to xkbfile library which is required to get
the short name of the locale).
Now supports up to 4 layouts, clicking on the language button will cycle
through them (XKB officially supports up to four groups).
2026-03-14 16:20:49 +00:00
David Maciejak 29177f94ed wmaker: extend default keybinding for multikeys support and add sticky-chain mode
This patch extends the existing keybindings to support multiple keys and
add an optional "sticky chain" mode that lets a prefix remain active until users press
a cancel key so users can enter the continuation key without re-pressing the prefix.

The idea is to bring Emacs shortcuts keybinding to wmaker.

Normal (existing and enhanced) mode:

Prefix behaves like a one-shot release before the next key if any.
For example: Mod1+h -> hide the active application, that is still working as usual.
But if you want for example to have all your window management keys under the same leader key
you can now do something like that:
"Mod4+w h" which is pressing the Super key with w, releasing them and pressing h.
You can assign that key sequence to an action.

Sticky chain mode:

Pressing a configured prefix enters a short-lived sticky state.
Sticky state expires on timeout or when explicitly canceled (with KeychainCancelKey).
For example, you can define:
"Mod4+a x" -> run xterm
"Mod4+a b f" -> run firefox
"Mod4+a b c" -> run google chrome

In sticky mode, "Mod4+a x x b f", then KeychainCancelKey or KeychainTimeoutDelay, will launch 2 xterm and firefox.

New options for WindowMaker conf file:

KeychainTimeoutDelay: timeout in milliseconds (can be set to 0)
Default: 500
Example: KeychainTimeoutDelay = 500;

KeychainCancelKey: explicit keybinding used to cancel an active sticky chain.
If set to None the feature has no dedicated cancel key and the chain only ends by timeout
or naturally if the keybind pressed is not defined.
Default: None
Example: KeychainCancelKey = Escape;
2026-03-14 16:20:49 +00:00
gryf ae050ceb40 Respect user defined icons.
Currently, when switchpanel is invoked (usually by alt-tab), icons are
taken with the order from higher priority to lower:

* appicon
* user defined icon
* net_icon
* default icon

Using appicon, when no net_icon nor user icon is defined is good,
although it will provide another confusion with user defined icons,
which will be ignored for all apps which provide appicons. With this
patch order of selecting icon for an app is:

* user defined icon
* appicon
* net_icon
* default icon

Note, that even, if there is icon defined for certain application,
usually it need to have "Ignore client supplied icon" checkbox ticked,
especially for the apps like Firefox.
2026-03-13 13:40:37 +00:00
David Maciejak b27b44db72 wmaker: filter inotify events only to expected config files
This patch is checking if the notification wmaker is receiving
from the Defaults directory is coming from a proper expected config file.
Until now, using vim for example to open any of the files,
for example WMRootMenu would reload the configs, even before saving
the file.
You would see in the logs:
warning: Inotify: Reading config files in defaults database.

because vim by default is creating a .swp file in that same directory.
2026-03-05 09:03:58 +00:00
gryf c6f029c946 Make mouse wheel window focus configurable.
With commit e45a3bc07d a behavior change
was introduced that may disrupt the workflow of a user who may
intentionally want to give focus to a window without bringing it to the
front. Using the scroll wheel is less intrusive compared to the left,
right, and especially the middle (in the case of a terminal) mouse
buttons.

This commit introduces the ability to change the behavior by enabling or
disabling the ability to focus a window with mouse wheel in the expert
panel.
2026-02-26 10:04:15 +00:00
David Maciejak 66bf19c1e0 wmaker: add new ModifierKeyShortLabels option
This patch is adding a new ModifierKeyShortLabels option to the
WindowMaker file to let the user specify the modifier key labels
used in the shortcuts like those appearing in the root menu.
For example, to overwrite the default labels, a user can set
the new option value to:

ModifierKeyShortLabels = (
  "\342\207\247",
  "\342\214\203",
  "\342\214\245",
  "\342\207\255",
  "\342\207\263",
  "\342\214\230",
  "\342\207\252",
  "\342\227\206",
  "\342\214\245"
);

Which is using the same symbols as defined in macos.
For example, instead of printing M4+, "\342\214\230"
will print the ⌘ (Command) symbol.
2026-02-25 07:54:55 +00:00
David Maciejak 073235ada4 wmaker: set proper group window class when hint is empty
This patch is setting a proper class hint internally
when the app is not setting any.
That issue can be reproduced with terminator 2.1.3,
where the window itself is setting a proper WM_CLASS

$ xprop|grep WM_CLASS
WM_CLASS(STRING) = "terminator", "Terminator

But the window id # of group leader: 0x1000001
is setting only the instance name not the class name.
$ xprop -id 0x1000001|grep CLASS
WM_CLASS(STRING) = "terminator", ""

The issue is that wmaker is using those 2 string values
for the dock apps and to identify linked launched apps.
Those strings are concatenated and used in WMWindowAttributes.
Without the patch, that entry below is created:

  terminator. = {
    Icon = terminator..xpm;
  };

If wmaker is warm restarted, a new entry appears in WMWindowAttributes:

  terminator. = {
    Icon = terminator..xpm;
  };

  terminator = {
    Icon = terminator..xpm;
  };

and the opened window is not linked anymore to the dock app as the
WM_CLASS is different.
So you can launch the app as many times as you want from the dock,
the dock icon will
always have the 3 dots on the bottom left corner showing no window
apps are linked to it.

In case if the group window is not defining a CLASS but the client window
has one, the patch is setting the group window CLASS to the value of the
client window CLASS, or as a fallback, as seen in PropGetWMClass function,
setting it to "default".

With the patch, in WMWindowAttributes, we have now:
  terminator.Terminator = {
    Icon = terminator.Terminator.xpm;
  };

and a warm restart is not creating another entry.
2026-02-22 09:23:40 +00:00
David Maciejak 1b8eb63376 wmaker: add check in getSize function to prevent X error
This patch is checking if the passed Drawable exists before calling
XGetGeometry on it, as seen when using Steam and trying to change
the attributes of the 'Friends & Chat' popup window, wmaker is
generating such error in the logs:
warning: internal X error: BadDrawable (invalid Pixmap or Window parameter)
	Request code: 14 X_GetGeometry
	Request minor code: 0
	Resource ID: 0x0
	Error serial: 32091
2026-02-22 09:23:40 +00:00
David Maciejak 75a8299d18 wmaker: set the color pixel for TrueColor display
As mentioned in commit 67e2f5e1ca,
for TrueColor display it's not necessary to allocate a color but
it is required to set the pixel property of the XColor.
2026-02-20 08:47:50 +00:00
David Maciejak cc0a652ea8 WPrefs: add mouse wheel action to the expert panel
This patch is adding the mouse wheel action to be performed
on the expert text frame panel.
2026-02-16 17:55:21 +00:00
David Maciejak 80079cd343 WINGs: improve wlist widget
This patch is adding keyboard control to the wlist widget
(up/down/pgup/pgdw/home/end) and typeahead list search.
That component is for example used in the wmaker icon chooser,
and WPrefs keyboard shortcut, font conf panels.
2026-02-16 17:55:21 +00:00
David Maciejak 955c6793a6 WINGs: fix memory leaks and potential buffer over-read in wfont
This patch is fixing memory leaks when pango structures are used
but not freed.
Also according to commit 4f050ebab9,
previous_text string in WMWidthOfString can be not NULL terminated,
the same construct is used in WMDrawString and WMDrawImageString
functions, so to be safe better to also check for the length
of the string.
2026-02-16 01:41:16 +00:00
David Maciejak 189679b49c wmaker: don't exit wmaker if app child process errored
This patch is fixing a possible memory corruption and abnormal exit
of wmaker when a created child process errored.
This had been kind of mentioned at
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1040643
and I also experienced it with especially Steam.
At first, I also thought it was a crash or a memory corruption,
but gdb or valgrind are not reporting anything.
In fact, Steam is not setting properly some hints and that is bringing
some issues. More patches will be needed to support that app properly.
For example, WM_COMMAND is not set properly and when you are trying to
relaunch the app from the appIcon the child process is generating an error
and the actual code is calling Exit(-1) which is entirely exiting wmaker,
that's why from gdb you can see the message
[Inferior 4 (process 567278) exited normally] and no crash.
2026-02-15 20:38:59 +00:00
David Maciejak e45a3bc07d wmaker: ignore mouse wheel when giving window focus
This patch is fixing a window focus issue by ignoring mouse wheel
up/down buttons. How to reproduce the issue:
open 2 xterm with one window overlapping the other, in 1 xterm list
files with ls to have the scrollbar to appear, click the other xterm
to give focus to its window, now mouse wheel up or down on the other
xterm, at that point the window is focused but under the other xterm.
Try to click left button to get it to appear on top, it will not work
cause the focus is set already on it. With that patch the click to
focus is working.
2026-02-14 16:10:30 +00:00
David Maciejak bc16a03722 WINGs: fix compiler warnings on fontl example
The patch is fixing some compiler warnings about missing
noreturn keyword.
2026-02-14 16:10:30 +00:00
David Maciejak 260415eb42 wmaker: treat empty icon name hint as unset
This patch is treating empty _NET_WM_ICON_NAME as unset,
thus the code is falling back to set the appicon title
to the window title. Case seen with virtualbox where
the _NET_WM_ICON_NAME(UTF8_STRING) is set to empty string.
2026-02-13 09:06:07 +00:00
David Maciejak c8174a4b2e wmaker: add room for the modelock option in winspector
This patch is conditionaly adding some extra room in the window
inspector advanced options frame if modelock is enabled to fit
the extra option. Without it the option text is truncated.
2026-02-11 22:02:05 +00:00
David Maciejak 2901b418ad wmaker: add window app icon to the window list
This patch is adding the app icon in between the flags icon and
the window name from the window list.
Feature request from https://github.com/window-maker/wmaker/issues/19
It is disabled by default, it needs WindowListAppIcons to be
set to YES manually in the conf file or "Show app icons in window list."
enabled from WPrefs expert panel.
2026-02-10 09:35:23 +00:00
David Maciejak ae6b03e50f wmiv: fix default window size
Set default windows size to 10x10 as 1x1 is unmanaged since
commit 839061a25a.
2026-02-09 09:23:07 +00:00
David Maciejak 128ba2ddc7 wmaker: use appicon icons in the switchpanel when existing
This patch is making sure the icons shown in the switchpanel
are also those used for the appicon. For example, for xterm
the icon used in the switchpanel is the default app and not the
icon provided by xterm app.
Seems that issue is also present in vanilla wmaker 0.96.
2026-02-09 09:23:07 +00:00
David Maciejak 7ca96b9ed6 wmaker: fix titlebar glitch issues with modelock
This patch is fixing 2 issues with the modelock language pixmap
located in the titlebar.

If wmaker is compiled with modelock support but modelock is disabled
from the expert preferences, dialog windows like run command or exit
will not show the language pixmap but will show empty frame borders.

When modelock is enabled from the expert preferences, it needs a
warm restart for the titlebars to be updated with the language pixmap.
If afterwards, modelock is disabled from the expert preferences,
any old windows that is gettting focus will be repainted and the language
pixmap will be destroyed but the empty frame borders will still be
present. Now to fully disable modelock for existing opened windows,
wmaker needs a warm restart.
2026-02-09 09:23:07 +00:00
David Maciejak 839061a25a wmaker: fix window position issues
This patch is fixing some initial window position issues
as seen for example with virtualbox.
Now wmaker is not trying to manage the 1x1 app internal windows
which was resulting on some position issues (stacking the window
app on the left side).
It also fixes some window jitters issues when the app is trying
to negotiate some tiny position adjustments.
Related to bug at https://github.com/window-maker/wmaker/issues/26
2026-02-07 20:39:24 +00:00
David Maciejak 1e63c590b6 wmaker: factorize duplicated code
This patch is factorizing is_same and getBool functions in misc.
is_same is renamed to WMStrEqual
getBool is renamed to WMPLGetBool
to prevent name collision issues.
2026-02-07 20:37:46 +00:00
David Maciejak 92e1e9fb0b WPrefs: fix some truncated texts
This patch is fixing some text truncation in the ergonomic and
hot corner preference tabs.
2026-02-07 13:33:40 +00:00
David Maciejak ddf0b20367 wmaker: refactor get_corner()
This patch refactors get_corner() for better readability
and performance.
2026-02-07 13:33:40 +00:00
David Maciejak d303317a31 wmaker: handle keybinding change notifications
This patch is to fix an issue seen on FreeBSD 15 where
keybinding are mixed up at the cold start of wmaker.
It is mentioned at https://github.com/window-maker/wmaker/issues/43
Seems that issue is not happening on Linux.
A warm restart ("restart window maker") from the root menu
is getting rid of that issue temporarily.

To solve that issue, now wmaker is reloading the keyboard mapping
via the new wReadKeybindings function when a XkbNewKeyboardNotifyMask
event is received.
It means xkb, which is part of X11 core,
is now used by default and not conditionally with modelock.
I tried to delay reading the keybinding as late as possible but
it did not solve the issue as seems X is started with a improper
keyboard by default.

Here some debug trace when the bindings are loaded by wmaker on FreeBSD:

Keybind F12: keycode=96 modifier=0x0   <--- cold starting wmaker
Keybind F11: keycode=95 modifier=0x0
Keybind Escape: keycode=9 modifier=0x4
Keybind M: keycode=58 modifier=0x8
Keybind H: keycode=43 modifier=0x8
Keybind Up: keycode=98 modifier=0x8   <--- keycode is wrong, provided by X11
Keybind Down: keycode=104 modifier=0x8
Keybind Tab: keycode=23 modifier=0x8
Keybind Tab: keycode=23 modifier=0x9
Keybind Right: keycode=102 modifier=0xc
Keybind Left: keycode=100 modifier=0xc
Keybind 1: keycode=10 modifier=0x8
Keybind 2: keycode=11 modifier=0x8
Keybind 3: keycode=12 modifier=0x8
Keybind 4: keycode=13 modifier=0x8
Keybind 5: keycode=14 modifier=0x8
Keybind 6: keycode=15 modifier=0x8
Keybind 7: keycode=16 modifier=0x8
Keybind 8: keycode=17 modifier=0x8
Keybind 9: keycode=18 modifier=0x8
Keybind 0: keycode=19 modifier=0x8
Keybind Print: keycode=111 modifier=0x0   <--- keycode is wrong, 111 is UP key

/usr/ports/x11-wm/windowmaker/work/WindowMaker-0.96.0/src/.libs/wmaker(execInitScript(main.c:531)):
error: /root/GNUstep/Library/WindowMaker/autostart:could not execute initialization script   <--- warm restart from wmaker
Keybind F12: keycode=96 modifier=0x0
Keybind F11: keycode=95 modifier=0x0
Keybind Escape: keycode=9 modifier=0x4
Keybind M: keycode=58 modifier=0x8
Keybind H: keycode=43 modifier=0x8
Keybind Up: keycode=111 modifier=0x8   <--- UP key keycode is correct
Keybind Down: keycode=116 modifier=0x8
Keybind Tab: keycode=23 modifier=0x8
Keybind Tab: keycode=23 modifier=0x9
Keybind Right: keycode=114 modifier=0xc
Keybind Left: keycode=113 modifier=0xc
Keybind 1: keycode=10 modifier=0x8
Keybind 2: keycode=11 modifier=0x8
Keybind 3: keycode=12 modifier=0x8
Keybind 4: keycode=13 modifier=0x8
Keybind 5: keycode=14 modifier=0x8
Keybind 6: keycode=15 modifier=0x8
Keybind 7: keycode=16 modifier=0x8
Keybind 8: keycode=17 modifier=0x8
Keybind 9: keycode=18 modifier=0x8
Keybind 0: keycode=19 modifier=0x8
Keybind Print: keycode=107 modifier=0x0   <--- Print keycode is correct

Alternatively, to mitigate the issue, .xinitrc can be set to:

setxkbmap -layout us
exec wmaker

or whatever layout you are using.
2026-02-07 13:33:40 +00:00
David Maciejak c620b354b5 wmaker: fix some truncated texts in the info panel
This patch is fixing some text truncation especially
for displaying the total memory allocated in debug mode
and the image formats (when the JXL support is enabled).
2026-02-07 13:33:40 +00:00
David Maciejak ebac2bbcd8 wmaker: fix compiler warning in properties.c
This patch is fixing a compiler warning for the implicit
conversion of int to char changes value from 255 to -1
when at the line *ptr++ = 255 the code is trying to store
the value 255 into a char.
2026-02-07 13:33:40 +00:00
David Maciejak 3281349f8d WINGs: remove unnecessary warning in wtextfield
Since commit 77db6dc649
("WINGs: fix right and center aligned wtextfield"),
right and center alignments are working in wtextfield.
2026-02-07 13:32:27 +00:00
David Maciejak 3f5280987e WINGs: refactor wlist
This patch refactors wlist to bring some improvements
to not count the list of entries at each loop iteration.
2026-02-07 13:31:28 +00:00
David Maciejak 6d0953bc22 wmaker: add support for _NET_WM_MOVERESIZE
This patch adds support for _NET_WM_MOVERESIZE hint as defined in EWMH
which allows a window without decorations to manage itself (moving/resizing).
The purpose is to fix the issue mentioned at https://github.com/window-maker/wmaker/issues/20

Tested with VS Code, Google Chrome, Steam and Discord.

Specs are available at https://specifications.freedesktop.org/wm/1.5/ar01s04.html#id-1.5.4
2026-02-03 18:05:20 +00:00
David Maciejak ef1a504898 wrlib: alpha combine speed improvement
This patch is improving the alpha combine function by using int
instead of float. That function is used for example in the
switch panel to merge the transparency mask.
The change is practically indistinguishable to the human eye
for a single-pass blend but the performance gained is huge.

I've been doing some benchmark of wrlib and even implemented AVX2 support.
But the gain compared to the complexity of AVX2 is not worth,
while having int usage in that specific function is a really good trade-off.

Here the result:

Alpha Blending Performance Test
Image size: 1024x768 (786432 pixels)
Iterations: 100

AVX2 support: YES

=== RGBA Source Test ===
Original (float):     2.540 ms/frame  (393.8 FPS)
Optimized (int):      1.983 ms/frame  (504.2 FPS)  [1.3x speedup]
AVX2 optimized:       1.843 ms/frame  (542.6 FPS)  [1.4x speedup]

By using int, the alpha blending in that use case is 28% faster.
2026-01-27 10:56:30 +00:00
David Maciejak 474b23344a wrlib: change default scaling interpolation to Catmull-Rom
This patch is implementing a new default Catmull-Rom filter
to resize images.
Catmull-Rom is a special case of cubic interpolation with B=0 and
C=0.5 (in the Mitchell-Netravali formulation).
It provides slighlty sharper results than Mitchell with the same
performance.
Catmull-Rom is a better choice for a window manager as it prioritizes
sharpness, making small elements feel crisp.
2026-01-27 10:53:34 +00:00
David Maciejak 77db6dc649 WINGs: fix right and center aligned wtextfield
This patch is fixing some issues in how right and center aligned
wtextfields are handled.
-text selection with mouse was not working properly especially
setting and identifying the cursor position
-middle button paste was only working for left aligned text
2026-01-27 10:52:04 +00:00
David Maciejak b09ac30233 WINGs: add case to wtextfield test
This patch adds a wtextfield center aligned to the unit test.
2026-01-27 10:50:58 +00:00
David Maciejak 6e14b6142b wmaker: fix _NET_WM_NAME window manager's name
xterm is not working properly (it's not advertising its internal icon)
if the window manager's name contains a space, seems to be specific
to xterm as xeyes and xpaint are working fine.
2026-01-27 10:47:58 +00:00
David Maciejak 7778df2fc5 wmaker: add keyboard control to crash window
This patch is allowing to control the wpopupbutton entries
via keyboard up/down arrows.
It happens to me a few weeks ago during development,
wmaker crashed and I lost the mouse control.
I was stuck on that dialog box without a way to select another entry.
2026-01-25 01:28:53 +00:00
David Maciejak 156841f80e WINGs: wpopupbutton add two functions to change the displayed item
This patch is adding WMSelectPopUpButtonPreviousItem and
WMSelectPopUpButtonNextItem functions to the widget.
The WINGs lib version is bumped.
2026-01-25 01:28:53 +00:00
David Maciejak c82e6dad5c wmaker: set the window manager's information
According to EWMH specification, the active window manager is supposed
to set some information. Those can be gathered for example with
'wmctrl -m'.

Before the patch:
$ wmctrl -m
Name: N/A
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: OFF

After the patch:
$ wmctrl -m
Name: Window Maker 0.96.0
Class: wmaker
PID: 6866
Window manager's "showing the desktop" mode: OFF
2026-01-24 14:24:03 +00:00
David Maciejak 95c68fe26d configure: add optional --enable-native option to compilation flags
This patch adds an option to enable native CPU optimizations
by adding -march=native to the compiler flags, tuning the
generated code for the build machine at the expense of portability.

In some tests, especially on wrlib I saw 8% perf improvement.
Should be used by developers or those who recompile wmaker for their own usage.
2026-01-24 14:24:03 +00:00
David Maciejak 77c3b95fd5 Doc: fix wmiv man page
Sort out the argument order or else 'make check' will complain.
2026-01-24 00:52:25 +00:00
David Maciejak b662d0827c WINGs: wfont fallback to default font when font is not found
This patch is fixing the issue reported
at https://github.com/window-maker/wmaker/issues/62
where wmaker is crashing if the font specified in WMGLOBAL is not found.
Now by default it will failsafe to DEFAULT_FONT.
2026-01-22 22:46:10 +00:00
David Maciejak a542934e67 WINGs: fix cursor ghosting issue in wtextfield
The cursor is moved using right/left arrows but as it's blinking
and a XOR function is used to hide/unhide it, it happens the cursor
can be not hidden properly from its previous position.
Better to refresh the view to avoid such issues.
2026-01-22 22:46:10 +00:00
David Maciejak d2b2c3238b WINGs: fix cursor position in wtextfield
In case the cursor is positioned out of the textfield view
after a delete and more chars are entered, wmaker process
will reach 100% and become unresponsive.

How to reproduce:
in the run command window enter an overly long text (longer than
the current input field view). Then, press home to go back to the
beginning of the string. Then, shift-End to select all the text,
then del to delete all the text. At that point the cursor is still
out of the view and if you enter more text wmaker process will be stuck.
2026-01-22 22:46:10 +00:00
David Maciejak d37a3162e0 WINGs: fix TARGETS request return type
According to the ICCCM, a reply to a TARGETS request must be a list of atoms.
Took the chance to also fix variable naming consistency between wtext and
wtextfield which are using the same kind of code.
2026-01-22 22:46:10 +00:00
David Maciejak 9ddacfc29b Fix typos and some appicon consistency in the FAQ 2026-01-18 14:54:28 +00:00
David Maciejak 7e21785710 wmiv: add support for archive files and a new option to ignore unknown image format
This patch adds optional support for compressed files and a new --ignore-unknown option
to ignore unknown image format. It also adds local filename drag-and-drop support.
And a copy current image to clipboard feature with ctrl+c shortcut.

It also fixes:
- fullscreen issue on multi monitors setup by using randr
- app icon advertised via _NET_WM_ICON
- fix UTF-8 filename usage in window title
2026-01-17 22:03:09 +00:00
David Maciejak 7cfdf6bd68 WRaster: add function to save image in memory
This patch adds the RSaveRawImage() function to the WRaster lib
to be able to save image structure in memory.
The WRaster lib version is bumped.
2026-01-17 22:03:09 +00:00
David Maciejak 72942267aa Prevent wrong UTF-8 window title truncation
The patch is fixing a UTF-8 truncation issue that could happen with the window title
when it was shrinked to be displayed in the window list (F11), leading to
an infinite loop.

Issue was reported at https://github.com/window-maker/wmaker/issues/61
2026-01-15 15:56:20 +00:00
Balló György ac19c4bc07 Don't set X-GDM-SessionRegisters to true
Window Maker does not call the RegisterSession() method on GDM's D-Bus
interface, causing that GDM doesn't know that the login was successful,
which leads to problems. If X-GDM-SessionRegisters is not specified or
false, GDM registers the session itself.

I noticed this when I logged out from Window Maker, and tried to log
in into another session with GDM, it doesn't work, because the login
screen hangs as the previous session was not entered into registered
state within GDM.

If X-GDM-SessionRegisters=true is specified, GDM expects that the
session will be registered via D-Bus:
https://gitlab.gnome.org/GNOME/gdm/-/commit/1c061b84ffc3e874da825982d18d970556ff74bb

E.g. GNOME Shell calls RegisterSession() method after login:
https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/0e37cd2ec92c5fbbc0870272e5e00fc07a705eba

Older versions behave the same way as would be X-GDM-SessionRegisters
not set or false.

Currently X-GDM-SessionRegisters=true is used only by GNOME Shell. All
other sessions omit this property, because they don't call the
RegisterSession() method on GDM's D-Bus interface after login.
2026-01-13 13:11:21 +00:00
David Maciejak 14bd13b1be Doc: fix spelling errors 2026-01-04 14:57:50 +00:00
David Maciejak afe13d3e72 New expert option: cycle all windows from all workspaces
Mentioned on the WMaker user mailing list, option disabled by default.

https://groups.google.com/g/wmaker-user/c/pR8P-ZYCDFo/m/Wo42U_xqBgAJ

So basically the patch is adding a new expert option in WPrefs (disabled by
default) to allow the switch panel to cycle over all the windows from all
workspaces. I believe it's useful if you are using a lot of fullscreen apps
each on different workspaces.
2026-01-03 19:23:34 +00:00
Carlos R. Mafra e356ef8c05 Revert "Prevent unnecessary RandR wmaker restart"
This reverts commit 3579c85af1.

As pointed out by David Maciejak himself, this patch triggers
an odd behavior:

 "Now I cannot do a rectangular selection on the desktop with the left
 click of the mouse like I used to do.
 Seems the XRRQueryVersion call to get randr version is messing up with the
 X events. I tried to move up the call in src/startup.c and src/main.c
 instead to the point where the bug cannot be reproduced if I am putting the
 XRRQueryVersion code just before the call to wDefaultsInitDomain
 "WMWindowAttributes" (in src/startup.c) which is really weird."
2025-12-30 20:25:46 +00:00
David Maciejak 3d993a7323 Fix UTF-8 usage in icon title
When pango is enabled and a window title contains UTF-8 chars,
there is a chance the miniaturized icon title will cut in 2 an UTF-8 char
leading to a glitch in the title.
2025-12-29 16:10:24 +00:00
David Maciejak a4a6e65ca9 Fix for ignore client supplied icon attributes
As mentioned on the WMaker user mailing list some time ago
https://groups.google.com/g/wmaker-user/c/95M_pb_Qlbs/m/6qJLJSqoAwAJ
The Ignore client supplied icon from the windows attributes is not working.
That's especially visible with firefox and thunderbird when they are using
NET_WM_ICON to push the embedded icon.
That patch is making sure to ignore the embedded icon if the user defined one.
2025-12-29 16:10:24 +00:00
David Maciejak 4392fdc291 WRaster: Add optional support to JPEG XL
Detect if libjxl is intalled, and build-in support in raster lib.
Feature can be disabled/enabled at configure time.
2025-12-27 19:48:37 +00:00
David Maciejak 67e2f5e1ca Prevent XAllocColor() call on TrueColor display
As reported in bug https://github.com/window-maker/wmaker/issues/50
X11 XAllocColor() call from wGetColorForColormap() in src/resources.c is returning some errors
especially seen when running GZDoom.

TrueColor display has been the dominant standard for well over a decade, meaning almost all modern X servers default to a TrueColor visual.
The default colormap is predefined and read-only, making allocation with XAllocColor() unnecessary (and meaning no need to free it too).
The patch is checking the display visual, and in case the display is truecolor, it does not allocate or free the color, just looking up for it.
Once the patch applied, GZDoom is not reporting warnings anymore.
2025-12-25 23:22:57 +00:00
David Maciejak 3579c85af1 Prevent unnecessary RandR wmaker restart
As reported in bug https://github.com/window-maker/wmaker/issues/34
when RandR is enabled, everytime a monitor is turned on or off wmaker is restarting
(that happens either manually or automatically with DPMS).
This behavior causes issues with xscreensaver.

How to reproduce the issue:
-install xscreensaver and lock the screen
-turn off then on the monitor manually
-you can see that wmaker was restarted and behind the xscreensaver lock window,
the desktop appears, potentially leaking information

Instead of using the RandR event RRScreenChangeNotifyMask which is too generic,
the patch is using RRCrtcChangeNotifyMask defined since RandR 1.2 (released in 2007).
In the recent RandR version, events for output (hardware) changes are propagated via
RROutputChangeNotifyMask while layout changes (like position, size, rotation)
are propagated via RRCrtcChangeNotifyMask.

The patch is purposedly not listening for RROutputChangeNotifyMask,
thus wmaker is not restarting on DPMS events anymore.

Currently, in case a new monitor is added (or removed) wmaker is not discovering it anyway
even after an automatic restart.
Either, wmaker has to be exited and restarted fully or an external tool like arandr
has to be used to configure the new monitor. So after the patch functionality remains unchanged.
2025-12-24 12:37:12 +00:00
David Maciejak 896bbce2e5 Remove default print key grabbing 2025-12-21 21:23:30 +00:00
David Maciejak 8f1ee27595 Remove duplicated code 2025-12-21 21:23:13 +00:00
Страхиња Радић 541947e9ef Update translator's email for Serbian
This patch updates my email throughout the source.

Signed-off-by: Страхиња Радић <sr@strahinja.org>
2025-10-27 20:47:25 +00:00
Страхиња Радић 7bb7d0f4d6 m4/wm_i18n.m4: Make compatible with POSIX sed
Currently, it seems like the script m4/wm_i18n.m4 is passing some editing
commands to sed(1), which are not strictly conforming to POSIX[1]. Namely, the
"grouping" command:

	{ command; command }

needs to have either a semicolon or a newline before the closing brace:

	{ command; command; }

or

	{ command; command
	}

according to POSIX.

On systems which don't use the lax GNU sed by default (like OpenBSD), the
current configuration and compilation goes like this:

$ autoreconf -vif

	...
	sed: 1: "/po$/{s,.po,,;p}": extra characters at the end of p command
	sed: 1: "/po$/{s,.po,,;p}": extra characters at the end of p command
	... (etc)

$ ./configure --without-menu-textdomain CATALOGS=sr.mo LINGUAS=sr \
	LIBS=-lintl MSGFMT=msgfmt --mandir=/usr/local/man

	...

	Translated languages to support     :

	configure: WARNING: No language from $LINGUAS are supported

$ gmake && doas gmake install
	... (no .mo files are generated nor installed)

and so on, since the editing commands in question are affecting the processing
of .po files.

This patch proposes inserting semicolons before the closing brace in the
mentioned editing commands passed to sed(1).

[1]: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html#tag_20_109_13_03

Signed-off-by: Страхиња Радић <sr@strahinja.org>
2025-10-27 20:47:25 +00:00
Doug Torrance da676c9e9e Add WPrefs Serbian translation to EXTRA_DIST
Otherwise "make check" fails (script/check-translation-sources.sh).
2024-11-12 10:15:17 +00:00
Doug Torrance 4edf589a5b Remove cruft from autogen.sh 2024-11-12 10:15:17 +00:00
Doug Torrance 709eec4bce Update autogen.sh so that it can be run from build directory 2024-11-12 10:15:17 +00:00
Jeremy Sowden b179803c11 Fix spelling errors
* "unknow" -> "unknown"
* "occured" -> "occurred"

Remove some entries from PO files where these entries contain spelling errors
and there are other entries that are identical except for these mistakes.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2024-11-10 16:59:03 +00:00
Jeremy Sowden 5cd40deb20 Add missing Language: headers to PO files
msgfmt complains.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2024-11-10 16:59:03 +00:00
Jeremy Sowden 9db1ea580d Ignore wrlib gettext artefacts
Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2024-11-10 16:59:03 +00:00
Jeremy Sowden 9e56f58742 Remove obsolete autoconf macro
`AC_PROG_GCC_TRADITIONAL` is obsolete and is now just an alias for `AC_PROG_CC`,
which is already defined.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2024-11-10 16:59:03 +00:00
Страхиња Радић 4b946f69e2 Update Serbian translation from master branch
Signed-off-by: Страхиња Радић <contact@strahinja.org>
2023-11-02 21:03:07 +00:00
Страхиња Радић d55be193b8 Edit leftover automake files and READMEs for Serbian localization
This patch adds sr.po files to Makefile.am files throughout the repository
where needed. It also adds credits for Serbian localization in README files as
needed.

Signed-off-by: Страхиња Радић <contact@strahinja.org>
2023-11-02 19:28:30 +00:00
Strahinya e5b227fe8d Add Serbian localization
This patch adds Serbian localization to Window Maker.

Signed-off-by: Страхиња Радић <contact@strahinja.org>
2023-11-01 19:36:20 +00:00
Страхиња Радић d947095881 util/wmgenmenu.c(main): Close parentheses around vgradient
Currently, menu definitions created by wmgenmenu don't include the closing
parenthesis in vgradient constructs. This patch adds the missing closing
parentheses.

Signed-off-by: Страхиња Радић <contact@strahinja.org>
2023-11-01 13:25:52 +00:00
Carlos R. Mafra 93b049356f Revert "WUtil: Be more strict about base directory for wmkdirhier()"
This reverts commit a0b283a60f,
as it breaks saving the history in ~GNUstep/.AppInfo/WindowMaker/History
by restricting modifications to either ~GNUstep/Defaults or ~GNUstep/Library.

Thanks to Paul Selig for reporting this issue.
2023-08-21 22:22:32 +01:00
Carlos R. Mafra 75f353bef4 Update .gitignore
Since

fc63d72032 (WINGs: Fix incorrect use of macro USE_PANGO in installed header)

and

0e274dc979 (WRaster: Fix incorrect use of macro USE_XSHM in installed header)

the files wrlib/wraster.h and WINGs/WINGs/WINGsP.h are generated by the compilation,
so add them to .gitignore
2023-08-21 21:35:30 +01:00
Christophe CURIS 2264ed9de6 Fix calculation of version number in the library mapfiles
As reported by Andreas Metzler, the latest API change in lib WRaster caused
a compatibility issue because the internal version number was increased.

To correctly handle this situation, this patch does 2 things:
 - do not discard the 2 last number in the "c:r:a" version, because we need them;
 - when calculating the version for the mapfile, use the formula that is
suggested in libtool's documentation.

The purpose of the formula is that when API is changed, if a new function
is added then the version is not incremented to reflect that we are still
compatible with current binaries, it will be incremented only when there
is a break in compatibility.
2023-08-12 21:53:52 +01:00
Carlos R. Mafra d0aa2cefcd Window Maker 0.96.0 2023-08-05 08:46:23 +01:00
David Maciejak a52d13c8b8 Fix autoconf obsolete macros
autogen.sh is reporting some warnings as below

./autogen.sh 2>&1 |grep "obsolete"
libtoolize: copying file 'm4/lt~obsolete.m4'
configure.ac:115: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:115: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:134: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:134: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:135: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:135: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:146: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:146: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:146: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:146: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:373: warning: The macro `AC_LANG_C' is obsolete.
configure.ac:373: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:458: warning: The macro `AC_HEADER_TIME' is obsolete.
configure.ac:681: warning: The macro `AC_TRY_LINK' is obsolete.
configure.ac:807: warning: The macro `AC_TRY_LINK' is obsolete.

As the minimum autoconf version required is v2.69,
we need to make sure to update obsolete macros as described at
https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Obsolete-Macros.html
2023-04-14 23:45:00 +01:00
David Maciejak 215b6ee2e6 Set proper motif wm hints name
Just a cosmetic change as the variable is currently not in use.
According to the Motif Toolkit API and MwmUtil.h, the last long
variable from the Motif WM Hints struct is currenlty used
for the status.
2023-04-09 10:42:52 +01:00
David Maciejak ab45c6c6c2 Add central position feature for active window
This patch adds a new Central feature under the window menu
"Other maximization" entry.
Shortcut can be configured via WPrefs "Center active window" action.
When called the active window is centered on the screen head.
If the window height or width are bigger than the head size,
the window is resized to fit.
There are some transitions defined as below:
*from fullscreen to center
*from any corner to center
*from top half to center top half
*from bottom half to center bottom half
*from left half to center left half
*from right half to center right half

Undoing the action is done via the window menu "Unmaximize" entry
or the shortcut.
2023-03-31 09:11:38 +01:00
David Maciejak 3344f2b040 NEWS: Hot corners feature description
Add an entry in the NEWS to describe the Hot Corners feature.
2023-03-26 10:35:33 +01:00
David Maciejak ecef2b2890 WPrefs: Hot corner preferences
Add a new "Hot Corner Shortcut Preferences" section to WPrefs
to configure the Hot Corners feature.
2023-03-26 10:35:33 +01:00
David Maciejak 802cbc0d75 Hot corners feature core
Add mouse pointer position detection to trigger the corner actions.

Screen corners can be assigned an external command to be
executed when the mouse pointer is entering those areas.

In WPrefs, "Hot Corner Shortcut Preferences" can be used
for configuration or by manually adding a "HotCorners" key
and value to "YES" in the ~/GNUstep/Defaults/WindowMaker file.

Actions are specified by the "HotCornerActions" and are defined
as a four entries list ("top left action", "top right action",
"bottom left action", "bottom right action").
A screen corner area is a cube shape defined by the "HotCornerEdge"
which is a number of pixels from 2 (by default) to 10.

To lower the risk of triggering that feature accidentally a
"HotCornerDelay" key can be used which is the time before the action
is triggered while the pointer is in one of the screen corner.
Default value is 250 ms.

Hot Corners feature is disabled by default.
2023-03-26 10:35:33 +01:00
David Maciejak 157d1ba85f Fix internal function name typo
The patch is to fix a typo in the fct name movePionterToWindowCenter
2023-03-23 12:57:58 +00:00
David Maciejak 91e7f37074 WPrefs: fix keyboard shortcut sorting order
That patch is fixing some Actions entries that are not sorted properly.
One is using some upper/lower cases.
And the other one, is displaying numbers while alphabetic sorting is not
working properly on numbers. For example:
Shortcut for window 1
Shortcut for window 10
Shortcut for window 2
...
2023-03-21 15:20:19 +00:00
David Maciejak 18a539b372 Add some more cases to handle window unusual size request
As discussed on the ML, the test to check for CARD16 limit is probably innacurate.
Check instead for maxH and maxW which are set by default to twice the size
of the screen or to the max values passed by the window normal hints property.
2023-03-16 15:02:18 +00:00
David Maciejak eae9200c5d Fix ICCM ConfigureNotify request
According to ICCM specs at [1]

*Not changing the size, location, border width, or stacking order of the window at all.
A client will receive a synthetic ConfigureNotify event that describes the (unchanged)
geometry of the window. The (x,y) coordinates will be in the root coordinate system,
adjusted for the border width the client requested, irrespective of any reparenting
that has taken place. The border_width will be the border width the client requested.
The client will not receive a real ConfigureNotify event because no change has actually
taken place.

*Moving or restacking the window without resizing it or changing its border width.
A client will receive a synthetic ConfigureNotify event following the change that
describes the new geometry of the window. The event's (x,y) coordinates will be in
the root coordinate system adjusted for the border width the client requested.
The border_width will be the border width the client requested. The client may not
receive a real ConfigureNotify event that describes this change because the window
manager may have reparented the top-level window. If the client does receive a
real event, the synthetic event will follow the real one.

*Resizing the window or changing its border width
(regardless of whether the window was also moved or restacked).
A client that has selected for StructureNotify events will receive a real
ConfigureNotify event.
Note that the coordinates in this event are relative to the parent,
which may not be the root if the window has been reparented. The coordinates will
reflect the actual border width of the window (which the window manager may have
changed). The TranslateCoordinates request can be used to convert the coordinates
if required.

In Window Maker, the first case is not implemented: doing a synthetic ConfigureNotify
to notify no changes were done. That's creating some issues with app like Citrix icaclient
when sometime windows are blank and need to be moved to be refreshed.

[1]https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#configuring_the_window
2023-03-16 15:02:18 +00:00
David Maciejak 25cb9d208a Update window.c copyright
Just updating the copyright line in the file header.
2023-03-16 15:02:18 +00:00
David Maciejak 23471b2e21 WPrefs: update maximization feature descriptions
Align the old maximization descriptions to the new visual indicator
names. The internal shortcut names had also been updated, meaning a
reconfiguration of the shortcuts in WPrefs is required.
2023-03-16 11:36:02 +00:00
David Maciejak 258ffc8b97 Window menu: add maximization visual indicators
Add visual indicators for the maximization options in the window menu.
2023-03-14 12:27:16 +00:00
David Maciejak 86b7ec1a58 Restore proper drawer direction when screen was resized
Since 48d4820dee the dock is positioned
dynamically based on the screen midpoint.
The side issue using such method is if in case the screen was temporarily
resized the dock as a chance to be displayed on the other side making
the drawer saved configuration from WMState esp the direction wrong when
wm is started again.
For example, the dock and drawer are displayed on the right of the screen.
Then the screen resolution is downsized temporaily to half or less of
the previous size. The position stored in WMState will be updated and the
direction of the drawer is still opening on the left.
But on next wm start, when reading the conf.
The position of the dock and drawer are corresponding to the
middle or less of the unresized screen. The dock and drawer will be sticked
on the left. But the drawer direction was not updated and still opening
on the left (which is out of the screen).
2023-03-14 12:27:16 +00:00
Doug Torrance 9831e3f72a Move declarations to beginning of switch statements
Several variable declarations were recently added immediately after
labels, but this causes compile errors in GCC versions prior to 11,
e.g.,

    wsmap.c: In function ‘handle_event’:
    wsmap.c:534:4: error: a label can only be part of a statement and a declaration is not a statement
      534 |    WMScreen *wmscr = wsmap->scr->wmscreen;
          |    ^~~~~~~~

We move these declarations to the top of the corresponding switch
statements so that Window Maker can compile on these older versions of
GCC.
2023-03-13 15:33:21 +00:00
David Maciejak 0a55facac0 wmiv: align version with wm
Use wm version for the wmiv util.
2023-03-13 15:32:19 +00:00
David Maciejak 0ecf7d3540 KeepDockOnPrimaryHead: fix drawer direction
When that option is on, swapping drawer does not always mean
swapping drawer direction. For example if drawer is on the left
side of the second head and moving to the left side of the first head,
the direction should be the same.
2023-03-13 15:32:19 +00:00
David Maciejak 4576b5bf1e Info Panel: display proper number of colors in deepcolor env
Instead of displaying a number of unitary colors in 10bit env,
display a more human readable message.
2023-03-13 15:32:19 +00:00
David Maciejak 0526ddfc54 WINGs: Make the Extras examples to compile
There is a table view example which is not compiling cause
of a missing lib, also fixed some warnings.
2023-03-12 09:44:10 +00:00
David Maciejak 4c52232ee7 Window titlebar double click to unmaximize
Commit 6e2075f3df from 2020 added
a feature to maximize window when double clicking on the titlebar.
But unmaximizing is not supported so when double clicking again
on the window titlebar the window geometry was not reverted back.
2023-03-12 09:44:10 +00:00
David Maciejak 43edd37ee2 Update file headers year copyright
Update copyright year for Window Maker Team entries.
2023-03-12 09:44:10 +00:00
David Maciejak e95aea2e30 Workspace pager: display ? on non visited mini workspace
When the workspace pager is displayed it's showing grey mini workspaces
for non rendered/non visited workspaces. That patch is adding an exclamation
mark in the middle of the dummy grey background mini workspaces.
2023-03-11 11:38:25 +00:00
David Maciejak 038a3588d6 WINGs: W_KeycodeToKeysym remove unnecessary if test
min_kc value is always -1 at that point in the code, so need to test it
as it's always true.
2023-03-09 15:05:58 +00:00
David Maciejak 0b2fd6a8c8 WINGs: handle fixed size windows
According to the EWMH specs, windows can indicate that they are
non-resizable by setting minheight = maxheight and minwidth = maxwidth
in the ICCCM WM_NORMAL_HINTS property. That should be for example
the case for WPrefs app which is not resizable.
Window Maker currently is overwriting that flag in src/window.c for
apps that are exposing GNUstepHints instead.
This patch is making sure the apps created with WINGs is removing
the WMResizableWindowMask to hide the resizebar.
2023-03-09 15:05:58 +00:00
David Maciejak 3e991badf7 SwitchPanel: fix app icons opacity combination
For some apps the background is not displayed properly, showing
some kind of shawow around the app icon like for example firefox
or skype. This is due to an issue in combining alpha channels.
2023-03-09 15:05:58 +00:00
David Maciejak ac6d284269 NEWS: add entry for libXRes support 2023-03-09 15:05:58 +00:00
David Maciejak 83b94b1616 Update news and changelog files 2023-03-07 17:31:07 +00:00
David Maciejak d045ffcf7d Add a screenshot capture feature
This patch adds a feature to take screenshots directly from Window Maker.
Having the feature embeded direclty inside Window Maker allows us to take
advantage of how Window Maker is managing and handling Windows.
Three new actions can be bound to a key shortcut from WPrefs.
The screenshot files are saved in ~/GNUstep/Library/WindowMaker/Screenshots/
dir, with a "screenshot_%Y-%m-%d_at_%H:%M:%S" format followed by the
extension. Preferably as a PNG or JPG file if available.
Meaning, to work Window Maker via WRaster needs to support
at least one of those format.

"Capture the entire screen" is quite standard, it takes a screenshot
of the whole screen area (even in multiheads env).
"Capture a portion of the screen" requires the user to draw a rectangle which
will be captured.
Those two first are quite straightforward, just taking a live picture of
the screen.
The last one is "Capture a window" which works in best effort mode,
it catures the focused window. As Window Maker by default is not using
any compositor (like for example Xcompmgr) it can only dump the content
displayed on the screen.
If a window is minimized or out of the screen, there is high chance the
image will be split or some area greyed in case other windows overlapped it.
2023-03-07 17:30:59 +00:00
David Maciejak 6c69dc32a0 WINGs: Make the test examples to compile
Those examples are optional but currently cannot compile properly.
The compiler is reporting some unused variables and missing header file.
2023-03-07 17:24:41 +00:00
David Maciejak 3b1c00ad06 WINGs: comment out wtext unused NOTIFY macro
The compiler is reporting the warning below
wtext.c:171: warning: macro "NOTIFY" is not used [-Wunused-macros]

That macro is only used once within that C file, code which is commented
out already.
2023-03-06 20:16:07 +00:00
David Maciejak dd6fe27858 WPrefs: convert workspacename.xpm X11 color name to hex
On window maker built without libxpm, a simple build-in xpm support is used.
That component does not support X11 color name thus when trying to load
that image we are getting a file corrupted error.
Colors manually converted using ref at
https://www.ehdp.com/methods/x11-colors/x11-colors-rgb-values-05.htm
2023-03-05 00:16:44 +00:00
David Maciejak 45f3f5d0ae Util: fix wmgenmenu memory leak and help msg
Memory allocated from wstrconcat() calls are not freed properly.
Help msg is reporting the wrong directory where to install WMRootMenu.
2023-03-05 00:16:44 +00:00
David Maciejak 7185af15cf Use wtokenfree whenever there is wtokensplit
Whenever wtokensplit is used to split into argv/argc, it's better to
use the built-in function wtokenfree() as a wfree call only on argv
is not freeing the memory properly.
2023-03-05 00:16:44 +00:00
David Maciejak 80e8dd43f7 Convert tile.xpm X11 color name to hex
On window maker built without libxpm, a simple build-in xpm support is used.
That component does not support X11 color name thus when trying to load
that image we are getting a file corrupted error.
Colors manually converted using ref at
https://www.ehdp.com/methods/x11-colors/x11-colors-rgb-values-05.htm
2023-03-05 00:16:44 +00:00
David Maciejak a383074c99 WPrefs: sort alphabetically the key shortcut actions and expert options
There are too many entries now in key shortcut actions and expert options,
better to sort them dynamically.
2023-03-03 14:15:19 +00:00
David Maciejak 52a623729d Coverity: fix WRaster convert uninitialized scalar variable 2023-03-03 14:15:19 +00:00
David Maciejak d4ee17f0b5 Coverity: fix WPrefs workspace negative array index read 2023-03-03 14:15:19 +00:00
David Maciejak 7475bc5d0a Coverity: fix util wmsetbg resource leak 2023-03-03 14:15:19 +00:00
David Maciejak 35f87b5592 WRaster: add new file references for translation
This patch is adding the references for the two newly added files
save_jpeg.c and save_png.c for translation (even if those new
files are not adding any new strings to be translated).
2023-03-03 09:51:24 +00:00
David Maciejak 5e37d13eb6 Coverity: fix wmgenmenu resource leak 2023-03-02 17:04:48 +00:00
David Maciejak 4b1aee3e79 Coverity: fix wmmenugen resource leak 2023-03-02 17:04:48 +00:00
David Maciejak 0ccc5bbde7 Coverity: fix wmspec dereference after null check 2023-03-02 17:04:48 +00:00
David Maciejak 59a686d22e Coverity: fix WPrefs appearance negative array index read 2023-03-02 17:04:48 +00:00
David Maciejak 26d46f6e16 Coverity: fix WPrefs menu negative array index read 2023-03-02 17:04:48 +00:00
David Maciejak ceafbf0629 Coverity: fix WPrefs mousesettings menu negative array index read 2023-03-02 17:04:48 +00:00
David Maciejak cf178d011b Coverity: fix WPrefs preference negative array index read 2023-03-02 17:04:48 +00:00
David Maciejak 682c2767c2 Coverity: fix WPrefs texturepanel negative array index read 2023-03-02 17:04:48 +00:00
David Maciejak 0e00c6b605 Coverity: fix dialog dereference null return value
This patch is making sure defaultPath returns from FindImage() is not null
and freeing the variables.
2023-03-02 17:04:48 +00:00
David Maciejak e9717ed719 Coverity: fix WPrefs appearance time of check time of use 2023-03-02 17:04:48 +00:00
David Maciejak 9e59d19507 Coverity: fix WPrefs editmenu uninitialized scalar variables 2023-03-02 17:04:48 +00:00
David Maciejak 94f98dcd25 Coverity: fix WRaster convert uninitialized scalar variable 2023-03-02 17:04:48 +00:00
David Maciejak 6c7266c338 Coverity: fix session resource leak 2023-03-02 17:04:48 +00:00
David Maciejak b4bd6d0cad Coverity: fix xmodifier uninitialized scalar variable 2023-03-02 17:04:48 +00:00
David Maciejak c7f7c10d7c Coverity: fix wmsetbg string not null terminated 2023-03-02 17:04:48 +00:00
David Maciejak d831766572 Coverity: fix rootmenu structurally dead code 2023-03-02 17:04:48 +00:00
David Maciejak e2ecfbfd54 Coverity: fix wcolorpanel uninitialized scalar value 2023-03-02 17:04:48 +00:00
David Maciejak a8ec32d41a Coverity: fix setstyle resource leak 2023-03-02 17:04:48 +00:00
David Maciejak 1215680b6d Coverity: fix misc resource leak 2023-03-02 17:04:48 +00:00
David Maciejak 77df89396c Coverity: fix menuparser_macro uninitialized pointer read 2023-03-02 17:04:48 +00:00
David Maciejak c8883fdbb0 WRaster: add functions to save image on disk
This patch adds the RSaveTitledImage() function to the WRaster lib
to be able to save file on disk either as a PNG or a JPEG file.
Those two formats depends on optional external libs.
The function can take an optional title/comment which will
be save inside the file.

The WRaster lib and header versions are bumped.
2023-03-02 10:23:47 +00:00
David Maciejak 3cc5808dcd Coverity: fix wmspec uninitialized layer variable 2023-02-28 13:40:48 +00:00
David Maciejak 8ca89f0141 Coverity: fix RContextAttributes uninitialized variable 2023-02-28 13:33:11 +00:00
David Maciejak 76fa91d21e Coverity: fix wmiv resource leak 2023-02-28 13:33:11 +00:00
David Maciejak d2d5297a1e Coverity: fix potential buffer overflow 2023-02-28 13:33:11 +00:00
David 7b317a5fba wmiv: use W_KeycodeToKeysym instead of XkbKeycodeToKeysym
This patch replaces XkbKeycodeToKeysym in wmiv by our
own function W_KeycodeToKeysym.
2023-02-28 03:33:21 +00:00
David Maciejak 9f8dc6f5dc Use W_KeycodeToKeysym instead of XkbKeycodeToKeysym
This patch replaces XkbKeycodeToKeysym by our
own function W_KeycodeToKeysym.
2023-02-27 23:05:27 +00:00
David Maciejak bc56db0776 WPrefs: use W_KeycodeToKeysym instead of XkbKeycodeToKeysym
This patch replaces XKeycodeToKeysym and XkbKeycodeToKeysym
in WPrefs by our own function W_KeycodeToKeysym.
2023-02-27 23:05:27 +00:00
David Maciejak 15d06ff064 WINGs: Add W_KeycodeToKeysym to replace XKeycodeToKeysym/XkbKeycodeToKeysym calls
XKeycodeToKeysym was deprecated some time ago and we replaced
those function calls to XkbKeycodeToKeysym.
Usage of XkbKeycodeToKeysym is not the best as it appears
the XKEYBOARD can be disabled via xorg.conf (at least on Linux).
So just replacing XKeycodeToKeysym() with XkbKeycodeToKeysym()
could cause run-time errors on top of the compilation warning
we may have.
Better fix is to address the problem without introducing a
dependency on XKEYBOARD. W_KeycodeToKeysym is the equivalent
code for XKeycodeToKeysym/XkbKeycodeToKeysym using
XGetKeyboardMapping instead.

As a new function is added to the library WINGs library version
is bumped.
2023-02-27 22:37:44 +00:00
David Maciejak 2dd98666f1 Store window maximize state as hex value
As the maximize state is defined as a bit-field internally.
Better to store the flag in the WMSTATE file as hex value.
2023-02-27 22:37:44 +00:00
David Maciejak d1a7db8aea Compile by default with POSIX 7 revision
Compile by default with POSIX-2008 standard for Linux and FreeBSD.
2023-02-27 22:37:44 +00:00
David Maciejak 64a8ecb390 Code cleaning: removing trailing space
The patch is removing trailing space(s) before
the semicolon ending line. .c and .h files were checked.
2023-02-27 22:37:44 +00:00
David Maciejak a9e336256b Doc: add disable-res description 2023-02-26 11:02:46 +00:00
David Maciejak e9b20b51e9 WPrefs: check if captured keyboard shortcut is not in use
Make sure the captured keyboard shortcut is not already in use
by another action, if it's the case an error popup is shown and
the key is not kept.
2023-02-25 13:31:42 +00:00
David Maciejak 1d8b38b6e0 Fix compiler warnings from texture.c v2
The patch fixes those 2 warnings below from texture.c.
It reverts the previous v1 patch and fixes the compiler warning
by updating the texture.h wTextureMakeIGradient header instead.

texture.c:205:81: warning: argument 3 of type 'const RColor[2]' with mismatched bound [-Warray-parameter=]
  205 | WTexIGradient *wTextureMakeIGradient(WScreen *scr, int thickness1, const RColor colors1[2],
      |                                                                    ~~~~~~~~~~~~~^~~~~~~~~~
In file included from texture.c:33:
texture.h:165:53: note: previously declared as 'const RColor[]'
  165 | WTexIGradient *wTextureMakeIGradient(WScreen*, int, const RColor[], int, const RColor[]);
      |                                                     ^~~~~~~~~~~~~~
texture.c:206:67: warning: argument 5 of type 'const RColor[2]' with mismatched bound [-Warray-parameter=]
  206 |                                      int thickness2, const RColor colors2[2])
      |                                                      ~~~~~~~~~~~~~^~~~~~~~~~
texture.h:165:74: note: previously declared as 'const RColor[]'
  165 | WTexIGradient *wTextureMakeIGradient(WScreen*, int, const RColor[], int, const RColor[]);
      |
2023-02-25 13:31:42 +00:00
David Maciejak 82ad19d420 Fix compiler warnings from texture.c
The patch fixes those 2 warnings below from texture.c

texture.c:205:81: warning: argument 3 of type 'const RColor[2]' with mismatched bound [-Warray-parameter=]
  205 | WTexIGradient *wTextureMakeIGradient(WScreen *scr, int thickness1, const RColor colors1[2],
      |                                                                    ~~~~~~~~~~~~~^~~~~~~~~~
In file included from texture.c:33:
texture.h:165:53: note: previously declared as 'const RColor[]'
  165 | WTexIGradient *wTextureMakeIGradient(WScreen*, int, const RColor[], int, const RColor[]);
      |                                                     ^~~~~~~~~~~~~~
texture.c:206:67: warning: argument 5 of type 'const RColor[2]' with mismatched bound [-Warray-parameter=]
  206 |                                      int thickness2, const RColor colors2[2])
      |                                                      ~~~~~~~~~~~~~^~~~~~~~~~
texture.h:165:74: note: previously declared as 'const RColor[]'
  165 | WTexIGradient *wTextureMakeIGradient(WScreen*, int, const RColor[], int, const RColor[]);
      |
2023-02-24 12:19:38 +00:00
David Maciejak 492b22d975 Fix compiler warning from menu.c
The patch fixes the compiler warning below

menu.c: In function 'restoreMenuRecurs':
menu.c:2450:47: warning: '%s' directive output may be truncated writing up to 510 bytes into a region of size between 509 and 1019 [-Wformat-truncation=]
 2450 |         snprintf(buffer, sizeof(buffer), "%s\\%s", path, menu->frame->title);
      |                                               ^~

The code is taking care of checking properly the string passed to the buffer,
so there is no issue, the change is just to make the compiler happy.
2023-02-24 12:19:38 +00:00
David Maciejak 62405fbb75 Detect and override illegal window size hints v2
The patch is trying to mitigate and properly address the issue described at
https://github.com/window-maker/wmaker/issues/26
A buggy application (in that example virtualbox) is requesting a window size creation
that is way too big and basically at the limit of X11 protocol
(width and height are defined as CARD16).
See details at https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html
During the tests, virtualbox has been seen requesting for window creation of size 843x65508.
Even xprop is reporting incorrect values.

There had been an attempt before with the commit
https://repo.or.cz/wmaker-crm.git?a=commit;h=6668715402a5d8e2ecda6702076a06bf8988721e

But the patch is broken and not implemented at the right place.
As described in the wWindowConfigure function header, the size passed by the client app
should not be trusted and should be vetted with a prior call to wWindowConstrainSize.
wWindowConstrainSize call was missing only once in the wClientConfigure function from client.c
What wWindowConstrainSize doing now is basically setting a failsafe window size fo 640x480
if both width and height are above the size of CARD16.
If only one dimension is oversized, it's setting a default 4/3 window ratio.
Oversized here has not been changed and it's defined in windowmaker as double the screen size.
2023-02-22 20:10:31 +00:00
David Maciejak f1fef40f0d Make window maximize state persistent
Window maximize state is not persistent between windowmaker sessions.
This patch is updating the save and restore workspace state functions
to update the state in the WMSTATE file.
2023-02-21 18:16:35 +00:00
David Maciejak 2fb9308a67 Info Panel: Add libXRes info if supported
If windowmaker was compiled with libXRes,
add XRes info in the "Additional support" section.

Take also the chance to remove the mode +x on the source code file.
2023-02-20 23:07:02 +00:00
David Maciejak d902477efd Set missing WM_COMMAND using pid given from libXRes
For apps which are not setting the window WM_COMMAND property like those old
apps using Motif toolkit (I am thinking of NEdit for example)
it's bringing some issues in windowmaker which is relying on it for a few interactions.
Especially,
*an app without WM_COMMAND will not be saved during the workspace state
(so session restore is not working for them)
*when added to the dock, the settings parameters are empty and need to be filled
*cannot autostart from the dock (even if the settings are manually filled and saved)
*right click on the app titlebar, and choosing Launch has no effect

Most of the time, those apps are also not setting the X11_NET_WM_PID property.
With the pid we could have a chance to find the running program.
To link a window to a pid, there is the X11 Resource extension library (libXRes).
After checking, gnome and xfce are also using the same method to handle such issues.

The patch is checking if the libXRes is present on the system (but it's not mandatory to compile).
Then, it adds a layer on top of wNETWMGetPidForWindow to not only check the window property
but if necessary to get the underlying pid from libXRes if available.
That's solving the points mentioned above.
2023-02-20 15:00:55 +00:00
David Maciejak 5ee19c2308 Allow WM_COMMAND-less app to autostart
For apps which are not setting the window WM_COMMAND property like those old
apps using Motif toolkit (I am thinking of NEdit for example)
it's bringing some issues in windowmaker which is relying on it for a few interactions.
Especially,
*an app without WM_COMMAND will not be saved during the workspace state
(so session restore is not working for them)
*when added to the dock, the settings parameters are empty and need to be filled
*cannot autostart from the dock (even if the settings are manually filled and saved)
*right click on the app titlebar, and choosing Launch has no effect

The patch below allows the workspace state to be saved for those apps without WM_COMMAND
that have been launched from the dock. We are just reusing what have been set in the
Application Path Settings of the dock app (and it does not require extra libs like libXRes).
2023-02-20 15:00:55 +00:00
David Maciejak fabd4252ab Allow exit panel to be bound to a key shortcut
While debugging the save/restore workspace state, I found quite
useful to be able to exit windowmaker using a key shortcut.
2023-02-20 15:00:55 +00:00
David Maciejak 630e9292c2 Factorize duplicate run command code
Run command from the menu and run command from the key shortcut are from two different codes.
Merge them into one function instead.
2023-02-19 10:10:49 +00:00
David Maciejak 14d1b8197a WRaster: Avoid undefined setjmp() behavior with libjpeg
Fix compiler warning:
load_jpeg.c: In function 'RLoadJPEG':
load_jpeg.c:100:17: warning: variable 'image' might be clobbered by 'longjmp' or 'vfork' [-Wclobbered]

As it was not working to only set the RImage *image as volatile,
I had to refactor the code by following the example from
https://github.com/libjpeg-turbo/libjpeg-turbo/commit/410c028f3396d1fa9bcc72608079ff4d3d76b03e#diff-e7cb632359a2be17c1008b50f9ec85691cd5d66834d5fe8f63ef65ceb06682ee
2023-02-19 10:10:41 +00:00
David Maciejak 4d658341d2 Add support for _NET_WM_FULLSCREEN_MONITORS
This patch adds the _NET_WM_FULLSCREEN_MONITORS hint as defined in EWMH which is based on Xinerama.
It's allowing a window to be displayed fullscreen on multiple monitors.

Issue mentioned at https://github.com/window-maker/wmaker/issues/8
Specs at https://specifications.freedesktop.org/wm-spec/1.5/ar01s06.html#idm45763309187776
GTK test program used https://bugzilla.gnome.org/show_bug.cgi?id=414476
2023-02-18 08:41:08 +00:00
David Maciejak ac75047aef Fix mini workspace compiler warnings
The patch is to fix warnings like:
wsmap.c: In function "update_mini_workspace":
wsmap.c:451:55: warning: "%d" directive output may be truncated writing between 1 and 11 bytes into a region of size 10 [-Wformat-truncation=]
  451 |                         snprintf(name, sizeof(name), "%d", general_index);
2023-02-17 21:51:06 +00:00
David Maciejak 6d6f9f6ff5 Info Panel: Fix uninitialized posn variable 2023-02-16 11:34:54 +00:00
David Maciejak 370adc94e7 Ignore WM_NORMAL_HINTS resize increment for maximized windows
If you are trying to maximize old apps that are setting a resize increment
in term of WM_NORMAL_HINTS notion the window will not be maximized fully (by a few pixels).
It's easy to reproduce with xterm, ctrl double click on the title bar.
xprop extract sample is giving:
program specified resize increment: 6 by 13

For those maximized windows the patch is just ignoring the resize increment.
Seems the same issue happened on that project
https://github.com/paperwm/PaperWM/issues/106
2023-02-16 01:21:25 +00:00
David Maciejak 532acdc443 WRaster: Avoid types deprecated with libtiff 4.3
This patch is fixing compiler warnings like:

load_tiff.c:42:9: warning: 'uint16' is deprecated [-Wdeprecated-declarations]
load_tiff.c:43:9: warning: 'uint32' is deprecated [-Wdeprecated-declarations]

As starting from libtiff 4.3, released in April 2021, types were moved
from uint16 to uint16_t and uint32 to uint32_t respectively.

See https://libtiff.gitlab.io/libtiff/releases/v4.3.0.html
2023-02-15 11:24:09 +00:00
David Maciejak d7d38aa443 Info Panel: display more OS details
Rely on old utsname and os-release (http://0pointer.de/blog/projects/os-release) when available
to display more underlying OS details in the Info panel.
The idea is when someone creates a bug entry we can request them to copy/paste that screen
to give more info about the context that could help us debug the issue.
For example, on my current system it's displaying:
"Running on: Ubuntu 22.10 (x86_64)"
2023-02-15 09:37:06 +00:00
David Maciejak a6209cc89b Set a better exit panel message
Replace the exit window manager generic message with Window Maker term instead.
2023-02-15 09:37:06 +00:00
David Maciejak 01bd523cee WINGs: allow keypad enter key to validate button
This patch allows the keypad enter key to validate the button click action.
2023-02-15 09:37:06 +00:00
David Maciejak 45ab72a78a InfoPanel: fix out of display text
When debug is enabled, the memory allocated details is supposed to display the free chunks
but as the text length is too long it's getting out of the display area.
This patch is increasing the window width to handle such case.
2023-02-13 13:10:14 +00:00
David Maciejak 437b76812d Info Panel: mallinfo is deprecated use mallinfo2 instead
Replacing mallinfo with mallinfo2.

The fields of the mallinfo structure that is returned by the
older mallinfo() function are typed as int.  However, because
some internal bookkeeping values may be of type long, the
reported values may wrap around zero and thus be inaccurate.
2023-02-11 10:35:23 +00:00
David Maciejak e3ee459a78 Info Panel: use system time to get the current year
Use the system date to get the current year to insert inside the copyright line.
So no need to update that string anymore.
2023-02-11 10:33:22 +00:00
David Maciejak d70b546f2e Fix wrong XKeycodeToKeysym index value
XKeycodeToKeysym was deprecated some time ago and wmaker code was patched to use the definition from XKBlib instead.
(https://repo.or.cz/wmaker-crm.git?a=commit;h=0382dd5dd7ecae2112a0c6366eaf9e6ab68ad354)

Before being deprecated,  XKeycodeToKeysym was prototyped at X11/Xlib.h as
KeySym XKeycodeToKeysym(display, keycode, index)

Now it's available in X11/XKBlib.h as
KeySym XkbKeycodeToKeysym(display, keycode, group, level)

Basically level now which is the 4th parameter is our old index variable (3rd parameter).

On systems which don't have xkb supported the value set for index is wrong.
As seen in old patch at https://repo.or.cz/wmaker-crm.git/blobdiff/139f912e618870cc7fd908099f203450547eb658..43c3526d2120712f72579398b73ef92283d9078b:/WPrefs.app/MouseSettings.c
we should pass the l value to old XKeycodeToKeysym function and not the 0 value which is used for the group in the new XkbKeycodeToKeysym definition.
2023-02-11 10:30:52 +00:00
David Maciejak 812930b7cd Fix icon.c unused variable compiler warning
Just to please the compiler as it's reporting:
icon.c: In function 'get_icon_cache_path':
icon.c:425:13: warning: unused variable 'len' [-Wunused-variable]
2023-02-11 10:30:02 +00:00
David Maciejak 2a14004fc3 SwitchPanel: make sure WMRetainColor and WMReleaseColor calls are even
The number of calls to WMRetainColor for a color in use should the same as the number of calls to WMReleaseColor
to free that color. In case of discrepancy, random crashes can happen and memory is not freed properly.
To debug that issue I checked the retained colors when the switchpanel is opened and then checked if those colors are properly released once the panel is closed.

This patch fixes the issue mentioned at https://github.com/window-maker/wmaker/issues/22
2023-02-10 11:24:55 +00:00
David Maciejak 04e9f33437 WINGs: Fix incorrect findCloseColor exact flag value
In case the color cannot be allocated exactly by createRGBAColor function,
the findCloseColor function is used as a failover function to find a color close to the requested color.
By definition that color is then not exact.
createRGBAColor exact flag should be 1 while findCloseColor exact flag should be 0
2023-02-10 11:24:44 +00:00
David Maciejak 150816c687 Fix missing linefeed on the error message
Just to display the error message properly in case there is no display.
2023-02-08 00:14:48 +00:00
Torrance, Douglas ddacfa5d63 Include screen.h in dialog.h for definition of WScreen 2023-01-26 10:15:58 +00:00
Torrance, Douglas 0718297e9a Correctly draw window snapping hints on multi-head systems
Previously, the transparent frames that were drawn prior to snapping a
window assumed that there was only one head, i.e., that the new
position and dimensions of the window would be based on the dimensions
of the entire screen.

However, this is not the case on multi-head systems, and so we now
base the transparent frame's position and dimensions on the current
head of the window.

We also refactor the code so that the new dimensions are computed in
the switch statement and finish with one final call to
drawTransparentFrame.
2023-01-20 11:54:07 +00:00
Torrance, Douglas 9cc16182d3 Use dock to determine whether drawer is on right side when swapping
Previously, we assumed that it always switched from left to right or
vice versa when calling swapDrawer.  However, now we may also call
swapDrawer when changing the value of "KeepDockOnPrimaryHead", which
wouldn't actually switch which side of the screen it's on.

So instead, we determine which side of the screen it should be on
based on the dock.
2023-01-20 10:34:36 +00:00
Torrance, Douglas f6165d6e80 Use actual x position of dock when saving state
Previously, we either saved it as 0 or -ICON_SIZE, and then adjusted
it depending on the screen width when restoring the state.

But since the introduction of the "KeepDockOnPrimaryHead" option, the
state-restoring code has changed so that the dock will go on the left if the
x-coordinate of the position in WMState is to the left of the midpoint
of the screen and on the right otherwise.  But previously (unless the
user manually set the value in WMState) this would always send the
dock to the left, even if it had been on the right, since the x-coordinate
automatically saved to WMState in this case was negative.

We simplify things by saving the actual x position of the dock to WMState.
2023-01-20 10:34:36 +00:00
Torrance, Douglas 10c36d244e Use dock's position to determine position of dock menu
Previously, we assumed that if the dock was on the right, then the
menu should be on the far right of the entire screen, but this is no
longer the case with "KeepDockOnPrimaryHead" set to "YES".
2023-01-20 10:34:36 +00:00
Torrance, Douglas 515eb652c7 Update the dock position when "KeepDockOnPrimaryHead" is changed 2023-01-18 12:18:03 +00:00
Torrance, Douglas 8ed92efa3c Rename swapDock to wDockSwap and add to dock.h
We'll be calling it from defaults.c.
2023-01-18 12:18:03 +00:00
Torrance, Douglas cc839f8bc5 Add default value of "KeepDockOnPrimaryHead" to Defaults/WindowMaker 2023-01-18 12:18:03 +00:00
Torrance, Douglas 48d4820dee Support "KeepDockOnPrimaryHead" when restoring state
We use the new helper function getDockXPosition to determine where
to put the dock.  If WMState gives an x-coordinate less than the
center of the screen, we put it on the left, and otherwise we put it
on the right.
2023-01-18 12:18:03 +00:00
Torrance, Douglas d4f5f3ec7f Support "KeepDockOnPrimaryHead" when initially creating dock
We use the new "getDockXPosition" helper function to find the x
position of the main icon, whose position is used in "wDockCreate" to
get the position of the entire dock.

Previously, "KeepDockOnPrimaryHead" was only taken into account
when *moving* the dock and not when creating it.
2023-01-18 12:18:03 +00:00
Torrance, Douglas 83f7fa43ce Add helper function for computing the dock's x position
Avoid code duplication since we'll need to make this computation in
several places.
2023-01-18 12:18:03 +00:00
Torrance, Douglas 55a816bdbc Keep dock on primary head if KeepDockOnPrimaryHead is YES
This implements a feature request [1] to allow the possibility of
keeping the dock on the primary head on a multi-head system.

In particular, if the new KeepDockOnPrimaryHead option is set to YES,
the dock will either be on the left- or right-hand side of the primary
screen.  If it is NO, then we get the current behavior, i.e., the dock
will either be on the left-hand side of the leftmost head or the
right-hand side of the rightmost head.

[1] https://github.com/window-maker/wmaker/issues/24

Closes: #24
2023-01-15 00:18:34 +00:00
Torrance, Douglas 7639fa1c15 Add "KeepDockOnPrimaryHead" checkbox to WPrefs experts panel 2023-01-15 00:18:34 +00:00
Torrance, Douglas 93b411f258 Document "KeepDockOnPrimaryHead" option in NEWS 2023-01-15 00:18:34 +00:00
Torrance, Douglas 326a67e18f Add new "KeepDockOnPrimaryHead" option
Once implemented, this will keep the dock on the primary head (when
there are multiple heads) when YES.  The default value is NO, the
current behavior, i.e., treat all monitors together as one large screen.
2023-01-15 00:18:34 +00:00
Petre Rodan c089c6aea4 Fix segfault on right-click sweep of menu
bug description: after menu is displayed I get a segfault when trying to hover over the last menu
entry. it looks like under some circumstances menu->entries[] gets accessed past the last valid
value (off by one).

how to reproduce:
right-click desktop to show menu and keep right mouse button pressed
sweep mouse up-down the menu a few times - it crashes all the time between 1-5 sweeps

this commit fixes the unwanted behaviour, in active use since december 2021.
2023-01-06 12:47:22 +00:00
Torrance, Douglas 66b0ee3c4d Add WPrefs to XDG desktop menu
We include a desktop entry file for WPrefs so that it will be included
in XDG-compatible menus.  See the specifications at:

https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html
https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
2022-02-17 22:31:18 +00:00
Torrance, Douglas a6c8577eb4 Include wmaker.desktop in distribution tarball
This fixes a bug where building from a tarball generated by "make
dist" would fail due to the absence of this file.
2022-02-17 22:31:18 +00:00
Doug Torrance 094001a53d Convert Slovak language manpages from ISO-8859-2 to UTF-8 2021-10-10 11:53:29 +01:00
Doug Torrance deba131857 Convert Czech language manpages from ISO-8859-2 to UTF-8 2021-10-10 11:53:11 +01:00
Doug Torrance a9bc9751a2 Use quotes around "Window Maker" in translated manpage title headers
This matches the English manpage and also prevents
wrong-manual-section Lintian warnings in the Debian package, as "Maker"
was being interpreted as the section of these manpages.
2021-10-09 13:53:34 +01:00
Torrance, Douglas 58b6728743 Add desktop file for display manager session configuration
Files in /usr/share/xsessions are used by some display managers (e.g.,
LightDM and GDM) to detect available sessions.  Such a file has been
shipped in the Debian Window Maker package for years.
2021-10-09 09:55:40 +01:00
Christophe CURIS 894d096d6e WINGs: in WText, do not re-query Atom value every time they are used
It is resource-consuming to query the server for an Atom, yet the protocol
ensures the values will stay unique, so we'd better ask them once and
retain the values for further use.
2021-09-04 19:03:53 +01:00
Christophe CURIS a41b0aa21d WINGs: Simplify function wstrconcat
Because we have allocated enough space, it is a waste of time to check the
size after copy and cat; beside the use of plain strxxx functions may allow
compiler to make a better job.
2021-09-04 19:03:53 +01:00
Christophe CURIS d4cc033379 Util: Rewrite error message generation to avoid potential problem
The call to 'snprintf' may change the value of 'errno', which means that
the 'perror' call would print a wrong error message, not the one from
'fopen'.
2021-09-04 19:03:53 +01:00
Christophe CURIS 308b9f4975 Configure: Fix non-working libbsd usage when explicitly requested
Due to a missing comma, in the AS_IF the action run-if-false is actually
merged with run-if-true action, which means that with_libbsd is always
empty when user provides --with[out]-libbsd.
2021-09-04 19:03:53 +01:00
Christophe CURIS 1d1c904126 Configure: Place the argument checks at the beginning of execution
The autotool provides a simple mechanism which allows us to move ("divert")
the checks we do on the user arguments to the beginning of the script, yet
without needing to scatter the code.

This is good because we can raise errors very fast, user do not have to
wait until many other checks have passed before knowing he has to correct
his argument list; yet on our side we can keep related things together.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-09-04 19:03:53 +01:00
Christophe CURIS ca4ae5068b WINGs: Simplify wglobaldefaultspathfordomain
The original code was over-complicated, it can be reduced to a one-line
call to a function that does the same thing, with the bonus that it will
behave better in the case where domain == NULL.
2021-08-10 09:42:43 +01:00
Christophe CURIS 26491867a3 WINGs: Fix incomplete prototypes for functions that take no argument 2021-08-10 09:42:43 +01:00
John D Pell dce34e926b wmaker.inst: remove all modification to ~/.xinitrc
I cannot imagine that modifying an existing ~/.xinitrc is ever wanted, and creating an ~/.xinitrc when none exists is much worse.

If a user created their own ~/.xinitrc, then don't modify it.
The user will modify it if they like.

If the user did not create their own ~/.xinitrc, then creating one will short-circuit X startup as `startx` will *replace* the system's version with the user's version.
Literally ~/.Xresources won't be loaded.
There's no way this is expected behavior.
2021-08-10 09:42:43 +01:00
John D Pell a0b283a60f WUtil: Be more strict about base directory for wmkdirhier()
The original code refused to create anything not in $WMAKER_USER_ROOT, now
we go one step further and limit creation inside its 'Library' or
'Defaults' sub-directories.
2021-08-10 09:42:43 +01:00
John D Pell 671db45007 WUtil: Be more strict about base directory for wrmdirhier()
The original code refused to delete anything not in $WMAKER_USER_ROOT, now
we go one step further and limit deletion inside 'Library' or 'Defaults'.
2021-08-10 09:42:43 +01:00
John D Pell 0c6ad643c8 Change generation of Data Dir in the global header
It has become common practice in previous patches to use PACKAGE_TARNAME
instead of hard-coding "WindowMaker" when working with paths, so let's be
as consistent in the generated header.
2021-08-10 09:42:43 +01:00
John D Pell 5076b6f496 Default Files: Replace misleading variables 'defsdatadir' in Makefiles
The parameter name 'defsdatadir' was copied in to many sub-Makefiles; for
all of them give a unique name for clarity.
2021-08-10 09:42:43 +01:00
Christophe CURIS 54c8535365 Configure: Add an error message when using deprecated "--with-defsdatadir" 2021-08-10 09:42:43 +01:00
John D Pell 24f5b32469 Configure: Rename setting DEFSDATADIR to PKGCONFDIR
Directory /etc/WindowMaker is for global defaults configuration, it is not
a "data" folder which is $PREFIX/share/WindowMaker.

The name change make it more consistent with other names.
2021-08-10 09:42:43 +01:00
John D Pell 85169642ca WMaker: Store history in $XDG_STATE_HOME if defined
The FreeDesktop XDG standard suggests storing history in the directory
pointed by $XDG_STATE_HOME; so if we find it is defined we prefer to use
it over the default path. If undefined, keep the old behaviour.

This may introduce a loss of history for users that had some in the legacy
place but have the variable, we consider this very unlikely to be a problem
but if user complains we can suggest them to move the legacy file over the
empty new one.
2021-08-10 09:42:43 +01:00
Christophe CURIS 9f9ef6417e Utils: Use the constants added in config-paths.h for paths
Replace hard-coded directory names by the constants that have been
previously added to the common header.
2021-08-10 09:42:43 +01:00
Christophe CURIS fb2a6d2e61 WPrefs: Use the constants added in config-paths.h for paths
Replace hard-coded directory names by the constants that have been
previously added to the common header.
2021-08-10 09:42:43 +01:00
John D Pell 8219c36488 WINGs: Use the constants added in config-paths.h for paths
Replace hard-coded directory names by the constants that have been
previously added to the common header.
2021-08-10 09:42:43 +01:00
John D Pell bd38778bef Use wuserdatapath() everytime it is applicable
Replace calls to wusergnusteppath() which just append "/Library" by calls
to wuserdatapath().
Take opportunity to replace hardcoded "/WindowMaker" directories with
the existing PACKAGE_TARNAME macro (which comes from autotools).

The choice of 'TARNAME' is because it meant to be used in filename, thus
less likely to have problematic characters than PACKAGE_NAME (meant for
display purpose) and PACKAGE which is there for historical reason.
2021-08-10 09:42:43 +01:00
John D Pell 1e45ff2305 WUtil: New function wuserdatapath() to get path for application data
Returns the path in the user's GNUstep library: ~/GNUstep/Library
2021-08-10 09:42:43 +01:00
John D Pell 7e1cdf2d59 Add definition of directory names used for building paths in common header
The organisation of the file tree for storing application files depends on
a number of directories with a specific name.
This patch puts these names in the generated "config-paths.h" so they can
be shared between WINGs and WindowMaker, and could be user-configured in
the future.
2021-08-10 09:42:43 +01:00
Christophe CURIS 43f0474013 WINGs: Properly mark 'const' more 'char*' in the public API
Because the previous patch brought a (welcome) change in the public API,
seize the opportunity to go further in the improvement.
2021-08-10 09:42:43 +01:00
John D Pell a079544647 WINGs: Properly mark 'const' some 'char*' in the public API
Update all the callers in our code to deal with the const qualifier
where the compiler reports an issue.
2021-08-10 09:42:43 +01:00
John D Pell 03ec24502d WMaker: Fix logical-not operator in framewin.c
As reported by clang, (!wPreferences.new_style == TS_NEW) inverts the
"wPreferences.new_style" and not the whole expression. Use the appropriate
comparison operator to avoid misunderstanding.
2021-08-10 09:42:43 +01:00
John D Pell 5c90ed9d2d WPrefs: Use wdefaultspathfordomain() to build path to the root menu file
For the Menu edition tab, when building the path to the file that contains
the menu data, rely on wdefaultspathfordomain instead of constructing the
path with many hard-coded names.
2021-08-10 09:42:43 +01:00
John D Pell 735651df55 WMaker: Use wdefaultspathfordomain() to get path for Defaults directory
Instead of constructing path to user's defaults directory with hard-coded
names, just query wdefaultspathfordomain with a blank domain: this returns
the equivalent of "~/GNUstep/Defaults/", yet avoiding problems related to
duplicating strings.
2021-08-10 09:42:43 +01:00
John D Pell bfab769065 WINGs: Improve search path logic in WMPathForResourceOfType
The man page says environment variables are used, and if they don't exist
it falls back to defaults, yet this was not true in WINGS.

This changes implements the checks for the default paths used when the env
variables are not defined; these default paths have been fixed (+lib) to
match the GNUstep layout ('fhs'), expect for the very last path which keeps
the legacy layout.

For the user Apps folder, rely on wusergnusteppath() (~/GNUstep) to build
the path.

The previous code was only partially functional as the hard-coded paths
did not exist in any of GNUstep standard file system layout and the
GNUSTEP_*_ROOT environment variables were not provided by GNUstep for a
while. This means it would never work no matter how environment variables
were set when using layouts: 'debian', 'fhs', 'next', 'Apple', 'mac',
'fhs-system', or 'standalone'.
2021-08-10 09:42:43 +01:00
John D Pell c060477d57 WINGs: Simplify use of HAVE_SECURE_GETENV
Define the macro GETENV(x) instead of sprinkling code with #ifdef HAVE_SECURE_GETENV
everytime we want to use it.
2021-08-10 09:42:43 +01:00
Torrance, Douglas 75f133285f Fix segfault in color picker
Previously, we released the color well's color even if it was the same
as the new color.  This eventually resulted in a segfault when calling
WMPaintColorSwatch because we tried calling XFillRectangle with no
display.

We fix this by only releasing/updating the color well's if it differs
from the new color.
2021-06-29 22:32:31 +01:00
Torrance, Douglas a6ec6a30a3 Use wmkdirhier instead of mkdir to create color config directory
Otherwise, if ~/GNUstep/Library doesn't already exist, then creating
~/GNUstep/Library/Colors will fail.
2021-06-29 22:32:31 +01:00
Christophe CURIS 6afa419b01 Website: Create script to update the list of man pages in the index
It is a good idea to have an Index web page with the list of the man pages
available, but there is a risk to have it outdated, so there is a script to
take care of this for us.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-06-20 22:28:19 +01:00
Christophe CURIS a2bf67f54c Website: Create script to generate the HTML version of the man pages
When running the 'make website' command, it will call groff to convert the
man pages into HTML and post-process them to get them in the style of the
site, then place them in the Website Git Repository.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-06-20 22:28:19 +01:00
Christophe CURIS 351e05dca9 Configure: Add a maintainer option to prepare generation of HTML for the website
When the new configure option '--with-web-repo' is used, the new target
'make website' becomes available and will generate HTML pages to be placed
in the Homepage Repository.

This patch does not generate any content yet but it prepares the skeleton
to handle everything.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-06-05 23:54:15 +01:00
Christophe CURIS ae78e88eef Repair compilation when Pango support is enabled
It seems there have been changes in the way Pango's header files are
installed in recent versions, probably to allow having multiple versions
together on a system.

Because one public header from WINGs has to include Pango's header, we must
include the search path provided by Pango into our WINGs search path that
are returned by pkg-config (the .pc file).

They are then also added to WindowMaker and WPrefs which use the header but
can't rely on the path from the .pc file which has not been installed yet.

Reported-by: Carlos R. Mafra <crmafra@gmail.com>
Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-29 23:55:10 +01:00
Christophe CURIS f049635fa5 Configure: Rewrite the detection for Pango library
Make use of the standard macro for PKG_CONFIG; the default behaviour is now
to use Pango if present, instead of requiring explicit user request, yet
still not making it mandatory.

The detection code was moved to a macro to keep the configure.ac script
(relatively) small, and consistent with what is done for most other libs.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-29 20:15:09 +01:00
Doug Torrance 4221e30bd2 Convert WPrefs.app/po/README from iso-8859-1 to utf-8 2021-05-25 22:12:23 -04:00
Doug Torrance 71558f4ce3 Convert WindowMaker/README from iso-8859-1 to utf-8 2021-05-25 22:10:15 -04:00
Doug Torrance 4b61081353 Convert po/README from iso-8859-1 to utf-8 2021-05-25 22:05:30 -04:00
Christophe CURIS 4138c57631 Configure: Rewrite the macro for checking Xft2 version
The original macro used over-complicated things, like:
 - useless uses of 'eval',
 - split AC_CACHE_CHECK construct (AC_MSG_CHECKING + AC_CACHE_VAL +
AC_MSG_RESULT)
 - dubious variable name (CPPFLAGS_old, which is not the "old" value but
the "saved" value for a temporary change)
 - variable CPPFLAGS was changed at wrong hierarchy level
 - calculate the integer value for XFT_VERSION in m4 instead generating
shell commands that had to do it on user side
 - indentation was missing

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-22 20:00:41 +01:00
Christophe CURIS 0bbb122b94 Configure: Rewrite detection for Xft2 to properly use PKG_CONFIG macro
The goal is to use standard macros, which make code easier to maintain
(smaller, more consistent). We still keep the legacy "xfg-config" method
because we don't want to drop support for old hardware/software.

A side effect is the change in the name of the variables for the makefile,
but this goes in favour of consistency.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-22 20:00:41 +01:00
Christophe CURIS 0e274dc979 WRaster: Fix incorrect use of macro USE_XSHM in installed header
The header "wraster.h" needs different behaviour depending on whether the
support for X Shared Memory extension was enabled or not; but the related
macro USE_XSHM is defined by WindowMaker's configure. After this header
have been installed, the macro is no more useable.

This patch makes the "wraster.h" a generated file, so it will be different
depending on USE_XSHM, but will not make use of the macro itself.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:50:43 +01:00
Christophe CURIS 4dfb0dd059 WRaster: Create french translation to have at least one
The translation check would complain because it does not find any '.po'
files, so I am providing one translation.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS bcb53700d6 WRaster: Improve error messages to provide useful information to user
The original error messages tended to be a bit sparse, now they try to be
a little bit more helpful, and translatable in user's language.

In xutil.c:122, took opportunity fix a problem because calling 'perror'
after other function which are likely to have changed the errno is likely
to provide a wrong error string.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS e5f7ef23a6 WRaster: Made a few messages translatable
Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 70f89fd9c5 WRaster: Add initialisation for locale support
Because the library does not have an initialisation function, we need to
rely on an automatic called-on-load mechanism, which is provided through
a compiler attribute 'constructor'.

However, as the project aims to still compile on old hard/software, we
include a check in 'configure' to ensure it works, and if not use the
legacy solution.

Note: Because we introduce a new DEFINE, the 'config.h.in' needs to be
regenerated, otherwise you may get a compilation error in wrlib. This is
done by re-running './autogen.sh'

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 19202fd2db WRaster: Create header for i18n helper functions
This patch is just adding a single header, but because it also modifies
all the C files to add the #include, it was made as a patch on its own to
ease review.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS aadd694a6b WRaster: Create structure to make the library translatable
The library did not propose the mechanisms to be translated, this patch is
creating the structure in autoconf/automake and the translation directory
so its messages can be also translated.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS fbec3a728f wmaker: Do not allocate memory for a temporary string for the Window Shortcut menu
When creating the list of possible shortcut for windows to populate the
window menu, a temporary buffer was allocated to hold that string.

As this allocation participates to memory fragmentation, this patch makes
use of storage on the stack instead which is also faster.

Took opportunity to include the shortcut number (%i) in the string to be
translated, because it is unlikely that adding that number at the end of
the string is right in all languages. Updated french translation because
it is the only one I am confident with.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 944bb49997 wrlib: Add compiler attributes to the API functions
With proper attributes, the compiler is able to do some extra checks on
user side to make code safer and/or better optimised.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 0ac6827a9b wmmenugen: Fix memory leaks when parsing menu in wmconfig format
As reported by Coverity (CID #50181, #50182 and #50183) the strings allocated by parse_wmconfig_line were not freed after use.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS f030ab7664 wmmenugen: Fix memory leaks in XDG menu generation when getting locale-dependant name
As reported by Coverity as CID #50142, #50143, #50144 and #50145, all the
strings allocated by 'parse_locale' were never freed.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 2a8fc1df9a wmmenugen: Fix memory leak when parsing names for menus in XDG format
As reported by Coverity (CID #50146), if the function getLocalizedStringValue
returns without matching the entry, the storage for the entry's locale was
leaked.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 296456f361 wmmenugen: Fix memory leak when parsing categories in an XDG menu
Reported by Coverity (CID #50147)

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS f2cd2c9f03 WRaster: Properly set file's mtime in the cache when loading an image
The library maintains a cache to not reload a file that was previously
loaded. In order to still reload an image in case its file would have
changed in the meantime, the cache saves the file's modification time.

As reported by Coverity (CID #331576) the 'stat' function was not on the
execution path the first time an image is loaded, which means the cache
information is populated with junk data. This could lead to an image not
being reloaded for example.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS d125f80dee WRaster: Stop parsing number in PPM file if invalid syntax is found
When the function 'pm_getuint' is reading a number, it prints an error
message if it encounters a non-digit number, yet it still enters the
processing loop which will cause an invalid number to be calculated.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 8e47ca8e62 WPrefs: Add check for invalid OPEN_MENU/EXEC in PL-Menu to avoid potential crash
As reported by Coverity (CID #50047, #50048), if the proplist is incorrect
and has an OPEN_MENU or (SH)EXEC command without its arguments, we did
dereference a NULL pointer.
Now we simply return the NULL value, appropriate to have the caller of the
function issue a message.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 29cf48b934 WPrefs: Provide fall-back colour in the case of colour name not found
As reported by Coverity (CID #331571), we did not check the return value of
the call to XParseColor. If the function is given a colour name that it
does not know, we would return an uninitialised colour.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 816fa00625 WUtil: Make sure wmalloc/wrealloc won't fail because of the abort handler
As pointed by Coverity (#50074), despite the expected behaviour that
'wmalloc' should never return NULL, it may still happen if an abort handler
set by user (with wsetabort) does not call exit() as expected. In such
case we make sure the NULL pointer dereference does not happen inside
WINGs code because we assume it is a known user choice.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 6ebec0bb9f WUtil: Fix non-closed file handle in WMWritePropListToFile
As reported by Coverity (CID #50129), in case of error during the write
operation, the failure path does include close of the file handle. In
addition to the resource leak, this may be a problem if the application
were to make a second try on the same file.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 7c50721747 WPrefs: Fix memory leak in Expert tab
As reported by Coverity (CID #331553), we leak the allocated string
returned by 'WMGetTextFieldText'

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 4559cbbccc WPrefs: Fix memory leak in the Menu tab
As reported by Coverity (CID #331559), the call to 'wfindfile' replaces
the value for variable 'path' but we did not free its previous content.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS e828e1c074 Fix use-after-free error in wIconStore reported by Coverity
The function always returns the filename where the icon have been saved,
but in the case where the save operation failed we would free the memory
for that file name, yet still return this pointer like if it were valid.

Took opportunity to remove redundant free(path) which is done a couple
lines later, because redundancy is a source of problem for code
maintenance.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 97a9300aa4 Fix memory leak reported by Coverity
As reported in CID #331577, we re-use the variable 'tmp' without freeing
the previously allocated pointer.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS fd56152202 WPrefs: fix memory leak and potential buffer overflow
Coverity pointed that the "text" returned by WMGetTextFieldText was never
freed (CID #331578, because WMSetTextFieldText does its own copy, it does
not take the pointer as-is).

By looking at the code, there is also a potential buffer overflow because
the buffer alloc'd for "value" is sized for the exact number of digits
before increase, but the +delta can make the number use more digits so we
may write past the end of original buffer.
We write to a stack-allocated one, so it does not cost anything and does
not participates to memory fragmentation.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 58862300f9 WINGs: Fix invalid handling of Blue in the HSV conversion in ColorPanel widget
Because of a minor bug, when pure blue was chosen in RGB in the ColorPanel,
the conversion to HSV would mistreat it as white and resets its hue,
leading to possible user annoyance.
2021-05-18 17:49:17 +01:00
Christophe CURIS 1612d2f345 WINGs: increase temporary buffer to silence a gcc warning
The code limits the integer number to 0..359 so we need 4 bytes to store
that, but that require too complex flow processing for compilers to deduce
it.

It does not cost to increase the temporary buffer to the minimum size
requested by GCC, so let's do this, because spurious warnings can
potentially divert us from more important ones.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 920c6d16b1 wraster: Remove duplicate code
Duplicating things makes maintenance error-prone, which is not a good idea.
In case the abort procedure would need an update, it would be easy then
to forget some place, leading to leaks, if not worse.

Beside, goto is not as bad as academics would like people to believe, when
it is used correctly (and this case is one of them).
The name for the label was given an explicit meaning to make code easy to
understand.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS 8aecba27d1 Fix usage of float constant reported by gcc
Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Christophe CURIS fc63d72032 WINGs: Fix incorrect use of macro USE_PANGO in installed header
The header "WINGsP.h" needs different behaviour depending on whether the
support for Pango was enabled or not. But the related macro USE_PANGO is
defined by WindowMaker's configure, and after this header have been
installed the macro is no more valid.

This patch makes the "WINGsP.h" a generated file, so it will be different
depending on USE_PANGO, but will not make use of the macro itself.

As a side effect of being now generated, the include paths in the makefile
have been updated to include build-dir too, because for users doing an
out-of-tree build the generated file (that is used during compilation) is
placed in the build-dir.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2021-05-18 17:49:17 +01:00
Xander eb2a9d97a2 Make dock dots scalable
This patch makes the three dots in the dock change their size when bigger icon size is used.
The logic here is such that the dots are scaled only when a certain icon size is reached;
for instance, the dots will remain unchanged if icon size is less than 128x128 px, and will
be twice as big if it's set to a value from 128x128 to 184x184 px. The get_dot_mult() func
calculates and returns the scale multiplier. In the draw_dot() func, XDrawLine() and
XDrawPoint() were replaced with XFillRectangle() because those funcs do not allow their
result to be scalable. This patch does not require additional icon size values (those bigger
than 96x96 px) to exist, but makes no use without them.
2021-05-07 18:03:19 +01:00
Xander 9abe4165d1 Add icon sizes
The classic WindowMaker allows tile icon size up to 96x96 px. This patch rises this value
to 256x256 px. It also sets the max number of visible items in the corresponding pref list
to 29 (instead of 9), so the new values show up in the list. This patch makes it possible
to use dockapps that allow changing their size to bigger than 64x64 px, see
https://gitlab.com/xander1988/dockapps for more info.
2021-05-07 18:02:03 +01:00
gryf 82ab2d2d06 Correct calculation of usable space for reserved area.
Previous patch has correct the way, how reserved area found in
_NET_WM_STRUT was calculated. Unfortunately, the calculation was not
precise, as for not reserved areas (i.e. values of 0 for one of the
cardinals is set) must be calculated anyway for given head, otherwise
usable area might be too broad.
2021-03-18 16:08:40 +00:00
gryf bbf24d1d39 Correct way for reserved space on multihead environment.
Applications such a panels or docks have ability for reserving space so
that no windows should cover or overlap them. There is (partially)
support for it by checking the _NET_WM_STRUT property, although
calculation for the reserved space was wrong in case of several heads
enabled.

In this patch calculation for reserved area has been corrected.
2021-03-16 20:39:54 +00:00
Helge Kreutzmann 224cb403a7 Tippfehler in de.po von WPrefs (WindowMaker)
per Zufall habe ich einen Tippfehler gefunden
2020-12-07 16:53:16 +00:00
Nick Berendsen 1cd8fea423 Add support for _NET_WM_STATE_FOCUSED
Thanks to Jeremy Sowden for sending the patch to the mailing list.

Signed-off-by: Carlos R. Mafra <crmafra@gmail.com>
2020-10-27 15:35:08 +00:00
Diedrich Vorberg a98680cd14 Patch for GetCommandForPid() in osdep_darwin.c
the function mentioned above caused segfaults on MacOS. The attached patch
seems to solve that.

Details: The functions provides an array of string pointers (the argument
vector) pointing to a buffer allocated and referred to by a static local
variable `args`. This buffer was used on each subsequent call. For one
thing this would overwrite old values and for another this caused segfaults.

My new implementation allocates a buffer for the argument vector plus the
actual string data on each call. The caller will wfree() the buffer, but
until then has available an independent copy of the strings.
2020-10-19 20:38:29 +01:00
Alexander Komarov 7d423a3a0f Added Expert option: "Close rootmenu when mouse (left or right) is clicked outside focus.
Common WindowMaker's rootmenu behavior if press right mouse button open menu and close only with same button.
It's uncomfortably, it patch  allows close menu by left or right is clicked outside focus.
Changed func "static WMenu*configureMenu(WScreen *scr, WMPropList *definition)" to non-static forglobal use.
Added new  OPTION_WMAKER for this Expert-option. Changed event.c: for correct work should use initialization
func configureMenu afterwMenuDestroy (this is a feature of the event implementation XEvent).
2020-09-13 16:56:09 +01:00
Alexander Komarov 033d2d9a6f Changed Russian translation 2020-08-11 10:49:13 +01:00
Alexander Komarov 6e2075f3df Double click on titlebar maximize a window to fullscreen 2020-08-10 12:15:01 +01:00
XOR 5d2fd7bf7e WPrefs: Create Turkish translation 2020-06-28 17:54:15 +01:00
Christophe CURIS f6742662ec Tell git to ignore files created during i18n preparation
The 'pot' files are templates generated when we want to update the 'po'
files against latest source code;

the 'mo' files are compiled 'po' files to be installed
2020-06-28 11:33:31 +01:00
Doug Torrance 583f66ec4e Turn off automake's warning messages about using GNU make extensions
We've been using addsuffix in WindowMaker/Makefile.am and may use others
in the future.
2020-06-22 18:07:09 +01:00
gryf cd23e77fd1 Remove Debian related build files.
Keeping Debian related build files should not be the duty of wmaker
development team, but Debian package maintainers.
2020-05-31 17:34:28 +01:00
gryf 230a501d36 Fix typo on defining imagemagick version.
In this patch we will fix an issue during compilation on systems, which
have ImageMagick version 7, and slightly more recent version of
compiler. If we define USE_MAGICK with null value, compilation will fail
on preprocessor check on such defined variable.
2020-04-20 09:03:56 +01:00
Doug Torrance 3022edd060 wrlib: Fix typo in macro containing ImageMagick version
It's USE_MAGICK, not USE_MAGIC.  Also, we wrap the if/else statement
in an ifdef.  This doesn't really affect anything since load_magick.c
won't be compiled if USE_MAGICK is undefined because of an if statement
in the Makefile.  But in the off chance that it is somehow, then we will
try to load a nonexistent version 6 header file since USE_MAGICK will
be interprested as 0 and 0 < 7 is true.
2020-04-19 07:58:28 +01:00
Doug Torrance 1713a88656 debian: Remove ImageMagick patch; an equivalent patch now exists in next
If a user wanted to build a Debian package from the next branch, then
it would fail immediately when quilt tried to apply the patches.
2020-04-19 07:58:28 +01:00
Doug Torrance 00a25db9ea checkpatch.pl: Escape curly braces in regexes
Unescaped curly braces  have been deprecated since Perl 5.26 and are
illegal in Perl 5.30. I copied the relevant lines from the latest kernel
source, so we'll inherit a couple other improvements as well.
2020-04-18 22:27:29 +01:00
Doug Torrance c678580621 debian: Update with version 0.95.9-2 packaging. 2020-04-18 19:49:26 +01:00
Doug Torrance 44bc9cc264 Fix various abs() issues.
The abs() function should take an int as argument, but there were
several instances in the code where it was taking an unsigned int or a
double.  In these case, we took one of the following approaches:

* If the argument was a double, use fabs() instead.
* If the argument was unsigned and was certainly going to be positive
  (i.e,. no subtraction), then drop abs() altogether.
* If the argument was unsigned as result of adding or subtracting signed
  and unsigned ints, then we cast all the unsigned ints to signed ints.
2020-04-18 19:49:26 +01:00
Doug Torrance dfa92906c0 wrlib: Compile with either ImageMagick 6 and 7
We dropped ImageMagick 6 support in 0.95.9.  However, ImageMagick 6 is
still widespread (e.g., ImageMagick 7 has not been packaged in Debian
yet), and upstream plans on maintaining it until at least 2028 [1].

In this patch, we detect the version of the MagickWand library installed
on the user's system and include the appropriate header file when
building wrlib.

Note: I've only tested this with ImageMagick 6, so I'd appreciate
confirmation that it works with ImageMagick 7.

[1] https://github.com/ImageMagick/ImageMagick6/blob/master/NEWS.txt
2020-04-18 19:49:25 +01:00
Doug Torrance 27dc5efd2e debian: Update with version 0.95.9-1 packaging. 2020-04-17 08:20:50 +01:00
Doug Torrance 86659be668 wmlib: Use X flags from configure
We use the AC_PATH_XTRA macro to find all the X library paths during
build, but we weren't actually using the variables it generated for
building wmlib.  Instead, we just hardcoded the linker flag "-lX11",
which may or may not actually work.
2020-04-09 14:54:06 +01:00
Doug Torrance e314f10909 configure: Fix typo in libXmu check.
As the literal string "wm_cv_xext_xmu" will never be equal to "xno",
we always ran the code that was supposed to run when the variable
$wm_cv_xext_xmu was not equal to "no".  In particular, if libXmu
was not found, then we proceeded as if it had been found.
2020-04-09 14:54:06 +01:00
Doug Torrance 54a24ab6f7 Remove trailing whitespace.
Also, the script is a one-liner, stolen from [1]:

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

[1]
https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively
2020-04-09 14:28:09 +01:00
Doug Torrance a17d131da3 Remove apostrophes from instances of possessive "its".
I noticed one instance of this while looking at the code the other day,
and after a quick grep, realized it happened a *lot*!  One of the many
frustrating things about the English language is that we use apostrophes
to make pretty much everything possessive *except* the pronoun "it".
In that case, we use "its".  "It's" is reserved for the contraction
meaning "it is" or "it has".
2020-04-09 09:05:50 +01:00
David Michael 6320bb6219 configure: Allow changing default search paths
This changes the behavior of the --with-{inc,lib}s-from arguments
to replace the default paths instead of adding to them.  This is
required when cross-compiling in a sysroot, since the default paths
will include files from the host system which can have an
incompatible architecture.
2020-04-06 16:35:53 +01:00
Carlos R. Mafra f9bc310fa6 Window Maker 0.95.9 2020-04-04 11:02:28 +01:00
Carlos R. Mafra 58249c2b9b Update .gitignore file 2020-04-04 10:55:42 +01:00
David Maciejak bb716a4ca1 util: renamed wmiv DEBUG constant name
To prevent compilation warning message saying DEBUG name is already defined
2020-03-28 10:13:11 +00:00
David Maciejak 91f8e21668 WPrefs: fixed malformed TIFF file generating libtiff warnings
The original ergonomic.tiff file samples/pixel property was wrong which was generating the warning message from libtiff
"TIFFReadDirectory: Warning, Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.."
2020-03-28 01:02:56 +00:00
David Maciejak 5f18f60fd2 WPrefs: increased open submenu label size
Give more space for the open submenu label to be displayed properly
2020-03-28 01:02:41 +00:00
David Maciejak a215869067 wrlib: Fixed warning msg using libpng
Call png_set_interlace_handling() to get rid of the warning message "libpng warning: Interlace handling should be turned on when using png_read_image"
2020-03-27 09:00:37 +00:00
David Maciejak 909deea70c bump copyright year in Info Panel
bump copyright year in Info Panel
2020-03-25 10:08:17 +00:00
David Maciejak 984a992d0e Fix typo
Renamed isPointNearBoder() function
2020-03-25 10:05:02 +00:00
nchilingaryan@aua.am e82d86813e Update Armenian translation
I did some part of translatin back in 2008, now I fixed bugs and updated it
so that all the messages are translated.
2020-03-05 10:19:49 +00:00
Jeremy Sowden d9bc96e497 strncpy's third argument should be the length of the dest buffer, not the source. 2019-08-06 11:04:05 +01:00
Jeremy Sowden a7baed6cf7 Fixed expression checking whether flag is set. 2019-08-06 11:04:05 +01:00
Jeremy Sowden a12f0d453a Fixed buffer size. 2019-08-06 11:04:05 +01:00
Jeremy Sowden 41193bdacd Fixed function-pointer compatibility. 2019-08-06 11:04:05 +01:00
Jeremy Sowden a7f8e990db Added explicit fall-through comments to pacify GCC. 2019-08-06 11:04:05 +01:00
Jeremy Sowden b59273f199 Added missing function declaration. 2019-08-06 11:04:05 +01:00
Haroldo be922384ac slight increase in default switch panel icon size to improve border view 2019-07-28 23:05:28 +01:00
Haroldo 31f16b65a3 higher resolution images for switch panel 2019-07-28 20:21:14 +01:00
Haroldo 3665410377 make switchpanel configurable 2019-07-14 17:43:28 +01:00
Jeremy Sowden 4477ae4da4 Prefer TryExec to Exec when generating menu entries from XDG desktop files.
From the comments at the top of wmmenugen_parse_xdg.c:

  Since there is no passing of file name arguments or anything of the
  sort to applications from the menu, execname is determined as follows:

   - If `TryExec' is present, use that;
   - else use `Exec' with any switches stripped

However, Exec used to be preferred.  Changed code to prefer TryExec.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2019-06-20 22:06:36 +01:00
Jeremy Sowden 9330a021e5 Omit field-code in Exec fields when generating menu-entries from XDG desktop-files.
Exec fields in desktop-files may include field-codes which act as
place-holders for command-line arguments.  Previously the Exec arguments
were being passed through intact.  However, since Window Maker has no
support for expanding the field-codes, we now remove them and preserve
the remaining arguments.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2019-06-20 22:06:36 +01:00
Jeremy Sowden 41ab926090 Parse Exec fields when generating menu-entries from XDG desktop-files.
Exec fields in desktop-files are subject to escaping.  Unescape them.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2019-06-20 22:06:36 +01:00
Jeremy Sowden b32ccee5cb Undo XDG string-escaping when generating menu-entries.
In XDG desktop files, string values are subject to escaping.  Undo this
when parsing them.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2019-06-20 22:06:36 +01:00
Jeremy Sowden 6734646265 Use pointers as parameters instead of pointer-to-pointers.
Some functions expected pointers-to-pointers where pointers would do.
Changed them to use pointers.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
2019-06-20 22:06:36 +01:00
Rodolfo García Peñas (kix) 6a044fe5ae load_jpeg.c Return NULL
The image is NULL, we can return NULL here.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 6dd1498f7c load_jpeg.c Style
This patch is just coding style. Removes some empty lines,...

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 090b761fde load_jpeg.c Removed dead code
This patch removes the code not used. Because the if block
check that buffer[0] is NULL, then, we don't need check it
again inside.

Image is not used yet, so is NULL. We can return NULL.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 49db946aa2 load_jpeg.c Clean code
This patch returns NULL, because the variable image is not used yet.

The patch also removes three lines:

- buffer[0] = NULL;       /* Initialize pointer to avoid spurious free in cleanup code */
  RErrorCode = RERR_BADIMAGEFILE;
  jpeg_destroy_decompress(&cinfo);
  fclose(file);
- if (buffer[0])
-    free(buffer[0]);

buffer is a local variable. The malloc is not used yet. So:

- We set the value to NULL, then check if is null to call free(). So the free()
  call is never used. We can remove the last too lines.
- We don't need set now to NULL, because the variable is empty (the
  initializated (or not) value is not used, and is destroyed as local variable
  when we returns, just one line later.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) a2cc89dd3d load_jpeg.c Removed goto
This patch removes the goto call. I copied the code after the bye: label and
I paste it in the goto-calls.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) de09ac5dad WPrefs.c Removed format-overflow warning
This patch adds some characters to the mbuf buffer, to allow the buffer size and some extra characters.

WPrefs.c: In function ‘loadConfigurations’:
../src/wconfig.h:400:17: warning: ‘%s’ directive writing up to 1023 bytes into a region of size 1018 [-Wformat-overflow=]

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 3dce639aae Appearance.c Removed fallthrough warning
This patch adds some comments to remove the falthrough warning.

Appearance.c: In function ‘renderTexture’:
../WINGs/WINGs/WUtil.h:230:32: warning: this statement may fall through [-Wimplicit-fallthrough=]
 #define wwarning(fmt, args...) __wmessage( __func__, __FILE__, __LINE__, WMESSAGE_TYPE_WARNING, fmt, ## args)
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Appearance.c:675:4: note: in expansion of macro ‘wwarning’
    wwarning(_("unknown direction in '%s', falling back to diagonal"), type);
    ^~~~~~~~
Appearance.c:676:3: note: here
   case 'D':
   ^~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 00dffbe317 wmiv.c Removed indentation warning
This patch removes the indentation problem. The patch includes a long comment about the change.

wmiv.c: In function ‘main’:
wmiv.c:843:4: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
    if (e.xclient.data.l[0] == delWindow)
    ^~
wmiv.c:845:5: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
     break;
     ^~~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 7759d06851 wmgenmenu.c Removed format-truncation
This patch removes the format-truncation warning. The problem is because buf and comm are arrays with the same size (PATH_MAX). In the snprintf, comm is copied to buf, more some extra characters. The patch reduces the size for the array comm in the extra characters. Without the patch, the comm array is truncated. With the patch, the same characters are copied, without the warning.

wmgenmenu.c: In function ‘find_and_write’:
wmgenmenu.c:436:41: warning: ‘snprintf’ output may be truncated before the last format character [-Wformat-truncation=]
     snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
                                         ^
wmgenmenu.c:436:5: note: ‘snprintf’ output 5 or more bytes (assuming 4105) into a destination of size 4104
     snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) bf644338e4 gradient.c Removed implicit-fallthrough warnings
This patch adds the comments to remove the warnings.

gradient.c: In function ‘renderGradientWidth’:
gradient.c:162:10: warning: this statement may fall through [-Wimplicit-fallthrough=]
   *ptr++ = b;
   ~~~~~~~^~~
gradient.c:163:2: note: here
  case 2:
  ^~~~
gradient.c:166:10: warning: this statement may fall through [-Wimplicit-fallthrough=]
   *ptr++ = b;
   ~~~~~~~^~~
gradient.c:167:2: note: here
  case 1:
  ^~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 95561fba08 wtextfield.c: Removed multiple warnings
This patch removes the implicit-fallthrough warnings for GCC7. Just add the FALLTHRU comment.
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) a0b223263e wtext.c Remove warnings
This patch removes the FALLTHRU warnings in wtext.c. Only includes the comments for GCC7.

wtext.c: In function ‘handleActionEvents’:
wtext.c:2508:6: warning: this statement may fall through [-Wimplicit-fallthrough=]
   if (event->xbutton.button == Button2) {
      ^
wtext.c:2547:2: note: here
  case ButtonRelease:
  ^~~~
wtext.c: In function ‘handleTextKeyPress’:
wtext.c:2307:11: warning: this statement may fall through [-Wimplicit-fallthrough=]
   *buffer = '\n';
   ~~~~~~~~^~~~~~
wtext.c:2308:2: note: here
  default:
  ^~~~~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 2555413838 wruler.c Remove format-truncation warning
This patch removes the format-truncation error. The warning is because c has size of 3, but using "%d" is not possible to store the value.

wruler.c: In function ‘paintRuler.part.0’:
wruler.c:184:28: warning: ‘%d’ directive output may be truncated writing between 1 and 10 bytes into a region of size 3 [-Wformat-truncation=]
    snprintf(c, sizeof(c), "%d", ++j);
                            ^~
wruler.c:184:27: note: directive argument in the range [1, 2147483647]
    snprintf(c, sizeof(c), "%d", ++j);
                           ^~~~
wruler.c:184:4: note: ‘snprintf’ output between 2 and 11 bytes into a destination of size 3
    snprintf(c, sizeof(c), "%d", ++j);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The value "j" is the result of "m < w". w is the result of rPtr->view->size.width - rPtr->margins.left;, and both variables are unsigned int. So the value for w is an unsigned int and m is related to i. m cannot be greater of unsigned int.

	i = j = m = 0;
	w = rPtr->view->size.width - rPtr->margins.left;
	while (m < w) {
		XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer,
			  rPtr->fgGC, rPtr->margins.left + m, 23, rPtr->margins.left + m, marks[i % 8] + 23);
		if (i != 0 && i % 8 == 0) {
			snprintf(c, sizeof(c), "%hu", ++j);
			WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg,
				     rPtr->font, rPtr->margins.left + 2 + m, 26, c, 2);
		}
		m = (++i) * 10;
	}

The printf modifier should be unsigned int.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 3e3f06a7be widgets.c Removes implicit-fallthrough warning
This patch removes this warning:

widgets.c: In function `renderPixmap':
widgets.c:385:8: warning: this statement may fall through [-Wimplicit-fallthrough=]
     if (mask)
        ^
widgets.c:388:4: note: here
    case '.':
    ^~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 1f80c82091 wcolorpanel.c Removed hsbInit warnings
This patch removes these warnings in the hsbInit function.

wcolorpanel.c: In function ‘hsbInit’:
wcolorpanel.c:3456:16: warning: ‘%u’ directive writing between 1 and 5 bytes into a region of size 4 [-Wformat-overflow=]
  sprintf(tmp, "%d", value[0]);
                ^~
wcolorpanel.c:3456:15: note: directive argument in the range [0, 65535]
  sprintf(tmp, "%d", value[0]);
               ^~~~
wcolorpanel.c:3456:2: note: ‘sprintf’ output between 2 and 6 bytes into a destination of size 4
  sprintf(tmp, "%d", value[0]);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

The problem is that the hue variable in the RHSVColor struct. This variable is not an integer, is a shor variable, so using the printf using the "%d" modifier spects an integer. Using a "%hu" prints a unsigned short value.

typedef struct RHSVColor {
    unsigned short hue;	       /* 0-359 */
    unsigned char saturation;      /* 0-255 */
    unsigned char value;	       /* 0-255 */
} RHSVColor;
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) fb5f6c30c0 wcolorpanel.c: Remove warning in rgbIntToChar
This patch removes this warning. The default case should not be used.

wcolorpanel.c: In function ‘rgbIntToChar’:
wcolorpanel.c:2392:2: warning: ‘format’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  sprintf(tmp, format, value[1]);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) 972d85610a wcolorpanel.c Avoid compiler warning
This patch removes this warning. The patch adds a switch case that never should happend.

wcolorpanel.c: In function ‘rgbInit’:
wcolorpanel.c:3403:2: warning: ‘format’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  sprintf(tmp, format, panel->color.rgb.green);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Rodolfo García Peñas (kix) f0f95165e4 WINGs/selection.c Removed compiler warning
This patch removes this warning:

selection.c:265:64: warning: cast between incompatible function types from ‘int (*)(void *)’ to ‘void (*)(void *)’ [-Wcast-function-type]
  wdata = WMCreateDataWithBytesNoCopy((void *) data, len * bpi, (WMFreeDataProc *) XFree);

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2019-06-20 22:04:31 +01:00
Tim Taenny f895b906a4 Adjusted size of the Legal Information panel
With the changes to the layout, which were introduced in the
previous patch series, and the correction of the default font
size, the Legal Information panel was too small to display the
complete text.
It has been set to a sufficient size.
2019-06-19 18:06:53 +01:00
Tim Taenny 5ab9b7c6be Renamed the ScaleX/Y macros and their local variables
The names of the macros and the local variables that they use
have been changed to make them less "user-space" like.

    ScaleX -> WMScaleX
    ScaleY -> WMScaleY
    fw     -> wmScaleWidth
    fh     -> wmScaleHeight
2019-06-19 18:06:53 +01:00
Tim Taenny 1e490f8233 Adjusted scale factors in ScaleX and ScaleY macros
The scale factors in the macros were based on the assumption that
the default font size was 11. But the actual default font size is
12. This value is specified as DEFAULT_FONT_SIZE in
WINGS/configuration.c.
2019-06-19 18:06:53 +01:00
Tim Taenny ba3df2599d Use fixed font size in original WMCreate*Panel functions
Instead of just assuming that the size of the system font has not
been changed by the user, the WMCreateAlertPanel,
WMCreateInputPanel and WMCreateGenericPanel functions now use a
fixed default font size of 12, so that changing the system font's
size in WPrefs.app does not break the fixed layouts of these panels.
("12" is specified as DEFAULT_FONT_SIZE in WINGS/configuration.c)
2019-06-19 18:06:53 +01:00
Tim Taenny c803218ed1 New functions for the creation of scaled panels (WMCreateScaled*Panel)
To prevent breaking applications depending on the static layout
behavior of the WMCreateAlertPanel and WMCreateInputPanel functions
in WINGs, the scaling functionality has been moved to the new
functions WMCreateScaledAlertPanel and WMCreateScaledInputPanel.

The system dialogs (wMessageDialog, wExitDialog, etc.) now use the
new functions, thus keeping the improved layout introduced in the
previous patches.
2019-06-19 18:06:53 +01:00
Carlos R. Mafra 6c6853ea30 util: add wmiv entry to README 2019-06-15 16:49:34 +01:00
Tim Taenny b48b503eb1 Improved layout of the Info Panel
Instead of relying on static pixel values for position and size of
the widgets, the info panel now scales its widgets based on the
selected system font size.
2019-06-12 23:42:27 +01:00
Tim Taenny 1c8b680e3d Improved layout of the Legal Panel
Instead of relying on static pixel values for position and size of
the widgets, the legal panel now scales its widgets based on the
selected system font size.
2019-06-12 23:42:27 +01:00
Tim Taenny 5eeaf6b890 Improved layout of the Icon Chooser Panel
Instead of relying on static pixel values for position and size of
the widgets, the icon chooser panel now scales its widgets based
on the selected system font size.
2019-06-12 23:42:27 +01:00
Tim Taenny f9236c8d20 Improved layout of the Input Panels
Instead of relying on static pixel values for position and size of
the widgets, the input panels now scale their widgets based on the
selected system font size.
2019-06-12 23:42:27 +01:00
Tim Taenny 26bb94a8e7 Improved layout of the Alert Panels
Instead of relying on static pixel values for position and size of
the widgets, the alert panels now scale their widgets based on the
selected system font size.
2019-06-12 23:42:27 +01:00
Tim Taenny b185d46286 Added ScaleX and ScaleY macros to WINGs
To reduce code duplication the ScaleX and ScaleY macros have been
moved to WUtil.h. Along with the function WMGetScaleBaseFromSystemFont
these macros can be used in all panels to scale the widgets based on
the current system font size instead of giving fixed pixel sizes which
messes up the panels if a larger system font is selected in WPrefs.

Use the macros in the following way:

    instead of   WMResizeWidget(widget, 128, 64);
                 WMMoveWidget(widget, 32, 32);

    use          int fw, fh;
                 WMGetScaleBaseFromSystemFont(scr->wmscreen, &fw, &fh);
                 WMResizeWidget(widget, ScaleX(128), ScaleY(64));
                 WMMoveWidget(widget, ScaleX(32), ScaleY(32));
2019-06-12 23:42:27 +01:00
Tim Taenny 8f29bdc690 Improved layout of the widgets in the DockAppSettingsPanel
Instead of relying on static pixel values for position and size of
the widgets, the DockAppSettingsPanel now scales its widgets based
on the selected system font size.
2019-06-12 23:42:27 +01:00
Christophe CURIS e2cfed3377 Do not stop compilation if library Xmu is not found
We use only 1 function from this library, and it is in a case that should
be rare nowadays: displays with indexed color.
This commit makes it acceptable to compile if the library is missing.
2019-05-04 14:50:48 +01:00
Christophe CURIS 4665972175 Change the way the ChangeLog date is extracted for Texi2txt generated docs
When building into another directory than in the source, the hard-coded
relative path to the changelog will fail finding the file, causing an empty
date in the generated file when '@today' is used.

This patch is making sure the ChangeLog is taken in the source directory to
avoid any problem.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2019-02-22 16:21:00 +00:00
Christophe CURIS 8606ae9a83 WINGs: simplify code
It looks like the original code was expecting the side effect of specifying
a length in the %d to smartly truncate the number, which it does not.
The new code has the same behaviour without extra complexity.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2019-02-22 16:08:36 +00:00
Christophe CURIS 070f0ad8f4 WPrefs: Dead code removal
Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2019-02-22 16:08:36 +00:00
Christophe CURIS 2913ac0f09 Do not allocate memory for a temporary buffer
This kind of things participates in memory fragmentation, so it is
generally a bad practice when an on-stack allocation is enough.
Took opportunity to reduce the buffer size, there's no point in
overallocating memory (the new size being still way too much).

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2019-02-22 16:08:36 +00:00
Christophe CURIS dae63b5e96 WPrefs: Prefer use of 'sizeof' instead of hard-coded values
Hard-coding a value is prone to errors when maintaining the code; using the
builtin C macro 'sizeof' is a much safer choice.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2019-02-22 16:08:36 +00:00
Doug Torrance 738a78b3e2 Replace GNUSTEP_USER_ROOT environment variable with WMAKER_USER_ROOT
As reported in Debian bug #922284 [1]:

    As evident from the prefix, GNUSTEP_USER_ROOT is a GNUstep variable and
    Window Maker should not set it.  Furthemore, it has been deprecated for
    12 years already.  As of gnustep-make/2.7.0-4 the GNUstep build system
    is configured in strict v2 mode which makes it impossible to compile
    GNUstep software.  In a terminal started from a Window Maker session:

    yavor@aneto:/tmp/gorm.app-1.2.24$ make
    This is gnustep-make 2.7.0. Type 'make print-gnustep-make-help' for help.
    Running in gnustep-make version 2 strict mode.
    rm -f InterfaceBuilder; \
    ln -s GormLib InterfaceBuilder
    /usr/share/GNUstep/Makefiles/config-noarch.make:121: *** GNUSTEP_USER_ROOT
    is obsolete.  Stop.

    It is also impossible to build gnustep-make from pristine upstream
    source:

    yavor@aneto:/tmp$ wget -q
      ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-make-2.7.0.tar.gz
    yavor@aneto:/tmp$ tar xzf gnustep-make-2.7.0.tar.gz
    yavor@aneto:/tmp$ cd gnustep-make-2.7.0/
    yavor@aneto:/tmp/gnustep-make-2.7.0$ ./configure
    ...
    yavor@aneto:/tmp/gnustep-make-2.7.0$ make
    config-noarch.make:121: *** GNUSTEP_USER_ROOT is obsolete.  Stop.

    Note that the majority of GNUstep users use Window Maker as their window
    manager and many of them build GNUstep software from source, mostly
    because of the GNUstep Objective-C runtime which depends on Clang
    (Debian packages use GCC and the GCC/GNU runtime).

Our solution is to replace the GNUSTEP_USER_ROOT environment variable with our
own environment variable, WMAKER_USER_ROOT.  This is documented in NEWS.

[1] https://bugs.debian.org/922284
2019-02-17 18:44:33 +00:00
Stig-Ørjan Smelror 1dace5699f Drop support for Imagemagick version < 7
Had to do a few modifications to get WM to build with Imagemagick 7.

Attached is the diff from the latest git checkout.

Cheers,
Stig
2019-02-12 19:14:01 +00:00
Tim Taenny 5a95631091 Added expert option for WrapAppiconsInDock property to WPrefs
In 2013 Daniel added the functionality to wrap icons, which are
attached to the dock, around the screen edges when the dock is
being moved vertically.
This patch adds an expert option to WPrefs.app for setting the
property which enables/disables this feature.

Remark: In my opinion, the default value for that property should
        be changed to NO, as this is also the default behavior in
        NeXTSTEP. It is handy to be able to move all these icons
        out of sight when working with maximized application
        windows.
2019-02-05 21:32:04 +00:00
Tim Taenny 2427200c3e Added feature: automatic scaling of application icons
If the option "Enforce icon margin" is selected, application window
icons will be selected or scaled so that they only use 75% of the
available icon_size.
Even if the feature is not enabled, this change will scale down
large application icons to icon_size, so that icons can be used
that were rejected by the previous implementation of findBestIcon.
(Example: The Qt Creator icon never showed before, because it is
only provided in 128x128 resolution. Now it's visible.)
2019-01-31 17:22:49 +00:00
Tim Taenny d6c1ac3ecf Added icon feature option to WPrefs: Enforce icon margin
The current findBestIcon function usually selects an icon image
that almost completely fills up the (default) 64x64 pixels of an
icon. As Dan noted in the function, the icon images should use only
75% of the available space, which would result in room for the
miniwindow title and better overall aesthetics.

This feature option provides for enabling such an automatic "icon
shrinking" functionality.

Note: This commit only introduces the new option, not the actual
      image shrinking.
2019-01-31 17:22:49 +00:00
Tim Taenny 9b5eaa3d3e Use popup button for animation style instead of option group in WPrefs
To make some room for an additional icon option (yet to be committed)
the options group for selecting the iconification animation is
replaced by a popup button. This allows for adding at least two more
checkboxes in the options and makes adding new animation styles less
painful.
2019-01-31 17:22:49 +00:00
Tim Taenny 2beb5f2c52 Fixed icon loading during Attribute Inspector startup
When opening the "Icon and Initial Workspace" panel of the Attribute
Inspector, the Miniwindow Image and the corresponding text field were
always empty, even if an icon had been selected, applied and saved
before. The file name was not loaded from the database on startup
of the inspector window.

With this change, the icon and the text field are properly set on
startup of the inspector window.
2019-01-30 23:43:23 +00:00
Carlos R. Mafra f1809a7786 wmgenmenu: add a few programs 2019-01-22 22:25:06 +00:00
Gaspar Chilingarov 8b919b0d33 support moving window between heads using keyboard
Window Maker allows to perform practically all operations with windows
using only keyboard. One of the actions so far which required using
mouse was dragging window from one head (monitor) to another.

This patch introduces support for keyboard shortcuts. These shortcuts
move windows in circular fashion (if you have 3 and more monitors).

In case of 2 or 3 monitors arranged horizontally - window will just move
right/left.

In case of 3x3 setup - it is impossible to move window to central
monitor with keyboard.

- preserves window position and size (if display sizes are same)
- otherwise tries to fit window to smaller display
2018-12-16 10:13:50 +00:00
Doug Torrance d13b78bdde configure: Fix pkg-config variable typo.
The variable set by PKG_PROG_PKG_CONFIG which points to the pkg-config
utility is PKG_CONFIG, not PKGCONFIG.  The latter was previously used
when trying to detect the presence of the MagickWand library when Window
Maker was built using --enable-magick.
2018-08-08 08:51:45 +01:00
Gaspar Chilingarov 6668715402 Detect and override illegal window size hints
The problem - when VirtualBox starts virtual machine, window has very
small height (couple of pixels) and it requires some manual fiddling
to resize it to something usable.

See related bugs here:

https://www.virtualbox.org/ticket/14718#comment:19 - small horizontal
line in the middle of the screen is newly opened virtual machine's
window.

https://www.virtualbox.org/ticket/15863

Inspecting with xdebug and xprop reveals that VirtualBox sends wrong hints:

Request(12): ConfigureWindow window=0x0660000a values={x=27 y=559
width=720 height=65512}

Which is interpreted by X server wrongly and shown with xprop as

WM_NORMAL_HINTS(WM_SIZE_HINTS)
:
                user specified location: 27, 559
                user specified size: 720 by -24
                program specified minimum size: 254 by 109
                window gravity: Static

Some part of X11 interprets such large value as signed int and wraps
it to negative value.

The solution will be if program requests such big window - detect it,
ignore requested size and resize it to some reasonable defaults.

Disclaimer - I tested it only on Ubuntu 16.04, but should apply to
another systems as well - see bug reports.
2018-05-21 13:02:22 +01:00
Doug Torrance 100745d356 setstyle: Add support for fpixmap ("fillscale") textures 2018-05-15 19:55:28 +01:00
Doug Torrance 7c89ca2551 menu: Fix broken "Save Theme" option.
This option had been broken for several reasons:
* The getstyle utility does not replace the #usergnusteppath# macro which
  was passed to it by the menu.
* When processing the USER_THEMES_DIR macro, the menu inserts a space
  afterwards, and so the directory and filename were passed to getstyle
  as two separate arguments.
* It used the old, pre-0.50.0 theme format.

By using the -p option to getstyle, we can avoid these issues, as we don't
need to specify the directory *and* it uses the 'new' (since 1999) themepack
format.
2018-05-15 19:43:25 +01:00
Doug Torrance 0c737bc834 Add new Adwaita style to Makefile. 2018-05-15 14:26:51 +01:00
Doug Torrance b3f8d0997b New Adwaita style which approximates the look of the default GTK theme. 2018-05-15 10:13:48 +01:00
Doug Torrance 673ea18020 Update mailing list links to new Google Groups. 2018-05-14 16:51:23 +01:00
Bad Sector c89ec25c80 Fixes missing appicons after restarting Window Maker
Fixes the bug where if the icon image is accidentally set to
nothing or the image file is deleted, the appicon keeps losing
its icon (it resets to the default cube icon) when Window Maker
exits/restarts (depending on how the user cleared the icon this
may persist even after redocking the application if information
about the application window is still in the WM).  One way to
easily see this bug is to open the main window's attributes and
press the Save button (no need to do anything else) as this
clears the icon file (this is a separate bug that needs to be
fixed but it is more of a minor UI bug since clearing the image
should simply reset the icon to the application provided one if
the Ignore client supplied icon is not set).  Another way to
see it is to open the properties box in a docked application
that is not running and clear the image field.  After either of
these two actions are performed, restart Window Maker and see
that the icons are missing.

This patch fixes the above bug by calling save_appicon when the
appicon object is created and the application provided icon is
already available (window maker actually tries to save the icon
at an earlier stage but this is done as a side effect of
"painting" the dock icon - which also saves the icon - but this
is done too early, before ownership information is available).

Note that this bug seems to be a regression introduced from
commit 9c4b19d8aa (or one of the
related commits around the same time, they seem to be a bit too
aggressive in not saving icons).  This patch addresses the
concern in that commit about only saving the icon for docked
applications.
2018-04-18 10:09:38 +01:00
Bad Sector 569fbff07c wmaker: Add new advanced option to ignore decoration changes from clients.
This adds an option (IgnoreDecorationChanges in plist) for windows to
ignore any requests from the clients for changing decorations. Since the
default state for any window pre-request is to have all decorations visible
this basically means that applications cannot hide any of the titlebar,
sizing bar, titlebar buttons, etc and any hint that causes these elements
to be hidden will be followed by a restoration if this option is set.

 This is useful for broken clients (e.g. Steam) and clients that force
subpar client side decorations. It is basically a per-window setting of the
global advanced option to ignore Gtk hints, except that it also applies to
non-Gtk applications.
2018-02-14 08:16:55 +00:00
Bernhard M. Wiedemann 36879de261 texi2txt: Use ChangeLog date instead of build date
in order to make builds reproducible. See
https://reproducible-builds.org/
for why this is good.

This date call works with GNU date and BSD date. Without this patch,
/usr/share/doc/packages/WindowMaker/README.i18n will differ in the
line An alternative solution could use the $SOURCE_DATE_EPOCH
variable defined in
https://reproducible-builds.org/specs/source-date-epoch/

Signed-off-by: Carlos R. Mafra <crmafra@gmail.com>
2017-12-24 11:58:20 -02:00
Alwin bfd88e07e6 wmaker: Adding copyright year 2017
The Info Panel didn't show the current year.
2017-09-14 21:08:26 +02:00
Alwin 81b89f6a4c wmaker: Fixing a menu typo
There was a typo in background.menu. Although the menu worked fine, it
caused these errors in the logs:

  wmaker(WMReadPropListFromFile(proplist.c:1543)): error: error reading
    from file '/usr/share/WindowMaker/Backgrounds'
2017-09-14 21:08:26 +02:00
Alwin 6cfc71d40a Translations: Frisian language files for WPrefs and menus updated
Compacting two translations to fit the available space; two new strings.
The menus are now split like the English ones, using appearance.menu.fy
and background.menu.fy. A new comment was added to menu.fy.in.
2017-09-14 21:08:26 +02:00
Alwin ccc676a2bf Translations: Dutch language files for WPrefs and menus updated
Compacting a translation to fit the available space; two new strings.
The menus are now split like the English ones, using appearance.menu.nl
and background.menu.nl. A new comment was added to menu.nl.in.
2017-09-14 21:08:26 +02:00
Doug Torrance 2dbd778ed4 WPrefs: Inform user which menu file is being edited. 2017-08-19 15:59:13 +01:00
Doug Torrance f63635dd17 WPrefs: Save menu back to the file we read it from.
Previously, we saved any modifications back to WMRootMenu, regardless of
the file we read the menu from.
2017-08-19 15:59:13 +01:00
Doug Torrance 97702618de WPrefs: Display warning when attempting to modify a read-only menu file. 2017-08-19 15:59:13 +01:00
Doug Torrance b68a1994c2 debian: Remove patch 54_Debian_wmmacros.diff.
This patch is now unnecessary, as we have removed the SETSTYLE and
LOCAL_*_DIR macros and have added the USER_*_DIR upstream.
2017-08-19 11:14:38 +01:00
Doug Torrance fe459fbab3 menu: Add USER_*_DIR macros.
Inspired by the Debian patch 54_Debian_wmmacros.diff.  These macros are
actually already referenced in appearance.menu and background.menu, but
only Debian installations have taken advantage of them.

We use the new #usergnusteppath# macro to reference the user GNUstep path.
2017-08-19 11:14:38 +01:00
Doug Torrance 5f2dac318c menu: New macro #usergnusteppath# for user GNUstep directory
This macro is used when handling directories with OPEN_MENU, e.g., to list
available image files for setting the workspace background.

When parsing a menu file, we replace any instances of #usergnusteppath#
with either GNUSTEP_USER_ROOT or ~/GNUstep if the former is not set.  In
this way, authors of menu files do not have to worry about whether users
will have this variable set or not.

We also document this feature in WindowMaker/menu.in, which generates the
default English language old-style menu and currently contains the existing
documentation for the Window Maker menu system.
2017-08-19 11:14:38 +01:00
Doug Torrance bfda22ef1a menu: Remove unused LOCAL_*_DIR macros.
We remove the macros LOCAL_THEMES_DIR, LOCAL_STYLES_DIR,
LOCAL_ICON_SETS_DIR, and LOCAL_BACKGROUNDS_DIR.

They were only referenced in the Debian patch 54_Debian_wmmacros.diff, which
set them to /usr/local/share/WindowMaker/{Themes,Styles,etc.}.

In a default installation, THEMES_DIR, STYLES_DIR, etc. coincide exactly
with these paths.  In a Debian installation (which defaults to /usr/share
instead of /usr/local/share), it seems unlikely that a user would have these
files in both locations.
2017-08-19 11:14:38 +01:00
Doug Torrance 46daa76f77 menu: Remove unused SETSTYLE macro. 2017-08-19 11:14:38 +01:00
Doug Torrance 02cc702029 WPrefs: Edit proplist menus referenced by WMRootMenu.
Previously, WPrefs could only be used to edit the menu specified in
WMRootMenu.

In a recent commit, the ability to specify a menu in proplist format defined
in another file which is referenced by WMRootMenu was added.  However, if a
user attempted to edit such a menu in WPrefs, an error dialog appeared.

We add the ability for WPrefs to read such a menu.  After the user makes any
changes, the result is stored in WMRootMenu, and *not* the original file.
2017-08-19 11:14:38 +01:00
Doug Torrance 6f195b18fc WINGs: WMIsPL* functions return False if proplist is null.
Previously, calls to WMIsPLString, WMIsPLData, WMIsPLArray, and
WMIsPLDictionary would result in a segfault if the argument was null.
This could happen, e.g., if we are checking which type of proplist
was just parsed from a file, but the parsing failed.

These functions now return False in this case.
2017-08-19 11:14:38 +01:00
Doug Torrance 101ef6f28e menu: For consistency, use appearance.menu for English-language menus. 2017-08-18 02:14:11 +01:00
Doug Torrance 5a5595f76c menu: Add WPrefs to appearance.menu.
WPrefs appears under the 'Appearances' submenu of both menu and plmenu.
2017-08-18 02:14:11 +01:00
Doug Torrance 1a5abe9d84 menu: Add Bluemarine to solid background color options.
This color was present in menu and plmenu, but not background.menu.
2017-08-18 02:14:11 +01:00
Doug Torrance d364afff02 menu: Write data directory during build instead of with wmaker.inst.
Many of the menu files contain the macro #wmdatadir# as a placeholder for
the data directory containing Window Maker themes, styles, background
pixmaps, etc.  This macro is replaced by the the actual path to the data
directory (by default /usr/local/share/WindowMaker) by the wmaker.inst
script, but only when copying WMRootMenu to the user's home directory.

Instead, we replace the macro during the build.  This way, *every* menu
file has the correct path.

Note that several of the files in question were not previously generated
during build.  These have been renamed with a .in extension.
2017-08-18 02:14:11 +01:00
Doug Torrance 273d17a0be menu: Include all aspect ratio options for background pixmap.
The background menu was missing "centered", "maximized", and "filled".

This closes Debian bug #85591 [1]:
  The current default for the scaled backgrounds menu is to use
  scaling without keeping the aspect ratio.

  This very rarely yields to a usable background.

  Could the default be changed to scaling with keeping the aspect
  ratio ?

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=85591
2017-08-18 02:14:11 +01:00
Doug Torrance d6f754e747 debian: Update with version 0.95.8-2 packaging. 2017-08-15 10:34:03 +01:00
Doug Torrance b07075aed3 wmaker: Allow WMRootMenu to reference menu files in proplist format.
Previously, WMRootMenu could either be a menu file in proplist format
itself, or it could reference another menu file in the old style format.

If WMRootMenu referenced another menu file in proplist format, this file
was parsed assuming it was in the old style format and thus failed, as
observed by Andreas Metzler [1].

In this patch, we first attempt to parse a referenced menu file as if
it were in proplist format.  If this fails, then we fall back on the old
style format.  This has the disadvantage of spamming the terminal with
various parsing errors if the menu file is in the old style format.

[1] https://www.mail-archive.com/wmaker-dev@lists.windowmaker.org/msg07097.html
2017-08-13 10:34:46 +01:00
Doug Torrance ad4545b1d8 debian: Update with version 0.95.8-1 packaging. 2017-07-09 22:26:51 +01:00
Doug Torrance ee36395ddf debian: Update with version 0.95.8-1~exp2 packaging. 2017-07-08 23:18:22 +01:00
Doug Torrance ff865c31f0 wmmenugen: Sort menu entries with no category into 'Other'. 2017-07-07 09:59:29 +01:00
Doug Torrance adc1687f98 wmmenugen: Use 'Other' instead of 'Applications' for unknown categories.
From https://standards.freedesktop.org/menu-spec/latest/apa.html:

 Category-based menus based on the Main Categories listed in this
 specification do not provide a complete ontology for all available
 applications. Category-based menu implementations SHOULD therefore provide
 a "catch-all" submenu for applications that cannot be appropriately placed
 elsewhere.

Emphasis on *submenu*.  By using 'Applications', these menu entries were
sorted into the top level.
2017-07-07 09:59:29 +01:00
Doug Torrance ac0690b324 wmmenugen: Add reserved categories.
From https://standards.freedesktop.org/menu-spec/latest/apas03.html:

Reserved Categories have a desktop-specific meaning that has not been
standardized (yet). Desktop entry files that use a reserved category MUST
also include an appropriate OnlyShowIn= entry to restrict themselves to
those environments that properly support the reserved category as used.
2017-07-07 09:59:29 +01:00
Doug Torrance c261f8ec35 wmmenugen: Add missing 'Science' menu category.
See https://standards.freedesktop.org/menu-spec/latest/apa.html
2017-07-07 09:59:29 +01:00
Christophe CURIS e037ae3684 util: fix parsing of XDG menus with multiple groups
The specification for XDG menu files allows having more than one group and
assumes no constraint on their order. The original code assumed that once
the proper group marker was found, everything after was part of it, causing
misinterpretation of some data, like taking the wrong launch command.

This patch stops the parsing of the menu XDG file when a new group is
found, hence implementing the expected behaviour.

Reported-by: Andreas Metzler <ametzler@bebt.de>
2017-07-03 14:45:26 +01:00
Doug Torrance 83f0b764e6 WINGs: Set widget background pixmaps before realization.
Previously, when WMSetWidgetBackgroundPixmap() was called prior to
WMRealizeWidget(), no background pixmap was actually set.

This is because while the CWBackPixmap bit is correctly set to 1, the
CWBackPixel bit remains set to 1.  When XCreateWindow() is finally
called during realization, the background pixel takes precendence over the
background pixmap.

We fix this by setting CWBackPixel to 0 when setting CWBackPixmap to 1 and
vice versa.
2017-03-22 09:26:24 +00:00
Doug Torrance 3140c09240 wmaker: Consistent configuration options.
The default configuration options are given in two places in the source
code:
  - src/default.c
  - WindowMaker/Defaults/WindowMaker.in

The defaults are initially set in the former, but are then overwritten by
the latter.

Ideally, the default options in these two locations should coincide.
However, there are currently several issues.
- Many of the options are missing from WindowMaker/Defaults/WindowMaker.in
- Many of the options have conflicting defaults between the two locations.
- A number of options given in WindowMaker/Defaults/WindowMaker.in no longer
  exist.

In this patch, we bring the defaults in the two locations in line with one
another.  We have given preference to the defaults in W/D/WindowMaker, as
these are the one users have been used to.

Some of the paths in IconPath and PixmapPath have been removed.  In
particular, the various system pixmap paths (/usr/include/X11/pixmaps,
/usr/share/pixmaps, and /usr/local/share/pixmaps) have been removed in
favor of PIXMAPDIR, which is specified by the user at build.  Also,
/usr/share/icons has been removed from IconPath.  The root of this
directory will contain very few icons, as the icons themselves are located
in subdirectories corresponding to XDG icon themes.

We add a comment to src/defaults.c to remind future developers who
add or remove options to change the default values in both locations.

We also take the opportunity to remove the unused DEF_INFO_TEXT_FONT
macro.
2017-03-22 09:26:24 +00:00
Doug Torrance 8fba9945e0 WPrefs: Properly read system fonts in font configuration panel.
Previously, only the user's WMGLOBAL file would be read to determine the
current WINGs fonts (System Font and Bold System Font) in the Font
Configuration panel.  It is quite possible that this information would
not be in the user's WMGLOBAL file, but instead in the system WMGLOBAL
file.

We instead use the WMDefaultSystemFont and WMBoldDefaultSystemFont
functions to get this information.
2017-03-20 18:06:12 +00:00
Carlos R. Mafra 30cd22859a Merge branch 'master' into next
I forgot to add the wmaker 0.95.8 commit back into the next
branch. Doing it now.
2017-03-20 18:03:24 +00:00
Doug Torrance e13cfcd093 debian: Don't try to install scripts/manpages which have been removed. 2017-03-16 15:26:39 +00:00
Doug Torrance c2a03a3de5 debian: Update with version 0.95.8-1~exp1 packaging. 2017-03-15 16:50:42 +00:00
Doug Torrance db6b50e6c1 doc: Remove manpage for upgrade-windowmaker-defaults script.
This script is only available in the Debian package, is very out of date,
and will be soon be removed.
2017-03-12 00:12:18 +00:00
Doug Torrance fa8121ee61 wmaker/WPrefs: Remove legacy support for deprecated apercus.
Replaced by minipreviews in December 2014.  Over two years have passed.
2017-03-12 00:12:18 +00:00
Doug Torrance f6320d4fa5 configure: Remove deprecated --with-nlsdir option.
Deprecated in December 2014, and over two years have passed.
2017-03-12 00:12:18 +00:00
Doug Torrance cea5f6107c WINGs/wrlib: Remove deprecated get-*-flags scripts.
These have been replaced by pkg-config.  Christophe left a note in January
2015 to remove them, and this time has now passed.
2017-03-12 00:12:18 +00:00
Carlos R. Mafra 5d643a67dd Window Maker 0.95.8 2017-03-11 11:10:26 +00:00
Doug Torrance 9087222d1e doc: Add new --with-defsdatadir option to INSTALL-WMAKER. 2017-03-10 20:31:26 +00:00
Doug Torrance dede386b3d debian: Remove patch 51_wmaker_man.diff; applied upstream. 2017-03-10 17:25:32 +00:00
Doug Torrance b2b2ebad4c NEWS: Add note about new global defaults directory configuration. 2017-03-10 17:25:32 +00:00
Alwin d4a0b2f115 Translations: Frisian language file for WPrefs updated
A few new entries were translated.
2017-03-10 14:53:38 +00:00
Alwin 2411298ff6 Translations: Dutch language file for WPrefs updated
A few new entries were translated.
2017-03-10 14:53:38 +00:00
Doug Torrance cdaa7a4520 doc: Add info about user icons directory to manpage.
Based on patch in Debian package.  See:
debian/patches/51_wmaker_man.diff
2017-03-10 10:20:58 +00:00
Doug Torrance 7df224440b doc: Update global autostart/exitscript path in manpage. 2017-03-10 10:20:58 +00:00
Doug Torrance 01ad3ead5d doc: Use new defsdatadir variable to specify defaults directory in manpage. 2017-03-10 10:20:58 +00:00
Doug Torrance 6fa1c0c009 configure: Add option to specify global defaults directory.
Previously, this was only (partially) possible by redefining the macro
GLOBAL_DEFAULTS_SUBDIR.  This told Window Maker to look for the global
config files in a particular subdirectory of SYSCONFDIR.

However:
* This is undocumented.
* GLOBAL_DEFAULTS_SUBDIR is ignored when installing the config files.  They
  are always installed to SYSCONFDIR/WindowMaker.

To solve these issues, we add a "--with-defsdatadir" option to configure
which allows a user to specify the global defaults directory.
2017-03-10 10:20:58 +00:00
Doug Torrance ac92f1a844 wrlib: Bump soname version to 6.
Usually, a soname bump is reserved for when an interface is added, changed,
or removed.  This has not happened to wrlib.  However, I think there is a
special circumstance that warrants the bump.

In particular, there are two versions of wrlib version 5 in the wild:
* The one that shipped with wmaker 0.95.6, which uses symbol version
  LIBWRASTER3.
* The one that shipped with wmaker 0.95.7, which uses symbol version
  LIBWRASTER5.
This was reported in Debian bug #811304 [1].  Binaries which were built
against the older wrlib won't run after upgrading to the newer one, even
though they are supposedly using the same soname version.

(We get around this currently in Debian by patching the old LIBWRASTER3
symbol version back in.)

I propose we bump to version 6 and put this mess behind us.

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=811304
2017-03-10 10:20:58 +00:00
Doug Torrance 21d3fadebb ChangeLog: Update with commits since v0.95.7. 2017-03-10 10:20:58 +00:00
Doug Torrance 3986629590 debian: Update with version 0.95.7-8 packaging. 2017-03-10 01:21:32 +00:00
Cyrus Rahman c052addd1d wmaker: Do not place icons under the dock
While I love the new maximizing functions, in the process of
developing them the code to keep icons from under the dock was lost.

I have created a patch to prevent this problem.
2017-03-06 15:19:55 +00:00
gryf 6e4698fe11 Fixed couple of compilator warning and removed unused macros. 2017-02-25 10:19:52 +00:00
gryf 3617e4c20c Removed trailing whitespaces from readme files. 2017-02-25 10:19:51 +00:00
gryf f3fdf0b8dd Refactoring handleMaximize() function
Simplify handleMaximize function for "not effective" case, where there
was couple of duplicate code, now there is one indentation level less
and readability increased.
2017-02-21 19:24:36 +00:00
gryf 9328ba5b3c Implementation for moving mouse pointer within the maximized window.
Mouse pointer can be now moved together with window if keyboard was used
for arrange maximized windows on screen. This feature can be turned on
in WPrefs.app in Expert tab by selecting "Move mouse pointer with half
MAXIMIZED windows.", or setting "PointerWithHalfMaxWindows" to "Yes" on
~/GNUstep/Defaults/WindowMaker file.
2017-02-21 19:24:36 +00:00
gryf c9fbcda0b0 New option for moving mouse pointer along with half-maximized windows.
This option might be usable for using keyboard for moving windows
around. This option will enable moving mouse pointer for such windows.
2017-02-21 19:24:36 +00:00
gryf eadb7f3ab2 Alternative way for traversing half-maximized windows.
Now it is possible for change a bit pattern for changing state between
half-maximized windows. Half maximized windows will become maximized if
there is issued half-maximizing shortcut in opposite direction. Issue
half-maximizing command on same direction on already maximized window,
will have no effect.
2017-02-21 19:24:35 +00:00
gryf 9e7987713f New option for enabling alternative half-maximized window movement.
Added new option to Window Maker for enabling alternative way for
half-maximized windows movement. Option can be found on Expert section
in WPrefs app.
2017-02-21 19:24:35 +00:00
gryf 62d62eebf1 Bugfix for moving windows between heads.
Previous bugfix introduced another regression. It fixed the issue with
size of the unmaximized window, but break new functionality. Revert back
code for maximizing using mouse, leaving out head detection for keyboard
actions, since it is already calculated.

Mouse actions for maximize also has to be fixed due to different
behaviour in original implementation - movement of the window which is
called in handleMaximize filter out MAX_KEYBOARD from argument passed to
the wMaximizeWindow, so that it will always assume that all the actions
have to be done on the head where mouse pointer resides. For moving
windows between heads feature, calculated head is always passed and
used, regardless of how maximizing was invoked (keyboard or mouse) and
mouse pointer position.
2017-02-21 19:24:35 +00:00
gryf 160f879cce Fixed wrong (re)stored dimensions for unmaximized window. 2017-02-13 20:01:53 +00:00
gryf 28da4c98e3 Added possibility for half-maximized windows to move across the screens.
Using MoveHalfMaximizedWindowsBetweenScreens option user can enable
ability for moving half-maximized windows not only within current
screen/head/display, but also to other heads, if they exists. Note, that
only vertically or horizontally maximized windows can be transfered to
another display. Quarter-maximized windows are not supported, since it
is ambiguous to predict in which direction such window should be moved.
2017-02-08 07:26:35 +00:00
gryf 17a47af160 Added option for ability to move half-maximized between heads.
Added new option to Window Maker preferences to enable half-maximized
windows movement on all available heads. Option can be found in WPrefs
app on Expert section.
2017-02-08 07:26:35 +00:00
gryf 014a315f3a Added wGetHeadRelativeToCurrentHead function
A new function for obtaining possible heads (displays) was added. It
allow to query for a head in four directions relative to the current
one.
2017-02-08 07:26:35 +00:00
gryf e2f8525728 Added 'head' parameter to wMaximizeWindow
Additional 'head' parameter will help to select head (display) where
window should be maximized.
2017-02-08 07:26:35 +00:00
gryf 002d415d02 Trivial cleanup: Removed unused defines. 2017-02-04 13:06:13 +00:00
Doug Torrance 92bc458fac configure: Use PKG_PROG_PKG_CONFIG macro to allow cross building.
Patch by Helmut Grohne <helmut@subdivi.de> to fix Debian bug #853236 [1]:

> wmaker fails to cross build from source, because it forces the use of
> pkg-config without $ac_tool_prefix. Discovering pkg-config with the
> PKG_PROG_PKG_CONFIG macro considers $ac_tool_prefix and thus makes cross
> compilation succeed. Please consider applying the attached patch after
> stretch is released.
>
> Helmut

[1] https://bugs.debian.org/853236
2017-01-31 01:44:56 +00:00
Doug Torrance 6f3dbfeaba debian: Update with version 0.95.7-7 packaging. 2017-01-29 10:07:59 -05:00
Doug Torrance 3426f8110b Look for plmenu in build directory when creating WMRootMenu.
Previously, plmenu already existed in the source directory, and that's where
make looked for it.  Now, however, it is generated to include the proper
path to WPrefs and therefore is in the build directory.

See
https://www.gnu.org/software/make/manual/html_node/Makefile-Basics.html
for more about this distinction.
2017-01-29 10:07:59 -05:00
Doug Torrance f9b2cf9747 Don't try and add removed file mkMakefile to distribution tarball. 2017-01-20 21:01:42 -05:00
Doug Torrance ad590811f6 Remove WindowMaker/mkMakefile script.
It was used to generate WindowMaker/Makefile.am, but hasn't been touched
since 1999.  Meanwhile, WindowMaker/Makefile.am has been changed manually
a number of times.
2017-01-20 19:51:12 -05:00
Doug Torrance d48a37060c Use wprefs_bindir output variable to set WPrefs path in menus.
The path to WPrefs has been hardcoded in many of the menu files to
/usr/local/GNUstep/Applications/WPrefs.app/WPrefs, which would only actually
work if the user ran something like:
     ./configure --with-gnustepdir=/usr/local/GNUstep
during build.

Instead, we add a .in extension to all menu files with this issue and use sed
to use the actual WPrefs path (given by the wprefs_bindir output variable) and
generate a new menu file.

A very similar idea is already used to generate the WMState file, which sets
WPrefs as the command for the Window Maker logo tile in the dock.

This patch fixes Debian bug #851737:
https://bugs.debian.org/851737
2017-01-19 18:40:13 -05:00
Doug Torrance 23417d9934 WPrefs: Update path for Debian menu 2016-11-13 15:52:06 +00:00
Bjørn Mork 5561199c87 wmaker: allow alt+tabbed windows over fullscreen
Fullscreen windows should only be on top when they are in focus. Change
the stacking level temporarily back to WMNormalLevel if the fullscreen
window loses focus due to an alt+tab operation.

Change the stacking level back to WMFullscreenLevel if the fullscreen
window receives the focus again.

Cc: Amadeusz Sławiński <amade@asmblr.net>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
2016-07-12 23:21:00 +01:00
Bjørn Mork 6429847494 wmaker: fix stacking order of dock and fullscreen
This reverts the commits:
 311ab6b08c ("Raise fullscreened window")
 a504370f3b ("Remove WMFullscreenLevel")

Removing WMFullscreenLevel had the side effect that a dock or panel
having the _NET_WM_WINDOW_TYPE_DOCK type would stack on top of
fullscreen windows, obscuring part of them.  This is unwanted. No
other window should cover a focused fullscreen window:.
https://specifications.freedesktop.org/wm-spec/latest/ar01s09.html#STACKINGORDER

Simply raising the fullscreen window to the top of the stack of normal
windows is not sufficient if there are windows with higher stacking
levels present.  The separate WMFullscreenLevel is needed.

Cc: Amadeusz Sławiński <amade@asmblr.net>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
2016-07-12 23:21:00 +01:00
Alexandru Lazar b7a1528833 getstyle: fix wcopy_file paths
Some (presumably stale) calls to wcopy_file used what appears to
be an incorrect destination which did not always exist. This patch
forces assets to be copied under <themedir>/<asset>, rather than
<themedir><absolute path of asset>. It works by first getting the
"new" path (i.e. the one that will be inserted in the property
list), which is relative to <themedir> (and appears to be always
in the root directory, too); it then copies the file to that path.

This *may* have been the original intended behaviour, as the one
it replaces clutters the path and leaks configuration data. In
addition, the style file seems to store only the file's name, not
the path relative to <themedir>, even when the file is copied with
its full hierarchy.

Signed-off-by: Alexandru Lazar <alazar@startmail.com>
2016-04-24 19:11:08 -04:00
Doug Torrance 2ea6162629 wmmenugen: Fix segfault; argv[argc] doesn't exist. 2016-04-24 19:05:34 -04:00
Doug Torrance 5a730d63b2 debian: Update with version 0.95.7-6 packaging. 2016-03-24 16:17:44 -04:00
Doug Torrance fd31b29d0d debian: Update with version 0.95.7-5 packaging. 2016-03-09 15:27:04 -05:00
Doug Torrance ebf2801f4a debian: Update with version 0.95.7-4 packaging.
Note that the patch 57_ignore_with-aix-soname.diff, mentioned in
debian/changelog, is not included as it has already been applied to the next
branch.
2016-02-15 13:37:34 -05:00
Doug Torrance 8b46f16205 debian: Update with version 0.95.7-3 packaging. 2016-02-10 07:52:54 +05:30
Doug Torrance 2da2045efa debian: Remove 56_ignore_runstatedir.diff.
This patch has now been applied in next, so its presence among the Debian
patches would cause quilt to fail for those trying to build packages from
next.
2016-02-10 07:52:54 +05:30
Doug Torrance 67e9e7e554 check-doc: Ignore with-aix-soname in check-cmdline-options-doc.sh
Control: tags -1 forwarded wmaker-dev@lists.windowmaker.org

libtool 2.4.4 will add a --with-aix-soname option.  Ignore it when checking
whether INSTALL-WMAKER is up to date.

Fixes Debian bug #814213 [1].  Proposed fix to Debian package at [2].

   From: Chris Lamb <lamby@debian.org>
   Subject: wmaker: FTBFS: Error: program option '--with-aix-soname' is not in
     the documentation './INSTALL-WMAKER'
   Date: Tue, 09 Feb 2016 09:59:14 +0100

   Dear Maintainer,

   wmaker fails to build from source in unstable/amd64:

     [..]

     make  check-local
     make[4]: Entering directory '/home/lamby/temp/
       cdt.20160209093619.fGSQWYa4PE/wmaker-0.95.7'
     ./script/check-cmdline-options-doc.sh \
     	--program "./configure" --text-doc "./INSTALL-WMAKER" \
     	--ignore-prg 'with-PACKAGE,without-PACKAGE # only template names from
	  Autoconf' \
     	--ignore-prg 'program-prefix,program-suffix,program-transform-name
	  # in INSTALL' \
     	--ignore-prg 'version,quiet,srcdir,build,host,cache-file,no-create
	  # in INSTALL' \
     	--ignore-prg 'enable-silent-rules,disable-silent-rules # should be in
	  INSTALL' \
     	--ignore-prg 'enable-dependency-tracking,disable-dependency-tracking
	  # in INSTALL' \
     	--ignore-prg 'enable-shared,enable-static # should be in INSTALL' \
     	--ignore-prg 'disable-option-checking,enable-fast-install # should be
	  in INSTALL' \
     	--ignore-prg 'disable-libtool-lock,with-pic,with-gnu-ld,with-sysroot
	  # for libtool' \
     	--ignore-prg 'runstatedir #new in autoconf 2.70, backported in Debian' \
     	--ignore-prg 'with-x # no use, it would not work without X'
     Error: program option '--with-aix-soname' is not in the documentation
       './INSTALL-WMAKER'
     Makefile:951: recipe for target 'configure-documentation' failed
     make[4]: *** [configure-documentation] Error 1

     [..]

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=814213
[2] http://anonscm.debian.org/cgit/pkg-wmaker/wmaker.git/commit/?id=dd955a7
2016-02-09 23:21:42 +05:30
Doug Torrance 4f18b3e1f4 check-doc: Ignore runstatedir in check-cmdline-options-doc.sh
autoconf 2.70 will add a --runstatedir option, Debian has backported it.
Ignore it when checking whether INSTALL-WMAKER is up to date.

Patch by Andreas Metzler from Debian package [1].

[1] https://sources.debian.net/src/wmaker/0.95.7-3/debian/patches/
    56_ignore_runstatedir.diff/
2016-02-09 23:21:42 +05:30
Doug Torrance cb1760dc0b WPrefs: Add support for fpixmap ("fillscale") texture. 2016-01-24 08:53:21 -05:00
Doug Torrance 9f7e51e66d WPrefs: Code formatting in TexturePanel.c; minimizes checkpatch.pl warnings. 2016-01-24 08:53:21 -05:00
Doug Torrance bf6f81434b wmlib: Remove install-exec-local target.
This was made redundant by defining pkgconfigdir and pkgconfig_DATA.  On
some systems (with automake < 1.15), this caused a build failure, e.g., [1]:

/usr/bin/install -c -m 644 wmlib.pc /«BUILDDIR»/wmaker-0.95.7+201601230517/
 debian/tmp/usr/lib/x86_64-linux-gnu/pkgconfig/
/usr/bin/install -c -m 644 wmlib.pc '/«BUILDDIR»/wmaker-0.95.7+201601230517/
 debian/tmp/usr/lib/x86_64-linux-gnu/pkgconfig'
/usr/bin/install: cannot create regular file '/«BUILDDIR»/
 wmaker-0.95.7+201601230517/debian/tmp/usr/lib/x86_64-linux-gnu/pkgconfig/
 wmlib.pc': File exists

Also change the definition of DISTCLEANFILES to pkgconfig_DATA to match
the Makefiles for WINGs and wrlib.

[1] https://launchpadlibrarian.net/234989800/
 buildlog_ubuntu-precise-amd64.wmaker_0.95.7+201601230517-0ppa201601211606~
 ubuntu12.04.1_BUILDING.txt.gz
2016-01-23 09:36:53 -05:00
Doug Torrance af892d7dd6 wmlib: Add pkg-config file. 2016-01-23 00:17:05 -05:00
Alwin 7fa14a0137 Translations: Frisian language files updated
New entries were translated, and a lot improved.
2016-01-21 13:10:43 -05:00
Alwin 51d36afc8f Translations: Dutch language files updated
New entries were translated, a few improved.
2016-01-21 13:10:43 -05:00
Doug Torrance 84727563f9 wmaker: Implement basic menu shading.
Menus may now be shaded like other windows by double clicking on their title
bars.  Note that, even if animations are enabled, the shade animation seen
with other windows does not work for menus.

This fixes Debian bug #72038 [1]:

  From: Chris Pimlott <pimlottc@null.net>
  Subject: wmaker: Persistant menus should be shade-able
  Date: Tue, 19 Sep 2000 14:04:41 -0400

  One of the many little things that makes me appreciate Window
  Maker is that by clicking on the title bar of a menu, it can be made
  "persistant" so it stays on screen and doesn't dissappear after click or
  mouseout like normal.  I find it useful if I need to run a number of
  commands in a submenu, or for keeping a list of open windows on
  screen.

  The usefulness of this feature could be extended by allowing menus
  to be shaded (by double-clicking the title) like normal windows, thus
  collapsing them to take up less space when not needed but still be
  persistant.  Perhaps other commands of windows (like maximizing/
  minimizing, resizing) might be considered as well, although
  personally only shading stands out as particularly useful for menus.

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=72038
2016-01-21 08:52:36 -05:00
Doug Torrance c7c0b43629 wmaker: Fix whitespace in menu.h; passes checkpatch.pl inspection. 2016-01-21 08:52:36 -05:00
Doug Torrance ac33bb9d1b wmaker: Display keyboard shortcuts for remaining options in window menu.
In particular, Keep on top, Keep at bottom, and Omnipresent.
2016-01-20 08:27:07 -05:00
Doug Torrance 563cda28d3 wmaker: Add keyboard shortcuts for keeping window on top or at bottom.
This closes Debian bug #306808 [1].

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=306808
2016-01-20 08:27:07 -05:00
Doug Torrance 65802d3402 wmaker: Use window placement settings on other workspaces.
Previously, if a window was placed on a workspace other than the current one,
the window placement settings (given by WindowPlacement) were ignored and
the window was drawn in the upper left hand corner.  This is Debian
bug #181735, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=181735

Part of the bug report by Andrew Gorcester from the link above
is reproduced here:

"When placing a window in a non-active workspace (which usually happens
if the user asks for a program to be started when wmaker is launched,
and defines an initial workspace in the window's attributes dialog),
Windowmaker doesn't follow specified rules on window placement.

All windows of programs that don't manage their own window placement
(Gaim manages placement itself, for instance) are placed in the far
upper-left corner.  Usually windows originate from 64, 64, because the
clip occupies the upper-left corner by default."
2016-01-20 08:14:48 -05:00
Doug Torrance 9de5a27dbc wmaker: Add option for window snap to top edge to maximize to full screen.
This is a common behavior in a number of other environments, e.g., Unity
and Windows.
2016-01-17 22:54:49 -05:00
Doug Torrance 42e4069541 wmaker: Fix typos (used codespell). 2016-01-17 22:54:49 -05:00
Doug Torrance e5632a9120 wmaker: Remove prototype for unused get_right_position_on_screen function. 2016-01-17 22:54:49 -05:00
Doug Torrance c3ad2513a9 wmaker: Update copyright years in info panel. 2016-01-17 22:54:49 -05:00
Doug Torrance 7277787110 debian: Update with version 0.95.7-2 packaging. 2016-01-16 15:16:46 -05:00
Doug Torrance 2f33b3c2bc wmaker: Maintain sorting of windows by workspace in switch menu.
Previously, this sorting failed when one window was moved to another
workspace.

This fixes Debian bug #280851 [1].

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=280851
2016-01-16 01:13:20 -05:00
Doug Torrance fd19456d66 debian: Update with final version of 0.95.7-1 packaging.
For those interested, the official Debian packaging repository is at:
https://anonscm.debian.org/git/pkg-wmaker/wmaker.git
2016-01-10 14:23:25 -05:00
Doug Torrance 688c2277d7 debian: Add version 0.95.6-1.2 entry to changelog. 2016-01-06 07:51:06 -05:00
Doug Torrance 755ce07d76 debian: Add wmiv to wmaker package. 2016-01-06 07:51:06 -05:00
Andreas Metzler fc6ed78654 debian: wmaker manpage moved from 1x to 1.
wmaker manpage was also moved from section 1x to 1. Fix pointer in
README.Debian and update-alternatives slave link.
2016-01-04 13:47:36 -05:00
Andreas Metzler c11b08d42b debian: Fix typo occured. (Thanks, lintian.) 2016-01-04 13:47:25 -05:00
Andreas Metzler f7e1f5d5f4 debian: Simplify debian/rules.
Use dh_auto_configure, especially for handling dpkg-buildflags.
2016-01-04 13:47:16 -05:00
Andreas Metzler 4660e5b1eb debian: Use dh_autoreconf.
Use dh_autoreconf instead of invoking autogen.sh in the configure
target.
2016-01-04 13:47:05 -05:00
Andreas Metzler f58cf6a8cd debian: Ignore missing documentation for --runstatedir.
Ignore runstatedir in check-cmdline-options-doc.sh
autoconf 2.70 will add a --runstatedir option, Debian has backported
it. Ignore it when checking whether INSTALL is up to date.
2016-01-04 13:46:48 -05:00
Doug Torrance 15ae70b159 wmaker: Print error dialog when attempting to delete an in-use workspace. 2015-10-02 07:14:53 -04:00
Satya Mishra 88393f4a6c wmaker: fixed infinite loop in switching within group 2015-10-01 17:06:40 -04:00
Doug Torrance 1f74d4698c ChangeLog: Bring up to date through 0.95.7 release. 2015-08-30 09:34:23 +01:00
Rodolfo García Peñas (kix) 97189ce2cc Enable usermenu
This patch enables the usermenu when the application is launched
and the usermenu file exists.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-25 15:42:06 +01:00
Rodolfo García Peñas (kix) 2fec5f9f28 usermenu.c Avoid compiler warnings
This patch includes some changes to avoid compiler warnings and
some code style.

Compiler warnings are:

- notifyClient, do not uses the menu argument. Including (void) menu.
- WUserMenuData, keyover: label is not used.
- configureUserMenu, params is not initialized.
- configureUserMenu, mentry is not initialized.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-25 15:42:06 +01:00
Rodolfo García Peñas (kix) 7a2eb68aa4 Remove cache icon when detached
This pach removes the icon from the icon cache when the icon is
detached from the dock/clip.

That helps to hold tidy the icon cache folder.

-------8<-------
Also app icon caching was broken around the same time. The app icon cache
in CachedPixmaps was meant to store icons retrieved from X clients so the
dock or clip can display those when the client is not running like after
startup. The cache should contain only such icons and the path should never
appear in WMWindowAttributes because the cache is an internal thing used to
look up icons not otherwise available. If you look at your WMWindowAttributes
now it is full of entries referring to the cache that should not be there and
if you look at the cache dir you'll find a lot of icons from all apps you've
ever started while there should be only the few docked ones that use client
side icons. Also the cache is never cleaned up only new icons are added to it.
-------8<-------

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) 8a822004ee save the icon filename instead the full path
This patch saves the icon filename in the database and in the disk. wmaker
can find the icon in the different folders, including the cache folder.

This patch is based in the comments of Zoltan:

-------8<-------
Also app icon caching was broken around the same time. The app icon cache
in CachedPixmaps was meant to store icons retrieved from X clients so the
dock or clip can display those when the client is not running like after
startup. The cache should contain only such icons and the path should never
appear in WMWindowAttributes because the cache is an internal thing used to
look up icons not otherwise available. If you look at your WMWindowAttributes
now it is full of entries referring to the cache that should not be there and
if you look at the cache dir you'll find a lot of icons from all apps you've
ever started while there should be only the few docked ones that use client
side icons. Also the cache is never cleaned up only new icons are added to it.
-------8<-------

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) 54db8d6c43 Avoid create again a docked application cache icon
This patch avoids to create again the cache icon for a docked application.
If the application is docked, then the icon was previosly created.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) e11800652e Avoid recreate Cached icon moving between docks
This patch avoids to create again the icon in the Cache if the icon
was in other Dock/Clip/Drawer, becasue the icon was previously created
and exits.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) b2c5078987 Remove unused argument in save_appicon
The argument dock is always True, so can be removed.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) 9c4b19d8aa New applications do not create Cached Icon
This patch avoids to create Cached Icons for all applications. Only
the applications docked should create it, as Zoltan said:

-------8<-------
Also app icon caching was broken around the same time. The app icon cache
in CachedPixmaps was meant to store icons retrieved from X clients so the
dock or clip can display those when the client is not running like after
startup. The cache should contain only such icons and the path should never
appear in WMWindowAttributes because the cache is an internal thing used to
look up icons not otherwise available. If you look at your WMWindowAttributes
now it is full of entries referring to the cache that should not be there and
if you look at the cache dir you'll find a lot of icons from all apps you've
ever started while there should be only the few docked ones that use client
side icons. Also the cache is never cleaned up only new icons are added to it.
-------8<-------

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) b281587397 create_appicon_from_dock checks if no_appicon flag is set
As Josip Deanovic reported:

-------8<-------
In previous versions e.g. 0.80.2 up until 0.95.3 when an application
attributes are set with "NoAppIcon = Yes;" ("No application icon" option
in attributes window), it was possible to launch multiple instances of
the application from wmdock using double-click.

After doing a git bisect per your suggestion I have found and reported
this:

bc0700e016 is the first bad commit
commit bc0700e016
Author: Rodolfo García Peñas (kix) <kix@kix.es>
Date:   Mon Jun 18 11:15:19 2012 +0200

    Create WAppIcon always

    When the application is created, the WAppIcon now is created always,
    but it is only painted if the flag is not set.

    The icon initialization to NULL can be done now at
app_icon_create_from_docks
    because it is always called.

:040000 040000 7c58877ad5
33d52affb3 M      src
-------8<-------

This patch reverts this change (not the patch). Now the function
create_appicon_from_dock checks if the flag no_appicon is set,
and then, do not execute the code related to the appicon.

Because the connection between the icon and the window is broken
(icon->owner is null) we need check if the icon->owner exists
when we try to re-create the icon in the Window Attributes window.

Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-23 22:08:30 +01:00
Rodolfo García Peñas (kix) 7e42fedcbb Window Maker 0.95.7 Debian files
Signed-off-by: Rodolfo García Peñas (kix) <kix@kix.es>
2015-08-15 15:40:53 +01:00
Johann Haarhoff c84e787a24 Build on Ubuntu 14.04 2015-08-13 19:30:43 +01:00
519 changed files with 30520 additions and 12553 deletions
+45
View File
@@ -30,6 +30,8 @@ m4/ltversion.m4
m4/lt~obsolete.m4 m4/lt~obsolete.m4
src/wconfig.h src/wconfig.h
WINGs/WINGs/WINGsP.h
wrlib/wraster.h
# These files are generated by scripts # These files are generated by scripts
INSTALL-WMAKER INSTALL-WMAKER
@@ -87,11 +89,54 @@ WINGs/WUtil.pc
wrlib/libwraster.map wrlib/libwraster.map
WindowMaker/appearance.menu
WindowMaker/menu
WindowMaker/menu.bg
WindowMaker/menu.fi
WindowMaker/menu.fy
WindowMaker/menu.hu
WindowMaker/menu.ko
WindowMaker/menu.nl
WindowMaker/menu.ro
WindowMaker/menu.sk
WindowMaker/menu.zh_TW
WindowMaker/plmenu
WindowMaker/plmenu.bg
WindowMaker/plmenu.es
WindowMaker/plmenu.fi
WindowMaker/plmenu.fy
WindowMaker/plmenu.ja
WindowMaker/plmenu.ko
WindowMaker/plmenu.nl
WindowMaker/plmenu.pl
WindowMaker/plmenu.ro
WindowMaker/plmenu.sk
WindowMaker/plmenu.zh_CN
WindowMaker/plmenu.zh_TW
WindowMaker/wmmacros
WindowMaker/Defaults/WMRootMenu WindowMaker/Defaults/WMRootMenu
WindowMaker/Defaults/WMState WindowMaker/Defaults/WMState
WindowMaker/Defaults/WMWindowAttributes WindowMaker/Defaults/WMWindowAttributes
WindowMaker/Defaults/WindowMaker WindowMaker/Defaults/WindowMaker
WindowMaker/IconSets/Default.iconset WindowMaker/IconSets/Default.iconset
WPrefs.app/WPrefs.desktop
# These files are generated by the i18n process
/po/WindowMaker.pot
/po/*.mo
/WINGs/po/WINGs.pot
/WINGs/po/*.mo
/WPrefs.app/po/WPrefs.pot
/WPrefs.app/po/*.mo
/util/po/*.pot
/util/po/*.mo
/wrlib/po/*.pot
/wrlib/po/*.mo
# Some text editors generate backup files # Some text editors generate backup files
*~ *~
.pc
+1 -1
View File
@@ -4,7 +4,7 @@
If you find a bug please fill this form and send it to If you find a bug please fill this form and send it to
wmaker-dev@lists.windowmaker.org Please, USE THIS FORM!!! wmaker-dev@googlegroups.com Please, USE THIS FORM!!!
0. Before reporting this bug I already: 0. Before reporting this bug I already:
[ ] read the NEWS, README and INSTALL files [ ] read the NEWS, README and INSTALL files
+142 -5
View File
@@ -1,3 +1,95 @@
Changes since version 0.95.7:
.............................
- Build on Ubuntu 14.04
(Johann Haarhoff <johann@haarhoff.org.za>)
- Window Maker 0.95.7 Debian files
- create_appicon_from_dock checks if no_appicon flag is set
- New applications do not create Cached Icon
- Remove unused argument in save_appicon
- Avoid recreate Cached icon moving between docks
- Avoid create again a docked application cache icon
- save the icon filename instead the full path
- Remove cache icon when detached
- usermenu.c Avoid compiler warnings
- Enable usermenu
(Rodolfo García Peñas (kix) <kix@kix.es>)
- wmaker: fixed infinite loop in switching within group
(Satya Mishra <qufgmx@gmail.com>)
- wmaker: Print error dialog when attempting to delete an in-use workspace.
(Doug Torrance <dtorrance@piedmont.edu>)
- debian: Ignore missing documentation for --runstatedir.
- debian: Use dh_autoreconf.
- debian: Simplify debian/rules.
- debian: Fix typo occurred. (Thanks, lintian.)
- debian: wmaker manpage moved from 1x to 1.
(Andreas Metzler <ametzler@bebt.de>)
- debian: Add wmiv to wmaker package.
- debian: Add version 0.95.6-1.2 entry to changelog.
- debian: Update with final version of 0.95.7-1 packaging.
- wmaker: Maintain sorting of windows by workspace in switch menu.
- debian: Update with version 0.95.7-2 packaging.
- wmaker: Update copyright years in info panel.
- wmaker: Remove prototype for unused get_right_position_on_screen function.
- wmaker: Fix typos (used codespell).
- wmaker: Add option for window snap to top edge to maximize to full screen.
- wmaker: Use window placement settings on other workspaces.
- wmaker: Add keyboard shortcuts for keeping window on top or at bottom.
- wmaker: Display keyboard shortcuts for remaining options in window menu.
- wmaker: Fix whitespace in menu.h; passes checkpatch.pl inspection.
- wmaker: Implement basic menu shading.
(Doug Torrance <dtorrance@piedmont.edu>)
- Translations: Dutch language files updated
- Translations: Frisian language files updated
(Alwin <translations@ziggo.nl>)
- wmlib: Add pkg-config file.
- wmlib: Remove install-exec-local target.
- WPrefs: Code formatting in TexturePanel.c; minimizes checkpatch.pl warnings.
- WPrefs: Add support for fpixmap ("fillscale") texture.
- check-doc: Ignore runstatedir in check-cmdline-options-doc.sh
- check-doc: Ignore with-aix-soname in check-cmdline-options-doc.sh
- debian: Remove 56_ignore_runstatedir.diff.
- debian: Update with version 0.95.7-3 packaging.
- debian: Update with version 0.95.7-4 packaging.
- debian: Update with version 0.95.7-5 packaging.
- debian: Update with version 0.95.7-6 packaging.
- wmmenugen: Fix segfault; argv[argc] doesn't exist.
(Doug Torrance <dtorrance@piedmont.edu>)
- getstyle: fix wcopy_file paths
(Alexandru Lazar <alazar@startmail.com>)
- wmaker: fix stacking order of dock and fullscreen
- wmaker: allow alt+tabbed windows over fullscreen
(Bjørn Mork <bjorn@mork.no>)
- WPrefs: Update path for Debian menu
- Use wprefs_bindir output variable to set WPrefs path in menus.
- Remove WindowMaker/mkMakefile script.
- Don't try and add removed file mkMakefile to distribution tarball.
- Look for plmenu in build directory when creating WMRootMenu.
- debian: Update with version 0.95.7-7 packaging.
- configure: Use PKG_PROG_PKG_CONFIG macro to allow cross building.
(Doug Torrance <dtorrance@piedmont.edu>)
- Trivial cleanup: Removed unused defines.
(Roman Dobosz <gryf73@gmail.com>)
- Added 'head' parameter to wMaximizeWindow
- Added wGetHeadRelativeToCurrentHead function
- Added option for ability to move half-maximized between heads.
- Added possibility for half-maximized windows to move across the screens.
- Fixed wrong (re)stored dimensions for unmaximized window.
(gryf <gryf73@gmail.com>)
- Bugfix for moving windows between heads.
- New option for enabling alternative half-maximized window movement.
- Alternative way for traversing half-maximized windows.
- New option for moving mouse pointer along with half-maximized windows.
- Implementation for moving mouse pointer within the maximized window.
- Refactoring handleMaximize() function
- Removed trailing whitespaces from readme files.
- Fixed couple of compilator warning and removed unused macros.
(Roman Dobosz <gryf73@gmail.com>)
- wmaker: Do not place icons under the dock
(Cyrus Rahman <crahman@gmail.com>)
- debian: Update with version 0.95.7-8 packaging.
(Doug Torrance <dtorrance@piedmont.edu>)
Changes since version 0.95.6: Changes since version 0.95.6:
............................. .............................
@@ -396,6 +488,51 @@ Changes since version 0.95.6:
- debian: Import version 0.95.6-1. - debian: Import version 0.95.6-1.
- debian: Import version 0.95.6-1.1. - debian: Import version 0.95.6-1.1.
(Doug Torrance <dtorrance@monmouthcollege.edu>) (Doug Torrance <dtorrance@monmouthcollege.edu>)
- Import of (partly outdated) Ukrainian translations.
(Martin Dietze <mdietze@gmail.com>)
- Add folder with fedora .spec file
(Alexey I. Froloff <raorn@raorn.name>)
- make: Add Ukrainian translation files to EXTRA_DIST.
- wmiv: Add long command line options --help and --version.
- wmiv: Improve help text.
- doc: Add manpage for wmiv.
(Doug Torrance <dtorrance@monmouthcollege.edu>)
- wmaker: replaced old email address with the official one
- WINGs: Updated news with the API changes that occurred between 0.95.6 and
0.95.7
- WINGs: ran spell checker on the NEWS file
- WINGs: fix non-portable int conversion for printf in font panel size handling
- WRaster: fix unused variable warning when XShm extention is not enabled
(Christophe CURIS <christophe.curis@free.fr>)
- New translation into Frisian for Window Maker
(Alwin <translations@ziggo.nl>)
- wrlib: fixed gcc version needed for deprecated attribute support
- Configure: increased the version of Automake requested
(Christophe CURIS <christophe.curis@free.fr>)
- configure: Fix output of libdir directory in summary
(Josip Deanovic <djosip+news@linuxpages.net>)
- wmaker: fix detection of legacy Apercu configuration keywords
- WPrefs: fix conversion of old "Apercu" setting to the new keywords
(Christophe CURIS <christophe.curis@free.fr>)
- wmaker: Allow window snapping and linked workspaces simultaneously.
- wmaker: Allow configuration of window snapping detect distances.
- WPrefs: Add ability to set integer values in Expert panel
- WPrefs: Add snap edge and corner detect to Expert panel.
(Doug Torrance <dtorrance@monmouthcollege.edu>)
- Translations: Dutch updates for WPrefs
- Translations: Frisian updates for WPrefs
(Alwin <translations@ziggo.nl>)
- configure: fixed incorrect variable name that prevented --disable-xdnd to
work
(Rodolfo García Peñas (kix) <kix@kix.es>)
- Revert "wmaker: fix clearing of window attribute that was not saved properly"
- Disable pager by default
(Carlos R. Mafra <crmafra@gmail.com>)
- Allow using keypad Enter to commit move/resize
- Allow using numpad Enter key in dialogs for confirmation
(Amadeusz Sławiński <amade@asmblr.net>)
- Window Maker 0.95.7
(Carlos R. Mafra <crmafra@gmail.com>)
Changes since version 0.95.5: Changes since version 0.95.5:
@@ -832,7 +969,7 @@ Changes since version 0.95.5:
- WMaker: moved XGrab/XUngrabPointer into the conditional code - WMaker: moved XGrab/XUngrabPointer into the conditional code
- News: created section dedicated to the changes related to 0.95.3 - News: created section dedicated to the changes related to 0.95.3
- News: added description of a change that may be interesting to users - News: added description of a change that may be interesting to users
- News: added section to describe the changes that have occured in 0.95.4 - News: added section to describe the changes that have occurred in 0.95.4
- News: marked the current changes as part of 0.95.5 and describe the drawers - News: marked the current changes as part of 0.95.5 and describe the drawers
feature feature
- News: described the new features for future 0.95.6 release - News: described the new features for future 0.95.6 release
@@ -966,7 +1103,7 @@ Changes since version 0.95.5:
#50158) #50158)
- WPrefs: fix NULL pointer handling when getting the Modifiers (Coverity - WPrefs: fix NULL pointer handling when getting the Modifiers (Coverity
#50200) #50200)
- WPrefs: add warning when renderTexture encounters some unknow settings - WPrefs: add warning when renderTexture encounters some unknown settings
(Christophe CURIS <christophe.curis@free.fr>) (Christophe CURIS <christophe.curis@free.fr>)
- util/wmiv: add image auto orientation detection - util/wmiv: add image auto orientation detection
(David Maciejak <david.maciejak@gmail.com>) (David Maciejak <david.maciejak@gmail.com>)
@@ -3926,7 +4063,7 @@ Changes since version 0.17.5:
icons icons
- fixed bug in focusfollowmouse that made windows under the currently - fixed bug in focusfollowmouse that made windows under the currently
focused window that close, to not get the focus focused window that close, to not get the focus
- if the app is a .app, it will try to find it's icon in the .app - if the app is a .app, it will try to find its icon in the .app
directory and save it in the WMWindowAttributes, so that the dock can use it. directory and save it in the WMWindowAttributes, so that the dock can use it.
- drag docklets that select for mouse events to with Alt+drag - drag docklets that select for mouse events to with Alt+drag
@@ -4797,7 +4934,7 @@ Changes since version 0.3.2:
- application icons (not mini-windows) like I think how it is on NEXTSTEP(tm) - application icons (not mini-windows) like I think how it is on NEXTSTEP(tm)
- fixed "slippery" icon movement - fixed "slippery" icon movement
- added a Dock (not for GNUstep, as it will have it's own) - added a Dock (not for GNUstep, as it will have its own)
Changes since version 0.3.1: Changes since version 0.3.1:
............................ ............................
@@ -4827,7 +4964,7 @@ it's opened to select items, just drag the pointer
- transient owners get a different titlebar color when the focus - transient owners get a different titlebar color when the focus
is in the transient (e.g, in NeXTese: mainWindow is highlighted correctly when is in the transient (e.g, in NeXTese: mainWindow is highlighted correctly when
the keyWindow is a panel) the keyWindow is a panel)
- when transient is closed, it's owner always get the focus - when transient is closed, its owner always get the focus
- fixed XGrabButton/BadAccess bug - fixed XGrabButton/BadAccess bug
- fixed window_count error (this time I'm 90% sure) - fixed window_count error (this time I'm 90% sure)
- fixed focusNextWindow through Alt-Tab bug with non-focusable windows - fixed focusNextWindow through Alt-Tab bug with non-focusable windows
+14 -14
View File
@@ -15,7 +15,7 @@ Summary of Contents:
1.2 Where can I get Window Maker? 1.2 Where can I get Window Maker?
1.3 Where are the mailing list archives? 1.3 Where are the mailing list archives?
1.4 Where is more documentation on configuring Window Maker? 1.4 Where is more documentation on configuring Window Maker?
1.5 What is an App Icon? 1.5 What is an appicon?
1.6 How can I get a question added to the FAQ? 1.6 How can I get a question added to the FAQ?
1.7 How do I report bugs? 1.7 How do I report bugs?
1.8 Is there an anonymous cvs server? 1.8 Is there an anonymous cvs server?
@@ -134,7 +134,7 @@ Introduction:
1.1 What is Window Maker? 1.1 What is Window Maker?
---------------------------------- ----------------------------------
Window Maker is an elegant X11 window manger that emulates the Window Maker is an elegant X11 window manager that emulates the
OpenStep desktop with some noticeable enhancements. Look at OpenStep desktop with some noticeable enhancements. Look at
http://wm.current.nu/themes/my-themes.html and http://wm.current.nu/themes/my-themes.html and
http://wm.current.nu/themes/screenshots.html http://wm.current.nu/themes/screenshots.html
@@ -333,7 +333,7 @@ Window Maker distribution.
The author Anthony Quinn <southgat@frontiernet.net> has released a The author Anthony Quinn <southgat@frontiernet.net> has released a
version that works with Window Maker >= 0.15.x. It is available from version that works with Window Maker >= 0.15.x. It is available from
it's home page at http://www.frontiernet.net/~southgat/wmsound/ its home page at http://www.frontiernet.net/~southgat/wmsound/
or on Largo's site at http://wm.current.nu/files.html#wmsound or on Largo's site at http://wm.current.nu/files.html#wmsound
for your convenience. for your convenience.
@@ -352,7 +352,7 @@ GNOME application they have no title bar" below.
To use it with CDE, read the answer for "How do I switch To use it with CDE, read the answer for "How do I switch
CDE's window manager to use Window Maker?" CDE's window manager to use Window Maker?"
To use it with KDE, read it's documentation to get rid of kwm (and possibly To use it with KDE, read its documentation to get rid of kwm (and possibly
kpanel) and replace it with wmaker. Then, start WPrefs.app, go to "Mouse kpanel) and replace it with wmaker. Then, start WPrefs.app, go to "Mouse
Preferences" and set the "Disable mouse actions" check box. You will Preferences" and set the "Disable mouse actions" check box. You will
need to restart Window Maker to make this change take effect. The need to restart Window Maker to make this change take effect. The
@@ -507,7 +507,7 @@ exec wmaker
Things to try if it doesn't work: (somewhat fuzzy and random) Things to try if it doesn't work: (somewhat fuzzy and random)
This should do it although I did have problems sometimes initially which I This should do it although I did have problems sometimes initially which I
fixed by randomly trying absolute pathes for wmaker in .xsession/.xinitrc and/or fixed by randomly trying absolute paths for wmaker in .xsession/.xinitrc and/or
making the dtprofile/.xinitrc/etc executable. It helps logging in on the console making the dtprofile/.xinitrc/etc executable. It helps logging in on the console
(select from CDE login screen) and start X manually using 'X'. (select from CDE login screen) and start X manually using 'X'.
If it works that way it should work when logging into the CDE environment. If it works that way it should work when logging into the CDE environment.
@@ -628,7 +628,7 @@ the last app started by .xinitrc is closed.
the X server will be closed, and your session will end. the X server will be closed, and your session will end.
3.3 How do I "dock" AppIcons on the Clip? 3.3 How do I "dock" appicons on the Clip?
----------------------------------------- -----------------------------------------
Just drag icons near it like you would for the dock. Note that if you place Just drag icons near it like you would for the dock. Note that if you place
the clip near the dock, you may have problems docking appicons in either. the clip near the dock, you may have problems docking appicons in either.
@@ -674,7 +674,7 @@ David Reviejo <dreviejo@arrakis.es> best summed up this answer:
3.7 How do I "undock" AppIcons? 3.7 How do I "undock" appicons?
---------------------------------- ----------------------------------
If the program is not running, just drag the icon to the middle of your If the program is not running, just drag the icon to the middle of your
desktop (away from the dock and clip) and watch it disappear. desktop (away from the dock and clip) and watch it disappear.
@@ -731,7 +731,7 @@ These directories will be listed under the "Search Path" section of WPrefs.
3.11 When I run GNOME application they have no title bar. 3.11 When I run GNOME application they have no title bar.
---------------------------------- ----------------------------------
The GNOME toolkit decided to behave his own way, so it draws its own title bar The GNOME toolkit decided to behave in its own way, so it draws its own title bar
with buttons, and asks Window Maker to not draw anything (title bar, resize bar, with buttons, and asks Window Maker to not draw anything (title bar, resize bar,
close and miniaturise button, ...). close and miniaturise button, ...).
@@ -838,7 +838,7 @@ AlwaysUserIcon=Yes;
}; };
4.6 How do I get a Tile background for my AppIcons (those things in 4.6 How do I get a Tile background for my appicons (those things in
the dock)? the dock)?
---------------------------------- ----------------------------------
You need to change 1 line to your ~/GNUstep/Defaults/WindowMaker file. You need to change 1 line to your ~/GNUstep/Defaults/WindowMaker file.
@@ -868,9 +868,9 @@ Application Icon'' Option then Save, Apply and close the dialog.
This should allow you do dock the program normally. This should allow you do dock the program normally.
Emulate Appicon does exactly the same thing as dockit, a small app Emulate AppIcon does exactly the same thing as dockit, a small app
distributed with ancient versions of Window Maker before the Attribute distributed with ancient versions of Window Maker before the Attribute
Editor existed (now deprecated for the obvious reason). If Emulate Appicon Editor existed (now deprecated for the obvious reason). If Emulate AppIcon
does not work, dockit will not work either. Such applications violate the does not work, dockit will not work either. Such applications violate the
ICCCM (Inter-Client Communication Conventions Manual) and are considered ICCCM (Inter-Client Communication Conventions Manual) and are considered
badly coded for not setting the instance.class hints. badly coded for not setting the instance.class hints.
@@ -898,7 +898,7 @@ NoAppIcon=Yes;
4.9 How do I set a pixmap background? 4.9 How do I set a pixmap background?
---------------------------------- ----------------------------------
Here is the in depth explanation straight from the NEWS file: Here is the in-depth explanation straight from the NEWS file:
wmsetbg now accepts the following options: wmsetbg now accepts the following options:
usage: wmsetbg [-options] image usage: wmsetbg [-options] image
@@ -1283,7 +1283,7 @@ WM_NORMAL_HINTS(WM_SIZE_HINTS):
user specified size: 400 by 300 user specified size: 400 by 300
program specified minimum size: 400 by 300 program specified minimum size: 400 by 300
Now, when scilab opens it's window, Window Maker nicely does exactly what it Now, when scilab opens its window, Window Maker nicely does exactly what it
is told, that is, map the window at position 136679205, 1074468360 which is told, that is, map the window at position 136679205, 1074468360 which
obviously falls outside the screen no matter how big is your monitor ;) obviously falls outside the screen no matter how big is your monitor ;)
@@ -1476,7 +1476,7 @@ Themes:
8.1 What exactly are themes? 8.1 What exactly are themes?
---------------------------------- ----------------------------------
Themes are a great aspect of Window Maker allowing a user to simply Themes are a great aspect of Window Maker allowing a user to simply
save the entire 'look' of their desktop in a Archive to distribute freely among save the entire 'look' of their desktop in an archive to distribute freely among
friends, fellow users and/or the whole net in general. :) friends, fellow users and/or the whole net in general. :)
See the theme-HOWTO at http://wm.current.nu/themes/theme-HOWTO.html See the theme-HOWTO at http://wm.current.nu/themes/theme-HOWTO.html
+43 -5
View File
@@ -19,10 +19,19 @@ config-paths.h: Makefile
@echo '#define PIXMAPDIR "$(pixmapdir)"' >> $@ @echo '#define PIXMAPDIR "$(pixmapdir)"' >> $@
@echo '' >> $@ @echo '' >> $@
@echo '/* where shared data is stored */' >> $@ @echo '/* where shared data is stored */' >> $@
@echo '#define PKGDATADIR "$(datadir)/WindowMaker"' >> $@ @echo '#define PKGDATADIR "$(datadir)/$(PACKAGE_TARNAME)"' >> $@
@echo '' >> $@ @echo '' >> $@
@echo '/* where the configuration is stored */' >> $@ @echo '/* where the global defaults are stored */' >> $@
@echo '#define SYSCONFDIR "$(sysconfdir)"' >> $@ @echo '#define PKGCONFDIR "$(pkgconfdir)"' >> $@
@echo '' >> $@
@echo '/* where the user data root is located */' >> $@
@echo '#define GSUSER_SUBDIR "GNUstep"' >> $@
@echo '' >> $@
@echo '/* where the user defaults are stored */' >> $@
@echo '#define DEFAULTS_SUBDIR "Defaults"' >> $@
@echo '' >> $@
@echo '/* where the user data are stored */' >> $@
@echo '#define USERDATA_SUBDIR "Library"' >> $@
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
@@ -41,11 +50,13 @@ EXTRA_DIST = TODO BUGS BUGFORM FAQ INSTALL \
script/check-cmdline-options-doc.sh \ script/check-cmdline-options-doc.sh \
script/check-translation-sources.sh \ script/check-translation-sources.sh \
script/check-wmaker-loaddef-callbacks.sh \ script/check-wmaker-loaddef-callbacks.sh \
script/generate-html-from-man.sh \
script/generate-mapfile-from-header.sh \ script/generate-mapfile-from-header.sh \
script/generate-po-from-template.sh \ script/generate-po-from-template.sh \
script/generate-txt-from-texi.sh \ script/generate-txt-from-texi.sh \
script/nested-func-to-macro.sh \ script/nested-func-to-macro.sh \
script/replace-ac-keywords.sh script/replace-ac-keywords.sh \
script/replace-generated-content.sh
.PHONY: coverage-reset coverage .PHONY: coverage-reset coverage
@@ -62,6 +73,10 @@ coverage:
genhtml --output-directory @lcov_output_directory@ coverage/coverage.info genhtml --output-directory @lcov_output_directory@ coverage/coverage.info
endif endif
################################################################################
# Section for the I18N processing
################################################################################
# make update-lang PO=<lang> # make update-lang PO=<lang>
# ========================== # ==========================
# Update the PO files against the POT file in all the translation sub-directories # Update the PO files against the POT file in all the translation sub-directories
@@ -80,13 +95,34 @@ if HAVE_XGETTEXT
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) update-lang || exit $$?); \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) update-lang || exit $$?); \
done done
SUBDIRS_PO = WINGs/po po util/po WPrefs.app/po SUBDIRS_PO = wrlib/po WINGs/po po util/po WPrefs.app/po
else else
@echo "Error: the program 'xgettext' was not found by configure, it is mandatory for this operation" >&2 ; exit 1 @echo "Error: the program 'xgettext' was not found by configure, it is mandatory for this operation" >&2 ; exit 1
endif endif
.PHONY: update-lang .PHONY: update-lang
################################################################################
# Section related to generating HTML content for the website
################################################################################
if WITH_WEB_REPO
SUBDIRS_WEB = doc
website:
@for subdir in $(SUBDIRS_WEB); do \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) website || exit $$?); \
done
endif
.PHONY: website
################################################################################
# Section for the automated checks
################################################################################
# Create a 'silent-rule' for our make check the same way automake does # Create a 'silent-rule' for our make check the same way automake does
AM_V_CHKOPTS = $(am__v_CHKOPTS_$(V)) AM_V_CHKOPTS = $(am__v_CHKOPTS_$(V))
am__v_CHKOPTS_ = $(am__v_CHKOPTS_$(AM_DEFAULT_VERBOSITY)) am__v_CHKOPTS_ = $(am__v_CHKOPTS_$(AM_DEFAULT_VERBOSITY))
@@ -106,6 +142,8 @@ configure-documentation:
--ignore-prg 'enable-shared,enable-static # should be in INSTALL' \ --ignore-prg 'enable-shared,enable-static # should be in INSTALL' \
--ignore-prg 'disable-option-checking,enable-fast-install # should be in INSTALL' \ --ignore-prg 'disable-option-checking,enable-fast-install # should be in INSTALL' \
--ignore-prg 'disable-libtool-lock,with-pic,with-gnu-ld,with-sysroot # for libtool' \ --ignore-prg 'disable-libtool-lock,with-pic,with-gnu-ld,with-sysroot # for libtool' \
--ignore-prg 'runstatedir #new in autoconf 2.70, backported in Debian' \
--ignore-prg 'with-aix-soname #new in libtool 2.4.4' \
--ignore-prg 'with-x # no use, it would not work without X' --ignore-prg 'with-x # no use, it would not work without X'
.PHONY: configure-documentation .PHONY: configure-documentation
+495 -13
View File
@@ -1,7 +1,489 @@
NEWS for veteran Window Maker users NEWS for veteran Window Maker users
----------------------------------- -----------------------------------
-- 0.97.0
Directional window focus
------------------------
The keyboard focus can now be moved in a specific direction (left, right,
up, down) relative to the currently focused window, using window centres
for comparison. The shortcuts can be configured in WPrefs under
"Keyboard Shortcuts", or set directly in ~/GNUstep/Defaults/WindowMaker
via "FocusWindowLeftKey", "FocusWindowRightKey", "FocusWindowUpKey" and
"FocusWindowDownKey" (disabled by default).
The existing "CirculateRaise" option ("Raise window when switching focus
with keyboard" in WPrefs) also controls whether windows that are fully
obscured by others are raised when receiving focus this way.
Vim-like window marking
-----------------------
Windows can now be dynamically assigned a mark label (a key or
modifier+key combination) allowing them to be instantly recalled without
searching. This is inspired by vim's mark-and-jump navigation.
The mark label is displayed in the window list menu between the window
title and the workspace name.
Five actions can be configured in ~/GNUstep/Defaults/WindowMaker
(or in WPrefs under "Keyboard Shortcuts")
"MarkSetKey": assign a label to the focused window (e.g. with the
action bound to "Super+M", pressing "Super+M x" marks the focused
window with label 'x').
"MarkUnsetKey": remove the mark from a labeled window.
"MarkJumpKey": focus and raise the window with the given label.
"MarkBringKey": move the marked window to the current workspace and
focus it.
"MarkSwapKey": swap the focused window with the marked window.
Those are disabled by default.
Marks are persistent across sessions and saved in the WMState file.
Multi-key and sticky-chain keybindings
--------------------------------------
Keyboard shortcuts now support multi-key sequences, similar to
Emacs-style prefix bindings (e.g. pressing a leader key followed by
one or more continuation keys).
An optional sticky-chain mode allows a prefix key to remain active
until a cancel key is pressed or a timeout expires, making it possible
to trigger multiple actions in sequence without re-entering the prefix.
New options in ~/GNUstep/Defaults/WindowMaker:
"KeychainTimeoutDelay" is the timeout in milliseconds after which an
active chain expires. Default is 500. Set to 0 to disable the
timeout.
"KeychainCancelKey" sets a key to explicitly cancel an active chain.
(disabled by default).
Configurable modifier key labels
---------------------------------
A new "ModifierKeyShortLabels" option in ~/GNUstep/Defaults/WindowMaker
allows customizing the labels shown for modifier keys in menus and
keyboard shortcut displays. Unicode symbols can be used in place of the
default text labels. For example to use the same symbol as defined on
MacOS:
ModifierKeyShortLabels = (
"\342\207\247",
"\342\214\203",
"\342\214\245",
"\342\207\255",
"\342\207\263",
"\342\214\230",
"\342\207\252",
"\342\227\206",
"\342\214\245"
);
Configurable mouse wheel focus behavior
----------------------------------------
Scrolling the mouse wheel over a window can now optionally move the
keyboard focus to that window. The option is available in WPrefs under
"Expert User Preferences", or by setting "MouseWheelFocusEnable" in
~/GNUstep/Defaults/WindowMaker (NO by default).
Application icons in the window list
-------------------------------------
Application icons can now be shown in the window list menu. This behavior
can be configured by setting the "WindowListAppIcons" option in
~/GNUstep/Defaults/WindowMaker or "Show app icons in window list." in
WPrefs under "Expert User Preferences" (NO by default).
Configurable screenshot filename template
-----------------------------------------
The filename (strftime compatible) format used when saving screenshots
can now be customized by setting the "ScreenshotFileNameTemplate"
option in ~/GNUstep/Defaults/WindowMaker. The default remains the
format introduced in 0.96.0.
JPEG XL image support
---------------------
WRaster can now optionally load JPEG XL images if the libjxl
library is present at build time. The feature can be toggled at
configure time with --enable-jxl/--disable-jxl.
wmiv: archive files and unknown format handling
-----------------------------------------------
wmiv can now open images stored inside archive files (with libarchive).
A new option to silently skip unknown image formats is also available.
It supports ctrl+c shortcut to copy the current image to the clipboard.
Support for _NET_WM_MOVERESIZE
------------------------------
Window Maker now handles the _NET_WM_MOVERESIZE EWMH message, which
allows applications to initiate interactive window moves and resizes
through a standard protocol request (for those applications without
decorations: VS Code, Google Chrome, Steam and Discord, ...).
Cycle windows across all workspaces
-----------------------------------
A new 'Cycle all windows from all workspaces' expert option allows
the Alt-Tab window switcher to include windows from all workspaces,
not only the current one. Which is the "CycleAllWorkspaces" option
in ~/GNUstep/Defaults/WindowMaker (NO by default).
RandR and multi-monitor improvements
------------------------------------
RandR version >= 1.3 is automatically enabled when detected. By default,
it operates in static mode, requiring the screen layout to be defined
manually. A new "HotplugMonitor" option in ~/GNUstep/Defaults/WindowMaker
(NO by default) enables automatic monitor detection on hotplug events,
adding newly connected monitors to the right of the existing layout.
This option is also available in WPrefs expert panel under
"Automatically (de)activate monitors on hotplug events".
Titlebar language button revamp
-------------------------------
When the modelock feature is enabled, the legacy hardcoded language
dropdown icons in the titlebar are replaced by a compact button
displaying the short name of the current XKB locale (those are
basically the layouts displayed via setxkbmap -query).
Clicking the button cycles through up to four keyboard layouts
(matching the four XKB groups). The xkbfile library is required for
this feature.
-- 0.96.0
Hot Corners feature
-------------------
Screen corners can be assigned an external command to be
executed when the mouse pointer is entering those areas.
In WPrefs, "Hot Corner Shortcut Preferences" can be used
for configuration or by manually adding a "HotCorners" key
and value to "YES" in the ~/GNUstep/Defaults/WindowMaker file.
Hot Corners feature is disabled by default.
Actions are specified by the "HotCornerActions" and are defined
as a four entries list ("top left action", "top right action",
"bottom left action", "bottom right action").
A screen corner area is a cube shape defined by the "HotCornerEdge"
which is a number of pixels from 2 (by default) to 10.
To lower the risk of triggering that feature accidentally a
"HotCornerDelay" key can be used which is the time before the action
is triggered while the pointer is in one of the screen corner.
Default value is 250 ms.
Screenshot capture feature
--------------------------
In WPrefs "Keyboard Shortcut Preferences" tab, three new actions can
be configured: "Capture a portion of the screen", "Capture a window",
"Capture the entire screen". The file is saved in
~/GNUstep/Library/WindowMaker/Screenshots directory under a filename
format "screenshot_%Y-%m-%d_at_%H:%M:%S" followed by the extension.
Which can be png or jpg based on WRaster dependencies.
libXRes is now an optional dependency
-------------------------------------
XRes the resource extension for the X protocol is used to find the
underlying processes (and PIDs) responsible for displaying the windows.
Support for _NET_WM_FULLSCREEN_MONITORS hint
--------------------------------------------
That hint allows applications that support it to be set as fullscreen on multiple heads.
It depends on Xinerama extension support.
Keep dock on primary head
-------------------------
To keep the dock on the primary head in a multi-head setup, set the option
"KeepDockOnPrimaryHead" in ~/GNUstep/Defaults/WindowMaker to "YES" or click
"Keep dock on primary head" under the WPrefs "Expert User Preferences" tab.
-- 0.95.9
Configurable SwitchPanel
------------------------
SwitchPanel is now more configurable: you can configure the switch panel icon
size by setting the "SwitchPanelIconSize" option to your preferred value in
~/GNUstep/Defaults/WindowMaker. The font size used in this panel now is also
sensible to changes in the system font.
New user configuration directory environment variable
-----------------------------------------------------
In previous versions, the GNUstep directory used to store a user's Window Maker
configuration files was specified by the GNUSTEP_USER_ROOT environment variable,
which defaulted to ~/GNUstep. However, this environment variable was deprecated
in gnustep-make v2. Therefore, it has been replaced by the WMAKER_USER_ROOT
environment variable.
libXmu is now an optional dependency
------------------------------------
If the library is not found, compilation work, the only limitation will arise
when trying to install the standard colormap on displays which are not TrueColor.
Please note that if you have the library but not the headers, configure will
still stop; there is no user option to explicitly disable the library use.
-- 0.95.8
Move pointer with maximized windows
-----------------------------------
Implementation for moving mouse pointer within the maximized window.
Mouse pointer can be now moved together with window if keyboard was used for
arrange maximized windows on screen. This feature can be turned on in WPrefs.app
in Expert tab by selecting "Move mouse pointer with half maximized windows.", or
setting "PointerWithHalfMaxWindows" to "Yes" on ~/GNUstep/Defaults/WindowMaker
file.
Alternative way for traverse half-maximized windows
---------------------------------------------------
For now, there could be three possible states of the window while using
the half-maximized feature. Unmaximized windows have their state saved during
that process, which is used to unmaximize them. For example, if there is a
window that is maximized on the left half of the screen, and while requesting
left-half-maximize it becomes unmaximized with its size and dimensions
restored to the original state.
By setting "AlternativeHalfMaximized" option to "Yes"
~/GNUstep/Defaults/WindowMaker config file (or by using WPrefs.app and option
"Alternative transitions between states for half maximized windows."), there
would be slightly different change in window "traverse". Given layout depicted
below:
┌┬────────────────────┬┐
├┘ ┌───────┐ ├┤
│ ├───────┤ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ └───────┘ └┤
├┬┐ │
└┴┴────────────────────┘
Window can be moved using keyboard shortcut right-half-maximize:
┌┬─────────┬──────────┬┐
├┘ ├──────────┼┤
│ │ ├┤
│ │ ├┤
│ │ ├┤
│ │ ├┤
├┬┐ └──────────┘│
└┴┴────────────────────┘
Further invoking right-half-maximize will do nothing. Note, that the window always
can be unmaximized using an appropriate keyboard shortcut or by selecting
"Unmaximize" from the window menu.
Going to opposite direction by invoking left-half-maximize, will make the window
maximized in both, vertical and horizontal directions:
┌─────────────────────┬┐
├─────────────────────┼┤
│ ├┤
│ ├┤
│ ├┤
│ ├┤
├┬┬───────────────────┘│
└┴┴────────────────────┘
Further invoking left-half-maximize, will make the window maximized in half left
side od the screen:
┌──────────┬──────────┬┐
├──────────┤ ├┤
│ │ ├┤
│ │ ├┤
│ │ ├┤
│ │ └┤
├┬┬────────┘ │
└┴┴────────────────────┘
And again, further invoking left-half-maximize, will do nothing in this mode.
This change affects all possible half-maximized window state also quarters.
Issuing bottom-left-corner will take lower left quarter of the screen (nothing
is new so far):
┌┬────────────────────┬┐
├┘ ├┤
│ ├┤
├──────────┐ ├┤
├──────────┤ ├┤
│ │ └┤
├┬┬────────┘ │
└┴┴────────────────────┘
Issuing bottom-right-corner again will change window state to bottom half
maximized:
┌┬────────────────────┬┐
├┘ ├┤
│ ├┤
├─────────────────────┼┤
├─────────────────────┼┤
│ ├┤
├┬┬───────────────────┘│
└┴┴────────────────────┘
Invoking bottom-right-corner again:
┌┬────────────────────┬┐
├┘ ├┤
│ ├┤
│ ┌──────────┼┤
│ ├──────────┼┤
│ │ ├┤
├┬┐ └──────────┘│
└┴┴────────────────────┘
Issuing bottom-right-corner again will have no effect.
Move half-maximized windows between the screens
-----------------------------------------------
New option was introduced to allow change of behaviour of half-maximize windows
in multiple displays environment. In such environment it is more natural that
half maximized windows would travel from one screen to another. Now it is
possible to make that happen by setting an option
"MoveHalfMaximizedWindowsBetweenScreens" to "Yes" in
~/GNUstep/Defaults/WindowMaker config file, or by checking "Allow move
half-maximized windows between multiple screens." in 'Expert User Preferences"
tab in WPrefs.app.
For example, given there are two screens in layout where one display is on the
left and second display is on the right with window on first screen:
┌┬────────────────┬─────────────────┬┐
├┘ ┌───────┐ │ ├┤
│ ├───────┤ │ ├┤
│ │ │ │ ├┤
│ │ │ │ ├┤
│ └───────┘ │ └┤
├┬┐ ├┬┬┐ │
└┴┴───────────────┴┴┴┴───────────────┘
It can be right-half-maximized (using the previously defined key combination), so it
becomes:
┌┬───────┬────────┬─────────────────┬┐
├┘ ├────────┤ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ └┤
├┬┐ └────────┼┬┬┐ │
└┴┴───────────────┴┴┴┴───────────────┘
In this example there is an assumption that WindowMaker is configured, that
maximized windows won't cover mini icons nor the dock.
Without setting new option to true, issuing another right-half-maximize will
restore window dimensions and position to the original state (like on the first
figure). With new option set to true it will move window to second screen like:
┌┬────────────────┬────────┬────────┬┐
├┘ ├────────┤ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ └┤
├┬┐ ├┬┬┬─────┘ │
└┴┴───────────────┴┴┴┴───────────────┘
Another activation of right-half-maximize:
┌┬────────────────┬────────┬────────┬┐
├┘ │ ├────────┼┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ │ │ ├┤
├┬┐ ├┬┬┐ └────────┘│
└┴┴───────────────┴┴┴┴───────────────┘
And final activation of right-half-maximize:
┌┬────────────────┬───────┬─────────┬┐
├┘ ├───────┤ ├┤
│ │ │ ├┤
│ │ │ ├┤
│ ├───────┘ ├┤
│ │ └┤
├┬┐ ├┬┬┐ │
└┴┴───────────────┴┴┴┴───────────────┘
Where the window is restored to its size (but not position, since it is on a different
head now). Moving a window in directions like left-half-maximize,
top-half-maximize and bottom-half-maximize will behave in similar way depending
on the layout of displays.
Note, that only windows that are half-maximized vertically or horizontally can
be moved to another screen due to the fact, that direction of movement of
quarter-maximized windows is ambiguous. As for vertical/horizontal-maximize,
since doesn't move the window but only stretch it vertically/horizontally this
feature also doesn't apply.
Snapping a window to the top
----------------------------
You can now choose whether snapping a window to the top edge of the screen
maximizes it to the top half (the previous and default behavior) or to the
full screen by setting "SnapToTopMaximizesFullscreen" to "NO" or "YES",
respectively. This setting can also be changed by unchecking or checking
"Snapping a window to the top maximizes it to the full screen" in the
"Expert User Preferences" tab in WPrefs.app.
Global defaults directory configuration
---------------------------------------
You can now configure the global defaults directory, where the system
WindowMaker, WMRootMenu, etc. files are stored, by running
./configure --with-defsdatadir=/path/to/defaults
at build time. The previous method, which only partially worked, involved
defining the GLOBAL_DEFAULTS_SUBDIR macro. This is no longer available.
Note that the default location is ${sysconfdir}/WindowMaker.
-- 0.95.7 -- 0.95.7
Window snapping Window snapping
@@ -43,12 +525,12 @@ There are four choices:
geometry is restored. geometry is restored.
* "Unmaximize" ("...consider the window unmaximized") causes a maximized window * "Unmaximize" ("...consider the window unmaximized") causes a maximized window
to be moved when dragged and remains partially maximized, i.e., it keeps its to be moved when dragged and remains partially maximized, i.e., it keeps its
maximized geometry, but is consider to be unmaximized. In particular, it can maximized geometry, but is considered to be unmaximized. In particular, it can
be immediately re-maximized. be immediately re-maximized.
* "NoMove" ("...do not move the window") prevents a maximized window from being * "NoMove" ("...do not move the window") prevents a maximized window from being
moved when dragged. moved when dragged.
Note that, to accomodate this option in the "Window Handling Preferences" tab in Note that, to accommodate this option in the "Window Handling Preferences" tab in
WPrefs.app, the option to "Open dialogs in the same workspace as their owners" WPrefs.app, the option to "Open dialogs in the same workspace as their owners"
(which sets the "OpenTransientOnOwnerWorkspace" option from (which sets the "OpenTransientOnOwnerWorkspace" option from
~/GNUstep/Defaults/WindowMaker) has been moved to "Expert User Preferences". ~/GNUstep/Defaults/WindowMaker) has been moved to "Expert User Preferences".
@@ -848,7 +1330,7 @@ Others
- added DONT_SCALE_ICONS compile time option - added DONT_SCALE_ICONS compile time option
- added --dont-restore cmd line option. When passed to wmaker, it - added --dont-restore cmd line option. When passed to wmaker, it
wont restore the state saved previously. won't restore the state saved previously.
--- 0.61.1 --- 0.61.1
@@ -1388,10 +1870,10 @@ Clip icons when the mouse pointer enter/leave the Clip. To avoid unwanted
raising/lowering there is a time threshold before raising/lowering. raising/lowering there is a time threshold before raising/lowering.
The thresholds can be changed in wconfig.h by changing one or both of The thresholds can be changed in wconfig.h by changing one or both of
AUTO_LOWER_DELAY and AUTO_RAISE_DELAY (expressed in milliseconds). AUTO_LOWER_DELAY and AUTO_RAISE_DELAY (expressed in milliseconds).
For example if you set AUTO_RAISE_DELAY to 0, then the Clip will be raised as For example, if you set AUTO_RAISE_DELAY to 0, then the Clip will be raised as
soon as the mouse pointer enters it's area. Setting AUTO_RAISE_DELAY to a very soon as the mouse pointer enters its area. Setting AUTO_RAISE_DELAY to a very
big value, will make the Clip to practically do not auto raise unless clicked, big value will make the Clip practically not auto-raise unless clicked,
but to be automatically lowered after AUTO_LOWER_DELAY (ms) when leaved. but it will still be automatically lowered after AUTO_LOWER_DELAY (ms) when left.
New ThemePack Format New ThemePack Format
@@ -2158,7 +2640,7 @@ applets of that kind, because the icon window do not belongs to WindowMaker,
but to the application itself. For such icons you must keep the mouse over the but to the application itself. For such icons you must keep the mouse over the
icon groundplate, else it will collapse back. But usually these type of icons icon groundplate, else it will collapse back. But usually these type of icons
will not stay in a collapsed clip, since one needs to see what they show. will not stay in a collapsed clip, since one needs to see what they show.
When the clip is leaved it will collapse back after a delay of 1 second, unless When the clip is left it will collapse back after a delay of 1 second, unless
the mouse is moved back to the clip area. The delay can be set modifying the mouse is moved back to the clip area. The delay can be set modifying
AUTO_COLLAPSE_DELAY in wconfig.h. Default is 1000 (ms) which means 1 second. AUTO_COLLAPSE_DELAY in wconfig.h. Default is 1000 (ms) which means 1 second.
@@ -2318,7 +2800,7 @@ The OPEN_MENU command now supports the following syntax:
// it in current position // it in current position
OPEN_MENU file.menu OPEN_MENU file.menu
2. Pipe menu handling. 2. Pipe menu handling.
// opens command and uses it's stdout to construct menu. // opens command and uses its stdout to construct menu.
// Command's output must be a valid menu description. // Command's output must be a valid menu description.
OPEN_MENU | command OPEN_MENU | command
3. Directory handling. 3. Directory handling.
@@ -2495,8 +2977,8 @@ When the step to move becomes smaller than IconSlideStep, IconSlideStep will
be used further until the destination is reached. be used further until the destination is reached.
This way a nice deceleration effect is achieved, since while the icon This way a nice deceleration effect is achieved, since while the icon
approaches destination, it will use smaller steps, gibing the illusion that approaches the destination, it will use smaller steps, giving the illusion that
the icons is moving slower. the icons are moving slower.
IconSlideDelay will give the pause between steps, and is expressed in ms. IconSlideDelay will give the pause between steps, and is expressed in ms.
@@ -2921,7 +3403,7 @@ when they are first mapped
titlebar gradients are in a single piece now titlebar gradients are in a single piece now
the WMDock file was merged into the WMState file. You can insert this the WMDock file was merged into the WMState file. You can insert this
file in WMState and set it's key to Dock. For example, if your WMDock file in WMState and set its key to Dock. For example, if your WMDock
contains: contains:
{ {
+10 -10
View File
@@ -129,8 +129,8 @@ HELP ME!!!
========== ==========
There is a mailing list for discussing Window Maker at There is a mailing list for discussing Window Maker at
wmaker-user@lists.windowmaker.org To subscribe to it, send a message to wmaker-user@googlegroups.com. To subscribe to it, visit
wmaker-user-subscribe@lists.windowmaker.org https://groups.google.com/forum/#!forum/wmaker-user
If you got a problem, ask there (after reading the docs, of course). The people If you got a problem, ask there (after reading the docs, of course). The people
there is more likely to be able to answer your questions than we are. For bug there is more likely to be able to answer your questions than we are. For bug
@@ -178,7 +178,7 @@ Running multiple instances of Window Maker
It is not a good idea to run more than one instance of Window Maker It is not a good idea to run more than one instance of Window Maker
from the same user (so that wmaker will use the same configuration files) at the from the same user (so that wmaker will use the same configuration files) at the
same time. You might get unexpected behavior when Window Maker updates it's same time. You might get unexpected behavior when Window Maker updates its
configuration files. configuration files.
If you really desire to do this, try running Window Maker with the command line If you really desire to do this, try running Window Maker with the command line
@@ -190,7 +190,7 @@ Performance Tuning
================== ==================
If you want to diminish Window Maker's memory usage and improve performance, If you want to diminish Window Maker's memory usage and improve performance,
while keeping a nice appearance and good functionality, follow the items bellow: while keeping a nice appearance and good functionality, follow the items below:
- use solid textures for everything, mainly title bars and menus. If you want a - use solid textures for everything, mainly title bars and menus. If you want a
nice looking desktop, use the Traditional style. nice looking desktop, use the Traditional style.
@@ -209,7 +209,7 @@ while keeping a nice appearance and good functionality, follow the items bellow:
- remove support for image formats you don't use - remove support for image formats you don't use
- to reduce memory usage, disable the icon cache, by setting the RIMAGE_CACHE - to reduce memory usage, disable the icon cache, by setting the RIMAGE_CACHE
environment variable to 0. If you want to increase performance at the cost of environment variable to 0. If you want to increase performance at the cost of
memory usage, set it's value to a value like the number of different icons you memory usage, set its value to a value like the number of different icons you
use. Also, disable anti-aliased text support in ~/GNUstep/Defaults/WMGLOBAL. use. Also, disable anti-aliased text support in ~/GNUstep/Defaults/WMGLOBAL.
@@ -240,7 +240,7 @@ pointer faster;
clicked with the 0 (Ins) key. clicked with the 0 (Ins) key.
The above key values work in a XFree86 3.2 (X11R6.1) X server but your The above key values work on an XFree86 3.2 (X11R6.1) X server, but your
mileage may vary. mileage may vary.
@@ -252,7 +252,7 @@ that crashes Window Maker, please send a backtrace with your bug report.
To make a useful backtrace, you need a core file with debugging information To make a useful backtrace, you need a core file with debugging information
produced by Window Maker when it crashes. It should have been installed without produced by Window Maker when it crashes. It should have been installed without
stripping too. being stripped.
To compile wmaker with debugging information: To compile wmaker with debugging information:
@@ -287,7 +287,7 @@ The icons listed in COPYING.WTFPL and are distributed in this program and were
made by Banlu Kemiyatorn (]d), are licensed through the "do What The Fuck you made by Banlu Kemiyatorn (]d), are licensed through the "do What The Fuck you
want to Public License". Read the COPYING.WTFPL file for the complete license. want to Public License". Read the COPYING.WTFPL file for the complete license.
NeXT, OpenStep and NEXTSTEP are a trademarks of NeXT Computer, Inc. All other NeXT, OpenStep and NEXTSTEP are trademarks of NeXT Computer, Inc. All other
trademarks are property of their respective owners. trademarks are property of their respective owners.
The authors reserve the right to make changes in the software without prior The authors reserve the right to make changes in the software without prior
@@ -307,9 +307,9 @@ screenshots.
The AUTHORS file contains a list of the people who have contributed to the The AUTHORS file contains a list of the people who have contributed to the
project. The name of people who have helped with localization (translation) can project. The names of people who have helped with localization (translation) can
be found in po/README and Window Maker/README be found in po/README and Window Maker/README
If you have any comments, fixes and bug reports (filled BUGFORMs) send them If you have any comments, fixes and bug reports (filled BUGFORMs) send them
to wmaker-dev@lists.windowmaker.org to wmaker-dev@googlegroups.com
+2 -2
View File
@@ -134,7 +134,7 @@ Sending the patch to the mailing list
Send your patches to: Send your patches to:
wmaker-dev@lists.windowmaker.org wmaker-dev@googlegroups.com
Please do not send patches to any individual developer unless you have a very Please do not send patches to any individual developer unless you have a very
good reason to avoid more people being able to comment (and improve) on your good reason to avoid more people being able to comment (and improve) on your
@@ -147,7 +147,7 @@ you, otherwise you may face the problems below. Doing this is really easy:
# (of course, replace smtp.example.com with your ISP's) # (of course, replace smtp.example.com with your ISP's)
git config --global sendemail.smtpserver "smtp.example.com" git config --global sendemail.smtpserver "smtp.example.com"
git config --global sendemail.validate true git config --global sendemail.validate true
git config sendemail.to "Window Maker Devel <wmaker-dev@lists.windowmaker.org>" git config sendemail.to "Window Maker Devel <wmaker-dev@googlegroups.com>"
# If you're sending more than 1 patch, you may be interested in having an # If you're sending more than 1 patch, you may be interested in having an
# introduction mail for the batch: # introduction mail for the batch:
+7 -1
View File
@@ -1,3 +1,9 @@
Changes since wmaker 0.96.0:
............................
- added W_KeycodeToKeysym to replace XKeycodeToKeysym/XkbKeycodeToKeysym calls
Changes since wmaker 0.92.0: Changes since wmaker 0.92.0:
............................ ............................
@@ -134,7 +140,7 @@ Changes since wmaker 0.64.0:
- Moved all internal handlers (timer, idle and input) to handlers.c - Moved all internal handlers (timer, idle and input) to handlers.c
- simplified wevent.c and wutil.c. - simplified wevent.c and wutil.c.
- fixed handling of input with poll (was broken) - fixed handling of input with poll (was broken)
- fixed mem leak that occured when input handling was done with poll - fixed mem leak that occurred when input handling was done with poll
- simpler and more straightforward event handling for timer, idle, input - simpler and more straightforward event handling for timer, idle, input
and X events (also fixed some problems the old handling logic had) and X events (also fixed some problems the old handling logic had)
- moved timer, idle and input handler definitions and prototypes from - moved timer, idle and input handler definitions and prototypes from
+1 -1
View File
@@ -8,7 +8,7 @@ noinst_PROGRAMS = fontl puzzle colorpick
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \ LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/WINGs/libWUtil.la \ $(top_builddir)/WINGs/libWUtil.la \
@XFTLIBS@ @INTLIBS@ @XLIBS@ @XFT_LIBS@ @INTLIBS@ @XLIBS@
colorpick_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la colorpick_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
+3 -2
View File
@@ -24,8 +24,9 @@
#include <WINGs/WINGs.h> #include <WINGs/WINGs.h>
#include <WINGs/WUtil.h> #include <WINGs/WUtil.h>
#include <inttypes.h> #include <inttypes.h>
#include <stdnoreturn.h>
void wAbort() noreturn void wAbort(void)
{ {
exit(0); exit(0);
} }
@@ -40,7 +41,7 @@ void show(WMWidget * self, void *data)
WMSetLabelText(l, buf); WMSetLabelText(l, buf);
} }
void quit(WMWidget * self, void *data) noreturn void quit(WMWidget * self, void *data)
{ {
(void) self; (void) self;
(void) data; (void) data;
+3 -3
View File
@@ -10,7 +10,7 @@ include_HEADERS = wtableview.h wtabledelegates.h
lib_LTLIBRARIES = libExtraWINGs.la lib_LTLIBRARIES = libExtraWINGs.la
noinst_PROGRAMS = test noinst_PROGRAMS = tableview
EXTRA_DIST = EXTRA_DIST =
@@ -25,6 +25,6 @@ AM_CPPFLAGS = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs \
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \ LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/WINGs/libWUtil.la \ $(top_builddir)/WINGs/libWUtil.la \
@XFTLIBS@ @INTLIBS@ @XFT_LIBS@ @INTLIBS@ @XLIBS@
test_LDADD = wtableview.o wtabledelegates.o $(LDADD) tableview_LDADD = wtableview.o wtabledelegates.o $(LDADD)
@@ -19,13 +19,18 @@ static char *options[] = {
int numberOfRows(WMTableViewDelegate * self, WMTableView * table) int numberOfRows(WMTableViewDelegate * self, WMTableView * table)
{ {
(void) self;
(void) table;
return 20; return 20;
} }
void *valueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row) void *valueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row)
{ {
(void) self;
/*WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column); */ /*WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column); */
int i; int i;
if (col1[0] == 0) { if (col1[0] == 0) {
for (i = 0; i < 20; i++) { for (i = 0; i < 20; i++) {
char buf[128]; char buf[128];
@@ -44,6 +49,8 @@ void *valueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row)
void setValueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row, void *data) void setValueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row, void *data)
{ {
(void) self;
if ((uintptr_t)WMGetTableColumnId(column) == 1) if ((uintptr_t)WMGetTableColumnId(column) == 1)
col1[row] = data; col1[row] = data;
else else
@@ -59,6 +66,7 @@ static WMTableViewDelegate delegate = {
void clickedTable(WMWidget * w, void *self) void clickedTable(WMWidget * w, void *self)
{ {
(void) w;
int row = WMGetTableViewClickedRow((WMTableView *) self); int row = WMGetTableViewClickedRow((WMTableView *) self);
WMEditTableViewRow(self, row); WMEditTableViewRow(self, row);
+14 -8
View File
@@ -2,6 +2,8 @@
#include <WINGs/WINGsP.h> #include <WINGs/WINGsP.h>
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
#include <stdint.h> #include <stdint.h>
#include <math.h>
#include <float.h>
#include "wtableview.h" #include "wtableview.h"
@@ -274,7 +276,7 @@ static void adjustScrollers(WMTableView * table)
prop = 1.0; prop = 1.0;
} else { } else {
oprop = WMGetScrollerKnobProportion(table->hscroll); oprop = WMGetScrollerKnobProportion(table->hscroll);
if (oprop == 0.0) if (fabs(oprop) <= DBL_EPSILON)
oprop = 1.0; oprop = 1.0;
ovalue = WMGetScrollerValue(table->hscroll); ovalue = WMGetScrollerValue(table->hscroll);
@@ -290,7 +292,7 @@ static void adjustScrollers(WMTableView * table)
prop = 1.0; prop = 1.0;
} else { } else {
oprop = WMGetScrollerKnobProportion(table->vscroll); oprop = WMGetScrollerKnobProportion(table->vscroll);
if (oprop == 0.0) if (fabs(oprop) <= DBL_EPSILON)
oprop = 1.0; oprop = 1.0;
ovalue = WMGetScrollerValue(table->vscroll); ovalue = WMGetScrollerValue(table->vscroll);
@@ -332,7 +334,7 @@ static void doScroll(WMWidget * self, void *data)
case WSIncrementWheel: case WSIncrementWheel:
case WSIncrementLine: case WSIncrementLine:
value += (float)table->rowHeight / size; value += (float)table->rowHeight / size;
if (value > 1.0) if (value > (float)1.0)
value = 1.0; value = 1.0;
WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self));
repaintTable(table); repaintTable(table);
@@ -344,7 +346,7 @@ static void doScroll(WMWidget * self, void *data)
case WSDecrementPage: case WSDecrementPage:
value -= vpsize / size; value -= vpsize / size;
if (value < 0.0) if (value < (float)0.0)
value = 0.0; value = 0.0;
WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self));
repaintTable(table); repaintTable(table);
@@ -352,7 +354,7 @@ static void doScroll(WMWidget * self, void *data)
case WSIncrementPage: case WSIncrementPage:
value += vpsize / size; value += vpsize / size;
if (value > 1.0) if (value > (float)1.0)
value = 1.0; value = 1.0;
WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self));
repaintTable(table); repaintTable(table);
@@ -398,6 +400,7 @@ static void doScroll(WMWidget * self, void *data)
static void splitterHandler(XEvent * event, void *data) static void splitterHandler(XEvent * event, void *data)
{ {
(void) event;
WMTableColumn *column = (WMTableColumn *) data; WMTableColumn *column = (WMTableColumn *) data;
WMTableView *table = column->table; WMTableView *table = column->table;
int done = 0; int done = 0;
@@ -451,6 +454,8 @@ static void splitterHandler(XEvent * event, void *data)
static void realizeTable(void *data, WMNotification * notif) static void realizeTable(void *data, WMNotification * notif)
{ {
(void) notif;
repaintTable(data); repaintTable(data);
} }
@@ -790,7 +795,6 @@ void WMSetTableViewRowHeight(WMTableView * table, int height)
void WMScrollTableViewRowToVisible(WMTableView * table, int row) void WMScrollTableViewRowToVisible(WMTableView * table, int row)
{ {
WMScroller *scroller;
WMRange range; WMRange range;
WMRect rect; WMRect rect;
int newY, tmp; int newY, tmp;
@@ -798,7 +802,6 @@ void WMScrollTableViewRowToVisible(WMTableView * table, int row)
rect = getVisibleRect(table); rect = getVisibleRect(table);
range = rowsInRect(table, rect); range = rowsInRect(table, rect);
scroller = table->vscroll;
if (row < range.position) { if (row < range.position) {
newY = row * table->rowHeight - rect.size.height / 2; newY = row * table->rowHeight - rect.size.height / 2;
@@ -1157,6 +1160,8 @@ static void handleEvents(XEvent * event, void *data)
static void handleResize(W_ViewDelegate * self, WMView * view) static void handleResize(W_ViewDelegate * self, WMView * view)
{ {
(void) self;
reorganizeInterior(view->self); reorganizeInterior(view->self);
} }
@@ -1167,7 +1172,8 @@ static void reorganizeInterior(WMTableView * table)
WMSize size = getTotalSize(table); WMSize size = getTotalSize(table);
WMView *view = table->view; WMView *view = table->view;
int vw, vh; int vw, vh;
int hsThickness, vsThickness; int hsThickness = 0;
int vsThickness = 0;
if (table->vscroll) if (table->vscroll)
vsThickness = WMWidgetWidth(table->vscroll); vsThickness = WMWidgetWidth(table->vscroll);
+7 -8
View File
@@ -8,13 +8,11 @@ DIST_SUBDIRS = $(SUBDIRS) Tests Examples Extras
libWINGs_la_LDFLAGS = -version-info @WINGS_VERSION@ libWINGs_la_LDFLAGS = -version-info @WINGS_VERSION@
libWUtil_la_LDFLAGS = -version-info @WUTIL_VERSION@ libWUtil_la_LDFLAGS = -version-info @WUTIL_VERSION@
dist_bin_SCRIPTS = get-wings-flags get-wutil-flags
lib_LTLIBRARIES = libWUtil.la libWINGs.la lib_LTLIBRARIES = libWUtil.la libWINGs.la
LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@ LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@
libWINGs_la_LIBADD = libWUtil.la $(top_builddir)/wrlib/libwraster.la @XLIBS@ @XFTLIBS@ @FCLIBS@ @LIBM@ @PANGOLIBS@ libWINGs_la_LIBADD = libWUtil.la $(top_builddir)/wrlib/libwraster.la @XLIBS@ @XFT_LIBS@ @FCLIBS@ @LIBM@ @PANGO_LIBS@
libWUtil_la_LIBADD = @LIBBSD@ libWUtil_la_LIBADD = @LIBBSD@
EXTRA_DIST = BUGS make-rgb Examples Extras Tests EXTRA_DIST = BUGS make-rgb Examples Extras Tests
@@ -89,11 +87,12 @@ libWUtil_la_SOURCES = \
wutil.c wutil.c
AM_CFLAGS = AM_CFLAGS = @PANGO_CFLAGS@
AM_CPPFLAGS = -DRESOURCE_PATH=\"$(datadir)/WINGs\" \ AM_CPPFLAGS = -DRESOURCE_PATH=\"$(datadir)/WINGs\" \
-I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \ -I$(top_srcdir)/WINGs/WINGs -I$(top_builddir)/WINGs/WINGs \
@XFTFLAGS@ @HEADER_SEARCH_PATH@ -I$(top_builddir)/wrlib -I$(top_srcdir)/src \
@XFT_CFLAGS@ @HEADER_SEARCH_PATH@
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = WINGs.pc WUtil.pc pkgconfig_DATA = WINGs.pc WUtil.pc
@@ -107,8 +106,8 @@ WINGs.pc: Makefile
@echo 'Version: $(VERSION)' >> $@ @echo 'Version: $(VERSION)' >> $@
@echo 'Requires: wrlib WUtil' >> $@ @echo 'Requires: wrlib WUtil' >> $@
@echo 'Libs: $(lib_search_path) -lWINGs' >> $@ @echo 'Libs: $(lib_search_path) -lWINGs' >> $@
@echo 'Libs.private: $(XFTLIBS) $(PANGOLIBS) $(XLIBS) -lm $(INTLIBS)' >> $@ @echo 'Libs.private: $(XFT_LIBS) $(PANGOLIBS) $(XLIBS) -lm $(INTLIBS)' >> $@
@echo 'Cflags: $(inc_search_path)' >> $@ @echo 'Cflags: $(inc_search_path) @PANGO_CFLAGS@' >> $@
WUtil.pc: Makefile WUtil.pc: Makefile
@echo "Generating $@" @echo "Generating $@"
+3 -1
View File
@@ -1,7 +1,9 @@
** API and ABI modifications since wmaker 0.92.0 ** API and ABI modifications since wmaker 0.96.0
----------------------------------------------------
** libWINGs ** ** libWINGs **
<WINGsP.h> <WINGsP.h>
W_KeycodeToKeysym ADDED
struct W_DragDestinationInfo: new members added SIZE CHANGE struct W_DragDestinationInfo: new members added SIZE CHANGE
<WINGs.h> <WINGs.h>
+6 -6
View File
@@ -8,25 +8,25 @@
kojima@windowmaker.info kojima@windowmaker.info
WINGs is a small widget set with the N*XTSTEP look and feel. It's API WINGs is a small widget set with the N*XTSTEP look and feel. Its API
is inspired in OpenStep and it's implementation borrows some ideas is inspired in OpenStep and its implementation borrows some ideas
from Tk. It has a reasonable set of widgets, sufficient for building from Tk. It has a reasonable set of widgets, sufficient for building
small applications (like a CDPlayer or hacking something like rxvt). It small applications (like a CDPlayer or hacking something like rxvt). It
also has other functions that are usefull for applications, like a also has other functions that are usefull for applications, like a
User Defaults alike configuration manager and a notification system. User Defaults alike configuration manager and a notification system.
The library is limited and it's design is a little sloppy, The library is limited and its design is a little sloppy,
so it's not intended to build large or complex applications, like so it's not intended to build large or complex applications, like
anything more complex than a CDPlayer. GNUstep should be used for such anything more complex than a CDPlayer. GNUstep should be used for such
applications. applications.
Since WINGs is written in C and is sort of low-level it is small Since WINGs is written in C and is sort of low-level it is small
and faster than say, Motif or even Athena. Knowing Xlib will help you to and faster than say, Motif or even Athena. Knowing Xlib will help you to
workaround some of it's limitations, although you'll probably be able to workaround some of its limitations, although you'll probably be able to
write something like a trivial tic-tac-toe game without knowing much Xlib. write something like a trivial tic-tac-toe game without knowing much Xlib.
Some of it's functions are designed to support the Window Maker window Some of its functions are designed to support the Window Maker window
manager (see http://windowmaker.info) In fact, it's primary role is to manager (see http://windowmaker.info) In fact, its primary role is to
support Window Maker. All other uses of it are just an added bonus. support Window Maker. All other uses of it are just an added bonus.
It will help you to understand the API if you read the ApplicationKit It will help you to understand the API if you read the ApplicationKit
+3 -2
View File
@@ -6,7 +6,7 @@ noinst_PROGRAMS = wtest wmquery wmfile testmywidget
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \ LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/WINGs/libWUtil.la \ $(top_builddir)/WINGs/libWUtil.la \
@XFTLIBS@ @INTLIBS@ @XLIBS@ @XFT_LIBS@ @INTLIBS@ @XLIBS@
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
@@ -17,4 +17,5 @@ wtest_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
EXTRA_DIST = logo.xpm upbtn.xpm wm.html wm.png EXTRA_DIST = logo.xpm upbtn.xpm wm.html wm.png
AM_CPPFLAGS = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \ AM_CPPFLAGS = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFTFLAGS@ @HEADER_SEARCH_PATH@ -DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFT_CFLAGS@ @HEADER_SEARCH_PATH@ \
@PANGO_CFLAGS@
+1
View File
@@ -64,6 +64,7 @@ static W_Class myWidgetClass = 0;
*/ */
W_Class InitMyWidget(WMScreen * scr) W_Class InitMyWidget(WMScreen * scr)
{ {
(void)scr;
/* register our widget with WINGs and get our widget class ID */ /* register our widget with WINGs and get our widget class ID */
if (!myWidgetClass) { if (!myWidgetClass) {
myWidgetClass = W_RegisterUserWidget(); myWidgetClass = W_RegisterUserWidget();
+1 -1
View File
@@ -4,7 +4,7 @@
#include "mywidget.h" #include "mywidget.h"
void wAbort() _Noreturn void wAbort(void)
{ {
exit(1); exit(1);
} }
+4 -7
View File
@@ -19,14 +19,14 @@
#include "logo.xpm" #include "logo.xpm"
void wAbort() _Noreturn void wAbort(void)
{ {
exit(1); exit(1);
} }
char *ProgName; char *ProgName;
void usage(void) _Noreturn void usage(void)
{ {
fprintf(stderr, fprintf(stderr,
"usage:\n" "usage:\n"
@@ -53,13 +53,10 @@ int main(int argc, char **argv)
WMPixmap *pixmap; WMPixmap *pixmap;
WMOpenPanel *oPanel; WMOpenPanel *oPanel;
WMSavePanel *sPanel; WMSavePanel *sPanel;
/* RImage *image; */
char *title = NULL; char *title = NULL;
char *initial = "/"; char *initial = "/";
int ch; int ch;
int panelType = OPEN_PANEL_TYPE; int panelType = OPEN_PANEL_TYPE;
extern char *optarg;
extern int optind;
if (!dpy) { if (!dpy) {
puts("could not open display"); puts("could not open display");
@@ -96,14 +93,14 @@ int main(int argc, char **argv)
if (panelType == SAVE_PANEL_TYPE) { if (panelType == SAVE_PANEL_TYPE) {
sPanel = WMGetSavePanel(scr); sPanel = WMGetSavePanel(scr);
if (WMRunModalFilePanelForDirectory(sPanel, NULL, initial, if (WMRunModalFilePanelForDirectory(sPanel, NULL, initial,
/*title */ NULL, NULL) == True) title, NULL) == True)
printf("%s\n", WMGetFilePanelFileName(sPanel)); printf("%s\n", WMGetFilePanelFileName(sPanel));
else else
printf("\n"); printf("\n");
} else { } else {
oPanel = WMGetOpenPanel(scr); oPanel = WMGetOpenPanel(scr);
if (WMRunModalFilePanelForDirectory(oPanel, NULL, initial, if (WMRunModalFilePanelForDirectory(oPanel, NULL, initial,
/*title */ NULL, NULL) == True) title, NULL) == True)
printf("%s\n", WMGetFilePanelFileName(oPanel)); printf("%s\n", WMGetFilePanelFileName(oPanel));
else else
printf("\n"); printf("\n");
+3 -5
View File
@@ -11,14 +11,14 @@
#include "logo.xpm" #include "logo.xpm"
void wAbort() _Noreturn void wAbort(void)
{ {
exit(1); exit(1);
} }
char *ProgName; char *ProgName;
void usage(void) _Noreturn void usage(void)
{ {
fprintf(stderr, fprintf(stderr,
"usage:\n" "usage:\n"
@@ -45,8 +45,6 @@ int main(int argc, char **argv)
char *initial = NULL; char *initial = NULL;
char *result = NULL; char *result = NULL;
int ch; int ch;
extern char *optarg;
extern int optind;
WMInitializeApplication("WMQuery", &argc, argv); WMInitializeApplication("WMQuery", &argc, argv);
+19 -3
View File
@@ -14,7 +14,7 @@
* This will be called when the application will be terminated because * This will be called when the application will be terminated because
* of a fatal error (only for memory allocation failures ATM). * of a fatal error (only for memory allocation failures ATM).
*/ */
void wAbort() _Noreturn void wAbort(void)
{ {
exit(1); exit(1);
} }
@@ -25,6 +25,7 @@ int windowCount = 0;
void closeAction(WMWidget * self, void *data) void closeAction(WMWidget * self, void *data)
{ {
(void)data;
WMDestroyWidget(self); WMDestroyWidget(self);
windowCount--; windowCount--;
printf("window closed, window count = %d\n", windowCount); printf("window closed, window count = %d\n", windowCount);
@@ -165,10 +166,13 @@ void testBox(WMScreen * scr)
static void singleClick(WMWidget * self, void *data) static void singleClick(WMWidget * self, void *data)
{ {
(void)self;
(void)data;
} }
static void doubleClick(WMWidget * self, void *data) static void doubleClick(WMWidget * self, void *data)
{ {
(void)data;
WMSelectAllListItems((WMList *) self); WMSelectAllListItems((WMList *) self);
} }
@@ -480,6 +484,7 @@ void testColorPanel(WMScreen * scr)
void sliderCallback(WMWidget * w, void *data) void sliderCallback(WMWidget * w, void *data)
{ {
(void)data;
printf("SLIDER == %i\n", WMGetSliderValue(w)); printf("SLIDER == %i\n", WMGetSliderValue(w));
} }
@@ -516,7 +521,7 @@ void testSlider(WMScreen * scr)
void testTextField(WMScreen * scr) void testTextField(WMScreen * scr)
{ {
WMWindow *win; WMWindow *win;
WMTextField *field, *field2; WMTextField *field, *field2, *field3;
windowCount++; windowCount++;
@@ -535,6 +540,11 @@ void testTextField(WMScreen * scr)
WMMoveWidget(field2, 20, 50); WMMoveWidget(field2, 20, 50);
WMSetTextFieldAlignment(field2, WARight); WMSetTextFieldAlignment(field2, WARight);
field3 = WMCreateTextField(win);
WMResizeWidget(field3, 200, 20);
WMMoveWidget(field3, 20, 80);
WMSetTextFieldAlignment(field3, WACenter);
WMRealizeWidget(win); WMRealizeWidget(win);
WMMapSubwidgets(win); WMMapSubwidgets(win);
WMMapWidget(win); WMMapWidget(win);
@@ -749,6 +759,8 @@ void testTabView(WMScreen * scr)
void splitViewConstrainProc(WMSplitView * sPtr, int indView, int *minSize, int *maxSize) void splitViewConstrainProc(WMSplitView * sPtr, int indView, int *minSize, int *maxSize)
{ {
(void)sPtr;
switch (indView) { switch (indView) {
case 0: case 0:
*minSize = 20; *minSize = 20;
@@ -782,6 +794,7 @@ static void resizeSplitView(XEvent * event, void *data)
void appendSubviewButtonAction(WMWidget * self, void *data) void appendSubviewButtonAction(WMWidget * self, void *data)
{ {
(void)self;
WMSplitView *sPtr = (WMSplitView *) data; WMSplitView *sPtr = (WMSplitView *) data;
char buf[64]; char buf[64];
WMLabel *label = WMCreateLabel(sPtr); WMLabel *label = WMCreateLabel(sPtr);
@@ -796,6 +809,7 @@ void appendSubviewButtonAction(WMWidget * self, void *data)
void removeSubviewButtonAction(WMWidget * self, void *data) void removeSubviewButtonAction(WMWidget * self, void *data)
{ {
(void)self;
WMSplitView *sPtr = (WMSplitView *) data; WMSplitView *sPtr = (WMSplitView *) data;
int count = WMGetSplitViewSubviewsCount(sPtr); int count = WMGetSplitViewSubviewsCount(sPtr);
@@ -808,12 +822,14 @@ void removeSubviewButtonAction(WMWidget * self, void *data)
void orientationButtonAction(WMWidget * self, void *data) void orientationButtonAction(WMWidget * self, void *data)
{ {
(void)self;
WMSplitView *sPtr = (WMSplitView *) data; WMSplitView *sPtr = (WMSplitView *) data;
WMSetSplitViewVertical(sPtr, !WMGetSplitViewVertical(sPtr)); WMSetSplitViewVertical(sPtr, !WMGetSplitViewVertical(sPtr));
} }
void adjustSubviewsButtonAction(WMWidget * self, void *data) void adjustSubviewsButtonAction(WMWidget * self, void *data)
{ {
(void)self;
WMAdjustSplitViewSubviews((WMSplitView *) data); WMAdjustSplitViewSubviews((WMSplitView *) data);
} }
@@ -902,7 +918,7 @@ void testSplitView(WMScreen * scr)
WMMapWidget(win); WMMapWidget(win);
} }
void testUD() void testUD(void)
{ {
WMUserDefaults *defs; WMUserDefaults *defs;
char str[32]; char str[32];
+11 -1
View File
@@ -5,4 +5,14 @@ AUTOMAKE_OPTIONS =
# is this a kluge? if so, how should i do it? # is this a kluge? if so, how should i do it?
includedir = @includedir@/WINGs includedir = @includedir@/WINGs
include_HEADERS = WINGs.h WUtil.h WINGsP.h BUILT_SOURCES = WINGsP.h
CLEANFILES = WINGsP.h
include_HEADERS = WINGs.h WUtil.h
nodist_include_HEADERS = WINGsP.h
EXTRA_DIST = WINGsP.h.in
WINGsP.h: WINGsP.h.in $(top_builddir)/config.h
$(AM_V_GEN)$(top_srcdir)/script/replace-ac-keywords.sh \
--header "$(top_builddir)/config.h" \
--filter "USE_PANGO" \
-o $@ $<
+31 -16
View File
@@ -26,7 +26,7 @@
#include <WINGs/WUtil.h> #include <WINGs/WUtil.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#define WINGS_H_VERSION 20150508 #define WINGS_H_VERSION 20230226
#ifdef __cplusplus #ifdef __cplusplus
@@ -736,7 +736,7 @@ Bool WMRequestSelection(WMView *view, Atom selection, Atom target,
void *cdata); void *cdata);
extern char *WMSelectionOwnerDidChangeNotification; extern const char *WMSelectionOwnerDidChangeNotification;
/* ---[ WINGs/dragcommon.c ]---------------------------------------------- */ /* ---[ WINGs/dragcommon.c ]---------------------------------------------- */
@@ -795,6 +795,8 @@ char* WMGetFontName(WMFont *font);
unsigned int WMFontHeight(WMFont *font); unsigned int WMFontHeight(WMFont *font);
void WMGetScaleBaseFromSystemFont(WMScreen *scrPtr, int *alphabetWidth, int *fontHeight);
void WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font); void WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font);
void WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font); void WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font);
@@ -975,11 +977,11 @@ WMPoint WMGetViewScreenPosition(WMView *view);
WMWidget* WMWidgetOfView(WMView *view); WMWidget* WMWidgetOfView(WMView *view);
/* notifications */ /* notifications */
extern char *WMViewSizeDidChangeNotification; extern const char *WMViewSizeDidChangeNotification;
extern char *WMViewFocusDidChangeNotification; extern const char *WMViewFocusDidChangeNotification;
extern char *WMViewRealizedNotification; extern const char *WMViewRealizedNotification;
/* ---[ WINGs/wballoon.c ]------------------------------------------------ */ /* ---[ WINGs/wballoon.c ]------------------------------------------------ */
@@ -1188,9 +1190,9 @@ void WMSetTextFieldDelegate(WMTextField *tPtr, WMTextFieldDelegate *delegate);
WMTextFieldDelegate* WMGetTextFieldDelegate(WMTextField *tPtr); WMTextFieldDelegate* WMGetTextFieldDelegate(WMTextField *tPtr);
extern char *WMTextDidChangeNotification; extern const char *WMTextDidChangeNotification;
extern char *WMTextDidBeginEditingNotification; extern const char *WMTextDidBeginEditingNotification;
extern char *WMTextDidEndEditingNotification; extern const char *WMTextDidEndEditingNotification;
/* ---[ WINGs/wscroller.c ]----------------------------------------------- */ /* ---[ WINGs/wscroller.c ]----------------------------------------------- */
@@ -1210,7 +1212,7 @@ void WMSetScrollerAction(WMScroller *sPtr, WMAction *action, void *clientData);
void WMSetScrollerArrowsPosition(WMScroller *sPtr, void WMSetScrollerArrowsPosition(WMScroller *sPtr,
WMScrollArrowPosition position); WMScrollArrowPosition position);
extern char *WMScrollerDidScrollNotification; extern const char *WMScrollerDidScrollNotification;
/* ---[ WINGs/wlist.c ]--------------------------------------------------- */ /* ---[ WINGs/wlist.c ]--------------------------------------------------- */
@@ -1289,8 +1291,8 @@ Bool WMListAllowsMultipleSelection(WMList *lPtr);
Bool WMListAllowsEmptySelection(WMList *lPtr); Bool WMListAllowsEmptySelection(WMList *lPtr);
extern char *WMListDidScrollNotification; extern const char *WMListDidScrollNotification;
extern char *WMListSelectionDidChangeNotification; extern const char *WMListSelectionDidChangeNotification;
/* ---[ WINGs/wbrowser.c ]------------------------------------------------ */ /* ---[ WINGs/wbrowser.c ]------------------------------------------------ */
@@ -1322,7 +1324,7 @@ void WMSortBrowserColumnWithComparer(WMBrowser *bPtr, int column,
WMCompareDataProc *func); WMCompareDataProc *func);
/* Don't free the returned string. */ /* Don't free the returned string. */
char* WMSetBrowserPath(WMBrowser *bPtr, char *path); const char* WMSetBrowserPath(WMBrowser *bPtr, const char *path);
/* free the returned string */ /* free the returned string */
char* WMGetBrowserPath(WMBrowser *bPtr); char* WMGetBrowserPath(WMBrowser *bPtr);
@@ -1460,6 +1462,10 @@ void WMSetPopUpButtonEnabled(WMPopUpButton *bPtr, Bool flag);
Bool WMGetPopUpButtonEnabled(WMPopUpButton *bPtr); Bool WMGetPopUpButtonEnabled(WMPopUpButton *bPtr);
int WMSelectPopUpButtonPreviousItem(WMPopUpButton *bPtr);
int WMSelectPopUpButtonNextItem(WMPopUpButton *bPtr);
/* ---[ WINGs/wprogressindicator.c ]------------------------------------- */ /* ---[ WINGs/wprogressindicator.c ]------------------------------------- */
WMProgressIndicator* WMCreateProgressIndicator(WMWidget *parent); WMProgressIndicator* WMCreateProgressIndicator(WMWidget *parent);
@@ -1494,7 +1500,7 @@ void WMSetColorPanelPickerMode(WMColorPanel *panel, WMColorPanelMode mode);
void WMSetColorPanelAction(WMColorPanel *panel, WMAction2 *action, void *data); void WMSetColorPanelAction(WMColorPanel *panel, WMAction2 *action, void *data);
extern char *WMColorPanelColorChangedNotification; extern const char *WMColorPanelColorChangedNotification;
/* ---[ WINGs/wcolorwell.c ]---------------------------------------------- */ /* ---[ WINGs/wcolorwell.c ]---------------------------------------------- */
@@ -1507,7 +1513,7 @@ WMColor* WMGetColorWellColor(WMColorWell *cPtr);
void WSetColorWellBordered(WMColorWell *cPtr, Bool flag); void WSetColorWellBordered(WMColorWell *cPtr, Bool flag);
extern char *WMColorWellDidChangeNotification; extern const char *WMColorWellDidChangeNotification;
/* ---[ WINGs/wscrollview.c ]--------------------------------------------- */ /* ---[ WINGs/wscrollview.c ]--------------------------------------------- */
@@ -1527,6 +1533,8 @@ void WMSetScrollViewRelief(WMScrollView *sPtr, WMReliefType type);
WMRect WMGetScrollViewVisibleRect(WMScrollView *sPtr); WMRect WMGetScrollViewVisibleRect(WMScrollView *sPtr);
void WMScrollViewScrollPoint(WMScrollView * sPtr, WMPoint point);
WMScroller* WMGetScrollViewHorizontalScroller(WMScrollView *sPtr); WMScroller* WMGetScrollViewHorizontalScroller(WMScrollView *sPtr);
WMScroller* WMGetScrollViewVerticalScroller(WMScrollView *sPtr); WMScroller* WMGetScrollViewVerticalScroller(WMScrollView *sPtr);
@@ -1839,10 +1847,17 @@ WMAlertPanel* WMCreateAlertPanel(WMScreen *app, WMWindow *owner, const char *tit
const char *msg, const char *defaultButton, const char *msg, const char *defaultButton,
const char *alternateButton, const char *otherButton); const char *alternateButton, const char *otherButton);
WMAlertPanel* WMCreateScaledAlertPanel(WMScreen *app, WMWindow *owner, const char *title,
const char *msg, const char *defaultButton,
const char *alternateButton, const char *otherButton);
WMInputPanel* WMCreateInputPanel(WMScreen *app, WMWindow *owner, const char *title, WMInputPanel* WMCreateInputPanel(WMScreen *app, WMWindow *owner, const char *title,
const char *msg, const char *defaultText, const char *okButton, const char *msg, const char *defaultText, const char *okButton,
const char *cancelButton); const char *cancelButton);
WMInputPanel* WMCreateScaledInputPanel(WMScreen *app, WMWindow *owner, const char *title,
const char *msg, const char *defaultText, const char *okButton,
const char *cancelButton);
WMGenericPanel* WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner, WMGenericPanel* WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner,
const char *title, const char *defaultButton, const char *title, const char *defaultButton,
@@ -1867,7 +1882,7 @@ void WMSetFilePanelCanChooseFiles(WMFilePanel *panel, Bool flag);
void WMSetFilePanelAutoCompletion(WMFilePanel *panel, Bool flag); void WMSetFilePanelAutoCompletion(WMFilePanel *panel, Bool flag);
void WMSetFilePanelDirectory(WMFilePanel *panel, char *path); void WMSetFilePanelDirectory(WMFilePanel *panel, const char *path);
/* you can free the returned string */ /* you can free the returned string */
char* WMGetFilePanelFileName(WMFilePanel *panel); char* WMGetFilePanelFileName(WMFilePanel *panel);
@@ -1875,7 +1890,7 @@ char* WMGetFilePanelFileName(WMFilePanel *panel);
void WMFreeFilePanel(WMFilePanel *panel); void WMFreeFilePanel(WMFilePanel *panel);
int WMRunModalFilePanelForDirectory(WMFilePanel *panel, WMWindow *owner, int WMRunModalFilePanelForDirectory(WMFilePanel *panel, WMWindow *owner,
char *path, const char *name, char **fileTypes); const char *path, const char *name, char **fileTypes);
void WMSetFilePanelAccessoryView(WMFilePanel *panel, WMView *view); void WMSetFilePanelAccessoryView(WMFilePanel *panel, WMView *view);
@@ -5,9 +5,7 @@
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#ifdef USE_PANGO @USE_PANGO@#include <pango/pango.h>
#include <pango/pango.h>
#endif
#include <WINGs/WINGs.h> #include <WINGs/WINGs.h>
@@ -43,7 +41,7 @@ typedef struct _WINGsConfiguration {
unsigned mouseWheelDown; unsigned mouseWheelDown;
} _WINGsConfiguration; } _WINGsConfiguration;
extern char *_WINGS_progname; extern const char *_WINGS_progname;
extern _WINGsConfiguration WINGsConfiguration; extern _WINGsConfiguration WINGsConfiguration;
extern struct W_Application WMApplication; extern struct W_Application WMApplication;
@@ -459,9 +457,7 @@ typedef struct W_Font {
short refCount; short refCount;
char *name; char *name;
#ifdef USE_PANGO @USE_PANGO@ PangoLayout *layout;
PangoLayout *layout;
#endif
} W_Font; } W_Font;
#define W_FONTID(f) (f)->font->fid #define W_FONTID(f) (f)->font->fid
@@ -498,6 +494,8 @@ void W_SetPreeditPositon(W_View *view, int x, int y);
int W_LookupString(W_View *view, XKeyPressedEvent *event, char *buffer, int W_LookupString(W_View *view, XKeyPressedEvent *event, char *buffer,
int buflen, KeySym *keysym, Status *status); int buflen, KeySym *keysym, Status *status);
KeySym W_KeycodeToKeysym(Display *display, KeyCode keycode, int index);
/* ---[ wmisc.c ]--------------------------------------------------------- */ /* ---[ wmisc.c ]--------------------------------------------------------- */
@@ -688,6 +686,37 @@ void W_BroadcastMessage(W_View *targetParent, XEvent *event);
void W_DispatchMessage(W_View *target, XEvent *event); void W_DispatchMessage(W_View *target, XEvent *event);
/* ---[ UTF-8 helpers ]--------------------------------------------------- */
static inline int oneUTF8CharBackward(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[--pos] >= 0x80 && ustr[pos] <= 0xbf) ;
return pos;
}
static inline int oneUTF8CharForward(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[++pos] >= 0x80 && ustr[pos] <= 0xbf) ;
return pos;
}
// find the beginning of the UTF8 char pointed by str
static inline int seekUTF8CharStart(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[pos] >= 0x80 && ustr[pos] <= 0xbf)
--pos;
return pos;
}
#ifdef __cplusplus #ifdef __cplusplus
} }
+12 -1
View File
@@ -193,6 +193,16 @@ typedef void WMNotificationObserverAction(void *observerData,
sizeof(array) / sizeof(array[0]); \ sizeof(array) / sizeof(array[0]); \
}) })
/* These macros can be used to adjust the location and size pixel values in
* the panel layouts so that they match the configured size of the system
* font (useful with high DPI screens, where you have to increase this size).
* The macros require two local variables to be set:
* wmScaleWidth: the width of the alphabet in the current system font
* wmScaleHeight: the height of the current system font
* Use the WMGetScaleBaseFromSystemFont function to set these values.
*/
#define WMScaleX(value) ((int)((double)value / 177.0 * (double)wmScaleWidth + 0.5))
#define WMScaleY(value) ((int)((double)value / 15.0 * (double)wmScaleHeight + 0.5))
/* ---[ WINGs/memory.c ]-------------------------------------------------- */ /* ---[ WINGs/memory.c ]-------------------------------------------------- */
@@ -239,7 +249,7 @@ char* wexpandpath(const char *path);
int wcopy_file(const char *toPath, const char *srcFile, const char *destFile); int wcopy_file(const char *toPath, const char *srcFile, const char *destFile);
/* don't free the returned string */ /* don't free the returned string */
char* wgethomedir(void); const char* wgethomedir(void);
/* ---[ WINGs/proplist.c ]------------------------------------------------ */ /* ---[ WINGs/proplist.c ]------------------------------------------------ */
@@ -854,6 +864,7 @@ Bool WMWritePropListToFile(WMPropList *plist, const char *path);
/* don't free the returned string */ /* don't free the returned string */
const char* wusergnusteppath(void); const char* wusergnusteppath(void);
const char* wuserdatapath(void);
/* Free the returned string when you no longer need it */ /* Free the returned string when you no longer need it */
char* wdefaultspathfordomain(const char *domain); char* wdefaultspathfordomain(const char *domain);
+1 -1
View File
@@ -599,7 +599,7 @@ static void dragSourceResponseTimeOut(void *destView)
W_DragDestinationInfoClear(info); W_DragDestinationInfoClear(info);
} }
void W_DragDestinationStopTimer() void W_DragDestinationStopTimer(void)
{ {
if (dndDestinationTimer != NULL) { if (dndDestinationTimer != NULL) {
WMDeleteTimerHandler(dndDestinationTimer); WMDeleteTimerHandler(dndDestinationTimer);
+1 -1
View File
@@ -1080,7 +1080,7 @@ static void dragSourceResponseTimeOut(void *source)
} }
} }
void W_DragSourceStopTimer() void W_DragSourceStopTimer(void)
{ {
if (dndSourceTimer != NULL) { if (dndSourceTimer != NULL) {
WMDeleteTimerHandler(dndSourceTimer); WMDeleteTimerHandler(dndSourceTimer);
+2 -6
View File
@@ -39,7 +39,7 @@
#endif #endif
char *wgethomedir() const char *wgethomedir(void)
{ {
static char *home = NULL; static char *home = NULL;
char *tmp; char *tmp;
@@ -48,11 +48,7 @@ char *wgethomedir()
if (home) if (home)
return home; return home;
#ifdef HAVE_SECURE_GETENV tmp = GETENV("HOME");
tmp = secure_getenv("HOME");
#else
tmp = getenv("HOME");
#endif
if (tmp) { if (tmp) {
home = wstrdup(tmp); home = wstrdup(tmp);
return home; return home;
-33
View File
@@ -1,33 +0,0 @@
#!/bin/sh
# [Christophe CURIS, 2015/01/31]
# This script is now reporting itself as deprecated (this should have been done
# a long time ago), so it should be kept for at least 2 years from now in order
# to allow users to update their scripts, and then removed.
if test $# -eq 0; then
echo "Error: $0 is deprecated, please use 'pkg-config WINGs ...'" >&2
exit 1
fi
while test $# -gt 0; do
case $1 in
--cflags)
echo "Warning: $0 is deprecated, please use 'pkg-config WINGs --cflags'" >&2
pkg-config WINGs --cflags
;;
--ldflags|--lflags)
echo "Warning: $0 is deprecated, please use 'pkg-config WINGs --libs'" >&2
pkg-config WINGs --libs-only-L
;;
--libs)
echo "Warning: $0 is deprecated, please use 'pkg-config WINGs --libs'" >&2
pkg-config WINGs --libs
;;
*)
echo "Error: $0 is deprecated, please use 'pkg-config WINGs ...'" >&2
exit 1
;;
esac
shift
done
-33
View File
@@ -1,33 +0,0 @@
#!/bin/sh
# [Christophe CURIS, 2015/01/31]
# This script is now reporting itself as deprecated (this should have been done
# a long time ago), so it should be kept for at least 2 years from now in order
# to allow users to update their scripts, and then removed.
if test $# -eq 0; then
echo "Error: $0 is deprecated, please use 'pkg-config WUtil ...'" >&2
exit 1
fi
while test $# -gt 0; do
case $1 in
--cflags)
echo "Warning: $0 is deprecated, please use 'pkg-config WUtil --cflags'" >&2
pkg-config WUtil --cflags
;;
--ldflags|--lflags)
echo "Warning: $0 is deprecated, please use 'pkg-config WUtil --libs'" >&2
pkg-config WUtil --libs-only-L
;;
--libs)
echo "Warning: $0 is deprecated, please use 'pkg-config WUtil --libs'" >&2
pkg-config WUtil --libs
;;
*)
echo "Error: $0 is deprecated, please use 'pkg-config WUtil ...'" >&2
exit 1
;;
esac
shift
done
+2 -1
View File
@@ -107,7 +107,8 @@ void *wmalloc(size_t size)
} }
} }
} }
memset(tmp, 0, size); if (tmp != NULL)
memset(tmp, 0, size);
return tmp; return tmp;
} }
+3 -3
View File
@@ -536,7 +536,7 @@ found_end_define_fname:
while (*src != '\0') { while (*src != '\0') {
idx = 0; idx = 0;
if (*src == '~') { if (*src == '~') {
char *home = wgethomedir(); const char *home = wgethomedir();
while (*home != '\0') { while (*home != '\0') {
if (idx < sizeof(buffer) - 2) if (idx < sizeof(buffer) - 2)
buffer[idx++] = *home; buffer[idx++] = *home;
@@ -612,10 +612,10 @@ static void menu_parser_condition_ifmacro(WMenuParser parser, Bool check_exists)
macro = menu_parser_find_macro(parser, macro_name); macro = menu_parser_find_macro(parser, macro_name);
parser->cond.stack[0].skip = parser->cond.stack[0].skip =
((check_exists) && (macro == NULL)) || ((check_exists) && (macro == NULL)) ||
((!check_exists) && (macro != NULL)) ; ((!check_exists) && (macro != NULL));
} }
strcpy(parser->cond.stack[0].name, cmd_name); strncpy(parser->cond.stack[0].name, cmd_name, sizeof(parser->cond.stack[0].name) - 1);
parser->cond.stack[0].line = parser->line_number; parser->cond.stack[0].line = parser->line_number;
} }
+6 -2
View File
@@ -167,6 +167,7 @@ void menu_parser_define_macro(WMenuParser parser)
return; return;
} }
macro = wmalloc(sizeof(*macro)); macro = wmalloc(sizeof(*macro));
memset(arg_name, 0, MAX_MACRO_ARG_COUNT * sizeof(char *));
/* Isolate name of macro */ /* Isolate name of macro */
idx = 0; idx = 0;
@@ -279,7 +280,8 @@ WParserMacro *menu_parser_find_macro(WMenuParser parser, const char *name)
continue; continue;
return macro; return macro;
check_next_macro: ; check_next_macro:
;
} }
return NULL; return NULL;
} }
@@ -391,6 +393,8 @@ void menu_parser_expand_macro(WMenuParser parser, WParserMacro *macro)
unsigned int size; unsigned int size;
int i, space_left; int i, space_left;
memset(arg_value, 0, MAX_MACRO_ARG_COUNT * sizeof(char *));
/* Skip the name of the macro, this was not done by caller */ /* Skip the name of the macro, this was not done by caller */
for (i = 0; macro->name[i] != '\0'; i++) for (i = 0; macro->name[i] != '\0'; i++)
parser->rd++; parser->rd++;
@@ -692,7 +696,7 @@ static void w_create_macro(WMenuParser parser, const char *name, WParserMacroFun
WParserMacro *macro; WParserMacro *macro;
macro = wmalloc(sizeof(*macro)); macro = wmalloc(sizeof(*macro));
strcpy(macro->name, name); strncpy(macro->name, name, sizeof(macro->name) - 1);
macro->function = handler; macro->function = handler;
macro->arg_count = -1; macro->arg_count = -1;
macro->next = parser->macros; macro->next = parser->macros;
+1 -1
View File
@@ -4,7 +4,7 @@ CATALOGS = @WINGSMOFILES@
CLEANFILES = $(CATALOGS) $(DOMAIN).pot CLEANFILES = $(CATALOGS) $(DOMAIN).pot
EXTRA_DIST = bg.po ca.po cs.po de.po fr.po fy.po hu.po nl.po sk.po EXTRA_DIST = bg.po ca.po cs.po de.po fr.po fy.po hu.po nl.po sk.po sr.po
# WUtil files: # WUtil files:
POTFILES = \ POTFILES = \
+1
View File
@@ -9,6 +9,7 @@ sk.po Slovak Jan 'judas' Tomka <judas@linux.sk>
bg.po Bulgarian Anton Zinoviev <zinoviev@debian.org> bg.po Bulgarian Anton Zinoviev <zinoviev@debian.org>
nl.po Dutch Alwin <translations@ziggo.nl> nl.po Dutch Alwin <translations@ziggo.nl>
fy.po Frisian Alwin <translations@ziggo.nl> fy.po Frisian Alwin <translations@ziggo.nl>
sr.po Serbian Strahinya Radich <sr@strahinja.org>
Notes Notes
----- -----
+1
View File
@@ -9,6 +9,7 @@ msgstr ""
"PO-Revision-Date: 2003-02-09 12:10+0200\n" "PO-Revision-Date: 2003-02-09 12:10+0200\n"
"Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n" "Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n"
"Language-Team: Bulgarian <dict@linux.zonebg.com>\n" "Language-Team: Bulgarian <dict@linux.zonebg.com>\n"
"Language: bg\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+1
View File
@@ -14,6 +14,7 @@ msgstr ""
"PO-Revision-Date: 2003-09-16 23:16+0200\n" "PO-Revision-Date: 2003-09-16 23:16+0200\n"
"Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n" "Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n"
"Language-Team: Catalan <ca@dodds.net>\n" "Language-Team: Catalan <ca@dodds.net>\n"
"Language: ca\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+1
View File
@@ -12,6 +12,7 @@ msgstr ""
"PO-Revision-Date: 2001-10-11 22:00+0100\n" "PO-Revision-Date: 2001-10-11 22:00+0100\n"
"Last-Translator: Jiří Hnídek <jiri.hnidek@vslib.cz>\n" "Last-Translator: Jiří Hnídek <jiri.hnidek@vslib.cz>\n"
"Language-Team: Czech <cz@li.org>\n" "Language-Team: Czech <cz@li.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: unknown\n" "Content-Transfer-Encoding: unknown\n"
+1
View File
@@ -15,6 +15,7 @@ msgstr ""
"PO-Revision-Date: 2004-11-05 23:48+0100\n" "PO-Revision-Date: 2004-11-05 23:48+0100\n"
"Last-Translator: shlomme@gmx.net\n" "Last-Translator: shlomme@gmx.net\n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+1
View File
@@ -10,6 +10,7 @@ msgstr ""
"PO-Revision-Date: 2002-01-09 21:20+0100\n" "PO-Revision-Date: 2002-01-09 21:20+0100\n"
"Last-Translator: Emmanuel Benoit <tseeker@neptune.fr>\n" "Last-Translator: Emmanuel Benoit <tseeker@neptune.fr>\n"
"Language-Team: Français <fr@li.org>\n" "Language-Team: Français <fr@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: unknown\n" "Content-Transfer-Encoding: unknown\n"
+33 -72
View File
@@ -1,14 +1,14 @@
# Translation into Western Frisian for Window Maker # Translation into Western Frisian for Window Maker
# Copyright (C) 2015 Window Maker Developers Team # Copyright (C) 2015-2019 Window Maker Developers Team
# This file is distributed under the same license as the windowmaker package. # This file is distributed under the same license as the windowmaker package.
# Original by Alwin <translations@ziggo.nl>, 2015. # Original by Alwin <translations@ziggo.nl>, 2015.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: wmaker-0.95.6+\n" "Project-Id-Version: wmaker-0.95.7+\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-06-14 16:10+0200\n" "POT-Creation-Date: 2016-01-21 16:19+0100\n"
"PO-Revision-Date: 2015-06-14 00:00+0000\n" "PO-Revision-Date: 2016-01-21 00:00+0000\n"
"Last-Translator: Alwin <translations@ziggo.nl>\n" "Last-Translator: Alwin <translations@ziggo.nl>\n"
"Language-Team: Western Frisian\n" "Language-Team: Western Frisian\n"
"Language: fy\n" "Language: fy\n"
@@ -99,7 +99,7 @@ msgstr "foartidich bestânsein, ferwachte in nije rigel nei '\\'"
#, c-format #, c-format
msgid "reached end of file while searching '*/' for comment started at line %d" msgid "reached end of file while searching '*/' for comment started at line %d"
msgstr "" msgstr ""
"bestânsein berikt by sykje nei '*/' foar kommentaar begûnen op rigel %d" "bestânsein berikt by sykjen nei '*/' foar kommentaar begûnen op rigel %d"
#: ../../WINGs/menuparser.c:344 #: ../../WINGs/menuparser.c:344
msgid "missing closing double-quote before end-of-line" msgid "missing closing double-quote before end-of-line"
@@ -111,7 +111,7 @@ msgstr "ûntbrekkend slutend inkeld oanhelteken foar rigelein"
#: ../../WINGs/menuparser.c:380 #: ../../WINGs/menuparser.c:380
msgid "too many nested macro expansions, breaking loop" msgid "too many nested macro expansions, breaking loop"
msgstr "te folle neste makro-útwurkingen, syklus ôfbrutsen" msgstr "te folle neske makro-útwurkingen, syklus ôfbrutsen"
#: ../../WINGs/menuparser.c:439 #: ../../WINGs/menuparser.c:439
#, c-format #, c-format
@@ -140,7 +140,7 @@ msgstr "ûntbrekkende slutende '%c' yn bestânsnammeopjefte"
#: ../../WINGs/menuparser.c:503 #: ../../WINGs/menuparser.c:503
msgid "too many nested #include's" msgid "too many nested #include's"
msgstr "te folle neste #include's" msgstr "te folle neske #include's"
#: ../../WINGs/menuparser.c:568 #: ../../WINGs/menuparser.c:568
#, c-format #, c-format
@@ -150,11 +150,11 @@ msgstr "koe bestân \"%s\" net fine foar #include"
#: ../../WINGs/menuparser.c:589 #: ../../WINGs/menuparser.c:589
#, c-format #, c-format
msgid "missing macro name argument to #%s" msgid "missing macro name argument to #%s"
msgstr "ûntbrekkend makronammeargumint by #%s" msgstr "ûntbrekkend makronamme-argumint by #%s"
#: ../../WINGs/menuparser.c:600 #: ../../WINGs/menuparser.c:600
msgid "too many nested #if sequences" msgid "too many nested #if sequences"
msgstr "te folle neste #if-rigen" msgstr "te folle neske #if-rigen"
#: ../../WINGs/menuparser.c:626 ../../WINGs/menuparser.c:643 #: ../../WINGs/menuparser.c:626 ../../WINGs/menuparser.c:643
#, c-format #, c-format
@@ -168,7 +168,7 @@ msgstr "gjin makronamme fûn foar #define"
#: ../../WINGs/menuparser_macros.c:187 #: ../../WINGs/menuparser_macros.c:187
#, c-format #, c-format
msgid "premature end of file while reading arg-list for macro \"%s\"" msgid "premature end of file while reading arg-list for macro \"%s\""
msgstr "foartidich bestânsein by ynlêze arg.-list foar makro \"%s\"" msgstr "foartidich bestânsein by ynlêzen arg.-list foar makro \"%s\""
#: ../../WINGs/menuparser_macros.c:194 #: ../../WINGs/menuparser_macros.c:194
#, c-format #, c-format
@@ -196,7 +196,7 @@ msgstr ""
#: ../../WINGs/menuparser_macros.c:253 #: ../../WINGs/menuparser_macros.c:253
#, c-format #, c-format
msgid "macro \"%s\" already defined, ignoring redefinition" msgid "macro \"%s\" already defined, ignoring redefinition"
msgstr "makro \"%s\" al definiearre, negearret werdefiniearje" msgstr "makro \"%s\" al definiearre, negearret werdefiniearjen"
#: ../../WINGs/menuparser_macros.c:346 #: ../../WINGs/menuparser_macros.c:346
#, c-format #, c-format
@@ -225,7 +225,7 @@ msgstr "te folle arguminten foar makro \"%s\", ferwachte allinnich %d"
#: ../../WINGs/menuparser_macros.c:530 #: ../../WINGs/menuparser_macros.c:530
#, c-format #, c-format
msgid "premature end of line while searching for arguments to macro \"%s\"" msgid "premature end of line while searching for arguments to macro \"%s\""
msgstr "foartidich rigelein by sykje nei arguminten by makro \"%s\"" msgstr "foartidich rigelein by sykjen nei arguminten by makro \"%s\""
#: ../../WINGs/menuparser_macros.c:536 #: ../../WINGs/menuparser_macros.c:536
#, c-format #, c-format
@@ -345,7 +345,7 @@ msgstr "koe grutte foar bestân '%s' net krije"
#: ../../WINGs/proplist.c:1531 #: ../../WINGs/proplist.c:1531
#, c-format #, c-format
msgid "error reading from file '%s'" msgid "error reading from file '%s'"
msgstr "flater by ynlêze bestân '%s'" msgstr "flater by ynlêzen bestân '%s'"
#: ../../WINGs/proplist.c:1578 #: ../../WINGs/proplist.c:1578
#, c-format #, c-format
@@ -355,32 +355,32 @@ msgstr "%s:koe menubestân net iepenje"
#: ../../WINGs/proplist.c:1660 #: ../../WINGs/proplist.c:1660
#, c-format #, c-format
msgid "mkstemp (%s) failed" msgid "mkstemp (%s) failed"
msgstr "oanmeitsje unyk tydlik bestân (%s) mislearre" msgstr "oanmeitsjen unyk tydlik bestân (%s) mislearre"
#: ../../WINGs/proplist.c:1670 #: ../../WINGs/proplist.c:1670
#, c-format #, c-format
msgid "mktemp (%s) failed" msgid "mktemp (%s) failed"
msgstr "oanmeitsje tydlik bestân (%s) mislearre" msgstr "oanmeitsjen tydlik bestân (%s) mislearre"
#: ../../WINGs/proplist.c:1677 #: ../../WINGs/proplist.c:1677
#, c-format #, c-format
msgid "open (%s) failed" msgid "open (%s) failed"
msgstr "iepenje (%s) mislearre" msgstr "iepenjen (%s) mislearre"
#: ../../WINGs/proplist.c:1684 #: ../../WINGs/proplist.c:1684
#, c-format #, c-format
msgid "writing to file: %s failed" msgid "writing to file: %s failed"
msgstr "skriuwe nei bestân: %s mislearre" msgstr "skriuwen nei bestân: %s mislearre"
#: ../../WINGs/proplist.c:1693 #: ../../WINGs/proplist.c:1693
#, c-format #, c-format
msgid "fclose (%s) failed" msgid "fclose (%s) failed"
msgstr "ôfslute stream (%s) mislearre" msgstr "ôfsluten stream (%s) mislearre"
#: ../../WINGs/proplist.c:1701 #: ../../WINGs/proplist.c:1701
#, c-format #, c-format
msgid "rename ('%s' to '%s') failed" msgid "rename ('%s' to '%s') failed"
msgstr "omneame ('%s' nei '%s') mislearre" msgstr "omneamen ('%s' nei '%s') mislearre"
#: ../../WINGs/proplist.c:1772 #: ../../WINGs/proplist.c:1772
#, c-format #, c-format
@@ -388,14 +388,14 @@ msgid "Could not create component %s"
msgstr "Koe komponint %s net oanmeitsje" msgstr "Koe komponint %s net oanmeitsje"
#: ../../WINGs/userdefaults.c:72 #: ../../WINGs/userdefaults.c:72
msgid "variable GNUSTEP_USER_ROOT defined with invalid path, not used" msgid "variable WMAKER_USER_ROOT defined with invalid path, not used"
msgstr "fariabele GNUSTEP_USER_ROOT, definiearre mei ûnjildich paad, net brûkt" msgstr "fariabele WMAKER_USER_ROOT, definiearre mei ûnjildich paad, net brûkt"
#. something happened with the file. just overwrite it #. something happened with the file. just overwrite it
#: ../../WINGs/userdefaults.c:210 ../../WINGs/userdefaults.c:225 #: ../../WINGs/userdefaults.c:210 ../../WINGs/userdefaults.c:225
#, c-format #, c-format
msgid "cannot read domain from file '%s' when syncing" msgid "cannot read domain from file '%s' when syncing"
msgstr "kin domeinbestân '%s' net ynlêze by syngronisearje" msgstr "kin domeinbestân '%s' net ynlêze by syngronisearjen"
#: ../../WINGs/dragcommon.c:60 #: ../../WINGs/dragcommon.c:60
#, c-format #, c-format
@@ -414,11 +414,11 @@ msgstr "net-stipe ferzje %i foar XDND-berjocht by binnen gean"
#: ../../WINGs/dragsource.c:163 #: ../../WINGs/dragsource.c:163
msgid "XDND selection lost during drag operation..." msgid "XDND selection lost during drag operation..."
msgstr "XDND-seleksje ferlern by fersleephanneling..." msgstr "XDND-seleksje ferlern ûnder fersleephanneling..."
#: ../../WINGs/dragsource.c:758 #: ../../WINGs/dragsource.c:758
msgid "could not get XDND version for target of drop" msgid "could not get XDND version for target of drop"
msgstr "koe XDND-ferzje net krije foar doel fan ferslepe" msgstr "koe XDND-ferzje net krije foar doel fan ferslepen"
#: ../../WINGs/dragsource.c:774 #: ../../WINGs/dragsource.c:774
msgid "could not get ownership of XDND selection" msgid "could not get ownership of XDND selection"
@@ -456,7 +456,7 @@ msgstr "Kleuren"
#: ../../WINGs/wcolorpanel.c:568 ../../WINGs/wcolorpanel.c:2720 #: ../../WINGs/wcolorpanel.c:568 ../../WINGs/wcolorpanel.c:2720
msgid "Brightness" msgid "Brightness"
msgstr "Helderheid" msgstr "Helderens"
#: ../../WINGs/wcolorpanel.c:570 ../../WINGs/wcolorpanel.c:644 #: ../../WINGs/wcolorpanel.c:570 ../../WINGs/wcolorpanel.c:644
#: ../../WINGs/wcolorpanel.c:675 ../../WINGs/wcolorpanel.c:706 #: ../../WINGs/wcolorpanel.c:675 ../../WINGs/wcolorpanel.c:706
@@ -558,7 +558,7 @@ msgstr "Nij..."
msgid "" msgid ""
"Color Panel: Could not create directory %s needed to store configurations" "Color Panel: Could not create directory %s needed to store configurations"
msgstr "" msgstr ""
"Kleurepaniel: Koe map %s, nedich om ynstellingen te bewarje, net oanmeitsje" "Kleurepaniel: Koe map %s, nedich om ynstellingen te bewarjen, net oanmeitsje"
#. Delete the file, it doesn't belong here #. Delete the file, it doesn't belong here
#: ../../WINGs/wcolorpanel.c:1176 ../../WINGs/wcolorpanel.c:3073 #: ../../WINGs/wcolorpanel.c:1176 ../../WINGs/wcolorpanel.c:3073
@@ -568,7 +568,7 @@ msgstr "Bestânsflater"
#: ../../WINGs/wcolorpanel.c:1177 #: ../../WINGs/wcolorpanel.c:1177
msgid "Could not create ColorPanel configuration directory" msgid "Could not create ColorPanel configuration directory"
msgstr "Koe ynstellingenmap Kleurepaniel net oanmeitsje" msgstr "Koe ynstellingemap Kleurepaniel net oanmeitsje"
#: ../../WINGs/wcolorpanel.c:1178 ../../WINGs/wcolorpanel.c:3074 #: ../../WINGs/wcolorpanel.c:1178 ../../WINGs/wcolorpanel.c:3074
#: ../../WINGs/wcolorpanel.c:3079 ../../WINGs/wcolorpanel.c:3104 #: ../../WINGs/wcolorpanel.c:3079 ../../WINGs/wcolorpanel.c:3104
@@ -593,7 +593,7 @@ msgstr "Fersêding"
#: ../../WINGs/wcolorpanel.c:2788 #: ../../WINGs/wcolorpanel.c:2788
msgid "Hue" msgid "Hue"
msgstr "Tinte" msgstr "Tint"
#: ../../WINGs/wcolorpanel.c:3012 #: ../../WINGs/wcolorpanel.c:3012
msgid "Open Palette" msgid "Open Palette"
@@ -610,7 +610,7 @@ msgstr "kin bestân %s net ferwiderje"
#: ../../WINGs/wcolorpanel.c:3078 #: ../../WINGs/wcolorpanel.c:3078
msgid "Couldn't remove file from Configuration Directory !" msgid "Couldn't remove file from Configuration Directory !"
msgstr "Koe bestân net ferwiderje út ynstellingenmap!" msgstr "Koe bestân net ferwiderje út ynstellingemap!"
#: ../../WINGs/wcolorpanel.c:3103 #: ../../WINGs/wcolorpanel.c:3103
msgid "Rename" msgid "Rename"
@@ -737,12 +737,12 @@ msgstr "Bestân"
#: ../../WINGs/wfilepanel.c:719 #: ../../WINGs/wfilepanel.c:719
#, c-format #, c-format
msgid "Removing %s failed: %s" msgid "Removing %s failed: %s"
msgstr "Ferwiderje %s mislearre: %s" msgstr "Ferwiderjen %s mislearre: %s"
#: ../../WINGs/wfilepanel.c:751 #: ../../WINGs/wfilepanel.c:751
#, c-format #, c-format
msgid "An error occurred browsing '%s'." msgid "An error occurred browsing '%s'."
msgstr "Der trede in flater op by blêdzje troch '%s'." msgstr "Der trede in flater op by blêdzjen troch '%s'."
#: ../../WINGs/wfilepanel.c:754 #: ../../WINGs/wfilepanel.c:754
#, c-format #, c-format
@@ -799,7 +799,7 @@ msgstr "Koe biblioteek 'lettertype ynstelle' net inisjalisearje\n"
#: ../../WINGs/widgets.c:446 #: ../../WINGs/widgets.c:446
#, c-format #, c-format
msgid "WINGs: could not load widget images file: %s" msgid "WINGs: could not load widget images file: %s"
msgstr "WINGs: Koe ôfbyldingenbestân bestjoeringseleminten net lade: %s" msgstr "WINGs: Koe ôfbyldingebestân bestjoeringseleminten net lade: %s"
#: ../../WINGs/widgets.c:542 #: ../../WINGs/widgets.c:542
#, c-format #, c-format
@@ -824,7 +824,7 @@ msgstr "0 inch"
#: ../../WINGs/wtextfield.c:494 #: ../../WINGs/wtextfield.c:494
msgid "only left alignment is supported in textfields" msgid "only left alignment is supported in textfields"
msgstr "allinnich lofts rjochtsje wurdt stipe yn tekstfjilden" msgstr "allinnich lofts rjochtsjen wurdt stipe yn tekstfjilden"
#: ../../WINGs/wwindow.c:160 #: ../../WINGs/wwindow.c:160
msgid "window title conversion error... using STRING encoding" msgid "window title conversion error... using STRING encoding"
@@ -833,42 +833,3 @@ msgstr "finstertitelomsettingsflater... brûkt STRING-kodearring"
#: ../../WINGs/wwindow.c:181 #: ../../WINGs/wwindow.c:181
msgid "icon title conversion error... using STRING encoding" msgid "icon title conversion error... using STRING encoding"
msgstr "ikoantitelomsettingsflater... brûkt STRING-kodearring" msgstr "ikoantitelomsettingsflater... brûkt STRING-kodearring"
# Keep next entries for wmaker-0.95.6
msgid "Could not open input file \"%s\""
msgstr "Koe ynfierbestân \"%s\" net iepenje"
msgid "Could not create target file \"%s\""
msgstr "Koe doelbestân \"%s\" net oanmeitsje"
msgid "An error occured browsing '%s'."
msgstr "Der trede in flater op by blêdzje troch '%s'."
msgid ""
"invalid characted '%c' in arg-list for macro \"%s\" while expecting "
"parameter name"
msgstr ""
"ûnjildich letterteken '%c' yn arg.-list foar makro \"%s\", ferwachte "
"parameternamme"
msgid ""
"invalid characted '%c' in arg-list for macro \"%s\" while expecting ',' "
"or ')'"
msgstr ""
"ûnjildich letterteken '%c' yn arg.-list foar makro \"%s\", ferwachte ',' "
"of ')'"
msgid "unknow directive '#%s'"
msgstr "ûnbekende oanwizing '#%s'"
msgid "found #%s but have no matching #if"
msgstr "#%s fûn, mar hat gjin bybehearrende #if"
msgid "too many nested includes"
msgstr "te folle neste #include's"
msgid "could not find file \"%s\" for include"
msgstr "koe bestân \"%s\" net fine foar #include"
msgid "too many nested macro expansion, breaking loop"
msgstr "te folle neste makro-útwurkingen, syklus ôfbrutsen"
+3 -3
View File
@@ -11,7 +11,7 @@ msgstr ""
"PO-Revision-Date: 2014-02-18 00:25+0100\n" "PO-Revision-Date: 2014-02-18 00:25+0100\n"
"Last-Translator: BALATON Zoltán <balaton@eik.bme.hu>\n" "Last-Translator: BALATON Zoltán <balaton@eik.bme.hu>\n"
"Language-Team: Hungarian\n" "Language-Team: Hungarian\n"
"Language: \n" "Language: hu\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -197,8 +197,8 @@ msgid "Could not create component %s"
msgstr "Nem sikerült létrehozni a %s elemet" msgstr "Nem sikerült létrehozni a %s elemet"
#: ../../../wmaker-crm/WINGs/userdefaults.c:65 #: ../../../wmaker-crm/WINGs/userdefaults.c:65
msgid "variable GNUSTEP_USER_ROOT defined with invalid path, not used" msgid "variable WMAKER_USER_ROOT defined with invalid path, not used"
msgstr "A GNUSTEP_USER_ROOT változó be van állítva, de rossz értékre. Nem használom" msgstr "A WMAKER_USER_ROOT változó be van állítva, de rossz értékre. Nem használom"
#. something happened with the file. just overwrite it #. something happened with the file. just overwrite it
#: ../../../wmaker-crm/WINGs/userdefaults.c:196 #: ../../../wmaker-crm/WINGs/userdefaults.c:196
+3 -9
View File
@@ -1,5 +1,5 @@
# New translation into Dutch for Window Maker # New translation into Dutch for Window Maker
# Copyright (C) 2014-2015 Window Maker Developers Team # Copyright (C) 2014-2019 Window Maker Developers Team
# This file is distributed under the same license as the windowmaker package. # This file is distributed under the same license as the windowmaker package.
# Original by Alwin <translations@ziggo.nl>, 2014. # Original by Alwin <translations@ziggo.nl>, 2014.
# #
@@ -389,9 +389,9 @@ msgid "Could not create component %s"
msgstr "Kon component %s niet aanmaken" msgstr "Kon component %s niet aanmaken"
#: ../../WINGs/userdefaults.c:72 #: ../../WINGs/userdefaults.c:72
msgid "variable GNUSTEP_USER_ROOT defined with invalid path, not used" msgid "variable WMAKER_USER_ROOT defined with invalid path, not used"
msgstr "" msgstr ""
"variabele GNUSTEP_USER_ROOT, gedefinieerd met ongeldig pad, niet gebruikt" "variabele WMAKER_USER_ROOT, gedefinieerd met ongeldig pad, niet gebruikt"
#. something happened with the file. just overwrite it #. something happened with the file. just overwrite it
#: ../../WINGs/userdefaults.c:210 ../../WINGs/userdefaults.c:225 #: ../../WINGs/userdefaults.c:210 ../../WINGs/userdefaults.c:225
@@ -843,9 +843,6 @@ msgstr "Kon invoerbestand \"%s\" niet openen"
msgid "Could not create target file \"%s\"" msgid "Could not create target file \"%s\""
msgstr "Kon doelbestand \"%s\" niet aanmaken" msgstr "Kon doelbestand \"%s\" niet aanmaken"
msgid "An error occured browsing '%s'."
msgstr "Er trad 'n fout op bij bladeren door '%s'."
msgid "" msgid ""
"invalid characted '%c' in arg-list for macro \"%s\" while expecting " "invalid characted '%c' in arg-list for macro \"%s\" while expecting "
"parameter name" "parameter name"
@@ -860,9 +857,6 @@ msgstr ""
"ongeldig letterteken '%c' in arg.-lijst voor macro \"%s\", verwachtte ',' " "ongeldig letterteken '%c' in arg.-lijst voor macro \"%s\", verwachtte ',' "
"of ')'" "of ')'"
msgid "unknow directive '#%s'"
msgstr "onbekende aanwijzing '#%s'"
msgid "found #%s but have no matching #if" msgid "found #%s but have no matching #if"
msgstr "#%s gevonden, maar heeft geen bijbehorende #if" msgstr "#%s gevonden, maar heeft geen bijbehorende #if"
+1
View File
@@ -19,6 +19,7 @@ msgstr ""
"PO-Revision-Date: 2001-12-20 04:00+0100\n" "PO-Revision-Date: 2001-12-20 04:00+0100\n"
"Last-Translator: Jan \"judas\" Tomka <judas@linux.sk>\n" "Last-Translator: Jan \"judas\" Tomka <judas@linux.sk>\n"
"Language-Team: Slovak <sk@li.org>\n" "Language-Team: Slovak <sk@li.org>\n"
"Language: sk\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+806
View File
@@ -0,0 +1,806 @@
# Serbian messages for Window Maker
# Copyright (C) 1997-2006 Alfredo K. Kojima
# 1998-2006 Dan Pascu
# 2013-2020 Window Maker Developers Team
# This file is distributed under the same license as the Window Maker package.
# Strahinya Radich (Страхиња Радић) <sr@strahinja.org>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: WindowMaker 0.96.0\n"
"Report-Msgid-Bugs-To: wmaker-dev@googlegroups.com\n"
"POT-Creation-Date: 2023-11-02 19:36+0100\n"
"PO-Revision-Date: 2023-11-02 19:48+0100\n"
"Last-Translator: Страхиња Радић <sr@strahinja.org>\n"
"Language-Team: Serbian <sr@li.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: poe 1.6.0-1-g10e6dcc\n"
#: ../../WINGs/error.c:106
msgid "fatal: "
msgstr "фатално: "
#: ../../WINGs/error.c:112
msgid "error: "
msgstr "грешка: "
#: ../../WINGs/error.c:118
msgid "warning: "
msgstr "упозорење: "
#: ../../WINGs/findfile.c:59
#, c-format
msgid "could not get password entry for UID %i"
msgstr "не може се добавити унос лозинке за UID %i"
#: ../../WINGs/findfile.c:89
#, c-format
msgid "could not get password entry for user %s"
msgstr "не може се добавити унос лозинке за корисника %s"
#: ../../WINGs/findfile.c:208
#, c-format
msgid "could not expand %s"
msgstr "не може се проширити %s"
#: ../../WINGs/findfile.c:437
#, c-format
msgid "Could not open input file \"%s\": %s"
msgstr "Не може се отворити улазна датотека „%s“: %s"
#: ../../WINGs/findfile.c:453
#, c-format
msgid "Could not create target file \"%s\": %s"
msgstr "Не може се креирати одредишна датотека „%s“: %s"
#: ../../WINGs/findfile.c:461
msgid "could not allocate memory for the copy buffer"
msgstr "не може се алоцирати меморија за бафер за копирање"
#: ../../WINGs/findfile.c:478
#, c-format
msgid "could not read from file \"%s\": %s"
msgstr "не може се прочитати датотека „%s“: %s"
#: ../../WINGs/findfile.c:493
#, c-format
msgid "could not write data to file \"%s\": %s"
msgstr "не могу се уписати подаци у датотеку „%s“: %s"
#: ../../WINGs/findfile.c:505
#, c-format
msgid "could not set permission 0%03o on file \"%s\": %s"
msgstr "не може се поставити дозвола 0%03o на датотеци „%s“: %s"
#: ../../WINGs/findfile.c:509
#, c-format
msgid "could not close the file \"%s\": %s"
msgstr "не може се затворити датотека „%s“: %s"
#: ../../WINGs/menuparser.c:110
#, c-format
msgid " included from file \"%s\" at line %d"
msgstr " укључена из датотеке „%s“ у реду %d"
#: ../../WINGs/menuparser.c:142
#, c-format
msgid "missing #endif to match #%s at line %d"
msgstr "недостаје #endif који би одговарао #%s у реду %d"
#: ../../WINGs/menuparser.c:200
msgid "multiple SHORTCUT definition not valid"
msgstr "вишеструка дефиниција SHORTCUT није исправна"
#: ../../WINGs/menuparser.c:253
msgid "premature end of file while expecting a new line after '\\'"
msgstr "прерани крај датотеке док се очекивао нови ред после „\\“"
#: ../../WINGs/menuparser.c:279
#, c-format
msgid "reached end of file while searching '*/' for comment started at line %d"
msgstr "достигнут крај датотеке приликом тражења „*/“ за коментар започет у реду %d"
#: ../../WINGs/menuparser.c:344
msgid "missing closing double-quote before end-of-line"
msgstr "недостаје завршни наводник пре краја реда"
#: ../../WINGs/menuparser.c:362
msgid "missing closing simple-quote before end-of-line"
msgstr "недостаје завршни апостроф пре краја реда"
#: ../../WINGs/menuparser.c:380
msgid "too many nested macro expansions, breaking loop"
msgstr "превише угњеждених проширења макроа, прекида се петља"
#: ../../WINGs/menuparser.c:439
#, c-format
msgid "unknown directive '#%s'"
msgstr "непозната директива „#%s“"
#: ../../WINGs/menuparser.c:444
#, c-format
msgid "extra text after '#' command is ignored: \"%.16s...\""
msgstr "сувишни текст после наредбе „#“ је игнорисан: „%.16s...“"
#: ../../WINGs/menuparser.c:459
msgid "no file name found for #include"
msgstr "назив датотеке у #include-у није пронађен"
#: ../../WINGs/menuparser.c:471
msgid "file name must be enclosed in brackets or double-quotes for #define"
msgstr "назив датотеке у #define-у мора бити окружен угластим заградама или наводницима"
#: ../../WINGs/menuparser.c:485
#, c-format
msgid "missing closing '%c' in filename specification"
msgstr "недостаје завршно „%c“ у задавању назива датотеке"
#: ../../WINGs/menuparser.c:503
msgid "too many nested #include's"
msgstr "превише угњеждених #include-ова"
#: ../../WINGs/menuparser.c:568
#, c-format
msgid "could not find file \"%s\" for #include"
msgstr "не може се наћи датотека „%s“ у #include-у"
#: ../../WINGs/menuparser.c:589
#, c-format
msgid "missing macro name argument to #%s"
msgstr "недостаје аргумент #%s - назив макроа"
#: ../../WINGs/menuparser.c:600
msgid "too many nested #if sequences"
msgstr "превише угњеждених секвенци #if"
#: ../../WINGs/menuparser.c:626 ../../WINGs/menuparser.c:643
#, c-format
msgid "found #%s but has no matching #if"
msgstr "пронађено #%s, али без одговарајућег #if"
#: ../../WINGs/menuparser_macros.c:166
msgid "no macro name found for #define"
msgstr "назив макроа за #define није пронађен"
#: ../../WINGs/menuparser_macros.c:188
#, c-format
msgid "premature end of file while reading arg-list for macro \"%s\""
msgstr "прерани крај датотеке приликом читања листе аргумената за макро „%s“"
#: ../../WINGs/menuparser_macros.c:195
#, c-format
msgid "too many parameters for macro \"%s\" definition"
msgstr "превише параметара за дефиницију макроа „%s“"
#: ../../WINGs/menuparser_macros.c:210
#, c-format
msgid "invalid character '%c' in arg-list for macro \"%s\" while expecting parameter name"
msgstr "неисправни знак „%c“ у листи аргумената за макро „%s“ док се очекивао назив параметра"
#: ../../WINGs/menuparser_macros.c:221
#, c-format
msgid "invalid character '%c' in arg-list for macro \"%s\" while expecting ',' or ')'"
msgstr "неисправни знак „%c“ у листи аргумената за макро „%s“ док се очекивало „,“ или „)“"
#: ../../WINGs/menuparser_macros.c:254
#, c-format
msgid "macro \"%s\" already defined, ignoring redefinition"
msgstr "макро „%s“ је већ дефинисан, игнорише се поновна дефиниција"
#: ../../WINGs/menuparser_macros.c:348
#, c-format
msgid "more content than supported for the macro \"%s\""
msgstr "више садржаја него што је подржано за макро „%s“"
#: ../../WINGs/menuparser_macros.c:459
#, c-format
msgid "expansion for macro \"%s\" too big, line truncated"
msgstr "проширење макроа „%s“ је превелико, ред је исечен"
#: ../../WINGs/menuparser_macros.c:471
#, c-format
msgid "macro \"%s\" needs parenthesis for arguments"
msgstr "макроу „%s“ су потребне заграде за аргументе"
#: ../../WINGs/menuparser_macros.c:502
msgid "missing closing quote or double-quote before end-of-line"
msgstr "недостаје завршни наводник или апостроф пре краја реда"
#: ../../WINGs/menuparser_macros.c:525
#, c-format
msgid "too many arguments for macro \"%s\", expected only %d"
msgstr "превише аргумената за макро „%s“, очекује се само %d"
#: ../../WINGs/menuparser_macros.c:534
#, c-format
msgid "premature end of line while searching for arguments to macro \"%s\""
msgstr "прерани крај реда приликом тражења аргумената за макро „%s“"
#: ../../WINGs/menuparser_macros.c:540
#, c-format
msgid "not enough arguments for macro \"%s\", expected %d but got only %d"
msgstr "недовољно аргумената за макро „%s“, очекује се %d, али само постоји %d"
#: ../../WINGs/menuparser_macros.c:545
#, c-format
msgid "too much data in parameter list of macro \"%s\", truncated"
msgstr "превише података у листи параметара макроа „%s“, исечено"
#: ../../WINGs/menuparser_macros.c:565
#, c-format
msgid "size of value for macro '%s' is too big, truncated"
msgstr "величина вредности макроа „%s“ је превелика, исечено"
#: ../../WINGs/menuparser_macros.c:646 ../../WINGs/menuparser_macros.c:672
#, c-format
msgid "could not determine %s"
msgstr "не може се одредити %s"
#: ../../WINGs/proplist.c:78
#, c-format
msgid "syntax error in %s %s, line %i: %s"
msgstr "синтаксна грешка у %s %s, ред %i: %s"
#: ../../WINGs/proplist.c:134
msgid "Only string or data is supported for a proplist dictionary key"
msgstr "Само ниска или подаци су подржани у proplist речничком кључу"
#: ../../WINGs/proplist.c:167 ../../WINGs/proplist.c:217
#: ../../WINGs/proplist.c:382 ../../WINGs/proplist.c:458
#: ../../WINGs/proplist.c:1048 ../../WINGs/proplist.c:1098
#: ../../WINGs/proplist.c:1246 ../../WINGs/proplist.c:1326
#: ../../WINGs/proplist.c:1431 ../../WINGs/proplist.c:1475
msgid "Used proplist functions on non-WMPropLists objects"
msgstr "Користе се proplist функције над не-WMPropLists објектима"
#: ../../WINGs/proplist.c:635
msgid "unterminated PropList string"
msgstr "незатворена PropList ниска"
#: ../../WINGs/proplist.c:673
msgid "unterminated PropList data"
msgstr "незатворен PropList податак"
#: ../../WINGs/proplist.c:681
msgid "unterminated PropList data (missing hexdigit)"
msgstr "незатворен PropList податак (недостаје хекс-цифра)"
#: ../../WINGs/proplist.c:693 ../../WINGs/proplist.c:698
msgid "non hexdigit character in PropList data"
msgstr "знак који није хекс-цифра у PropList подацима"
#: ../../WINGs/proplist.c:730
msgid "unterminated PropList array"
msgstr "незатворен PropList низ"
#: ../../WINGs/proplist.c:738
msgid "missing or unterminated PropList array"
msgstr "недостајући или незатворени PropList низ"
#: ../../WINGs/proplist.c:748
msgid "could not get PropList array element"
msgstr "не може се добавити елемент PropList низа"
#: ../../WINGs/proplist.c:775
msgid "unterminated PropList dictionary"
msgstr "незатворени PropList речник"
#: ../../WINGs/proplist.c:792
msgid "missing PropList dictionary key"
msgstr "недостајући кључ PropList речника"
#: ../../WINGs/proplist.c:794
msgid "missing PropList dictionary entry key or unterminated dictionary"
msgstr "недостаје кључ PropList речничке ставке или је речник незатворен"
#: ../../WINGs/proplist.c:802
msgid "error parsing PropList dictionary key"
msgstr "грешка приликом рашчлањивања кључа PropList речника"
#: ../../WINGs/proplist.c:810
msgid "missing = in PropList dictionary entry"
msgstr "недостаје = у ставци PropList речника"
#: ../../WINGs/proplist.c:818
msgid "error parsing PropList dictionary entry value"
msgstr "грешка приликом рашчлањивања вредности PropList речничког уноса"
#: ../../WINGs/proplist.c:826
msgid "missing ; in PropList dictionary entry"
msgstr "недостаје ; у речничком уносу PropList"
#: ../../WINGs/proplist.c:885
msgid "was expecting a string, data, array or dictionary. If it's a string, try enclosing it with \"."
msgstr "очекује се ниска, податак, низ или речник. Ако је у питању ниска, пробајте да је окружите са \"."
#: ../../WINGs/proplist.c:888
msgid "Comments are not allowed inside WindowMaker owned domain files."
msgstr "Коментари нису дозвољени унутар датотека домена WindowMaker-а."
#: ../../WINGs/proplist.c:1495 ../../WINGs/proplist.c:1560
#: ../../WINGs/proplist.c:1624
msgid "extra data after end of property list"
msgstr "вишак података после листе особина"
#: ../../WINGs/proplist.c:1535
#, c-format
msgid "could not get size for file '%s'"
msgstr "не може се одредити величина датотеке „%s“"
#: ../../WINGs/proplist.c:1543
#, c-format
msgid "error reading from file '%s'"
msgstr "грешка приликом читања датотеке „%s“"
#: ../../WINGs/proplist.c:1590
#, c-format
msgid "%s:could not open menu file"
msgstr "%s:не може се отворити датотека менија"
#: ../../WINGs/proplist.c:1672
#, c-format
msgid "mkstemp (%s) failed"
msgstr "mkstemp (%s) није успео"
#: ../../WINGs/proplist.c:1682
#, c-format
msgid "mktemp (%s) failed"
msgstr "mktemp (%s) није успео"
#: ../../WINGs/proplist.c:1689
#, c-format
msgid "open (%s) failed"
msgstr "open (%s) није успео"
#: ../../WINGs/proplist.c:1696
#, c-format
msgid "writing to file: %s failed"
msgstr "уписивање у датотеку: %s није успело"
#: ../../WINGs/proplist.c:1706
#, c-format
msgid "fclose (%s) failed"
msgstr "fclose (%s) није успео"
#: ../../WINGs/proplist.c:1714
#, c-format
msgid "rename ('%s' to '%s') failed"
msgstr "rename („%s“ у „%s“) није успео"
#: ../../WINGs/proplist.c:1785
#, c-format
msgid "Could not create component %s"
msgstr "Не може се креирати компонента %s"
#: ../../WINGs/userdefaults.c:68
msgid "variable WMAKER_USER_ROOT defined with invalid path, not used"
msgstr "променљива WMAKER_USER_ROOT је задата са неисправном путањом, не користи се"
#. something happened with the file. just overwrite it
#: ../../WINGs/userdefaults.c:208 ../../WINGs/userdefaults.c:223
#, c-format
msgid "cannot read domain from file '%s' when syncing"
msgstr "не може се учитати домен из датотеке „%s“ приликом синхронизовања"
#: ../../WINGs/dragcommon.c:60
#, c-format
msgid "unknown XDND action %s"
msgstr "непозната XDND акција %s"
#: ../../WINGs/dragcommon.c:142
#, c-format
msgid "target %lu for XDND message no longer exists"
msgstr "одредиште %lu XDND поруке више не постоји"
#: ../../WINGs/dragcommon.c:220
#, c-format
msgid "unsupported version %i for XDND enter message"
msgstr "неподржана верзија %i XDND улазне поруке"
#: ../../WINGs/dragsource.c:163
msgid "XDND selection lost during drag operation..."
msgstr "XDND избор је изгубљен приликом операције превлачења..."
#: ../../WINGs/dragsource.c:758
msgid "could not get XDND version for target of drop"
msgstr "не може се одредити верзија XDND-а за одредиште превлачења"
#: ../../WINGs/dragsource.c:774
msgid "could not get ownership of XDND selection"
msgstr "не може се одредити власништво над XDND избором"
#: ../../WINGs/dragsource.c:1070
msgid "delay for drag destination response expired"
msgstr "пауза за одговор одредишта превлачења је истекла"
#: ../../WINGs/wcolor.c:204 ../../WINGs/wcolor.c:214 ../../WINGs/wcolor.c:250
#: ../../WINGs/wcolor.c:288
#, c-format
msgid "could not allocate %s color"
msgstr "не може се алоцирати боја %s"
#: ../../WINGs/wcolor.c:204
msgid "white"
msgstr "бела"
#: ../../WINGs/wcolor.c:214
msgid "black"
msgstr "црна"
#: ../../WINGs/wcolor.c:250
msgid "gray"
msgstr "сива"
#: ../../WINGs/wcolor.c:288
msgid "dark gray"
msgstr "тамно сива"
#: ../../WINGs/wcolorpanel.c:390
msgid "Colors"
msgstr "Боје"
#: ../../WINGs/wcolorpanel.c:565 ../../WINGs/wcolorpanel.c:2716
msgid "Brightness"
msgstr "Светлина"
#: ../../WINGs/wcolorpanel.c:567 ../../WINGs/wcolorpanel.c:641
#: ../../WINGs/wcolorpanel.c:672 ../../WINGs/wcolorpanel.c:703
#: ../../WINGs/wcolorpanel.c:778 ../../WINGs/wcolorpanel.c:809
#: ../../WINGs/wcolorpanel.c:841 ../../WINGs/wcolorpanel.c:874
#: ../../WINGs/wcolorpanel.c:2010 ../../WINGs/wcolorpanel.c:2718
#: ../../WINGs/wcolorpanel.c:2752 ../../WINGs/wcolorpanel.c:2786
msgid "Color Panel: Could not allocate memory"
msgstr "Панел за боје: Неуспешно алоцирање меморије"
#: ../../WINGs/wcolorpanel.c:639
msgid "Red"
msgstr "Црвена"
#: ../../WINGs/wcolorpanel.c:670
msgid "Green"
msgstr "Зелена"
#: ../../WINGs/wcolorpanel.c:701
msgid "Blue"
msgstr "Плава"
#: ../../WINGs/wcolorpanel.c:715
msgid "Decimal"
msgstr "Децимално"
#: ../../WINGs/wcolorpanel.c:723
msgid "Hexadecimal"
msgstr "Хексадекадно"
#: ../../WINGs/wcolorpanel.c:776
msgid "Cyan"
msgstr "Цијан"
#: ../../WINGs/wcolorpanel.c:807
msgid "Magenta"
msgstr "Магента"
#: ../../WINGs/wcolorpanel.c:839
msgid "Yellow"
msgstr "Жута"
#: ../../WINGs/wcolorpanel.c:872
msgid "Black"
msgstr "Црна"
#: ../../WINGs/wcolorpanel.c:947
msgid "Spectrum"
msgstr "Спектар"
#: ../../WINGs/wcolorpanel.c:973
msgid "Palette"
msgstr "Палета"
#: ../../WINGs/wcolorpanel.c:978
msgid "New from File..."
msgstr "Нова из датотеке..."
#: ../../WINGs/wcolorpanel.c:979 ../../WINGs/wcolorpanel.c:1024
#: ../../WINGs/wcolorpanel.c:1039
msgid "Rename..."
msgstr "Преименуј..."
#: ../../WINGs/wcolorpanel.c:980 ../../WINGs/wcolorpanel.c:1025
#: ../../WINGs/wcolorpanel.c:1040 ../../WINGs/wcolorpanel.c:3176
msgid "Remove"
msgstr "Уклони"
#: ../../WINGs/wcolorpanel.c:981
msgid "Copy"
msgstr "Копирај"
#: ../../WINGs/wcolorpanel.c:982
msgid "New from Clipboard"
msgstr "Нова из клипборда"
#: ../../WINGs/wcolorpanel.c:1001
msgid "X11-Colors"
msgstr "X11 боје"
#: ../../WINGs/wcolorpanel.c:1018
msgid "Color"
msgstr "Боја"
#: ../../WINGs/wcolorpanel.c:1023
msgid "Add..."
msgstr "Додај..."
#: ../../WINGs/wcolorpanel.c:1033
msgid "List"
msgstr "Листа"
#: ../../WINGs/wcolorpanel.c:1038
msgid "New..."
msgstr "Нова..."
#: ../../WINGs/wcolorpanel.c:1165
#, c-format
msgid "Color Panel: Could not create directory %s needed to store configurations"
msgstr "Панел за боје: Не може се креирати директоријум %s неопходан за чување подешавања"
#. Delete the file, it doesn't belong here
#: ../../WINGs/wcolorpanel.c:1171 ../../WINGs/wcolorpanel.c:3069
#: ../../WINGs/wcolorpanel.c:3073
msgid "File Error"
msgstr "Грешка датотеке"
#: ../../WINGs/wcolorpanel.c:1172
msgid "Could not create ColorPanel configuration directory"
msgstr "Не може се креирати директоријум са подешавањима ColorPanel"
#: ../../WINGs/wcolorpanel.c:1173 ../../WINGs/wcolorpanel.c:3070
#: ../../WINGs/wcolorpanel.c:3075 ../../WINGs/wcolorpanel.c:3100
#: ../../WINGs/wfilepanel.c:227 ../../WINGs/wfilepanel.c:596
#: ../../WINGs/wfilepanel.c:611 ../../WINGs/wfilepanel.c:715
#: ../../WINGs/wfilepanel.c:883 ../../WINGs/wfontpanel.c:532
msgid "OK"
msgstr "ОК"
#: ../../WINGs/wcolorpanel.c:1178
msgid "Color Panel: Could not find file"
msgstr "Панел за боје: Не може се пронаћи датотека"
#: ../../WINGs/wcolorpanel.c:1374 ../../WINGs/wcolorpanel.c:1435
#: ../../WINGs/wcolorpanel.c:1495
msgid "Color Panel: X failed request"
msgstr "Панел за боје: Неуспешан захтев X-а"
#: ../../WINGs/wcolorpanel.c:2750
msgid "Saturation"
msgstr "Засићење"
#: ../../WINGs/wcolorpanel.c:2784
msgid "Hue"
msgstr "Нијанса"
#: ../../WINGs/wcolorpanel.c:3008
msgid "Open Palette"
msgstr "Отвори палету"
#: ../../WINGs/wcolorpanel.c:3070
msgid "Invalid file format !"
msgstr "Неисправан формат датотеке !"
#: ../../WINGs/wcolorpanel.c:3072
#, c-format
msgid "can't remove file %s"
msgstr "не може се уклонити датотека %s"
#: ../../WINGs/wcolorpanel.c:3074
msgid "Couldn't remove file from Configuration Directory !"
msgstr "Не може се уклонити датотека из директоријума са подешавањима !"
#: ../../WINGs/wcolorpanel.c:3099
msgid "Rename"
msgstr "Преименовање"
#: ../../WINGs/wcolorpanel.c:3099
msgid "Rename palette to:"
msgstr "Преименуј палету у:"
#: ../../WINGs/wcolorpanel.c:3100 ../../WINGs/wfilepanel.c:236
#: ../../WINGs/wfilepanel.c:611 ../../WINGs/wfilepanel.c:715
msgid "Cancel"
msgstr "Поништи"
#. Careful, this palette exists already
#: ../../WINGs/wcolorpanel.c:3116 ../../WINGs/wfilepanel.c:715
msgid "Warning"
msgstr "Упозорење"
#: ../../WINGs/wcolorpanel.c:3117
msgid "Palette already exists !\n\nOverwrite ?"
msgstr "Палета већ постоји !\n\nПреписати ?"
#: ../../WINGs/wcolorpanel.c:3117 ../../WINGs/wcolorpanel.c:3176
msgid "No"
msgstr "Не"
#: ../../WINGs/wcolorpanel.c:3117 ../../WINGs/wcolorpanel.c:3176
msgid "Yes"
msgstr "Да"
#: ../../WINGs/wcolorpanel.c:3148
#, c-format
msgid "Couldn't rename palette %s to %s"
msgstr "Палета %s се не може преименовати у %s"
#: ../../WINGs/wcolorpanel.c:3171
msgid "This will permanently remove the palette "
msgstr "Ово ће трајно уклонити палету "
#: ../../WINGs/wcolorpanel.c:3173
msgid ".\n\nAre you sure you want to remove this palette ?"
msgstr ".\n\nДа ли сте сигурни да желите да уклоните палету ?"
#: ../../WINGs/wcolorpanel.c:3195
#, c-format
msgid "Couldn't remove palette %s"
msgstr "Не може се уклонити палета %s"
#: ../../WINGs/wcolorpanel.c:3498
msgid "Color Panel: Color unspecified"
msgstr "Панел за боју: Боја није задата"
#: ../../WINGs/wfilepanel.c:216
msgid "Name:"
msgstr "Назив:"
#: ../../WINGs/wfilepanel.c:306 ../../WINGs/wfilepanel.c:364
msgid "Open"
msgstr "Отвори"
#: ../../WINGs/wfilepanel.c:322 ../../WINGs/wfilepanel.c:370
msgid "Save"
msgstr "Сачувај"
#: ../../WINGs/wfilepanel.c:506
#, c-format
msgid "WINGs: could not open directory %s\n"
msgstr "WINGs: не може се отворити директоријум %s\n"
#: ../../WINGs/wfilepanel.c:526
#, c-format
msgid "WINGs: could not stat %s\n"
msgstr "WINGs: не може се stat-овати %s\n"
#: ../../WINGs/wfilepanel.c:596 ../../WINGs/wfilepanel.c:883
#: ../../WINGs/wfontpanel.c:531
msgid "Error"
msgstr "Грешка"
#: ../../WINGs/wfilepanel.c:610
msgid "Create Directory"
msgstr "Креирање директоријума"
#: ../../WINGs/wfilepanel.c:611
msgid "Enter directory name"
msgstr "Унесите назив директоријума"
#: ../../WINGs/wfilepanel.c:639
#, c-format
msgid "Can not create %s: %s"
msgstr "Не може се креирати %s: %s"
#: ../../WINGs/wfilepanel.c:705
#, c-format
msgid "Can not find %s: %s"
msgstr "Не може се наћи %s: %s"
#: ../../WINGs/wfilepanel.c:711
#, c-format
msgid "Delete %s %s?"
msgstr "Обрисати %s %s?"
#: ../../WINGs/wfilepanel.c:712
msgid "directory"
msgstr "директоријум"
#: ../../WINGs/wfilepanel.c:712
msgid "file"
msgstr "датотеку"
#: ../../WINGs/wfilepanel.c:719
#, c-format
msgid "Removing %s failed: %s"
msgstr "Уклањање %s није успело: %s"
#: ../../WINGs/wfilepanel.c:751
#, c-format
msgid "An error occurred browsing '%s'."
msgstr "Догодила се грешка приликом прегледања „%s“."
#: ../../WINGs/wfilepanel.c:754
#, c-format
msgid "'%s' is not a directory."
msgstr "„%s“ није директоријум."
#: ../../WINGs/wfilepanel.c:883
msgid "File does not exist."
msgstr "Датотека не постоји."
#: ../../WINGs/wfont.c:43
#, c-format
msgid "invalid font: %s. Trying '%s'"
msgstr "неисправан фонт: %s. Проба се „%s“"
#: ../../WINGs/wfont.c:270 ../../WINGs/wfont.c:288
#, c-format
msgid "could not load font: %s."
msgstr "не може се учитати фонт: %s."
#. WMSetWidgetBackgroundColor(panel->win, WMWhiteColor(scr));
#: ../../WINGs/wfontpanel.c:184
msgid "Font Panel"
msgstr "Панел за фонт"
#: ../../WINGs/wfontpanel.c:220
msgid "The quick brown fox jumps over the lazy dog"
msgstr "Одбациће кавгаџија плаштом чађ у жељезни фењер"
#: ../../WINGs/wfontpanel.c:226
msgid "Family"
msgstr "Фамилија"
#: ../../WINGs/wfontpanel.c:237
msgid "Typeface"
msgstr "Словни лик"
#: ../../WINGs/wfontpanel.c:248
msgid "Size"
msgstr "Величина"
#: ../../WINGs/wfontpanel.c:267
msgid "Set"
msgstr "Постави"
#: ../../WINGs/wfontpanel.c:273
msgid "Revert"
msgstr "Врати"
#: ../../WINGs/wfontpanel.c:532
msgid "Could not init font config library\n"
msgstr "Не може се иницијализовати библиотека font config\n"
#: ../../WINGs/widgets.c:447
#, c-format
msgid "WINGs: could not load widget images file: %s"
msgstr "WINGs: не може се учитати датотека са сликама виџета: %s"
#: ../../WINGs/widgets.c:543
#, c-format
msgid "WINGs: could not open display %s"
msgstr "WINGs: не може се отворити приказ %s"
#: ../../WINGs/widgets.c:772
msgid "could not load any fonts. Make sure your font installation and locale settings are correct."
msgstr "не може се учитати ниједан фонт. Проверите да ли су фонтови исправно инсталирани и да али су подешавања језика исправна."
#: ../../WINGs/winputmethod.c:65
msgid "could not add destroy callback for XIM input method"
msgstr "не може се додати destroy callback за XIM метод уноса"
#: ../../WINGs/wruler.c:175
msgid "0 inches"
msgstr "0 инча"
#: ../../WINGs/wtextfield.c:494
msgid "only left alignment is supported in textfields"
msgstr "у текстуалним пољима је подржано само лево уравнање"
#: ../../WINGs/wwindow.c:160
msgid "window title conversion error... using STRING encoding"
msgstr "грешка приликом конверзије наслова прозора... користи се STRING кодирање"
#: ../../WINGs/wwindow.c:181
msgid "icon title conversion error... using STRING encoding"
msgstr "грешка приликом конверзије наслова иконе... користи се STRING кодирање"
+38 -13
View File
@@ -1253,22 +1253,34 @@ int WMGetPropListItemCount(WMPropList * plist)
Bool WMIsPLString(WMPropList * plist) Bool WMIsPLString(WMPropList * plist)
{ {
return (plist->type == WPLString); if (plist)
return (plist->type == WPLString);
else
return False;
} }
Bool WMIsPLData(WMPropList * plist) Bool WMIsPLData(WMPropList * plist)
{ {
return (plist->type == WPLData); if (plist)
return (plist->type == WPLData);
else
return False;
} }
Bool WMIsPLArray(WMPropList * plist) Bool WMIsPLArray(WMPropList * plist)
{ {
return (plist->type == WPLArray); if (plist)
return (plist->type == WPLArray);
else
return False;
} }
Bool WMIsPLDictionary(WMPropList * plist) Bool WMIsPLDictionary(WMPropList * plist)
{ {
return (plist->type == WPLDictionary); if (plist)
return (plist->type == WPLDictionary);
else
return False;
} }
Bool WMIsPropListEqualTo(WMPropList * plist, WMPropList * other) Bool WMIsPropListEqualTo(WMPropList * plist, WMPropList * other)
@@ -1683,6 +1695,7 @@ Bool WMWritePropListToFile(WMPropList * plist, const char *path)
if (fprintf(theFile, "%s\n", desc) != strlen(desc) + 1) { if (fprintf(theFile, "%s\n", desc) != strlen(desc) + 1) {
werror(_("writing to file: %s failed"), thePath); werror(_("writing to file: %s failed"), thePath);
wfree(desc); wfree(desc);
fclose(theFile);
goto failure; goto failure;
} }
@@ -1719,7 +1732,7 @@ Bool WMWritePropListToFile(WMPropList * plist, const char *path)
* file, and the last component is stripped off. the rest is the * file, and the last component is stripped off. the rest is the
* the hierarchy to be created. * the hierarchy to be created.
* *
* refuses to create anything outside $GNUSTEP_USER_ROOT * refuses to create anything outside $WMAKER_USER_ROOT
* *
* returns 1 on success, 0 on failure * returns 1 on success, 0 on failure
*/ */
@@ -1730,7 +1743,7 @@ int wmkdirhier(const char *path)
size_t p, plen; size_t p, plen;
struct stat st; struct stat st;
/* Only create directories under $GNUSTEP_USER_ROOT */ /* Only create directories under $WMAKER_USER_ROOT */
if ((t = wusergnusteppath()) == NULL) if ((t = wusergnusteppath()) == NULL)
return 0; return 0;
if (strncmp(path, t, strlen(t)) != 0) if (strncmp(path, t, strlen(t)) != 0)
@@ -1811,7 +1824,7 @@ static int wrmdirhier_fn(const char *path, const struct stat *st,
/* /*
* remove a directory hierarchy * remove a directory hierarchy
* *
* refuses to remove anything outside $GNUSTEP_USER_ROOT * refuses to remove anything outside $WMAKER_USER_ROOT/Defaults or $WMAKER_USER_ROOT/Library
* *
* returns 1 on success, 0 on failure * returns 1 on success, 0 on failure
* *
@@ -1821,15 +1834,27 @@ static int wrmdirhier_fn(const char *path, const struct stat *st,
*/ */
int wrmdirhier(const char *path) int wrmdirhier(const char *path)
{ {
const char *libpath;
char *udefpath = NULL;
struct stat st; struct stat st;
int error; int error;
const char *t;
/* Only remove directories under $GNUSTEP_USER_ROOT */ /* Only remove directories under $WMAKER_USER_ROOT/Defaults or $WMAKER_USER_ROOT/Library */
if ((t = wusergnusteppath()) == NULL) libpath = wuserdatapath();
return EPERM; if (strncmp(path, libpath, strlen(libpath)) == 0)
if (strncmp(path, t, strlen(t)) != 0) if (path[strlen(libpath)] == '/')
return EPERM; goto path_in_valid_tree;
udefpath = wdefaultspathfordomain("");
if (strncmp(path, udefpath, strlen(udefpath)) == 0)
/* Note: by side effect, 'udefpath' already contains a final '/' */
goto path_in_valid_tree;
wfree(udefpath);
return EPERM;
path_in_valid_tree:
wfree(udefpath);
/* Shortcut if it doesn't exist to begin with */ /* Shortcut if it doesn't exist to begin with */
if (stat(path, &st) == -1) if (stat(path, &st) == -1)
+2 -2
View File
@@ -7,7 +7,7 @@
#define MAX_PROPERTY_SIZE 8*1024 #define MAX_PROPERTY_SIZE 8*1024
char *WMSelectionOwnerDidChangeNotification = "WMSelectionOwnerDidChange"; const char *WMSelectionOwnerDidChangeNotification = "WMSelectionOwnerDidChange";
typedef struct SelectionHandler { typedef struct SelectionHandler {
WMView *view; WMView *view;
@@ -261,7 +261,7 @@ static WMData *getSelectionData(Display * dpy, Window win, Atom where)
bpi = bits / 8; bpi = bits / 8;
wdata = WMCreateDataWithBytesNoCopy(data, len * bpi, (WMFreeDataProc *) XFree); wdata = WMCreateDataWithBytesNoCopy(data, len * bpi, (void *) XFree);
WMSetDataFormat(wdata, bits); WMSetDataFormat(wdata, bits);
return wdata; return wdata;
+5 -7
View File
@@ -204,7 +204,7 @@ char *wstrndup(const char *str, size_t len)
char *wstrconcat(const char *str1, const char *str2) char *wstrconcat(const char *str1, const char *str2)
{ {
char *str; char *str;
size_t slen; size_t slen, slen1;
if (!str1 && str2) if (!str1 && str2)
return wstrdup(str2); return wstrdup(str2);
@@ -213,13 +213,11 @@ char *wstrconcat(const char *str1, const char *str2)
else if (!str1 && !str2) else if (!str1 && !str2)
return NULL; return NULL;
slen = strlen(str1) + strlen(str2) + 1; slen1 = strlen(str1);
slen = slen1 + strlen(str2) + 1;
str = wmalloc(slen); str = wmalloc(slen);
if (wstrlcpy(str, str1, slen) >= slen || strcpy(str, str1);
wstrlcat(str, str2, slen) >= slen) { strcpy(str + slen1, str2);
wfree(str);
return NULL;
}
return str; return str;
} }
+22 -24
View File
@@ -40,36 +40,32 @@ char *WMUserDefaultsDidChangeNotification = "WMUserDefaultsDidChangeNotification
static void synchronizeUserDefaults(void *foo); static void synchronizeUserDefaults(void *foo);
#define DEFAULTS_DIR "/Defaults"
#ifndef HAVE_INOTIFY #ifndef HAVE_INOTIFY
/* Check defaults database for changes every this many milliseconds */ /* Check defaults database for changes every this many milliseconds */
/* XXX: this is shared with src/ stuff, put it in some common header */ /* XXX: this is shared with src/ stuff, put it in some common header */
#define UD_SYNC_INTERVAL 2000 #define UD_SYNC_INTERVAL 2000
#endif #endif
const char *wusergnusteppath() const char *wusergnusteppath(void)
{ {
static const char subdir[] = "/GNUstep"; static const char subdir[] = "/" GSUSER_SUBDIR;
static char *path = NULL; static char *path = NULL;
char *gspath, *h; char *gspath;
const char *h;
int pathlen; int pathlen;
if (path) if (path)
/* Value have been already computed, re-use it */ /* Value have been already computed, re-use it */
return path; return path;
#ifdef HAVE_SECURE_GETENV gspath = GETENV("WMAKER_USER_ROOT");
gspath = secure_getenv("GNUSTEP_USER_ROOT");
#else
gspath = getenv("GNUSTEP_USER_ROOT");
#endif
if (gspath) { if (gspath) {
gspath = wexpandpath(gspath); gspath = wexpandpath(gspath);
if (gspath) { if (gspath) {
path = gspath; path = gspath;
return path; return path;
} }
wwarning(_("variable GNUSTEP_USER_ROOT defined with invalid path, not used")); wwarning(_("variable WMAKER_USER_ROOT defined with invalid path, not used"));
} }
h = wgethomedir(); h = wgethomedir();
@@ -84,6 +80,19 @@ const char *wusergnusteppath()
return path; return path;
} }
const char *wuserdatapath(void)
{
static char *path = NULL;
if (path)
/* Value have been already computed, re-use it */
return path;
path = wstrconcat(wusergnusteppath(), "/" USERDATA_SUBDIR);
return path;
}
char *wdefaultspathfordomain(const char *domain) char *wdefaultspathfordomain(const char *domain)
{ {
char *path; char *path;
@@ -91,31 +100,20 @@ char *wdefaultspathfordomain(const char *domain)
size_t slen; size_t slen;
gspath = wusergnusteppath(); gspath = wusergnusteppath();
slen = strlen(gspath) + strlen(DEFAULTS_DIR) + strlen(domain) + 4; slen = strlen(gspath) + strlen("/" DEFAULTS_SUBDIR "/") + strlen(domain) + 1;
path = wmalloc(slen); path = wmalloc(slen);
strcpy(path, gspath); strcpy(path, gspath);
strcat(path, DEFAULTS_DIR); strcat(path, "/" DEFAULTS_SUBDIR "/");
strcat(path, "/");
strcat(path, domain); strcat(path, domain);
return path; return path;
} }
/* XXX: doesn't quite belong to *user*defaults.c */ /* XXX: doesn't quite belong to *user*defaults.c */
#ifndef GLOBAL_DEFAULTS_SUBDIR
#define GLOBAL_DEFAULTS_SUBDIR "WindowMaker"
#endif
char *wglobaldefaultspathfordomain(const char *domain) char *wglobaldefaultspathfordomain(const char *domain)
{ {
char *t = NULL; return wstrconcat(PKGCONFDIR "/", domain);
size_t len;
len = strlen( SYSCONFDIR ) + strlen( GLOBAL_DEFAULTS_SUBDIR ) + strlen(domain) + 3;
t = wmalloc(len);
snprintf(t, len, "%s/%s/%s", SYSCONFDIR, GLOBAL_DEFAULTS_SUBDIR, domain);
return t;
} }
void w_save_defaults_changes(void) void w_save_defaults_changes(void)
+32 -22
View File
@@ -9,7 +9,7 @@
struct W_Application WMApplication; struct W_Application WMApplication;
char *_WINGS_progname = NULL; const char *_WINGS_progname = NULL;
Bool W_ApplicationInitialized(void) Bool W_ApplicationInitialized(void)
{ {
@@ -83,7 +83,7 @@ void WMSetResourcePath(const char *path)
WMApplication.resourcePath = wstrdup(path); WMApplication.resourcePath = wstrdup(path);
} }
char *WMGetApplicationName() char *WMGetApplicationName(void)
{ {
return WMApplication.applicationName; return WMApplication.applicationName;
} }
@@ -131,7 +131,9 @@ error:
char *WMPathForResourceOfType(const char *resource, const char *ext) char *WMPathForResourceOfType(const char *resource, const char *ext)
{ {
const char *gslocapps, *gssysapps, *gsuserapps;
char *path, *appdir; char *path, *appdir;
char buffer[PATH_MAX];
size_t slen; size_t slen;
path = appdir = NULL; path = appdir = NULL;
@@ -140,12 +142,12 @@ char *WMPathForResourceOfType(const char *resource, const char *ext)
* Paths are searched in this order: * Paths are searched in this order:
* - resourcePath/ext * - resourcePath/ext
* - dirname(argv[0])/ext * - dirname(argv[0])/ext
* - GNUSTEP_USER_ROOT/Applications/ApplicationName.app/ext * - WMAKER_USER_ROOT/Applications/ApplicationName.app/ext
* - ~/GNUstep/Applications/ApplicationName.app/ext * - GNUSTEP_USER_APPS/ApplicationName.app/ext
* - GNUSTEP_LOCAL_ROOT/Applications/ApplicationName.app/ext * - GNUSTEP_LOCAL_APPS/ApplicationName.app/ext
* - /usr/local/GNUstep/Applications/ApplicationName.app/ext * - /usr/local/lib/GNUstep/Applications/ApplicationName.app/ext
* - GNUSTEP_SYSTEM_ROOT/Applications/ApplicationName.app/ext * - GNUSTEP_SYSTEM_APPS/ApplicationName.app/ext
* - /usr/GNUstep/Applications/ApplicationName.app/ext * - /usr/lib/GNUstep/Applications/ApplicationName.app/ext
*/ */
if (WMApplication.resourcePath) { if (WMApplication.resourcePath) {
@@ -170,32 +172,40 @@ char *WMPathForResourceOfType(const char *resource, const char *ext)
} }
} }
slen = strlen(WMApplication.applicationName) + sizeof("Applications/.app"); snprintf(buffer, sizeof(buffer), "Applications/%s.app", WMApplication.applicationName);
path = checkFile(GETENV("WMAKER_USER_ROOT"), buffer, ext, resource);
if (path)
goto out;
slen = strlen(WMApplication.applicationName) + sizeof("/.app");
appdir = wmalloc(slen); appdir = wmalloc(slen);
if (snprintf(appdir, slen, "Applications/%s.app", WMApplication.applicationName) >= slen) if (snprintf(appdir, slen, "/%s.app", WMApplication.applicationName) >= slen)
goto out; goto out;
path = checkFile(getenv("GNUSTEP_USER_ROOT"), appdir, ext, resource); gsuserapps = GETENV("GNUSTEP_USER_APPS");
if (!gsuserapps) {
snprintf(buffer, sizeof(buffer), "%s/Applications", wusergnusteppath());
gsuserapps = buffer;
}
path = checkFile(gsuserapps, appdir, ext, resource);
if (path) if (path)
goto out; goto out;
path = checkFile(wusergnusteppath(), appdir, ext, resource); gslocapps = GETENV("GNUSTEP_LOCAL_APPS");
if (!gslocapps)
gslocapps = "/usr/local/lib/GNUstep/Applications";
path = checkFile(gslocapps, appdir, ext, resource);
if (path) if (path)
goto out; goto out;
path = checkFile(getenv("GNUSTEP_LOCAL_ROOT"), appdir, ext, resource); gssysapps = GETENV("GNUSTEP_SYSTEM_APPS");
if (!gssysapps)
gssysapps = "/usr/lib/GNUstep/Applications";
path = checkFile(gssysapps, appdir, ext, resource);
if (path) if (path)
goto out; goto out;
path = checkFile("/usr/local/GNUstep", appdir, ext, resource); path = checkFile("/usr/GNUstep/System/Applications", appdir, ext, resource); /* falls through */
if (path)
goto out;
path = checkFile(getenv("GNUSTEP_SYSTEM_ROOT"), appdir, ext, resource);
if (path)
goto out;
path = checkFile("/usr/GNUstep", appdir, ext, resource); /* falls through */
out: out:
if (appdir) if (appdir)
+3 -2
View File
@@ -619,11 +619,12 @@ void WMSetBrowserHasScroller(WMBrowser * bPtr, int hasScroller)
bPtr->flags.hasScroller = hasScroller; bPtr->flags.hasScroller = hasScroller;
} }
char *WMSetBrowserPath(WMBrowser * bPtr, char *path) const char *WMSetBrowserPath(WMBrowser * bPtr, const char *path)
{ {
int i; int i;
char *str; char *str;
char *tmp, *retPtr = NULL; char *tmp;
const char *retPtr = NULL;
int item; int item;
WMListItem *listItem; WMListItem *listItem;
+3 -3
View File
@@ -51,7 +51,7 @@ static WMColor *findCloseColor(WMScreen * scr, unsigned short red, unsigned shor
color->refCount = 1; color->refCount = 1;
color->color = xcolor; color->color = xcolor;
color->alpha = alpha; color->alpha = alpha;
color->flags.exact = 1; color->flags.exact = 0;
color->gc = NULL; color->gc = NULL;
return color; return color;
@@ -91,7 +91,7 @@ WMColor *WMCreateRGBColor(WMScreen * scr, unsigned short red, unsigned short gre
color = findCloseColor(scr, red, green, blue, 0xffff); color = findCloseColor(scr, red, green, blue, 0xffff);
} }
if (!color) if (!color)
color = WMBlackColor(scr); color = scr->black;
return color; return color;
} }
@@ -117,7 +117,7 @@ WMColor *WMCreateRGBAColor(WMScreen * scr, unsigned short red, unsigned short gr
color = findCloseColor(scr, red, green, blue, alpha); color = findCloseColor(scr, red, green, blue, alpha);
} }
if (!color) if (!color)
color = WMBlackColor(scr); color = scr->black;
return color; return color;
} }
+33 -30
View File
@@ -44,7 +44,7 @@
# include <X11/extensions/shape.h> # include <X11/extensions/shape.h>
#endif #endif
char *WMColorPanelColorChangedNotification = "WMColorPanelColorChangedNotification"; const char *WMColorPanelColorChangedNotification = "WMColorPanelColorChangedNotification";
/* /*
* Bitmaps for magnifying glass cursor * Bitmaps for magnifying glass cursor
@@ -67,9 +67,6 @@ static unsigned char Cursor_bits[] = {
0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x70 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x70
}; };
/* Cursor shape-mask */
#define Cursor_shape_width 32
#define Cursor_shape_height 32
static unsigned char Cursor_shape_bits[] = { static unsigned char Cursor_shape_bits[] = {
0x00, 0x7e, 0x00, 0x00, 0xc0, 0x81, 0x03, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x08, 0x00, 0x7e, 0x00, 0x00, 0xc0, 0x81, 0x03, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x08,
0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x20, 0x00, 0x02, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x20, 0x00, 0x02, 0x00, 0x40, 0x00, 0x02, 0x00,
@@ -397,7 +394,7 @@ static WMColorPanel *makeColorPanel(WMScreen * scrPtr, const char *name)
panel->mode = WMWheelModeColorPanel; panel->mode = WMWheelModeColorPanel;
panel->lastChanged = 0; panel->lastChanged = 0;
panel->slidersmode = WMRGBModeColorPanel; panel->slidersmode = WMRGBModeColorPanel;
panel->configurationPath = wstrconcat(wusergnusteppath(), "/Library/Colors/"); panel->configurationPath = wstrconcat(wuserdatapath(), "/Colors/");
/* Some General Purpose Widgets */ /* Some General Purpose Widgets */
panel->colorWell = WMCreateColorWell(panel->win); panel->colorWell = WMCreateColorWell(panel->win);
@@ -1162,21 +1159,18 @@ static void readConfiguration(W_ColorPanel * panel)
DIR *dPtr; DIR *dPtr;
struct dirent *dp; struct dirent *dp;
struct stat stat_buf;
int item; int item;
if (stat(panel->configurationPath, &stat_buf) != 0) { if (!wmkdirhier(panel->configurationPath)) {
if (mkdir(panel->configurationPath, S_IRWXU | S_IRGRP | S_IROTH | S_IXGRP | S_IXOTH) != 0) { werror(_("Color Panel: Could not create directory %s needed"
werror(_("Color Panel: Could not create directory %s needed" " to store configurations"), panel->configurationPath);
" to store configurations"), panel->configurationPath); WMSetPopUpButtonEnabled(panel->customPaletteMenuBtn, False);
WMSetPopUpButtonEnabled(panel->customPaletteMenuBtn, False); WMSetPopUpButtonEnabled(panel->colorListColorMenuBtn, False);
WMSetPopUpButtonEnabled(panel->colorListColorMenuBtn, False); WMSetPopUpButtonEnabled(panel->colorListListMenuBtn, False);
WMSetPopUpButtonEnabled(panel->colorListListMenuBtn, False); WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win,
WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win, _("File Error"),
_("File Error"), _("Could not create ColorPanel configuration directory"),
_("Could not create ColorPanel configuration directory"), _("OK"), NULL, NULL);
_("OK"), NULL, NULL);
}
return; return;
} }
@@ -2265,7 +2259,7 @@ static void wheelPositionSelectionOutBounds(W_ColorPanel * panel, int x, int y)
static void wheelUpdateBrightnessGradientFromLocation(W_ColorPanel * panel) static void wheelUpdateBrightnessGradientFromLocation(W_ColorPanel * panel)
{ {
CPColor from; CPColor from = {};
unsigned long ofs; unsigned long ofs;
ofs = panel->coly * panel->wheelMtrx->width + panel->colx; ofs = panel->coly * panel->wheelMtrx->width + panel->colx;
@@ -2388,6 +2382,8 @@ void rgbIntToChar(W_ColorPanel *panel, int *value)
case RGBhex: case RGBhex:
format = "%0X"; format = "%0X";
break; break;
default:
format = "";
} }
sprintf(tmp, format, value[0]); sprintf(tmp, format, value[0]);
@@ -2608,7 +2604,7 @@ static void cmykTextFieldCallback(void *observerData, WMNotification * notificat
static void hsbSliderCallback(WMWidget * w, void *data) static void hsbSliderCallback(WMWidget * w, void *data)
{ {
CPColor cpColor; CPColor cpColor = {};
int value[3]; int value[3];
char tmp[4]; char tmp[4];
W_ColorPanel *panel = (W_ColorPanel *) data; W_ColorPanel *panel = (W_ColorPanel *) data;
@@ -2644,9 +2640,9 @@ static void hsbSliderCallback(WMWidget * w, void *data)
static void hsbTextFieldCallback(void *observerData, WMNotification * notification) static void hsbTextFieldCallback(void *observerData, WMNotification * notification)
{ {
CPColor cpColor; CPColor cpColor = {};
int value[3]; int value[3];
char tmp[4]; char tmp[12]; /* We only 4 bytes needed, but compilers cannot know that */
int n; int n;
W_ColorPanel *panel = (W_ColorPanel *) observerData; W_ColorPanel *panel = (W_ColorPanel *) observerData;
@@ -3399,6 +3395,9 @@ static void rgbInit(W_ColorPanel * panel)
case RGBhex: case RGBhex:
format = "%0X"; format = "%0X";
break; break;
default:
/* Avoid compiler warning */
format = "";
} }
sprintf(tmp, format, panel->color.rgb.red); sprintf(tmp, format, panel->color.rgb.red);
@@ -3451,7 +3450,7 @@ static void hsbInit(W_ColorPanel * panel)
WMSetSliderValue(panel->hsbSaturationS, value[1]); WMSetSliderValue(panel->hsbSaturationS, value[1]);
WMSetSliderValue(panel->hsbBrightnessS, value[2]); WMSetSliderValue(panel->hsbBrightnessS, value[2]);
sprintf(tmp, "%d", value[0]); sprintf(tmp, "%hu", value[0]);
WMSetTextFieldText(panel->hsbHueT, tmp); WMSetTextFieldText(panel->hsbHueT, tmp);
sprintf(tmp, "%d", value[1]); sprintf(tmp, "%d", value[1]);
WMSetTextFieldText(panel->hsbSaturationT, tmp); WMSetTextFieldText(panel->hsbSaturationT, tmp);
@@ -3502,13 +3501,17 @@ static void convertCPColor(CPColor * color)
old_hue = color->hsv.hue; old_hue = color->hsv.hue;
RRGBtoHSV(&(color->rgb), &(color->hsv)); RRGBtoHSV(&(color->rgb), &(color->hsv));
/* In black the hue is undefined, and may change by conversion /*
* Same for white. */ * For pure grey colors, the Hue is generally calculated
if (((color->rgb.red == 0) && * as 0, but in reality the Hue does not matter.
(color->rgb.green == 0) && *
(color->rgb.blue == 0)) || * But in an interactive GUI it is interresting to remember
((color->rgb.red == 0) && (color->rgb.green == 0) && (color->rgb.blue == 255)) * the previous Hue because if user moves away from perfect
) * grey then he could be interrested in finding back his
* previous tint
*/
if ((color->rgb.red == color->rgb.green) &&
(color->rgb.red == color->rgb.blue) )
color->hsv.hue = old_hue; color->hsv.hue = old_hue;
break; break;
case cpHSV: case cpHSV:
+4 -4
View File
@@ -3,7 +3,7 @@
#define XDND_COLOR_DATA_TYPE "application/X-color" #define XDND_COLOR_DATA_TYPE "application/X-color"
char *WMColorWellDidChangeNotification = "WMColorWellDidChangeNotification"; const char *WMColorWellDidChangeNotification = "WMColorWellDidChangeNotification";
typedef struct W_ColorWell { typedef struct W_ColorWell {
W_Class widgetClass; W_Class widgetClass;
@@ -173,10 +173,10 @@ WMColorWell *WMCreateColorWell(WMWidget * parent)
void WMSetColorWellColor(WMColorWell * cPtr, WMColor * color) void WMSetColorWellColor(WMColorWell * cPtr, WMColor * color)
{ {
if (cPtr->color) if (cPtr->color && cPtr->color != color) {
WMReleaseColor(cPtr->color); WMReleaseColor(cPtr->color);
cPtr->color = WMRetainColor(color);
cPtr->color = WMRetainColor(color); }
if (cPtr->colorView->flags.realized && cPtr->colorView->flags.mapped) if (cPtr->colorView->flags.realized && cPtr->colorView->flags.mapped)
paintColorWell(cPtr); paintColorWell(cPtr);
+6
View File
@@ -29,6 +29,12 @@
# define _(text) (text) # define _(text) (text)
#endif #endif
#ifdef HAVE_SECURE_GETENV
#define GETENV(x) secure_getenv((x))
#else
#define GETENV(x) getenv((x))
#endif
#endif /* WINGS_CONFIG_H_ */ #endif /* WINGS_CONFIG_H_ */
+4 -4
View File
@@ -343,7 +343,7 @@ void WMFreeFilePanel(WMFilePanel * panel)
} }
int int
WMRunModalFilePanelForDirectory(WMFilePanel * panel, WMWindow * owner, char *path, const char *name, char **fileTypes) WMRunModalFilePanelForDirectory(WMFilePanel * panel, WMWindow * owner, const char *path, const char *name, char **fileTypes)
{ {
WMScreen *scr = WMWidgetScreen(panel->win); WMScreen *scr = WMWidgetScreen(panel->win);
@@ -387,12 +387,12 @@ WMRunModalFilePanelForDirectory(WMFilePanel * panel, WMWindow * owner, char *pat
return (panel->flags.canceled ? False : True); return (panel->flags.canceled ? False : True);
} }
void WMSetFilePanelDirectory(WMFilePanel * panel, char *path) void WMSetFilePanelDirectory(WMFilePanel * panel, const char *path)
{ {
WMList *list; WMList *list;
WMListItem *item; WMListItem *item;
int col; int col;
char *rest; const char *rest;
rest = WMSetBrowserPath(panel->browser, path); rest = WMSetBrowserPath(panel->browser, path);
if (strcmp(path, "/") == 0) if (strcmp(path, "/") == 0)
@@ -761,7 +761,7 @@ static void goFloppy(WMWidget *widget, void *p_panel)
static void goHome(WMWidget *widget, void *p_panel) static void goHome(WMWidget *widget, void *p_panel)
{ {
WMFilePanel *panel = p_panel; WMFilePanel *panel = p_panel;
char *home; const char *home;
/* Parameter not used, but tell the compiler that it is ok */ /* Parameter not used, but tell the compiler that it is ok */
(void) widget; (void) widget;
+47 -33
View File
@@ -70,37 +70,30 @@ static Bool hasProperty(FcPattern * pattern, const char *property)
return False; return False;
} }
static Bool hasPropertyWithStringValue(FcPattern * pattern, const char *object, const char *value)
{
FcChar8 *str;
int id;
if (!value || value[0] == 0)
return True;
id = 0;
while (FcPatternGetString(pattern, object, id, &str) == FcResultMatch) {
if (strcasecmp(value, (char *)str) == 0) {
return True;
}
id++;
}
return False;
}
static char *makeFontOfSize(const char *font, int size, const char *fallback) static char *makeFontOfSize(const char *font, int size, const char *fallback)
{ {
FcPattern *pattern; FcPattern *pattern = NULL;
char *result; char *result;
if (font[0] == '-') { if (font && font[0] == '-') {
pattern = xlfdToFcPattern(font); pattern = xlfdToFcPattern(font);
} else { } else {
pattern = FcNameParse((const FcChar8 *) font); pattern = FcNameParse((const FcChar8 *) font);
} }
/*FcPatternPrint(pattern); */ if (!pattern) {
wwarning(_("could not load font spec: %s."), font);
if (!fallback)
return NULL;
pattern = FcPatternCreate();
if (!pattern)
return NULL;
if (!FcPatternAddString(pattern, FC_FAMILY, (const FcChar8 *) fallback)) {
wfatal(_("could not load default font spec: %s."), fallback);
FcPatternDestroy(pattern);
return NULL;
}
}
if (size > 0) { if (size > 0) {
FcPatternDel(pattern, FC_PIXEL_SIZE); FcPatternDel(pattern, FC_PIXEL_SIZE);
@@ -109,12 +102,6 @@ static char *makeFontOfSize(const char *font, int size, const char *fallback)
FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)DEFAULT_SIZE); FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)DEFAULT_SIZE);
} }
if (fallback && !hasPropertyWithStringValue(pattern, FC_FAMILY, fallback)) {
FcPatternAddString(pattern, FC_FAMILY, (const FcChar8 *) fallback);
}
/*FcPatternPrint(pattern); */
result = (char *)FcNameUnparse(pattern); result = (char *)FcNameUnparse(pattern);
FcPatternDestroy(pattern); FcPatternDestroy(pattern);
@@ -135,7 +122,7 @@ WMFont *WMCreateFont(WMScreen * scrPtr, const char *fontName)
double size; double size;
#endif #endif
if (fontName[0] == '-') { if (fontName && fontName[0] == '-') {
fname = xlfdToFcName(fontName); fname = xlfdToFcName(fontName);
} else { } else {
fname = wstrdup(fontName); fname = wstrdup(fontName);
@@ -187,6 +174,10 @@ WMFont *WMCreateFont(WMScreen * scrPtr, const char *fontName)
pango_layout_set_font_description(layout, description); pango_layout_set_font_description(layout, description);
font->layout = layout; font->layout = layout;
pango_font_description_free(description);
g_object_unref(context);
FcPatternDestroy(pattern);
#endif #endif
assert(WMHashInsert(scrPtr->fontCache, font->name, font) == NULL); assert(WMHashInsert(scrPtr->fontCache, font->name, font) == NULL);
@@ -210,6 +201,11 @@ void WMReleaseFont(WMFont * font)
font->refCount--; font->refCount--;
if (font->refCount < 1) { if (font->refCount < 1) {
XftFontClose(font->screen->display, font->font); XftFontClose(font->screen->display, font->font);
#ifdef USE_PANGO
if (font->layout) {
g_object_unref(font->layout);
}
#endif
if (font->name) { if (font->name) {
WMHashRemove(font->screen->fontCache, font->name); WMHashRemove(font->screen->fontCache, font->name);
wfree(font->name); wfree(font->name);
@@ -237,6 +233,16 @@ char *WMGetFontName(WMFont * font)
return font->name; return font->name;
} }
void WMGetScaleBaseFromSystemFont(WMScreen *scrPtr, int *alphabetWidth, int *fontHeight)
{
WMFont *font;
font = WMDefaultSystemFont(scrPtr);
*alphabetWidth = WMWidthOfString(font, "abcdefghijklmnopqrstuvwxyz", 26);
*fontHeight = WMFontHeight(font);
WMReleaseFont(font);
}
WMFont *WMDefaultSystemFont(WMScreen * scrPtr) WMFont *WMDefaultSystemFont(WMScreen * scrPtr)
{ {
return WMRetainFont(scrPtr->normalFont); return WMRetainFont(scrPtr->normalFont);
@@ -252,7 +258,11 @@ WMFont *WMSystemFontOfSize(WMScreen * scrPtr, int size)
WMFont *font; WMFont *font;
char *fontSpec; char *fontSpec;
fontSpec = makeFontOfSize(WINGsConfiguration.systemFont, size, NULL); fontSpec = makeFontOfSize(WINGsConfiguration.systemFont, size, DEFAULT_FONT);
if (!fontSpec) {
return NULL;
}
font = WMCreateFont(scrPtr, fontSpec); font = WMCreateFont(scrPtr, fontSpec);
@@ -270,7 +280,11 @@ WMFont *WMBoldSystemFontOfSize(WMScreen * scrPtr, int size)
WMFont *font; WMFont *font;
char *fontSpec; char *fontSpec;
fontSpec = makeFontOfSize(WINGsConfiguration.boldSystemFont, size, NULL); fontSpec = makeFontOfSize(WINGsConfiguration.boldSystemFont, size, DEFAULT_FONT);
if (!fontSpec) {
return NULL;
}
font = WMCreateFont(scrPtr, fontSpec); font = WMCreateFont(scrPtr, fontSpec);
@@ -326,7 +340,7 @@ void WMDrawString(WMScreen * scr, Drawable d, WMColor * color, WMFont * font, in
#ifdef USE_PANGO #ifdef USE_PANGO
previous_text = pango_layout_get_text(font->layout); previous_text = pango_layout_get_text(font->layout);
if ((previous_text == NULL) || (strcmp(text, previous_text) != 0)) if ((previous_text == NULL) || (strncmp(text, previous_text, length) != 0) || previous_text[length] != '\0')
pango_layout_set_text(font->layout, text, length); pango_layout_set_text(font->layout, text, length);
pango_xft_render_layout(scr->xftdraw, &xftcolor, font->layout, x * PANGO_SCALE, y * PANGO_SCALE); pango_xft_render_layout(scr->xftdraw, &xftcolor, font->layout, x * PANGO_SCALE, y * PANGO_SCALE);
#else #else
@@ -364,7 +378,7 @@ WMDrawImageString(WMScreen * scr, Drawable d, WMColor * color, WMColor * backgro
#ifdef USE_PANGO #ifdef USE_PANGO
previous_text = pango_layout_get_text(font->layout); previous_text = pango_layout_get_text(font->layout);
if ((previous_text == NULL) || (strcmp(text, previous_text) != 0)) if ((previous_text == NULL) || (strncmp(text, previous_text, length) != 0) || previous_text[length] != '\0')
pango_layout_set_text(font->layout, text, length); pango_layout_set_text(font->layout, text, length);
pango_xft_render_layout(scr->xftdraw, &textColor, font->layout, x * PANGO_SCALE, y * PANGO_SCALE); pango_xft_render_layout(scr->xftdraw, &textColor, font->layout, x * PANGO_SCALE, y * PANGO_SCALE);
#else #else
+2 -2
View File
@@ -700,7 +700,7 @@ static void typefaceClick(WMWidget * w, void *data)
WM_ITERATE_ARRAY(face->sizes, size, i) { WM_ITERATE_ARRAY(face->sizes, size, i) {
if (size != NULL) { if (size != NULL) {
int size_int = (int) size; int size_int = (intptr_t) size;
sprintf(buffer, "%i", size_int); sprintf(buffer, "%i", size_int);
@@ -802,7 +802,7 @@ static void setFontPanelFontName(FontPanel * panel, const char *family, const ch
char buffer[32]; char buffer[32];
if (vsize != NULL) { if (vsize != NULL) {
int size_int = (int) vsize; int size_int = (intptr_t) vsize;
sprintf(buffer, "%i", size_int); sprintf(buffer, "%i", size_int);
+3
View File
@@ -253,6 +253,9 @@ WMFrame *WMCreateFrame(WMWidget * parent)
static void destroyFrame(Frame * fPtr) static void destroyFrame(Frame * fPtr)
{ {
if (fPtr->textColor)
WMReleaseColor(fPtr->textColor);
if (fPtr->caption) if (fPtr->caption)
wfree(fPtr->caption); wfree(fPtr->caption);
+2 -1
View File
@@ -385,6 +385,7 @@ static void renderPixmap(W_Screen * screen, Pixmap d, Pixmap mask, char **data,
if (mask) if (mask)
XDrawPoint(screen->display, mask, screen->monoGC, x, y); XDrawPoint(screen->display, mask, screen->monoGC, x, y);
/* FALLTHRU */
case '.': case '.':
case 'l': case 'l':
XDrawPoint(screen->display, d, lightGC, x, y); XDrawPoint(screen->display, d, lightGC, x, y);
@@ -944,7 +945,7 @@ void WMSetFocusToWidget(WMWidget * widget)
/* /*
* WMRealizeWidget- * WMRealizeWidget-
* Realizes the widget and all it's children. * Realizes the widget and all its children.
* *
*/ */
void WMRealizeWidget(WMWidget * w) void WMRealizeWidget(WMWidget * w)
+29
View File
@@ -213,3 +213,32 @@ int W_LookupString(W_View *view, XKeyPressedEvent *event, char *buffer, int bufl
#endif #endif
return XLookupString(event, buffer, buflen, keysym, (XComposeStatus *) status); return XLookupString(event, buffer, buflen, keysym, (XComposeStatus *) status);
} }
/*
* Map a keycode to the corresponding keysym
* To replace the deprecated X11 function XKeycodeToKeysym
*/
KeySym W_KeycodeToKeysym(Display *display, KeyCode keycode, int index)
{
static int min_kc = -1;
static int max_kc;
int num_syms;
KeySym *key_syms;
KeySym ks;
XDisplayKeycodes(display, &min_kc, &max_kc);
if (keycode < min_kc || keycode > max_kc || index < 0) {
return NoSymbol;
}
key_syms = XGetKeyboardMapping(display, keycode, 1, &num_syms);
if (index >= num_syms) {
XFree(key_syms);
return NoSymbol;
}
ks = key_syms[index];
XFree(key_syms);
return ks;
}
+500 -11
View File
@@ -1,8 +1,10 @@
#include "WINGsP.h" #include "WINGsP.h"
#include <ctype.h>
#include <strings.h>
char *WMListDidScrollNotification = "WMListDidScrollNotification"; const char *WMListDidScrollNotification = "WMListDidScrollNotification";
char *WMListSelectionDidChangeNotification = "WMListSelectionDidChangeNotification"; const char *WMListSelectionDidChangeNotification = "WMListSelectionDidChangeNotification";
typedef struct W_List { typedef struct W_List {
W_Class widgetClass; W_Class widgetClass;
@@ -27,11 +29,15 @@ typedef struct W_List {
WMHandlerID *idleID; /* for updating the scroller after adding elements */ WMHandlerID *idleID; /* for updating the scroller after adding elements */
WMHandlerID *selectID; /* for selecting items in list while scrolling */ WMHandlerID *selectID; /* for selecting items in list while scrolling */
WMHandlerID *typeaheadID; /* for clearing typeahead buffer */
WMScroller *vScroller; WMScroller *vScroller;
Pixmap doubleBuffer; Pixmap doubleBuffer;
char *typeahead;
int typeaheadLen;
struct { struct {
unsigned int allowMultipleSelection:1; unsigned int allowMultipleSelection:1;
unsigned int allowEmptySelection:1; unsigned int allowEmptySelection:1;
@@ -48,6 +54,7 @@ typedef struct W_List {
#define DEFAULT_HEIGHT 150 #define DEFAULT_HEIGHT 150
#define SCROLL_DELAY 100 #define SCROLL_DELAY 100
#define TYPEAHEAD_CLEAR_DELAY 700
static void destroyList(List * lPtr); static void destroyList(List * lPtr);
static void paintList(List * lPtr); static void paintList(List * lPtr);
@@ -62,6 +69,8 @@ static void scrollBackwardSelecting(void *data);
static void vScrollCallBack(WMWidget * scroller, void *self); static void vScrollCallBack(WMWidget * scroller, void *self);
static void toggleItemSelection(WMList * lPtr, int index); static void toggleItemSelection(WMList * lPtr, int index);
static void jumpToFirstItemWithPrefix(WMList * lPtr, const char *prefix, int prefixLen);
static void typeaheadTimeout(void *data);
static void updateGeometry(WMList * lPtr); static void updateGeometry(WMList * lPtr);
static void didResizeList(W_ViewDelegate * self, WMView * view); static void didResizeList(W_ViewDelegate * self, WMView * view);
@@ -113,6 +122,9 @@ WMList *WMCreateList(WMWidget * parent)
W_Screen *scrPtr = W_VIEW(parent)->screen; W_Screen *scrPtr = W_VIEW(parent)->screen;
lPtr = wmalloc(sizeof(List)); lPtr = wmalloc(sizeof(List));
lPtr->typeahead = NULL;
lPtr->typeaheadLen = 0;
lPtr->typeaheadID = NULL;
lPtr->widgetClass = WC_List; lPtr->widgetClass = WC_List;
@@ -129,7 +141,8 @@ WMList *WMCreateList(WMWidget * parent)
| ClientMessageMask, handleEvents, lPtr); | ClientMessageMask, handleEvents, lPtr);
WMCreateEventHandler(lPtr->view, ButtonPressMask | ButtonReleaseMask WMCreateEventHandler(lPtr->view, ButtonPressMask | ButtonReleaseMask
| EnterWindowMask | LeaveWindowMask | ButtonMotionMask, handleActionEvents, lPtr); | EnterWindowMask | LeaveWindowMask | ButtonMotionMask
| KeyPressMask, handleActionEvents, lPtr);
lPtr->itemHeight = WMFontHeight(scrPtr->normalFont) + 1; lPtr->itemHeight = WMFontHeight(scrPtr->normalFont) + 1;
@@ -288,6 +301,14 @@ void WMClearList(WMList * lPtr)
WMDeleteTimerHandler(lPtr->selectID); WMDeleteTimerHandler(lPtr->selectID);
lPtr->selectID = NULL; lPtr->selectID = NULL;
} }
if (lPtr->typeaheadID) {
WMDeleteTimerHandler(lPtr->typeaheadID);
lPtr->typeaheadID = NULL;
}
if (lPtr->typeahead) {
lPtr->typeahead[0] = '\0';
lPtr->typeaheadLen = 0;
}
if (lPtr->view->flags.realized) { if (lPtr->view->flags.realized) {
updateScroller(lPtr); updateScroller(lPtr);
} }
@@ -495,15 +516,16 @@ static void paintItem(List * lPtr, int index)
static void paintList(List * lPtr) static void paintList(List * lPtr)
{ {
W_Screen *scrPtr = lPtr->view->screen; W_Screen *scrPtr = lPtr->view->screen;
int i, lim; int i, lim, itemCount;
if (!lPtr->view->flags.mapped) if (!lPtr->view->flags.mapped)
return; return;
if (WMGetArrayItemCount(lPtr->items) > 0) { itemCount = WMGetArrayItemCount(lPtr->items);
if (lPtr->topItem + lPtr->fullFitLines + lPtr->flags.dontFitAll > WMGetArrayItemCount(lPtr->items)) { if (itemCount > 0) {
if (lPtr->topItem + lPtr->fullFitLines + lPtr->flags.dontFitAll > itemCount) {
lim = WMGetArrayItemCount(lPtr->items) - lPtr->topItem; lim = itemCount - lPtr->topItem;
XClearArea(scrPtr->display, lPtr->view->window, 19, XClearArea(scrPtr->display, lPtr->view->window, 19,
2 + lim * lPtr->itemHeight, lPtr->view->size.width - 21, 2 + lim * lPtr->itemHeight, lPtr->view->size.width - 21,
lPtr->view->size.height - lim * lPtr->itemHeight - 3, False); lPtr->view->size.height - lim * lPtr->itemHeight - 3, False);
@@ -820,7 +842,7 @@ void WMSetListSelectionToRange(WMList * lPtr, WMRange range)
void WMSelectAllListItems(WMList * lPtr) void WMSelectAllListItems(WMList * lPtr)
{ {
int i; int i, itemCount;
WMListItem *item; WMListItem *item;
if (!lPtr->flags.allowMultipleSelection) if (!lPtr->flags.allowMultipleSelection)
@@ -833,7 +855,8 @@ void WMSelectAllListItems(WMList * lPtr)
WMFreeArray(lPtr->selectedItems); WMFreeArray(lPtr->selectedItems);
lPtr->selectedItems = WMCreateArrayWithArray(lPtr->items); lPtr->selectedItems = WMCreateArrayWithArray(lPtr->items);
for (i = 0; i < WMGetArrayItemCount(lPtr->items); i++) { itemCount = WMGetArrayItemCount(lPtr->items);
for (i = 0; i < itemCount; i++) {
item = WMGetFromArray(lPtr->items, i); item = WMGetFromArray(lPtr->items, i);
if (!item->selected) { if (!item->selected) {
item->selected = 1; item->selected = 1;
@@ -859,10 +882,11 @@ void WMSelectAllListItems(WMList * lPtr)
*/ */
static void unselectAllListItems(WMList * lPtr, WMListItem * exceptThis) static void unselectAllListItems(WMList * lPtr, WMListItem * exceptThis)
{ {
int i; int i, itemCount;
WMListItem *item; WMListItem *item;
for (i = 0; i < WMGetArrayItemCount(lPtr->items); i++) { itemCount = WMGetArrayItemCount(lPtr->items);
for (i = 0; i < itemCount; i++) {
item = WMGetFromArray(lPtr->items, i); item = WMGetFromArray(lPtr->items, i);
if (item != exceptThis && item->selected) { if (item != exceptThis && item->selected) {
item->selected = 0; item->selected = 0;
@@ -920,6 +944,85 @@ static void toggleItemSelection(WMList * lPtr, int index)
} }
} }
static int findItemWithPrefix(List * lPtr, const char *prefix, int prefixLen)
{
if (prefixLen <= 0)
return -1;
int i, itemCount;
itemCount = WMGetArrayItemCount(lPtr->items);
for (i = 0; i < itemCount; i++) {
WMListItem *item = WMGetFromArray(lPtr->items, i);
if (!item || !item->text || item->text[0] == '\0')
continue;
if (strncasecmp(item->text, prefix, prefixLen) == 0)
return i;
}
return -1;
}
static void jumpToFirstItemWithPrefix(WMList * lPtr, const char *prefix, int prefixLen)
{
int index, oldTop, visibleCount;
index = findItemWithPrefix(lPtr, prefix, prefixLen);
if (index < 0)
return;
if (lPtr->flags.allowMultipleSelection) {
WMRange range;
range.position = index;
range.count = 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMSelectListItem(lPtr, index);
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
visibleCount = lPtr->fullFitLines + lPtr->flags.dontFitAll;
if (visibleCount < 1)
visibleCount = 1;
oldTop = lPtr->topItem;
if (index < lPtr->topItem) {
lPtr->topItem = index;
} else {
if (lPtr->flags.dontFitAll) {
if (lPtr->fullFitLines <= 0) {
lPtr->topItem = index;
} else {
int lastFullyVisible = lPtr->topItem + lPtr->fullFitLines - 1;
if (index > lastFullyVisible)
lPtr->topItem = index - lPtr->fullFitLines + 1;
}
} else if (index >= lPtr->topItem + visibleCount) {
lPtr->topItem = index - visibleCount + 1;
}
}
if (lPtr->topItem < 0)
lPtr->topItem = 0;
if (lPtr->view->flags.realized && lPtr->topItem != oldTop)
updateScroller(lPtr);
}
static void typeaheadTimeout(void *data)
{
List *lPtr = (List *) data;
lPtr->typeaheadID = NULL;
if (lPtr->typeahead) {
lPtr->typeahead[0] = '\0';
lPtr->typeaheadLen = 0;
}
}
static void handleActionEvents(XEvent * event, void *data) static void handleActionEvents(XEvent * event, void *data)
{ {
List *lPtr = (List *) data; List *lPtr = (List *) data;
@@ -959,6 +1062,7 @@ static void handleActionEvents(XEvent * event, void *data)
WMDeleteTimerHandler(lPtr->selectID); WMDeleteTimerHandler(lPtr->selectID);
lPtr->selectID = NULL; lPtr->selectID = NULL;
} }
WMSetFocusToWidget(lPtr);
break; break;
case LeaveNotify: case LeaveNotify:
@@ -970,6 +1074,9 @@ static void handleActionEvents(XEvent * event, void *data)
lPtr->selectID = WMAddTimerHandler(SCROLL_DELAY, scrollBackwardSelecting, lPtr); lPtr->selectID = WMAddTimerHandler(SCROLL_DELAY, scrollBackwardSelecting, lPtr);
} }
} }
WMWidget *parentWidget = WMWidgetOfView(lPtr->view->parent);
if (parentWidget)
WMSetFocusToWidget(parentWidget);
break; break;
case ButtonPress: case ButtonPress:
@@ -1076,6 +1183,381 @@ static void handleActionEvents(XEvent * event, void *data)
prevItem = tmp; prevItem = tmp;
} }
break; break;
case KeyPress:
char buffer[16];
KeySym ksym;
Status status;
int len;
WMScreen *scr = lPtr->view->screen;
XWindowAttributes wattr;
if (event->xkey.state & (ControlMask | Mod1Mask))
break;
if (!(XGetWindowAttributes(scr->display, lPtr->view->window, &wattr) && wattr.map_state == IsViewable))
break;
len = W_LookupString(lPtr->view, &event->xkey, buffer, (int)sizeof(buffer) - 1, &ksym, &status);
if (len < 0)
break;
if (len > 0)
buffer[len] = '\0';
/* Handle navigation keys */
switch (ksym) {
case XK_Up: {
int newRow;
int itemCount = WMGetArrayItemCount(lPtr->items);
int cur = WMGetListSelectedItemRow(lPtr);
if (lPtr->flags.allowMultipleSelection && WMGetArrayItemCount(lPtr->selectedItems) > 0) {
WMListItem *lastSel = WMGetFromArray(lPtr->selectedItems, WMGetArrayItemCount(lPtr->selectedItems) - 1);
if (lastSel)
cur = WMGetFirstInArray(lPtr->items, lastSel);
}
if (cur == WLNotFound)
cur = lPtr->topItem;
newRow = cur - 1;
if (newRow < 0)
newRow = 0;
if (newRow != cur && itemCount > 0) {
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = cur;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
/* Ensure visibility */
if (newRow < lPtr->topItem) {
lPtr->topItem = newRow;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
}
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
case XK_Down: {
int newRow;
int itemCount = WMGetArrayItemCount(lPtr->items);
int cur = WMGetListSelectedItemRow(lPtr);
if (lPtr->flags.allowMultipleSelection && WMGetArrayItemCount(lPtr->selectedItems) > 0) {
WMListItem *lastSel = WMGetFromArray(lPtr->selectedItems, WMGetArrayItemCount(lPtr->selectedItems) - 1);
if (lastSel)
cur = WMGetFirstInArray(lPtr->items, lastSel);
}
if (cur == WLNotFound)
cur = lPtr->topItem;
newRow = cur + 1;
if (newRow >= itemCount)
newRow = itemCount - 1;
if (newRow != cur && itemCount > 0) {
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = cur;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
/* Ensure visibility */
if (newRow > (lPtr->topItem + lPtr->fullFitLines - 1)) {
lPtr->topItem = newRow - lPtr->fullFitLines + 1;
if (lPtr->topItem < 0)
lPtr->topItem = 0;
/* Ensure we don't scroll past the end */
if (lPtr->topItem + lPtr->fullFitLines > itemCount)
lPtr->topItem = itemCount - lPtr->fullFitLines;
if (lPtr->topItem < 0)
lPtr->topItem = 0;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
}
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
case XK_Page_Up: {
int newRow;
int page = lPtr->fullFitLines > 0 ? lPtr->fullFitLines : 1;
int cur = WMGetListSelectedItemRow(lPtr);
if (cur == WLNotFound)
cur = lPtr->topItem;
newRow = cur - page;
if (newRow < 0)
newRow = 0;
if (newRow != cur) {
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = cur;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
if (newRow < lPtr->topItem) {
lPtr->topItem = newRow;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
}
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
case XK_Page_Down: {
int newRow;
int page = lPtr->fullFitLines > 0 ? lPtr->fullFitLines : 1;
int itemCount = WMGetArrayItemCount(lPtr->items);
int cur = WMGetListSelectedItemRow(lPtr);
if (cur == WLNotFound)
cur = lPtr->topItem;
newRow = cur + page;
if (newRow >= itemCount)
newRow = itemCount - 1;
if (newRow != cur && itemCount > 0) {
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = cur;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
/* Ensure visibility */
if (newRow > (lPtr->topItem + lPtr->fullFitLines - 1)) {
lPtr->topItem = newRow - lPtr->fullFitLines + 1;
if (lPtr->topItem < 0)
lPtr->topItem = 0;
/* Ensure we don't scroll past the end */
if (lPtr->topItem + lPtr->fullFitLines > itemCount)
lPtr->topItem = itemCount - lPtr->fullFitLines;
if (lPtr->topItem < 0)
lPtr->topItem = 0;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
}
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
case XK_Home: {
int itemCount = WMGetArrayItemCount(lPtr->items);
if (itemCount > 0) {
int newRow = 0;
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = lPtr->topItem;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
if (newRow < lPtr->topItem) {
lPtr->topItem = newRow;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
}
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
case XK_End: {
int itemCount = WMGetArrayItemCount(lPtr->items);
if (itemCount > 0) {
int newRow = itemCount - 1;
if (lPtr->flags.allowMultipleSelection) {
if (event->xkey.state & ShiftMask) {
WMRange range;
int anchor = WMGetListSelectedItemRow(lPtr);
if (anchor == WLNotFound || WMGetArrayItemCount(lPtr->selectedItems) == 0) {
anchor = lPtr->topItem;
}
range.position = anchor;
if (newRow >= anchor)
range.count = newRow - anchor + 1;
else
range.count = newRow - anchor - 1;
WMSetListSelectionToRange(lPtr, range);
} else {
WMRange range = { .position = newRow, .count = 1 };
WMSetListSelectionToRange(lPtr, range);
lastClicked = newRow;
}
} else {
WMSelectListItem(lPtr, newRow);
lastClicked = newRow;
}
/* Ensure the last item is fully visible */
lPtr->topItem = itemCount - lPtr->fullFitLines;
if (lPtr->topItem < 0)
lPtr->topItem = 0;
if (lPtr->view->flags.realized)
updateScroller(lPtr);
/* Trigger action callback */
if (lPtr->action)
(*lPtr->action) (lPtr, lPtr->clientData);
}
break;
}
default:
break;
}
/* If we handled a navigation keysym, avoid falling through to typeahead logic */
if (ksym == XK_Up || ksym == XK_Down || ksym == XK_Page_Up || ksym == XK_Page_Down || ksym == XK_Home || ksym == XK_End)
break;
if (len <= 0)
break;
buffer[len] = '\0';
if (ksym == XK_Escape) {
if (lPtr->typeaheadID) {
WMDeleteTimerHandler(lPtr->typeaheadID);
lPtr->typeaheadID = NULL;
}
if (lPtr->typeahead) {
lPtr->typeahead[0] = '\0';
lPtr->typeaheadLen = 0;
}
break;
}
if (ksym == XK_BackSpace) {
if (lPtr->typeaheadLen > 0 && lPtr->typeahead) {
lPtr->typeaheadLen--;
lPtr->typeahead[lPtr->typeaheadLen] = '\0';
}
} else if (len == 1 && isalnum((unsigned char)buffer[0])) {
if (!lPtr->typeahead) {
lPtr->typeahead = wmalloc(2);
lPtr->typeaheadLen = 0;
}
lPtr->typeahead = wrealloc(lPtr->typeahead, lPtr->typeaheadLen + 2);
lPtr->typeahead[lPtr->typeaheadLen] = buffer[0];
lPtr->typeaheadLen++;
lPtr->typeahead[lPtr->typeaheadLen] = '\0';
} else {
break;
}
if (lPtr->typeaheadLen > 0)
jumpToFirstItemWithPrefix(lPtr, lPtr->typeahead, lPtr->typeaheadLen);
if (lPtr->typeaheadID) {
WMDeleteTimerHandler(lPtr->typeaheadID);
lPtr->typeaheadID = NULL;
}
if (lPtr->typeaheadLen > 0)
lPtr->typeaheadID = WMAddTimerHandler(TYPEAHEAD_CLEAR_DELAY, typeaheadTimeout, lPtr);
break;
} }
if (lPtr->topItem != topItem) if (lPtr->topItem != topItem)
WMPostNotificationName(WMListDidScrollNotification, lPtr, NULL); WMPostNotificationName(WMListDidScrollNotification, lPtr, NULL);
@@ -1123,6 +1605,10 @@ static void destroyList(List * lPtr)
WMDeleteTimerHandler(lPtr->selectID); WMDeleteTimerHandler(lPtr->selectID);
lPtr->selectID = NULL; lPtr->selectID = NULL;
if (lPtr->typeaheadID)
WMDeleteTimerHandler(lPtr->typeaheadID);
lPtr->typeaheadID = NULL;
if (lPtr->selectedItems) if (lPtr->selectedItems)
WMFreeArray(lPtr->selectedItems); WMFreeArray(lPtr->selectedItems);
@@ -1132,6 +1618,9 @@ static void destroyList(List * lPtr)
if (lPtr->doubleBuffer) if (lPtr->doubleBuffer)
XFreePixmap(lPtr->view->screen->display, lPtr->doubleBuffer); XFreePixmap(lPtr->view->screen->display, lPtr->doubleBuffer);
if (lPtr->typeahead)
wfree(lPtr->typeahead);
WMRemoveNotificationObserver(lPtr); WMRemoveNotificationObserver(lPtr);
wfree(lPtr); wfree(lPtr);
+7 -4
View File
@@ -122,11 +122,14 @@ static int fitText(const char *text, WMFont * font, int width, int wrap)
word1 = word2; word1 = word2;
} }
for (i = word1; i < word2; i++) { /* Advance character by character (not byte by byte) */
w = WMWidthOfString(font, text, i); i = word1;
if (w > width) { while (i < word2) {
int next_i = i + oneUTF8CharForward(text + i, word2 - i);
w = WMWidthOfString(font, text, next_i);
if (w > width)
break; break;
} i = next_i;
} }
/* keep words complete if possible */ /* keep words complete if possible */
+290 -10
View File
@@ -25,7 +25,7 @@ static void handleKeyPress(XEvent * event, void *clientData)
XLookupString(&event->xkey, NULL, 0, &ksym, NULL); XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
if (ksym == XK_Return && panel->defBtn) { if ((ksym == XK_Return || ksym == XK_KP_Enter) && panel->defBtn) {
WMPerformButtonClick(panel->defBtn); WMPerformButtonClick(panel->defBtn);
} else if (ksym == XK_Escape) { } else if (ksym == XK_Escape) {
if (panel->altBtn || panel->othBtn) { if (panel->altBtn || panel->othBtn) {
@@ -89,10 +89,12 @@ WMAlertPanel *WMCreateAlertPanel(WMScreen * scrPtr, WMWindow * owner,
const char *alternateButton, const char *otherButton) const char *alternateButton, const char *otherButton)
{ {
WMAlertPanel *panel; WMAlertPanel *panel;
WMFont *defaultFont;
int dw = 0, aw = 0, ow = 0, w; int dw = 0, aw = 0, ow = 0, w;
WMBox *hbox; WMBox *hbox;
WMPixmap *icon; WMPixmap *icon;
defaultFont = WMSystemFontOfSize(scrPtr, 12);
panel = wmalloc(sizeof(WMAlertPanel)); panel = wmalloc(sizeof(WMAlertPanel));
if (owner) { if (owner) {
@@ -160,6 +162,7 @@ WMAlertPanel *WMCreateAlertPanel(WMScreen * scrPtr, WMWindow * owner,
WMFontHeight(scrPtr->normalFont) * 4, 0, 5); WMFontHeight(scrPtr->normalFont) * 4, 0, 5);
WMSetLabelText(panel->mLbl, msg); WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WACenter); WMSetLabelTextAlignment(panel->mLbl, WACenter);
WMSetLabelFont(panel->mLbl, defaultFont);
} }
panel->hbox = WMCreateBox(panel->vbox); panel->hbox = WMCreateBox(panel->vbox);
@@ -170,13 +173,13 @@ WMAlertPanel *WMCreateAlertPanel(WMScreen * scrPtr, WMWindow * owner,
/* create buttons */ /* create buttons */
if (otherButton) if (otherButton)
ow = WMWidthOfString(scrPtr->normalFont, otherButton, strlen(otherButton)); ow = WMWidthOfString(defaultFont, otherButton, strlen(otherButton));
if (alternateButton) if (alternateButton)
aw = WMWidthOfString(scrPtr->normalFont, alternateButton, strlen(alternateButton)); aw = WMWidthOfString(defaultFont, alternateButton, strlen(alternateButton));
if (defaultButton) if (defaultButton)
dw = WMWidthOfString(scrPtr->normalFont, defaultButton, strlen(defaultButton)); dw = WMWidthOfString(defaultFont, defaultButton, strlen(defaultButton));
dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0); dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
@@ -206,18 +209,187 @@ WMAlertPanel *WMCreateAlertPanel(WMScreen * scrPtr, WMWindow * owner,
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow); WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow); WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight); WMSetButtonImagePosition(panel->defBtn, WIPRight);
WMSetButtonFont(panel->defBtn, defaultFont);
} }
if (alternateButton) { if (alternateButton) {
panel->altBtn = WMCreateCommandButton(panel->hbox); panel->altBtn = WMCreateCommandButton(panel->hbox);
WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->altBtn), False, True, aw, 0, 5); WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->altBtn), False, True, aw, 0, 5);
WMSetButtonAction(panel->altBtn, alertPanelOnClick, panel); WMSetButtonAction(panel->altBtn, alertPanelOnClick, panel);
WMSetButtonText(panel->altBtn, alternateButton); WMSetButtonText(panel->altBtn, alternateButton);
WMSetButtonFont(panel->altBtn, defaultFont);
} }
if (otherButton) { if (otherButton) {
panel->othBtn = WMCreateCommandButton(panel->hbox); panel->othBtn = WMCreateCommandButton(panel->hbox);
WMSetButtonAction(panel->othBtn, alertPanelOnClick, panel); WMSetButtonAction(panel->othBtn, alertPanelOnClick, panel);
WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->othBtn), False, True, ow, 0, 5); WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->othBtn), False, True, ow, 0, 5);
WMSetButtonText(panel->othBtn, otherButton); WMSetButtonText(panel->othBtn, otherButton);
WMSetButtonFont(panel->othBtn, defaultFont);
}
WMMapSubwidgets(panel->hbox);
WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask, handleKeyPress, panel);
WMRealizeWidget(panel->win);
WMMapSubwidgets(panel->win);
WMReleaseFont(defaultFont);
return panel;
}
WMAlertPanel *WMCreateScaledAlertPanel(WMScreen * scrPtr, WMWindow * owner,
const char *title, const char *msg, const char *defaultButton,
const char *alternateButton, const char *otherButton)
{
WMAlertPanel *panel;
int dw = 0, aw = 0, ow = 0, w;
WMBox *hbox;
WMPixmap *icon;
int wmScaleWidth, wmScaleHeight;
int pwidth, pheight;
panel = wmalloc(sizeof(WMAlertPanel));
if (owner) {
panel->win = WMCreatePanelWithStyleForWindow(owner, "alertPanel", WMTitledWindowMask);
} else {
panel->win = WMCreateWindowWithStyle(scrPtr, "alertPanel", WMTitledWindowMask);
}
/* calculate and set the panel's size */
WMGetScaleBaseFromSystemFont(scrPtr, &wmScaleWidth, &wmScaleHeight);
pwidth = WMScaleX(400);
pheight = WMScaleY(5) /* upper margin */
+ 64 /* icon size */
+ WMScaleY(5) /* space between icon and divider line */
+ 2 /* divider line */
+ WMScaleY(5); /* space between divider line and message */
if (msg)
pheight += WMFontHeight(scrPtr->normalFont) * 4 + WMScaleY(5);
pheight += WMScaleY(44);
WMResizeWidget(panel->win, pwidth, pheight);
WMSetWindowInitialPosition(panel->win,
(scrPtr->rootView->size.width - pwidth) / 2,
(scrPtr->rootView->size.height - pheight) / 2);
WMSetWindowTitle(panel->win, "");
panel->vbox = WMCreateBox(panel->win);
WMSetViewExpandsToParent(WMWidgetView(panel->vbox), 0, 0, 0, 0);
WMSetBoxHorizontal(panel->vbox, False);
WMMapWidget(panel->vbox);
hbox = WMCreateBox(panel->vbox);
WMSetBoxBorderWidth(hbox, WMScaleX(5));
WMSetBoxHorizontal(hbox, True);
WMMapWidget(hbox);
WMAddBoxSubview(panel->vbox, WMWidgetView(hbox), False, True, 64 + 2 * WMScaleY(5), 0, WMScaleY(5));
panel->iLbl = WMCreateLabel(hbox);
WMSetLabelImagePosition(panel->iLbl, WIPImageOnly);
WMMapWidget(panel->iLbl);
WMAddBoxSubview(hbox, WMWidgetView(panel->iLbl), False, True, 64, 0, 10);
icon = WMCreateApplicationIconBlendedPixmap(scrPtr, (RColor *) NULL);
if (icon) {
WMSetLabelImage(panel->iLbl, icon);
WMReleasePixmap(icon);
} else {
WMSetLabelImage(panel->iLbl, scrPtr->applicationIconPixmap);
}
if (title) {
WMFont *largeFont;
largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
panel->tLbl = WMCreateLabel(hbox);
WMMapWidget(panel->tLbl);
WMAddBoxSubview(hbox, WMWidgetView(panel->tLbl), True, True, 64, 0, 0);
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
WMReleaseFont(largeFont);
}
/* create divider line */
panel->line = WMCreateFrame(panel->win);
WMMapWidget(panel->line);
WMAddBoxSubview(panel->vbox, WMWidgetView(panel->line), False, True, 2, 2, WMScaleY(5));
WMSetFrameRelief(panel->line, WRGroove);
if (msg) {
panel->mLbl = WMCreateLabel(panel->vbox);
WMSetLabelWraps(panel->mLbl, True);
WMMapWidget(panel->mLbl);
WMAddBoxSubview(panel->vbox, WMWidgetView(panel->mLbl), True, True,
WMFontHeight(scrPtr->normalFont) * 4, 0, WMScaleY(5));
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WACenter);
}
panel->hbox = WMCreateBox(panel->vbox);
WMSetBoxBorderWidth(panel->hbox, WMScaleX(10));
WMSetBoxHorizontal(panel->hbox, True);
WMMapWidget(panel->hbox);
WMAddBoxSubview(panel->vbox, WMWidgetView(panel->hbox), False, True, WMScaleY(44), 0, 0);
/* create buttons */
if (otherButton)
ow = WMWidthOfString(scrPtr->normalFont, otherButton, strlen(otherButton));
if (alternateButton)
aw = WMWidthOfString(scrPtr->normalFont, alternateButton, strlen(alternateButton));
if (defaultButton)
dw = WMWidthOfString(scrPtr->normalFont, defaultButton, strlen(defaultButton));
dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
aw += WMScaleX(30);
ow += WMScaleX(30);
dw += WMScaleX(30);
w = WMAX(dw, WMAX(aw, ow));
if ((w + WMScaleX(10)) * 3 < pwidth) {
aw = w;
ow = w;
dw = w;
} else {
int t;
t = pwidth - 4 * WMScaleX(10) - aw - ow - dw;
aw += t / 3;
ow += t / 3;
dw += t / 3;
}
if (defaultButton) {
panel->defBtn = WMCreateCommandButton(panel->hbox);
WMResizeWidget(panel->defBtn, dw, WMScaleY(24));
WMSetButtonAction(panel->defBtn, alertPanelOnClick, panel);
WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->defBtn), False, True, dw, 0, 0);
WMSetButtonText(panel->defBtn, defaultButton);
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight);
}
if (alternateButton) {
panel->altBtn = WMCreateCommandButton(panel->hbox);
WMResizeWidget(panel->altBtn, aw, WMScaleY(24));
WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->altBtn), False, True, aw, 0, WMScaleX(5));
WMSetButtonAction(panel->altBtn, alertPanelOnClick, panel);
WMSetButtonText(panel->altBtn, alternateButton);
}
if (otherButton) {
panel->othBtn = WMCreateCommandButton(panel->hbox);
WMResizeWidget(panel->othBtn, ow, WMScaleY(24));
WMSetButtonAction(panel->othBtn, alertPanelOnClick, panel);
WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->othBtn), False, True, ow, 0, WMScaleX(5));
WMSetButtonText(panel->othBtn, otherButton);
} }
WMMapSubwidgets(panel->hbox); WMMapSubwidgets(panel->hbox);
@@ -249,7 +421,7 @@ static void handleKeyPress2(XEvent * event, void *clientData)
XLookupString(&event->xkey, NULL, 0, &ksym, NULL); XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
if (ksym == XK_Return && panel->defBtn) { if ((ksym == XK_Return || ksym == XK_KP_Enter) && panel->defBtn) {
WMPerformButtonClick(panel->defBtn); WMPerformButtonClick(panel->defBtn);
} else if (ksym == XK_Escape) { } else if (ksym == XK_Escape) {
if (panel->altBtn) { if (panel->altBtn) {
@@ -338,8 +510,10 @@ WMInputPanel *WMCreateInputPanel(WMScreen * scrPtr, WMWindow * owner, const char
const char *defaultText, const char *okButton, const char *cancelButton) const char *defaultText, const char *okButton, const char *cancelButton)
{ {
WMInputPanel *panel; WMInputPanel *panel;
WMFont *defaultFont;
int x, dw = 0, aw = 0, w; int x, dw = 0, aw = 0, w;
defaultFont = WMSystemFontOfSize(scrPtr, 12);
panel = wmalloc(sizeof(WMInputPanel)); panel = wmalloc(sizeof(WMInputPanel));
if (owner) if (owner)
@@ -371,21 +545,23 @@ WMInputPanel *WMCreateInputPanel(WMScreen * scrPtr, WMWindow * owner, const char
WMResizeWidget(panel->mLbl, 320 - 40, WMFontHeight(scrPtr->normalFont) * 2); WMResizeWidget(panel->mLbl, 320 - 40, WMFontHeight(scrPtr->normalFont) * 2);
WMSetLabelText(panel->mLbl, msg); WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WALeft); WMSetLabelTextAlignment(panel->mLbl, WALeft);
WMSetLabelFont(panel->mLbl, defaultFont);
} }
panel->text = WMCreateTextField(panel->win); panel->text = WMCreateTextField(panel->win);
WMMoveWidget(panel->text, 20, 85); WMMoveWidget(panel->text, 20, 85);
WMResizeWidget(panel->text, 320 - 40, WMWidgetHeight(panel->text)); WMResizeWidget(panel->text, 320 - 40, WMWidgetHeight(panel->text));
WMSetTextFieldText(panel->text, defaultText); WMSetTextFieldText(panel->text, defaultText);
WMSetTextFieldFont(panel->text, defaultFont);
WMAddNotificationObserver(endedEditingObserver, panel, WMTextDidEndEditingNotification, panel->text); WMAddNotificationObserver(endedEditingObserver, panel, WMTextDidEndEditingNotification, panel->text);
/* create buttons */ /* create buttons */
if (cancelButton) if (cancelButton)
aw = WMWidthOfString(scrPtr->normalFont, cancelButton, strlen(cancelButton)); aw = WMWidthOfString(defaultFont, cancelButton, strlen(cancelButton));
if (okButton) if (okButton)
dw = WMWidthOfString(scrPtr->normalFont, okButton, strlen(okButton)); dw = WMWidthOfString(defaultFont, okButton, strlen(okButton));
w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0); w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
if (aw > w) if (aw > w)
@@ -406,6 +582,7 @@ WMInputPanel *WMCreateInputPanel(WMScreen * scrPtr, WMWindow * owner, const char
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow); WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow); WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight); WMSetButtonImagePosition(panel->defBtn, WIPRight);
WMSetButtonFont(panel->defBtn, defaultFont);
} }
if (cancelButton) { if (cancelButton) {
x -= w + 10; x -= w + 10;
@@ -415,6 +592,104 @@ WMInputPanel *WMCreateInputPanel(WMScreen * scrPtr, WMWindow * owner, const char
WMMoveWidget(panel->altBtn, x, 124); WMMoveWidget(panel->altBtn, x, 124);
WMResizeWidget(panel->altBtn, w, 24); WMResizeWidget(panel->altBtn, w, 24);
WMSetButtonText(panel->altBtn, cancelButton); WMSetButtonText(panel->altBtn, cancelButton);
WMSetButtonFont(panel->altBtn, defaultFont);
}
WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask, handleKeyPress2, panel);
WMRealizeWidget(panel->win);
WMMapSubwidgets(panel->win);
WMSetFocusToWidget(panel->text);
WMReleaseFont(defaultFont);
return panel;
}
WMInputPanel *WMCreateScaledInputPanel(WMScreen * scrPtr, WMWindow * owner, const char *title, const char *msg,
const char *defaultText, const char *okButton, const char *cancelButton)
{
WMInputPanel *panel;
int x, dw = 0, aw = 0, w;
int wmScaleWidth, wmScaleHeight;
panel = wmalloc(sizeof(WMInputPanel));
if (owner)
panel->win = WMCreatePanelWithStyleForWindow(owner, "inputPanel", WMTitledWindowMask);
else
panel->win = WMCreateWindowWithStyle(scrPtr, "inputPanel", WMTitledWindowMask);
WMSetWindowTitle(panel->win, "");
WMGetScaleBaseFromSystemFont(scrPtr, &wmScaleWidth, &wmScaleHeight);
WMResizeWidget(panel->win, WMScaleX(320), WMScaleY(160));
if (title) {
WMFont *largeFont;
largeFont = WMBoldSystemFontOfSize(scrPtr, WMScaleY(24));
panel->tLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->tLbl, WMScaleX(20), WMScaleY(16));
WMResizeWidget(panel->tLbl, WMScaleX(320) - 2 * WMScaleX(20), WMFontHeight(largeFont) + WMScaleY(4));
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
WMReleaseFont(largeFont);
}
if (msg) {
panel->mLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->mLbl, WMScaleX(20), WMScaleY(50));
WMResizeWidget(panel->mLbl, WMScaleX(320) - 2 * WMScaleX(20), WMFontHeight(scrPtr->normalFont) * 2);
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WALeft);
}
panel->text = WMCreateTextField(panel->win);
WMMoveWidget(panel->text, WMScaleX(20), WMScaleY(85));
WMResizeWidget(panel->text, WMScaleX(320) - 2 * WMScaleX(20), WMScaleY(20));
WMSetTextFieldText(panel->text, defaultText);
WMAddNotificationObserver(endedEditingObserver, panel, WMTextDidEndEditingNotification, panel->text);
/* create buttons */
if (cancelButton)
aw = WMWidthOfString(scrPtr->normalFont, cancelButton, strlen(cancelButton));
if (okButton)
dw = WMWidthOfString(scrPtr->normalFont, okButton, strlen(okButton));
w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
if (aw > w)
w = aw;
w += WMScaleX(30);
x = WMScaleX(310);
if (okButton) {
x -= w + WMScaleX(10);
panel->defBtn = WMCreateCustomButton(panel->win, WBBPushInMask
| WBBPushChangeMask | WBBPushLightMask);
WMSetButtonAction(panel->defBtn, inputBoxOnClick, panel);
WMMoveWidget(panel->defBtn, x, WMScaleY(124));
WMResizeWidget(panel->defBtn, w, WMScaleY(24));
WMSetButtonText(panel->defBtn, okButton);
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight);
}
if (cancelButton) {
x -= w + WMScaleX(10);
panel->altBtn = WMCreateCommandButton(panel->win);
WMSetButtonAction(panel->altBtn, inputBoxOnClick, panel);
WMMoveWidget(panel->altBtn, x, WMScaleY(124));
WMResizeWidget(panel->altBtn, w, WMScaleY(24));
WMSetButtonText(panel->altBtn, cancelButton);
} }
WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask, handleKeyPress2, panel); WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask, handleKeyPress2, panel);
@@ -434,7 +709,7 @@ static void handleKeyPress3(XEvent * event, void *clientData)
XLookupString(&event->xkey, NULL, 0, &ksym, NULL); XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
if (ksym == XK_Return && panel->defBtn) { if ((ksym == XK_Return || ksym == XK_KP_Enter) && panel->defBtn) {
WMPerformButtonClick(panel->defBtn); WMPerformButtonClick(panel->defBtn);
} else if (ksym == XK_Escape) { } else if (ksym == XK_Escape) {
if (panel->altBtn) { if (panel->altBtn) {
@@ -457,10 +732,12 @@ WMGenericPanel *WMCreateGenericPanel(WMScreen * scrPtr, WMWindow * owner,
const char *title, const char *defaultButton, const char *alternateButton) const char *title, const char *defaultButton, const char *alternateButton)
{ {
WMGenericPanel *panel; WMGenericPanel *panel;
WMFont *defaultFont;
int dw = 0, aw = 0, w; int dw = 0, aw = 0, w;
WMBox *hbox; WMBox *hbox;
WMPixmap *icon; WMPixmap *icon;
defaultFont = WMSystemFontOfSize(scrPtr, 12);
panel = wmalloc(sizeof(WMGenericPanel)); panel = wmalloc(sizeof(WMGenericPanel));
if (owner) { if (owner) {
@@ -533,10 +810,10 @@ WMGenericPanel *WMCreateGenericPanel(WMScreen * scrPtr, WMWindow * owner,
/* create buttons */ /* create buttons */
if (defaultButton) if (defaultButton)
dw = WMWidthOfString(scrPtr->normalFont, defaultButton, strlen(defaultButton)); dw = WMWidthOfString(defaultFont, defaultButton, strlen(defaultButton));
if (alternateButton) if (alternateButton)
aw = WMWidthOfString(scrPtr->normalFont, alternateButton, strlen(alternateButton)); aw = WMWidthOfString(defaultFont, alternateButton, strlen(alternateButton));
dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0); dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
@@ -561,6 +838,7 @@ WMGenericPanel *WMCreateGenericPanel(WMScreen * scrPtr, WMWindow * owner,
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow); WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow); WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight); WMSetButtonImagePosition(panel->defBtn, WIPRight);
WMSetButtonFont(panel->defBtn, defaultFont);
} }
WMMapSubwidgets(hbox); WMMapSubwidgets(hbox);
@@ -570,5 +848,7 @@ WMGenericPanel *WMCreateGenericPanel(WMScreen * scrPtr, WMWindow * owner,
WMRealizeWidget(panel->win); WMRealizeWidget(panel->win);
WMMapSubwidgets(panel->win); WMMapSubwidgets(panel->win);
WMReleaseFont(defaultFont);
return panel; return panel;
} }
+50
View File
@@ -252,6 +252,56 @@ WMMenuItem *WMGetPopUpButtonMenuItem(WMPopUpButton * bPtr, int index)
return WMGetFromArray(bPtr->items, index); return WMGetFromArray(bPtr->items, index);
} }
int WMSelectPopUpButtonPreviousItem(WMPopUpButton * bPtr)
{
int testIndex;
CHECK_CLASS(bPtr, WC_PopUpButton);
if (bPtr->flags.pullsDown || bPtr->selectedItemIndex < 0)
return -1;
testIndex = bPtr->selectedItemIndex - 1;
while (testIndex >= 0 && !WMGetPopUpButtonItemEnabled(bPtr, testIndex))
testIndex--;
if (testIndex != -1) {
WMSetPopUpButtonSelectedItem(bPtr, testIndex);
if (bPtr->action)
(*bPtr->action) (bPtr, bPtr->clientData);
return testIndex;
}
return -1;
}
int WMSelectPopUpButtonNextItem(WMPopUpButton * bPtr)
{
int itemCount;
int testIndex;
CHECK_CLASS(bPtr, WC_PopUpButton);
if (bPtr->flags.pullsDown || bPtr->selectedItemIndex < 0)
return -1;
itemCount = WMGetArrayItemCount(bPtr->items);
testIndex = bPtr->selectedItemIndex + 1;
while (testIndex < itemCount && !WMGetPopUpButtonItemEnabled(bPtr, testIndex))
testIndex++;
if (testIndex != itemCount) {
WMSetPopUpButtonSelectedItem(bPtr, testIndex);
if (bPtr->action)
(*bPtr->action) (bPtr, bPtr->clientData);
return testIndex;
}
return -1;
}
static void paintPopUpButton(PopUpButton * bPtr) static void paintPopUpButton(PopUpButton * bPtr)
{ {
W_Screen *scr = bPtr->view->screen; W_Screen *scr = bPtr->view->screen;
+1 -4
View File
@@ -181,10 +181,7 @@ static void drawRulerOnPixmap(Ruler * rPtr)
XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer,
rPtr->fgGC, rPtr->margins.left + m, 23, rPtr->margins.left + m, marks[i % 8] + 23); rPtr->fgGC, rPtr->margins.left + m, 23, rPtr->margins.left + m, marks[i % 8] + 23);
if (i != 0 && i % 8 == 0) { if (i != 0 && i % 8 == 0) {
if (j < 10) snprintf(c, sizeof(c), "%hu", ++j);
snprintf(c, 3, "%d", ++j);
else
snprintf(c, 3, "%2d", ++j);
WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg, WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg,
rPtr->font, rPtr->margins.left + 2 + m, 26, c, 2); rPtr->font, rPtr->margins.left + 2 + m, 26, c, 2);
} }
+1 -1
View File
@@ -20,7 +20,7 @@
#define AUTOSCROLL_DELAY 40 #define AUTOSCROLL_DELAY 40
char *WMScrollerDidScrollNotification = "WMScrollerDidScrollNotification"; const char *WMScrollerDidScrollNotification = "WMScrollerDidScrollNotification";
typedef struct W_Scroller { typedef struct W_Scroller {
W_Class widgetClass; W_Class widgetClass;
-3
View File
@@ -41,9 +41,6 @@ typedef struct W_SplitView {
/* TODO: rewrite --Dan */ /* TODO: rewrite --Dan */
#define _GetSubviewsCount() WMGetArrayItemCount(sPtr->subviews) #define _GetSubviewsCount() WMGetArrayItemCount(sPtr->subviews)
#define _AddPSubviewStruct(P) \
(WMAddToArray(sPtr->subviews,((void*)P)))
#define _GetPSubviewStructAt(i) \ #define _GetPSubviewStructAt(i) \
((W_SplitViewSubview*)WMGetFromArray(sPtr->subviews,(i))) ((W_SplitViewSubview*)WMGetFromArray(sPtr->subviews,(i)))
+31 -15
View File
@@ -166,12 +166,15 @@ typedef struct W_Text {
WMArray *xdndDestinationTypes; WMArray *xdndDestinationTypes;
} Text; } Text;
/* not used */
#if 0
#define NOTIFY(T,C,N,A) {\ #define NOTIFY(T,C,N,A) {\
WMNotification *notif = WMCreateNotification(N,T,A);\ WMNotification *notif = WMCreateNotification(N,T,A);\
if ((T)->delegate && (T)->delegate->C)\ if ((T)->delegate && (T)->delegate->C)\
(*(T)->delegate->C)((T)->delegate,notif);\ (*(T)->delegate->C)((T)->delegate,notif);\
WMPostNotification(notif);\ WMPostNotification(notif);\
WMReleaseNotification(notif);} WMReleaseNotification(notif);}
#endif
#define TYPETEXT 0 #define TYPETEXT 0
@@ -215,6 +218,11 @@ static char *default_bullet[] = {
" ooo " " ooo "
}; };
/* These id are used when sharing the selected text between applications */
static Atom XA_TARGETS = None;
static Atom XA_TEXT = None;
static Atom XA_COMPOUND_TEXT = None;
static void handleEvents(XEvent * event, void *data); static void handleEvents(XEvent * event, void *data);
static void layOutDocument(Text * tPtr); static void layOutDocument(Text * tPtr);
static void updateScrollers(Text * tPtr); static void updateScrollers(Text * tPtr);
@@ -617,7 +625,7 @@ static void paintText(Text * tPtr)
TextBlock *tb; TextBlock *tb;
WMFont *font; WMFont *font;
const char *text; const char *text;
int len, y, c, s, done = False, dir /* 1 = down */ ; int len, y, c, s, done = False, dir; /* dir 1 = down */
WMScreen *scr = tPtr->view->screen; WMScreen *scr = tPtr->view->screen;
Display *dpy = tPtr->view->screen->display; Display *dpy = tPtr->view->screen->display;
Window win = tPtr->view->window; Window win = tPtr->view->window;
@@ -2036,17 +2044,13 @@ static void releaseSelection(Text * tPtr)
static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *cdata, Atom * type) static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *cdata, Atom * type)
{ {
Text *tPtr = view->self; Text *tPtr = view->self;
Display *dpy = tPtr->view->screen->display;
Atom _TARGETS;
Atom TEXT = XInternAtom(dpy, "TEXT", False);
Atom COMPOUND_TEXT = XInternAtom(dpy, "COMPOUND_TEXT", False);
WMData *data = NULL; WMData *data = NULL;
/* Parameter not used, but tell the compiler that it is ok */ /* Parameter not used, but tell the compiler that it is ok */
(void) selection; (void) selection;
(void) cdata; (void) cdata;
if (target == XA_STRING || target == TEXT || target == COMPOUND_TEXT) { if (target == XA_STRING || target == XA_TEXT || target == XA_COMPOUND_TEXT) {
char *text = WMGetTextSelectedStream(tPtr); char *text = WMGetTextSelectedStream(tPtr);
if (text) { if (text) {
@@ -2059,19 +2063,18 @@ static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *
} else } else
printf("didn't get it\n"); printf("didn't get it\n");
_TARGETS = XInternAtom(dpy, "TARGETS", False); if (target == XA_TARGETS) {
if (target == _TARGETS) { Atom supported_type[4];
Atom array[4];
array[0] = _TARGETS; supported_type[0] = XA_TARGETS;
array[1] = XA_STRING; supported_type[1] = XA_STRING;
array[2] = TEXT; supported_type[2] = XA_TEXT;
array[3] = COMPOUND_TEXT; supported_type[3] = XA_COMPOUND_TEXT;
data = WMCreateDataWithBytes(&array, sizeof(array)); data = WMCreateDataWithBytes(supported_type, sizeof(supported_type));
WMSetDataFormat(data, 32); WMSetDataFormat(data, 32);
*type = target; *type = XA_ATOM;
return data; return data;
} }
@@ -2305,6 +2308,7 @@ static void handleTextKeyPress(Text * tPtr, XEvent * event)
case XK_Return: case XK_Return:
*buffer = '\n'; *buffer = '\n';
/* FALLTHRU */
default: default:
if (*buffer != 0 && !control_pressed) { if (*buffer != 0 && !control_pressed) {
insertTextInteractively(tPtr, buffer, strlen(buffer)); insertTextInteractively(tPtr, buffer, strlen(buffer));
@@ -2544,6 +2548,7 @@ static void handleActionEvents(XEvent * event, void *data)
break; break;
} }
/* FALLTHRU */
case ButtonRelease: case ButtonRelease:
if (tPtr->flags.pointerGrabbed) { if (tPtr->flags.pointerGrabbed) {
tPtr->flags.pointerGrabbed = False; tPtr->flags.pointerGrabbed = False;
@@ -2972,6 +2977,17 @@ WMText *WMCreateTextForDocumentType(WMWidget * parent, WMAction * parser, WMActi
dpy = tPtr->view->screen->display; dpy = tPtr->view->screen->display;
scr = tPtr->view->screen; scr = tPtr->view->screen;
if (XA_TARGETS == None) {
/*
* Because the X protocol guaranties that the value will never change in
* the lifespan of the server, we query the values only the first time a
* widget is created
*/
XA_TARGETS = XInternAtom(dpy, "TARGETS", False);
XA_TEXT = XInternAtom(dpy, "TEXT", False);
XA_COMPOUND_TEXT = XInternAtom(dpy, "COMPOUND_TEXT", False);
}
tPtr->view->self = tPtr; tPtr->view->self = tPtr;
tPtr->view->attribs.cursor = scr->textCursor; tPtr->view->attribs.cursor = scr->textCursor;
tPtr->view->attribFlags |= CWOverrideRedirect | CWCursor; tPtr->view->attribFlags |= CWOverrideRedirect | CWCursor;
+108 -93
View File
@@ -10,9 +10,9 @@
#define CURSOR_BLINK_ON_DELAY 600 #define CURSOR_BLINK_ON_DELAY 600
#define CURSOR_BLINK_OFF_DELAY 300 #define CURSOR_BLINK_OFF_DELAY 300
char *WMTextDidChangeNotification = "WMTextDidChangeNotification"; const char *WMTextDidChangeNotification = "WMTextDidChangeNotification";
char *WMTextDidBeginEditingNotification = "WMTextDidBeginEditingNotification"; const char *WMTextDidBeginEditingNotification = "WMTextDidBeginEditingNotification";
char *WMTextDidEndEditingNotification = "WMTextDidEndEditingNotification"; const char *WMTextDidEndEditingNotification = "WMTextDidEndEditingNotification";
typedef struct W_TextField { typedef struct W_TextField {
W_Class widgetClass; W_Class widgetClass;
@@ -122,35 +122,6 @@ static WMSelectionProcs selectionHandler = {
#define TEXT_WIDTH2(tPtr, start, end) (WMWidthOfString((tPtr)->font, \ #define TEXT_WIDTH2(tPtr, start, end) (WMWidthOfString((tPtr)->font, \
&((tPtr)->text[(start)]), (end) - (start))) &((tPtr)->text[(start)]), (end) - (start)))
static inline int oneUTF8CharBackward(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[--pos] >= 0x80 && ustr[pos] <= 0xbf) ;
return pos;
}
static inline int oneUTF8CharForward(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[++pos] >= 0x80 && ustr[pos] <= 0xbf) ;
return pos;
}
// find the beginning of the UTF8 char pointed by str
static inline int seekUTF8CharStart(const char *str, int len)
{
const unsigned char *ustr = (const unsigned char *)str;
int pos = 0;
while (len-- > 0 && ustr[pos] >= 0x80 && ustr[pos] <= 0xbf)
--pos;
return pos;
}
static void normalizeRange(TextField * tPtr, WMRange * range) static void normalizeRange(TextField * tPtr, WMRange * range)
{ {
if (range->position < 0 && range->count < 0) if (range->position < 0 && range->count < 0)
@@ -239,9 +210,9 @@ static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *
TextField *tPtr = view->self; TextField *tPtr = view->self;
int count; int count;
Display *dpy = tPtr->view->screen->display; Display *dpy = tPtr->view->screen->display;
Atom _TARGETS; Atom XA_TARGETS;
Atom TEXT = XInternAtom(dpy, "TEXT", False); Atom XA_TEXT = XInternAtom(dpy, "TEXT", False);
Atom COMPOUND_TEXT = XInternAtom(dpy, "COMPOUND_TEXT", False); Atom XA_COMPOUND_TEXT = XInternAtom(dpy, "COMPOUND_TEXT", False);
WMData *data; WMData *data;
/* Parameter not used, but tell the compiler that it is ok */ /* Parameter not used, but tell the compiler that it is ok */
@@ -251,7 +222,7 @@ static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *
count = tPtr->selection.count < 0 count = tPtr->selection.count < 0
? tPtr->selection.position + tPtr->selection.count : tPtr->selection.position; ? tPtr->selection.position + tPtr->selection.count : tPtr->selection.position;
if (target == XA_STRING || target == TEXT || target == COMPOUND_TEXT) { if (target == XA_STRING || target == XA_TEXT || target == XA_COMPOUND_TEXT) {
data = WMCreateDataWithBytes(&(tPtr->text[count]), abs(tPtr->selection.count)); data = WMCreateDataWithBytes(&(tPtr->text[count]), abs(tPtr->selection.count));
WMSetDataFormat(data, 8); WMSetDataFormat(data, 8);
@@ -260,19 +231,19 @@ static WMData *requestHandler(WMView * view, Atom selection, Atom target, void *
return data; return data;
} }
_TARGETS = XInternAtom(dpy, "TARGETS", False); XA_TARGETS = XInternAtom(dpy, "TARGETS", False);
if (target == _TARGETS) { if (target == XA_TARGETS) {
Atom supported_type[4]; Atom supported_type[4];
supported_type[0] = _TARGETS; supported_type[0] = XA_TARGETS;
supported_type[1] = XA_STRING; supported_type[1] = XA_STRING;
supported_type[2] = TEXT; supported_type[2] = XA_TEXT;
supported_type[3] = COMPOUND_TEXT; supported_type[3] = XA_COMPOUND_TEXT;
data = WMCreateDataWithBytes(supported_type, sizeof(supported_type)); data = WMCreateDataWithBytes(supported_type, sizeof(supported_type));
WMSetDataFormat(data, 32); WMSetDataFormat(data, 32);
*type = target; *type = XA_ATOM;
return data; return data;
} }
@@ -446,6 +417,13 @@ void WMDeleteTextFieldRange(WMTextField * tPtr, WMRange range)
decrToFit(tPtr); decrToFit(tPtr);
/* Ensure cursor is visible after deletion */
if (tPtr->cursorPosition < tPtr->viewPosition) {
tPtr->viewPosition = tPtr->cursorPosition;
} else {
incrToFit2(tPtr);
}
paintTextField(tPtr); paintTextField(tPtr);
} }
@@ -490,11 +468,6 @@ void WMSetTextFieldAlignment(WMTextField * tPtr, WMAlignment alignment)
tPtr->flags.alignment = alignment; tPtr->flags.alignment = alignment;
if (alignment != WALeft) {
wwarning(_("only left alignment is supported in textfields"));
return;
}
if (tPtr->view->flags.realized) { if (tPtr->view->flags.realized) {
paintTextField(tPtr); paintTextField(tPtr);
} }
@@ -661,7 +634,7 @@ static void didResizeTextField(W_ViewDelegate * self, WMView * view)
tPtr->offsetWidth = WMAX((tPtr->view->size.height - WMFontHeight(tPtr->font)) / 2, 1); tPtr->offsetWidth = WMAX((tPtr->view->size.height - WMFontHeight(tPtr->font)) / 2, 1);
tPtr->usableWidth = tPtr->view->size.width - 2 * tPtr->offsetWidth /*+ 2 */ ; tPtr->usableWidth = tPtr->view->size.width - 2 * tPtr->offsetWidth;
} }
static char *makeHiddenString(int length) static char *makeHiddenString(int length)
@@ -846,8 +819,8 @@ static void paintTextField(TextField * tPtr)
count = tPtr->viewPosition; count = tPtr->viewPosition;
} }
rx = tPtr->offsetWidth + 1 + WMWidthOfString(tPtr->font, text, count) rx = tx + WMWidthOfString(tPtr->font, &(text[tPtr->viewPosition]),
- WMWidthOfString(tPtr->font, text, tPtr->viewPosition); count - tPtr->viewPosition);
WMDrawImageString(screen, drawbuffer, color, screen->gray, WMDrawImageString(screen, drawbuffer, color, screen->gray,
tPtr->font, rx, ty, &(text[count]), count2); tPtr->font, rx, ty, &(text[count]), count2);
@@ -942,7 +915,7 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
{ {
char buffer[64]; char buffer[64];
KeySym ksym; KeySym ksym;
char *textEvent = NULL; const char *textEvent = NULL;
void *data = NULL; void *data = NULL;
int count, refresh = 0; int count, refresh = 0;
int control_pressed = 0; int control_pressed = 0;
@@ -965,6 +938,7 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
switch (ksym) { switch (ksym) {
case XK_Tab: case XK_Tab:
#ifdef XK_ISO_Left_Tab #ifdef XK_ISO_Left_Tab
/* FALLTHRU */
case XK_ISO_Left_Tab: case XK_ISO_Left_Tab:
#endif #endif
if (!controled) { if (!controled) {
@@ -1001,8 +975,10 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
break; break;
#ifdef XK_KP_Enter #ifdef XK_KP_Enter
/* FALLTHRU */
case XK_KP_Enter: case XK_KP_Enter:
#endif #endif
/* FALLTHRU */
case XK_Return: case XK_Return:
if (!modified) { if (!modified) {
data = (void *)WMReturnTextMovement; data = (void *)WMReturnTextMovement;
@@ -1019,12 +995,13 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
controled = False; controled = False;
#ifdef XK_KP_Left #ifdef XK_KP_Left
/* FALLTHRU */
case XK_KP_Left: case XK_KP_Left:
#endif #endif
/* FALLTHRU */
case XK_Left: case XK_Left:
if (tPtr->cursorPosition > 0) { if (tPtr->cursorPosition > 0) {
int i; int i;
paintCursor(tPtr);
i = tPtr->cursorPosition; i = tPtr->cursorPosition;
i += oneUTF8CharBackward(&tPtr->text[i], i); i += oneUTF8CharBackward(&tPtr->text[i], i);
@@ -1040,9 +1017,8 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
if (tPtr->cursorPosition < tPtr->viewPosition) { if (tPtr->cursorPosition < tPtr->viewPosition) {
tPtr->viewPosition = tPtr->cursorPosition; tPtr->viewPosition = tPtr->cursorPosition;
refresh = 1; }
} else refresh = 1;
paintCursor(tPtr);
} }
if (shifted) if (shifted)
cancelSelection = 0; cancelSelection = 0;
@@ -1058,12 +1034,13 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
controled = False; controled = False;
#ifdef XK_KP_Right #ifdef XK_KP_Right
/* FALLTHRU */
case XK_KP_Right: case XK_KP_Right:
#endif #endif
/* FALLTHRU */
case XK_Right: case XK_Right:
if (tPtr->cursorPosition < tPtr->textLen) { if (tPtr->cursorPosition < tPtr->textLen) {
int i; int i;
paintCursor(tPtr);
i = tPtr->cursorPosition; i = tPtr->cursorPosition;
if (controled) { if (controled) {
@@ -1076,10 +1053,8 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
} }
tPtr->cursorPosition = i; tPtr->cursorPosition = i;
refresh = incrToFit2(tPtr); incrToFit2(tPtr);
refresh = 1;
if (!refresh)
paintCursor(tPtr);
} }
if (shifted) if (shifted)
cancelSelection = 0; cancelSelection = 0;
@@ -1095,18 +1070,18 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
controled = False; controled = False;
#ifdef XK_KP_Home #ifdef XK_KP_Home
/* FALLTHRU */
case XK_KP_Home: case XK_KP_Home:
#endif #endif
/* FALLTHRU */
case XK_Home: case XK_Home:
if (!controled) { if (!controled) {
if (tPtr->cursorPosition > 0) { if (tPtr->cursorPosition > 0) {
paintCursor(tPtr);
tPtr->cursorPosition = 0; tPtr->cursorPosition = 0;
if (tPtr->viewPosition > 0) { if (tPtr->viewPosition > 0) {
tPtr->viewPosition = 0; tPtr->viewPosition = 0;
refresh = 1; }
} else refresh = 1;
paintCursor(tPtr);
} }
if (shifted) if (shifted)
cancelSelection = 0; cancelSelection = 0;
@@ -1122,19 +1097,18 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
controled = False; controled = False;
#ifdef XK_KP_End #ifdef XK_KP_End
/* FALLTHRU */
case XK_KP_End: case XK_KP_End:
#endif #endif
/* FALLTHRU */
case XK_End: case XK_End:
if (!controled) { if (!controled) {
if (tPtr->cursorPosition < tPtr->textLen) { if (tPtr->cursorPosition < tPtr->textLen) {
paintCursor(tPtr);
tPtr->cursorPosition = tPtr->textLen; tPtr->cursorPosition = tPtr->textLen;
tPtr->viewPosition = 0; tPtr->viewPosition = 0;
refresh = incrToFit(tPtr); incrToFit(tPtr);
refresh = 1;
if (!refresh)
paintCursor(tPtr);
} }
if (shifted) if (shifted)
cancelSelection = 0; cancelSelection = 0;
@@ -1149,6 +1123,7 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
else else
modified = False; modified = False;
/* FALLTHRU */
case XK_BackSpace: case XK_BackSpace:
if (!modified) { if (!modified) {
if (tPtr->selection.count) { if (tPtr->selection.count) {
@@ -1177,8 +1152,10 @@ static void handleTextFieldKeyPress(TextField * tPtr, XEvent * event)
modified = False; modified = False;
#ifdef XK_KP_Delete #ifdef XK_KP_Delete
/* FALLTHRU */
case XK_KP_Delete: case XK_KP_Delete:
#endif #endif
/* FALLTHRU */
case XK_Delete: case XK_Delete:
if (!modified) { if (!modified) {
if (tPtr->selection.count) { if (tPtr->selection.count) {
@@ -1394,7 +1371,25 @@ static void handleTextFieldActionEvents(XEvent * event, void *data)
tPtr->viewPosition); tPtr->viewPosition);
} }
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xmotion.x); if (tPtr->flags.alignment == WARight) {
int textWidth = WMWidthOfString(tPtr->font, tPtr->text, tPtr->textLen);
if (textWidth < tPtr->usableWidth) {
tPtr->cursorPosition = pointToCursorPosition(tPtr,
event->xmotion.x - tPtr->usableWidth + textWidth);
} else {
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xmotion.x);
}
} else if (tPtr->flags.alignment == WACenter) {
int textWidth = WMWidthOfString(tPtr->font, tPtr->text, tPtr->textLen);
if (textWidth < tPtr->usableWidth) {
tPtr->cursorPosition = pointToCursorPosition(tPtr,
event->xmotion.x - (tPtr->usableWidth - textWidth) / 2);
} else {
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xmotion.x);
}
} else {
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xmotion.x);
}
/* Do not allow text selection in secure textfields */ /* Do not allow text selection in secure textfields */
if (tPtr->flags.secure) { if (tPtr->flags.secure) {
@@ -1427,17 +1422,35 @@ static void handleTextFieldActionEvents(XEvent * event, void *data)
if (tPtr->flags.enabled && !tPtr->flags.focused) { if (tPtr->flags.enabled && !tPtr->flags.focused) {
WMSetFocusToWidget(tPtr); WMSetFocusToWidget(tPtr);
} }
if (textWidth < tPtr->usableWidth) {
tPtr->cursorPosition = pointToCursorPosition(tPtr,
event->xbutton.x - tPtr->usableWidth
+ textWidth);
} else
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xbutton.x);
if (tPtr->flags.focused) { if (tPtr->flags.focused) {
tPtr->selection.position = tPtr->cursorPosition; tPtr->selection.position = tPtr->cursorPosition;
tPtr->selection.count = 0; tPtr->selection.count = 0;
} }
paintTextField(tPtr);
break;
case WACenter:
textWidth = WMWidthOfString(tPtr->font, tPtr->text, tPtr->textLen);
if (tPtr->flags.enabled && !tPtr->flags.focused) {
WMSetFocusToWidget(tPtr);
}
if (textWidth < tPtr->usableWidth) { if (textWidth < tPtr->usableWidth) {
tPtr->cursorPosition = pointToCursorPosition(tPtr, tPtr->cursorPosition = pointToCursorPosition(tPtr,
event->xbutton.x - tPtr->usableWidth event->xbutton.x - (tPtr->usableWidth - textWidth) / 2);
+ textWidth); } else {
} else
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xbutton.x); tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xbutton.x);
}
if (tPtr->flags.focused) {
tPtr->selection.position = tPtr->cursorPosition;
tPtr->selection.count = 0;
}
paintTextField(tPtr); paintTextField(tPtr);
break; break;
@@ -1451,29 +1464,31 @@ static void handleTextFieldActionEvents(XEvent * event, void *data)
tPtr->selection.count = 0; tPtr->selection.count = 0;
paintTextField(tPtr); paintTextField(tPtr);
} }
if (event->xbutton.button == Button2 && tPtr->flags.enabled) {
char *text;
int n;
if (!WMRequestSelection(tPtr->view, XA_PRIMARY, XA_STRING,
event->xbutton.time, pasteText, NULL)) {
text = XFetchBuffer(tPtr->view->screen->display, &n, 0);
if (text) {
text[n] = 0;
WMInsertTextFieldText(tPtr, text, tPtr->cursorPosition);
XFree(text);
NOTIFY(tPtr, didChange, WMTextDidChangeNotification,
(void *)WMInsertTextEvent);
}
} else {
tPtr->flags.waitingSelection = 1;
}
}
break; break;
default: default:
break; break;
} }
if (event->xbutton.button == Button2 && tPtr->flags.enabled) {
char *text;
int n;
if (!WMRequestSelection(tPtr->view, XA_PRIMARY, XA_STRING,
event->xbutton.time, pasteText, NULL)) {
text = XFetchBuffer(tPtr->view->screen->display, &n, 0);
if (text) {
text[n] = 0;
WMInsertTextFieldText(tPtr, text, tPtr->cursorPosition);
XFree(text);
NOTIFY(tPtr, didChange, WMTextDidChangeNotification,
(void *)WMInsertTextEvent);
}
} else {
tPtr->flags.waitingSelection = 1;
}
}
break; break;
case ButtonRelease: case ButtonRelease:
+1 -1
View File
@@ -5,7 +5,7 @@
#include "WINGsP.h" #include "WINGsP.h"
void WHandleEvents() void WHandleEvents(void)
{ {
/* Check any expired timers */ /* Check any expired timers */
W_CheckTimerHandlers(); W_CheckTimerHandlers();
+5 -3
View File
@@ -5,9 +5,9 @@
/* the notifications about views */ /* the notifications about views */
char *WMViewSizeDidChangeNotification = "WMViewSizeDidChangeNotification"; const char *WMViewSizeDidChangeNotification = "WMViewSizeDidChangeNotification";
char *WMViewFocusDidChangeNotification = "WMViewFocusDidChangeNotification"; const char *WMViewFocusDidChangeNotification = "WMViewFocusDidChangeNotification";
char *WMViewRealizedNotification = "WMViewRealizedNotification"; const char *WMViewRealizedNotification = "WMViewRealizedNotification";
#define EVENT_MASK \ #define EVENT_MASK \
KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \ KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
@@ -490,6 +490,7 @@ void W_SetViewBackgroundColor(W_View * view, WMColor * color)
view->backColor = WMRetainColor(color); view->backColor = WMRetainColor(color);
view->attribFlags |= CWBackPixel; view->attribFlags |= CWBackPixel;
view->attribFlags &= ~CWBackPixmap;
view->attribs.background_pixel = W_PIXEL(color); view->attribs.background_pixel = W_PIXEL(color);
if (view->flags.realized) { if (view->flags.realized) {
XSetWindowBackground(view->screen->display, view->window, W_PIXEL(color)); XSetWindowBackground(view->screen->display, view->window, W_PIXEL(color));
@@ -504,6 +505,7 @@ void W_SetViewBackgroundPixmap(W_View *view, WMPixmap *pix)
view->backImage = WMRetainPixmap(pix); view->backImage = WMRetainPixmap(pix);
view->attribFlags |= CWBackPixmap; view->attribFlags |= CWBackPixmap;
view->attribFlags &= ~CWBackPixel;
view->attribs.background_pixmap = pix->pixmap; view->attribs.background_pixmap = pix->pixmap;
if (view->flags.realized) { if (view->flags.realized) {
XSetWindowBackgroundPixmap(view->screen->display, view->window, pix->pixmap); XSetWindowBackgroundPixmap(view->screen->display, view->window, pix->pixmap);
+4
View File
@@ -395,7 +395,11 @@ static void setWindowMakerHints(WMWindow * win)
memset(&attribs, 0, sizeof(GNUstepWMAttributes)); memset(&attribs, 0, sizeof(GNUstepWMAttributes));
attribs.flags = GSWindowStyleAttr | GSWindowLevelAttr | GSExtraFlagsAttr; attribs.flags = GSWindowStyleAttr | GSWindowLevelAttr | GSExtraFlagsAttr;
if (win->minSize.width == win->maxSize.width && win->minSize.height == win->maxSize.height)
win->flags.style &= ~WMResizableWindowMask;
attribs.window_style = win->flags.style; attribs.window_style = win->flags.style;
attribs.window_level = win->level; attribs.window_level = win->level;
if (win->flags.documentEdited) if (win->flags.documentEdited)
attribs.extra_flags = GSDocumentEditedFlag; attribs.extra_flags = GSDocumentEditedFlag;
+33 -12
View File
@@ -446,12 +446,18 @@ static void str2rcolor(RContext * rc, const char *name, RColor * color)
{ {
XColor xcolor; XColor xcolor;
XParseColor(rc->dpy, rc->cmap, name, &xcolor); if (XParseColor(rc->dpy, rc->cmap, name, &xcolor) != 0) {
color->alpha = 255;
color->alpha = 255; color->red = xcolor.red >> 8;
color->red = xcolor.red >> 8; color->green = xcolor.green >> 8;
color->green = xcolor.green >> 8; color->blue = xcolor.blue >> 8;
color->blue = xcolor.blue >> 8; } else {
/* Color Name was not found - Return white instead */
color->alpha = 255;
color->red = 255;
color->green = 255;
color->blue = 255;
}
} }
static void dumpRImage(const char *path, RImage * image) static void dumpRImage(const char *path, RImage * image)
@@ -611,6 +617,7 @@ static Pixmap renderTexture(WMScreen * scr, WMPropList * texture, int width, int
break; break;
default: default:
wwarning(_("unknown direction in '%s', falling back to diagonal"), type); wwarning(_("unknown direction in '%s', falling back to diagonal"), type);
/* FALLTHRU */
case 'D': case 'D':
style = RDiagonalGradient; style = RDiagonalGradient;
break; break;
@@ -637,6 +644,7 @@ static Pixmap renderTexture(WMScreen * scr, WMPropList * texture, int width, int
break; break;
default: default:
wwarning(_("unknown direction in '%s', falling back to diagonal"), type); wwarning(_("unknown direction in '%s', falling back to diagonal"), type);
/* FALLTHRU */
case 'D': case 'D':
style = RDiagonalGradient; style = RDiagonalGradient;
break; break;
@@ -671,6 +679,7 @@ static Pixmap renderTexture(WMScreen * scr, WMPropList * texture, int width, int
break; break;
default: default:
wwarning(_("unknown direction in '%s', falling back to diagonal"), type); wwarning(_("unknown direction in '%s', falling back to diagonal"), type);
/* FALLTHRU */
case 'D': case 'D':
style = RDiagonalGradient; style = RDiagonalGradient;
break; break;
@@ -1067,6 +1076,8 @@ static void deleteTexture(WMWidget * w, void *data)
(void) w; (void) w;
section = WMGetPopUpButtonSelectedItem(panel->secP); section = WMGetPopUpButtonSelectedItem(panel->secP);
if (section < 0)
return;
row = WMGetListSelectedItemRow(panel->texLs); row = WMGetListSelectedItemRow(panel->texLs);
item = WMGetListItem(panel->texLs, row); item = WMGetListItem(panel->texLs, row);
titem = (TextureListItem *) item->clientData; titem = (TextureListItem *) item->clientData;
@@ -1125,6 +1136,8 @@ static void changePage(WMWidget * w, void *data)
if (w) { if (w) {
section = WMGetPopUpButtonSelectedItem(panel->secP); section = WMGetPopUpButtonSelectedItem(panel->secP);
if (section < 0)
return;
WMSelectListItem(panel->texLs, panel->textureIndex[section]); WMSelectListItem(panel->texLs, panel->textureIndex[section]);
@@ -1224,6 +1237,8 @@ static void textureDoubleClick(WMWidget * w, void *data)
/* unselect old texture */ /* unselect old texture */
section = WMGetPopUpButtonSelectedItem(panel->secP); section = WMGetPopUpButtonSelectedItem(panel->secP);
if (section < 0)
return;
item = WMGetListItem(panel->texLs, panel->textureIndex[section]); item = WMGetListItem(panel->texLs, panel->textureIndex[section]);
titem = (TextureListItem *) item->clientData; titem = (TextureListItem *) item->clientData;
@@ -1252,7 +1267,7 @@ static void paintListItem(WMList * lPtr, int index, Drawable d, char *text, int
{ {
_Panel *panel = (_Panel *) WMGetHangedData(lPtr); _Panel *panel = (_Panel *) WMGetHangedData(lPtr);
WMScreen *scr = WMWidgetScreen(lPtr); WMScreen *scr = WMWidgetScreen(lPtr);
int width, height, x, y; int width, height, x, y, tmp;
Display *dpy = WMScreenDisplay(scr); Display *dpy = WMScreenDisplay(scr);
WMColor *back = (state & WLDSSelected) ? WMWhiteColor(scr) : WMGrayColor(scr); WMColor *back = (state & WLDSSelected) ? WMWhiteColor(scr) : WMGrayColor(scr);
WMListItem *item; WMListItem *item;
@@ -1281,7 +1296,8 @@ static void paintListItem(WMList * lPtr, int index, Drawable d, char *text, int
XCopyArea(dpy, titem->preview, d, WMColorGC(black), 0, 0, XCopyArea(dpy, titem->preview, d, WMColorGC(black), 0, 0,
TEXPREV_WIDTH, TEXPREV_HEIGHT, x + 5, y + 5); TEXPREV_WIDTH, TEXPREV_HEIGHT, x + 5, y + 5);
if ((1 << WMGetPopUpButtonSelectedItem(panel->secP)) & titem->selectedFor) tmp = WMGetPopUpButtonSelectedItem(panel->secP);
if ((tmp >= 0) && ((1 << tmp) & titem->selectedFor))
WMDrawPixmap(panel->onLed, d, x + TEXPREV_WIDTH + 10, y + 6); WMDrawPixmap(panel->onLed, d, x + TEXPREV_WIDTH + 10, y + 6);
else if (titem->selectedFor) else if (titem->selectedFor)
WMDrawPixmap(panel->offLed, d, x + TEXPREV_WIDTH + 10, y + 6); WMDrawPixmap(panel->offLed, d, x + TEXPREV_WIDTH + 10, y + 6);
@@ -1416,6 +1432,10 @@ static void changeColorPage(WMWidget * w, void *data)
WMScreen *scr = WMWidgetScreen(panel->box); WMScreen *scr = WMWidgetScreen(panel->box);
RContext *rc = WMScreenRContext(scr); RContext *rc = WMScreenRContext(scr);
section = WMGetPopUpButtonSelectedItem(panel->colP);
if (section < 0)
return;
if (panel->preview) { if (panel->preview) {
GC gc; GC gc;
@@ -1427,7 +1447,6 @@ static void changeColorPage(WMWidget * w, void *data)
colorOptions[panel->oldcsection].hand.y); colorOptions[panel->oldcsection].hand.y);
} }
if (w) { if (w) {
section = WMGetPopUpButtonSelectedItem(panel->colP);
panel->oldcsection = section; panel->oldcsection = section;
if (panel->preview) if (panel->preview)
@@ -1728,6 +1747,8 @@ static void colorWellObserver(void *self, WMNotification * n)
(void) n; (void) n;
p = WMGetPopUpButtonSelectedItem(panel->colP); p = WMGetPopUpButtonSelectedItem(panel->colP);
if (p < 0)
return;
WMReleaseColor(panel->colors[p]); WMReleaseColor(panel->colors[p]);
@@ -1819,10 +1840,10 @@ static void createPanel(Panel * p)
char *tmp; char *tmp;
Bool ok = True; Bool ok = True;
panel->fprefix = wstrconcat(wusergnusteppath(), "/Library/WindowMaker"); panel->fprefix = wstrconcat(wuserdatapath(), "/" PACKAGE_TARNAME);
if (access(panel->fprefix, F_OK) != 0) { if (access(panel->fprefix, F_OK) != 0) {
if (mkdir(panel->fprefix, 0755) < 0) { if (-1 == mkdir(panel->fprefix, 0755) && errno != EEXIST) {
werror("%s", panel->fprefix); werror("%s", panel->fprefix);
ok = False; ok = False;
} }
@@ -1832,7 +1853,7 @@ static void createPanel(Panel * p)
wfree(panel->fprefix); wfree(panel->fprefix);
panel->fprefix = tmp; panel->fprefix = tmp;
if (access(panel->fprefix, F_OK) != 0) { if (access(panel->fprefix, F_OK) != 0) {
if (mkdir(panel->fprefix, 0755) < 0) { if (-1 == mkdir(panel->fprefix, 0755) && errno != EEXIST) {
werror("%s", panel->fprefix); werror("%s", panel->fprefix);
} }
} }
+188 -9
View File
@@ -2,8 +2,9 @@
* *
* WPrefs - Window Maker Preferences Program * WPrefs - Window Maker Preferences Program
* *
* Copyright (c) 2014 Window Maker Team * Copyright (c) 2014-2023 Window Maker Team
* Copyright (c) 1998-2003 Alfredo K. Kojima * Copyright (c) 1998-2003 Alfredo K. Kojima
* Copyright (c) 2009-2026 Window Maker Team
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -25,7 +26,7 @@
/* This structure containts the list of all the check-buttons to display in the /* This structure containts the list of all the check-buttons to display in the
* expert tab of the window with the corresponding information for effect * expert tab of the window with the corresponding information for effect
*/ */
static const struct { static struct expert_option {
const char *label; /* Text displayed to user */ const char *label; /* Text displayed to user */
int def_state; /* True/False: the default value, if not defined in current config */ int def_state; /* True/False: the default value, if not defined in current config */
@@ -71,9 +72,15 @@ static const struct {
{ N_("Cycle windows only on the active head."), { N_("Cycle windows only on the active head."),
/* default: */ False, OPTION_WMAKER, "CycleActiveHeadOnly" }, /* default: */ False, OPTION_WMAKER, "CycleActiveHeadOnly" },
{ N_("Cycle all windows from all workspaces."),
/* default: */ False, OPTION_WMAKER, "CycleAllWorkspaces" },
{ N_("Ignore minimized windows when cycling."), { N_("Ignore minimized windows when cycling."),
/* default: */ False, OPTION_WMAKER, "CycleIgnoreMinimized" }, /* default: */ False, OPTION_WMAKER, "CycleIgnoreMinimized" },
{ N_("Show app icons in window list."),
/* default: */ False, OPTION_WMAKER, "WindowListAppIcons" },
{ N_("Show switch panel when cycling windows."), { N_("Show switch panel when cycling windows."),
/* default: */ True, OPTION_WMAKER_ARRAY, "SwitchPanelImages" }, /* default: */ True, OPTION_WMAKER_ARRAY, "SwitchPanelImages" },
@@ -88,7 +95,7 @@ static const struct {
/* default: */ False, OPTION_WMAKER, "KbdModeLock" }, /* default: */ False, OPTION_WMAKER, "KbdModeLock" },
#endif /* XKB_MODELOCK */ #endif /* XKB_MODELOCK */
{ N_("Maximize (snap) a window to edge or corner by dragging."), { N_("Snap a window to edge or corner by dragging."),
/* default: */ False, OPTION_WMAKER, "WindowSnapping" }, /* default: */ False, OPTION_WMAKER, "WindowSnapping" },
{ N_("Distance from edge to begin window snap."), { N_("Distance from edge to begin window snap."),
@@ -97,9 +104,39 @@ static const struct {
{ N_("Distance from corner to begin window snap."), { N_("Distance from corner to begin window snap."),
/* default: */ 10, OPTION_WMAKER_INT, "SnapCornerDetect" }, /* default: */ 10, OPTION_WMAKER_INT, "SnapCornerDetect" },
{ N_("Open dialogs in the same workspace as their owners."), { N_("Snap a window to the top to maximize it to the full screen."),
/* default: */ False, OPTION_WMAKER, "OpenTransientOnOwnerWorkspace" } /* default: */ False, OPTION_WMAKER, "SnapToTopMaximizesFullscreen" },
{ N_("Allow move half-maximized windows between multiple screens."),
/* default: */ False, OPTION_WMAKER, "MoveHalfMaximizedWindowsBetweenScreens" },
{ N_("Alternative transitions between states for half maximized windows."),
/* default: */ False, OPTION_WMAKER, "AlternativeHalfMaximized" },
{ N_("Move mouse pointer with half maximized windows."),
/* default: */ False, OPTION_WMAKER, "PointerWithHalfMaxWindows" },
{ N_("Open dialogs in the same workspace as their owners."),
/* default: */ False, OPTION_WMAKER, "OpenTransientOnOwnerWorkspace" },
{ N_("Wrap dock-attached icons around the screen edges."),
/* default: */ True, OPTION_WMAKER, "WrapAppiconsInDock" },
{ N_("Double click on titlebar maximizes/minimizes a window to/from full screen."),
/* default: */ False, OPTION_WMAKER, "DbClickFullScreen" },
{ N_("Close rootmenu when mouse (left or right) is clicked outside focus."),
/* default: */ False, OPTION_WMAKER, "CloseRootMenuByLeftOrRightMouseClick" },
{ N_("Keep dock on primary head."),
/* default: */ False, OPTION_WMAKER, "KeepDockOnPrimaryHead"},
{ N_("Allow windows to take focus using mouse wheel."),
/* default: */ False, OPTION_WMAKER, "MouseWheelFocus"},
#ifdef USE_RANDR
{ N_("Automatically (de)activate monitors on hotplug events."),
/* default: */ False, OPTION_WMAKER, "HotplugMonitor"},
#endif
}; };
@@ -117,6 +154,8 @@ typedef struct _Panel {
WMButton *swi[wlengthof_nocheck(expert_options)]; WMButton *swi[wlengthof_nocheck(expert_options)];
WMTextField *textfield[wlengthof_nocheck(expert_options)]; WMTextField *textfield[wlengthof_nocheck(expert_options)];
WMScrollView *sv;
WMWidget *frame;
} _Panel; } _Panel;
@@ -125,15 +164,134 @@ typedef struct _Panel {
static void changeIntTextfield(void *data, int delta) static void changeIntTextfield(void *data, int delta)
{ {
WMTextField *textfield; WMTextField *textfield;
char *text; char *text, buffer[12];
int value; int value;
textfield = (WMTextField *)data; textfield = (WMTextField *)data;
text = WMGetTextFieldText(textfield); text = WMGetTextFieldText(textfield);
value = atoi(text); value = atoi(text);
wfree(text);
value += delta; value += delta;
sprintf(text, "%d", value); sprintf(buffer, "%d", value);
WMSetTextFieldText(textfield, text); WMSetTextFieldText(textfield, buffer);
}
static void scrollViewWheelHandler(XEvent *event, void *data)
{
_Panel *panel = (_Panel *) data;
int amount, viewH, contentH, newY, maxY;
WMRect rect;
WMPoint pt;
if (!panel || !panel->sv || !panel->frame)
return;
if (event->type != ButtonPress)
return;
if (event->xbutton.button != WINGsConfiguration.mouseWheelUp &&
event->xbutton.button != WINGsConfiguration.mouseWheelDown)
return;
rect = WMGetScrollViewVisibleRect(panel->sv);
viewH = rect.size.height;
contentH = WMWidgetHeight(panel->frame);
if (event->xbutton.state & ControlMask) {
amount = viewH; /* page */
} else if (event->xbutton.state & ShiftMask) {
amount = 1; /* line */
} else {
amount = viewH / 3; /* default */
if (amount == 0)
amount = 1;
}
if (event->xbutton.button == WINGsConfiguration.mouseWheelUp)
amount = -amount;
newY = rect.pos.y + amount;
maxY = contentH - viewH;
if (maxY < 0)
maxY = 0;
if (newY < 0)
newY = 0;
if (newY > maxY)
newY = maxY;
pt.x = rect.pos.x;
pt.y = newY;
WMScrollViewScrollPoint(panel->sv, pt);
}
static void scrollViewRealizeObserver(void *self, WMNotification *not)
{
(void) not;
_Panel *panel = (_Panel *) self;
Display *dpy = NULL;
Window viewport_win = 0;
WMView *frameView;
if (!panel || !panel->frame)
return;
frameView = WMWidgetView(panel->frame);
if (frameView && frameView->parent) {
dpy = frameView->screen->display;
viewport_win = frameView->parent->window;
}
/* fallback: use the scrollview's view window if parent viewport not available */
if (!viewport_win && panel->sv) {
WMView *svView = WMWidgetView(panel->sv);
if (svView && svView->screen) {
dpy = svView->screen->display;
viewport_win = svView->window;
}
}
if (!dpy || viewport_win == 0)
return;
XGrabButton(dpy, WINGsConfiguration.mouseWheelUp, AnyModifier, viewport_win,
True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(dpy, WINGsConfiguration.mouseWheelDown, AnyModifier, viewport_win,
True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
}
static void scrollViewPrepareForClose(Panel *p)
{
_Panel *panel = (_Panel *) p;
Display *dpy = NULL;
Window viewport_win = 0;
if (!panel)
return;
if (panel->frame) {
WMView *frameView = WMWidgetView(panel->frame);
if (frameView && frameView->parent) {
dpy = frameView->screen->display;
viewport_win = frameView->parent->window;
}
}
if (!viewport_win && panel->sv) {
WMView *svView = WMWidgetView(panel->sv);
if (svView && svView->screen) {
dpy = svView->screen->display;
viewport_win = svView->window;
}
}
if (dpy && viewport_win != 0) {
XUngrabButton(dpy, WINGsConfiguration.mouseWheelUp, AnyModifier, viewport_win);
XUngrabButton(dpy, WINGsConfiguration.mouseWheelDown, AnyModifier, viewport_win);
}
WMRemoveNotificationObserver(panel);
} }
static void downButtonCallback(WMWidget *self, void *data) static void downButtonCallback(WMWidget *self, void *data)
@@ -148,6 +306,19 @@ static void upButtonCallback(WMWidget *self, void *data)
changeIntTextfield(data, 1); changeIntTextfield(data, 1);
} }
static int cmpExpertOptions(const void *v1, const void *v2)
{
int rc;
const struct expert_option *opt1 = (struct expert_option *)v1;
const struct expert_option *opt2 = (struct expert_option *)v2;
if ((rc = strcmp(opt1->label, opt2->label)) < 0)
return -1;
else if (rc > 0)
return 1;
return 0;
}
static void createPanel(Panel *p) static void createPanel(Panel *p)
{ {
_Panel *panel = (_Panel *) p; _Panel *panel = (_Panel *) p;
@@ -171,6 +342,7 @@ static void createPanel(Panel *p)
WMSetFrameRelief(f, WRFlat); WMSetFrameRelief(f, WRFlat);
udb = WMGetStandardUserDefaults(); udb = WMGetStandardUserDefaults();
qsort(expert_options, wlengthof(expert_options), sizeof(expert_options[0]), cmpExpertOptions);
for (i = 0; i < wlengthof(expert_options); i++) { for (i = 0; i < wlengthof(expert_options); i++) {
if (expert_options[i].class != OPTION_WMAKER_INT) { if (expert_options[i].class != OPTION_WMAKER_INT) {
panel->swi[i] = WMCreateSwitchButton(f); panel->swi[i] = WMCreateSwitchButton(f);
@@ -245,7 +417,7 @@ static void createPanel(Panel *p)
default: default:
#ifdef DEBUG #ifdef DEBUG
wwarning("export_options[%d].class = %d, this should not happen\n", wwarning("expert_options[%d].class = %d, this should not happen\n",
i, expert_options[i].class); i, expert_options[i].class);
#endif #endif
state = expert_options[i].def_state; state = expert_options[i].def_state;
@@ -257,6 +429,11 @@ static void createPanel(Panel *p)
WMMapSubwidgets(panel->box); WMMapSubwidgets(panel->box);
WMSetScrollViewContentView(sv, WMWidgetView(f)); WMSetScrollViewContentView(sv, WMWidgetView(f));
/* keep references for the wheel handler and register it */
panel->sv = sv;
panel->frame = f;
WMCreateEventHandler(WMWidgetView(sv), ButtonPressMask, scrollViewWheelHandler, panel);
WMAddNotificationObserver(scrollViewRealizeObserver, panel, WMViewRealizedNotification, WMWidgetView(sv));
WMRealizeWidget(panel->box); WMRealizeWidget(panel->box);
} }
@@ -293,6 +470,7 @@ static void storeDefaults(_Panel *panel)
text = WMGetTextFieldText(panel->textfield[i]); text = WMGetTextFieldText(panel->textfield[i]);
value = atoi(text); value = atoi(text);
wfree(text);
SetIntegerForKey(value, expert_options[i].op_name); SetIntegerForKey(value, expert_options[i].op_name);
break; break;
@@ -316,6 +494,7 @@ Panel *InitExpert(WMWidget *parent)
panel->callbacks.createWidgets = createPanel; panel->callbacks.createWidgets = createPanel;
panel->callbacks.updateDomain = storeDefaults; panel->callbacks.updateDomain = storeDefaults;
panel->callbacks.prepareForClose = scrollViewPrepareForClose;
AddSection(panel, ICON_FILE); AddSection(panel, ICON_FILE);
+10 -13
View File
@@ -22,6 +22,7 @@
#include "WPrefs.h" #include "WPrefs.h"
#include <unistd.h> #include <unistd.h>
#include <fontconfig/fontconfig.h> #include <fontconfig/fontconfig.h>
#include <math.h>
/* workaround for older fontconfig, that doesn't define these constants */ /* workaround for older fontconfig, that doesn't define these constants */
#ifndef FC_WEIGHT_NORMAL #ifndef FC_WEIGHT_NORMAL
@@ -521,7 +522,7 @@ static void selectedOption(WMWidget * w, void *data)
WMListItem *item = WMGetListItem(panel->sizeL, i); WMListItem *item = WMGetListItem(panel->sizeL, i);
int distance; int distance;
distance = abs(size - atoi(item->text)); distance = fabs(size - atoi(item->text));
if (i == 0 || distance < closest) { if (i == 0 || distance < closest) {
closest = distance; closest = distance;
@@ -569,6 +570,9 @@ static void showData(_Panel * panel)
{ {
int i; int i;
WMMenuItem *item; WMMenuItem *item;
WMScreen *scr;
scr = WMWidgetScreen(panel->parent);
for (i = 0; i < WMGetPopUpButtonNumberOfItems(panel->optionP); i++) { for (i = 0; i < WMGetPopUpButtonNumberOfItems(panel->optionP); i++) {
char *ofont, *font; char *ofont, *font;
@@ -579,19 +583,12 @@ static void showData(_Panel * panel)
if (ofont) if (ofont)
wfree(ofont); wfree(ofont);
if (strcmp(fontOptions[i].option, "SystemFont") == 0 || if (strcmp(fontOptions[i].option, "SystemFont") == 0)
strcmp(fontOptions[i].option, "BoldSystemFont") == 0) { font = WMGetFontName(WMDefaultSystemFont(scr));
char *path; else if (strcmp(fontOptions[i].option, "BoldSystemFont") == 0)
WMUserDefaults *defaults; font = WMGetFontName(WMDefaultBoldSystemFont(scr));
else
path = wdefaultspathfordomain("WMGLOBAL");
defaults = WMGetDefaultsFromPath(path);
wfree(path);
font = WMGetUDStringForKey(defaults,
fontOptions[i].option);
} else {
font = GetStringForKey(fontOptions[i].option); font = GetStringForKey(fontOptions[i].option);
}
if (font) if (font)
font = wstrdup(font); font = wstrdup(font);
WMSetMenuItemRepresentedObject(item, font); WMSetMenuItemRepresentedObject(item, font);
+465
View File
@@ -0,0 +1,465 @@
/* HotCornerShortcuts.c - screen corners actions
*
* WPrefs - Window Maker Preferences Program
*
* Copyright (c) 2023 Window Maker Team
*
* 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.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "WPrefs.h"
typedef struct _Panel {
WMBox *box;
char *sectionName;
char *description;
CallbackRec callbacks;
WMWidget *parent;
WMPixmap *icon;
Pixmap quarter[4];
WMFrame *hcF;
WMButton *hcB;
WMFrame *hceF;
WMSlider *hceS;
WMLabel *hceL;
WMFrame *hcdescF;
WMLabel *hcdescL;
WMFrame *hcdelayF;
WMButton *hcdelayB[5];
WMTextField *hcdelayT;
WMLabel *hcdelayL;
WMLabel *icornerL;
WMFrame *hcactionsF;
WMTextField *hcactionsT[4];
char hotcornerDelaySelected;
} _Panel;
#define ICON_FILE "hotcorners"
#define DELAY_ICON "timer%i"
#define DELAY_ICON_S "timer%is"
static void edgeCallback(WMWidget * w, void *data)
{
_Panel *panel = (_Panel *) data;
char buffer[64];
int i;
/* Parameter not used, but tell the compiler that it is ok */
(void) w;
i = WMGetSliderValue(panel->hceS);
if (i == 0)
sprintf(buffer, _("OFF"));
else if (i == 1)
sprintf(buffer, _("1 pixel"));
else if (i <= 4)
/* 2-4 */
sprintf(buffer, _("%i pixels"), i);
else
/* >4 */
sprintf(buffer, _("%i pixels "), i); /* note space! */
WMSetLabelText(panel->hceL, buffer);
}
static void showData(_Panel * panel)
{
int i;
char buffer[32];
WMPropList *array;
if (!GetObjectForKey("HotCornerDelay"))
i = 250;
else
i = GetIntegerForKey("HotCornerDelay");
sprintf(buffer, "%i", i);
WMSetTextFieldText(panel->hcdelayT, buffer);
switch (i) {
case 0:
WMPerformButtonClick(panel->hcdelayB[0]);
break;
case 250:
WMPerformButtonClick(panel->hcdelayB[1]);
break;
case 500:
WMPerformButtonClick(panel->hcdelayB[2]);
break;
case 750:
WMPerformButtonClick(panel->hcdelayB[3]);
break;
case 1000:
WMPerformButtonClick(panel->hcdelayB[4]);
break;
}
i = GetIntegerForKey("HotCornerEdge");
i = i < 0 ? 2 : i;
i = i > 10 ? 10 : i;
WMSetSliderValue(panel->hceS, i);
edgeCallback(NULL, panel);
WMSetButtonSelected(panel->hcB, GetBoolForKey("HotCorners"));
array = GetObjectForKey("HotCornerActions");
if (array && (!WMIsPLArray(array) || WMGetPropListItemCount(array) != sizeof(panel->hcactionsT) / sizeof(WMTextField *))) {
wwarning(_("invalid data in option HotCornerActions."));
} else {
if (array) {
for (i = 0; i < sizeof(panel->hcactionsT) / sizeof(WMTextField *); i++)
if (strcasecmp(WMGetFromPLString(WMGetFromPLArray(array, i)), "None") != 0)
WMSetTextFieldText(panel->hcactionsT[i], WMGetFromPLString(WMGetFromPLArray(array, i)));
}
}
}
static void storeData(_Panel * panel)
{
WMPropList *list;
WMPropList *tmp;
char *str;
int i;
SetBoolForKey(WMGetButtonSelected(panel->hcB), "HotCorners");
str = WMGetTextFieldText(panel->hcdelayT);
if (sscanf(str, "%i", &i) != 1)
i = 0;
SetIntegerForKey(i, "HotCornerDelay");
free(str);
SetIntegerForKey(WMGetSliderValue(panel->hceS), "HotCornerEdge");
list = WMCreatePLArray(NULL, NULL);
for (i = 0; i < sizeof(panel->hcactionsT) / sizeof(WMTextField *); i++) {
str = WMGetTextFieldText(panel->hcactionsT[i]);
if (strlen(str) == 0)
str = "None";
tmp = WMCreatePLString(str);
WMAddToPLArray(list, tmp);
}
SetObjectForKey(list, "HotCornerActions");
}
static void pushDelayButton(WMWidget * w, void *data)
{
_Panel *panel = (_Panel *) data;
panel->hotcornerDelaySelected = 1;
if (w == panel->hcdelayB[0]) {
WMSetTextFieldText(panel->hcdelayT, "0");
} else if (w == panel->hcdelayB[1]) {
WMSetTextFieldText(panel->hcdelayT, "250");
} else if (w == panel->hcdelayB[2]) {
WMSetTextFieldText(panel->hcdelayT, "500");
} else if (w == panel->hcdelayB[3]) {
WMSetTextFieldText(panel->hcdelayT, "700");
} else if (w == panel->hcdelayB[4]) {
WMSetTextFieldText(panel->hcdelayT, "1000");
}
}
static void delayTextChanged(void *observerData, WMNotification * notification)
{
_Panel *panel = (_Panel *) observerData;
int i;
/* Parameter not used, but tell the compiler that it is ok */
(void) notification;
if (panel->hotcornerDelaySelected) {
for (i = 0; i < 5; i++) {
WMSetButtonSelected(panel->hcdelayB[i], False);
}
panel->hotcornerDelaySelected = 0;
}
}
static void createPanel(Panel * p)
{
_Panel *panel = (_Panel *) p;
int i;
char *buf1, *buf2;
WMColor *color;
WMFont *font;
char *path;
RImage *xis = NULL;
WMScreen *scr = WMWidgetScreen(panel->parent);
RContext *rc = WMScreenRContext(scr);
GC gc = XCreateGC(scr->display, WMWidgetXID(panel->parent), 0, NULL);
path = LocateImage(ICON_FILE);
if (path) {
xis = RLoadImage(rc, path, 0);
if (!xis) {
wwarning(_("could not load image file %s"), path);
}
wfree(path);
}
panel->box = WMCreateBox(panel->parent);
WMSetViewExpandsToParent(WMWidgetView(panel->box), 2, 2, 2, 2);
/***************** Hot Corner lelf side frames *****************/
panel->hcF = WMCreateFrame(panel->box);
WMResizeWidget(panel->hcF, 240, 53);
WMMoveWidget(panel->hcF, 15, 17);
panel->hcB = WMCreateSwitchButton(panel->hcF);
WMResizeWidget(panel->hcB, 150, 30);
WMMoveWidget(panel->hcB, 15, 12);
WMSetButtonText(panel->hcB, _("Enable Hot Corners"));
WMMapSubwidgets(panel->hcF);
panel->hceF = WMCreateFrame(panel->box);
WMSetFrameTitle(panel->hceF, _("Hot Corner Edge"));
WMResizeWidget(panel->hceF, 240, 40);
WMMoveWidget(panel->hceF, 15, 77);
panel->hceS = WMCreateSlider(panel->hceF);
WMResizeWidget(panel->hceS, 80, 15);
WMMoveWidget(panel->hceS, 15, 18);
WMSetSliderMinValue(panel->hceS, 2);
WMSetSliderMaxValue(panel->hceS, 10);
WMSetSliderAction(panel->hceS, edgeCallback, panel);
panel->hceL = WMCreateLabel(panel->hceF);
WMResizeWidget(panel->hceL, 100, 15);
WMMoveWidget(panel->hceL, 105, 18);
WMMapSubwidgets(panel->hceF);
panel->hcdescF = WMCreateFrame(panel->box);
WMResizeWidget(panel->hcdescF, 240, 95);
WMMoveWidget(panel->hcdescF, 15, 130);
panel->hcdescL = WMCreateLabel(panel->hcdescF);
WMResizeWidget(panel->hcdescL, 200, 70);
WMMoveWidget(panel->hcdescL, 15, 10);
WMSetLabelText(panel->hcdescL,
_("Instructions:\n\n"
" - assign command to corner\n"
" - or leave it empty\n"));
WMMapSubwidgets(panel->hcdescF);
/***************** Hot Corner Action Delay *****************/
panel->hcdelayF = WMCreateFrame(panel->box);
WMResizeWidget(panel->hcdelayF, 245, 60);
WMMoveWidget(panel->hcdelayF, 265, 10);
WMSetFrameTitle(panel->hcdelayF, _("Hot Corner Delay"));
buf1 = wmalloc(strlen(DELAY_ICON) + 1);
buf2 = wmalloc(strlen(DELAY_ICON_S) + 1);
for (i = 0; i < 5; i++) {
char *path;
panel->hcdelayB[i] = WMCreateCustomButton(panel->hcdelayF, WBBStateChangeMask);
WMResizeWidget(panel->hcdelayB[i], 25, 25);
WMMoveWidget(panel->hcdelayB[i], 12 + (30 * i), 25);
WMSetButtonBordered(panel->hcdelayB[i], False);
WMSetButtonImagePosition(panel->hcdelayB[i], WIPImageOnly);
WMSetButtonAction(panel->hcdelayB[i], pushDelayButton, panel);
if (i > 0)
WMGroupButtons(panel->hcdelayB[0], panel->hcdelayB[i]);
sprintf(buf1, DELAY_ICON, i);
sprintf(buf2, DELAY_ICON_S, i);
path = LocateImage(buf1);
if (path) {
panel->icon = WMCreatePixmapFromFile(scr, path);
if (panel->icon) {
WMSetButtonImage(panel->hcdelayB[i], panel->icon);
WMReleasePixmap(panel->icon);
} else {
wwarning(_("could not load icon file %s"), path);
}
wfree(path);
}
path = LocateImage(buf2);
if (path) {
panel->icon = WMCreatePixmapFromFile(scr, path);
if (panel->icon) {
WMSetButtonAltImage(panel->hcdelayB[i], panel->icon);
WMReleasePixmap(panel->icon);
} else {
wwarning(_("could not load icon file %s"), path);
}
wfree(path);
}
}
wfree(buf1);
wfree(buf2);
panel->hcdelayT = WMCreateTextField(panel->hcdelayF);
WMResizeWidget(panel->hcdelayT, 36, 20);
WMMoveWidget(panel->hcdelayT, 165, 28);
WMAddNotificationObserver(delayTextChanged, panel, WMTextDidChangeNotification, panel->hcdelayT);
panel->hcdelayL = WMCreateLabel(panel->hcdelayF);
WMResizeWidget(panel->hcdelayL, 36, 16);
WMMoveWidget(panel->hcdelayL, 205, 32);
WMSetLabelText(panel->hcdelayL, _("ms"));
color = WMDarkGrayColor(scr);
font = WMSystemFontOfSize(scr, 10);
WMSetLabelTextColor(panel->hcdelayL, color);
WMSetLabelFont(panel->hcdelayL, font);
WMReleaseColor(color);
WMReleaseFont(font);
WMMapSubwidgets(panel->hcdelayF);
/***************** Set Hot Corner Actions ****************/
panel->hcactionsF = WMCreateFrame(panel->box);
WMSetFrameTitle(panel->hcactionsF, _("Hot Corner Actions"));
WMResizeWidget(panel->hcactionsF, 245, 148);
WMMoveWidget(panel->hcactionsF, 265, 77);
panel->icornerL = WMCreateLabel(panel->hcactionsF);
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 18);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
CreateImages(scr, rc, xis, ICON_FILE, &panel->icon, NULL);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[0] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[0], gc, 0, 0, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[0], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
panel->hcactionsT[0] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[0], 180, 20);
WMMoveWidget(panel->hcactionsT[0], 50, 20);
panel->icornerL = WMCreateLabel(panel->hcactionsF);
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 48);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[1] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[1], gc, panel->icon->width/2, 0, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[1], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
panel->hcactionsT[1] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[1], 180, 20);
WMMoveWidget(panel->hcactionsT[1], 50, 50);
panel->icornerL = WMCreateLabel(panel->hcactionsF);
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 78);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[2] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[2], gc, 0, panel->icon->height/2, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[2], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
panel->hcactionsT[2] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[2], 180, 20);
WMMoveWidget(panel->hcactionsT[2], 50, 80);
panel->icornerL = WMCreateLabel(panel->hcactionsF);
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 108);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[3] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[3], gc, panel->icon->width/2, panel->icon->height/2, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[3], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
panel->hcactionsT[3] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[3], 180, 20);
WMMoveWidget(panel->hcactionsT[3], 50, 107);
WMMapSubwidgets(panel->hcactionsF);
if (xis)
RReleaseImage(xis);
XFreeGC(scr->display, gc);
WMRealizeWidget(panel->box);
WMMapSubwidgets(panel->box);
showData(panel);
}
static void prepareForClose(_Panel *panel)
{
int i;
WMScreen *scr = WMWidgetScreen(panel->parent);
WMReleasePixmap(panel->icon);
for (i = 0; i < sizeof(panel->quarter) / sizeof(Pixmap); i++)
XFreePixmap(scr->display, panel->quarter[i]);
}
Panel *InitHotCornerShortcuts(WMWidget *parent)
{
_Panel *panel;
panel = wmalloc(sizeof(_Panel));
panel->sectionName = _("Hot Corner Shortcut Preferences");
panel->description = _("Choose actions to perform when you move the\n"
"mouse pointer to the screen corners.");
panel->parent = parent;
panel->callbacks.createWidgets = createPanel;
panel->callbacks.updateDomain = storeData;
panel->callbacks.prepareForClose = prepareForClose;
AddSection(panel, ICON_FILE);
return panel;
}
+33 -61
View File
@@ -60,8 +60,6 @@ typedef struct _Panel {
CallbackRec callbacks; CallbackRec callbacks;
Bool have_legacy_apercu;
WMWidget *parent; WMWidget *parent;
WMFrame *posF; WMFrame *posF;
@@ -75,12 +73,13 @@ typedef struct _Panel {
WMButton *posB[wlengthof_nocheck(icon_position_dbvalue)]; WMButton *posB[wlengthof_nocheck(icon_position_dbvalue)];
WMFrame *animF; WMFrame *animF;
WMButton *animB[wlengthof_nocheck(icon_animation)]; WMPopUpButton *animP;
WMFrame *optF; WMFrame *optF;
WMButton *arrB; WMButton *arrB;
WMButton *omnB; WMButton *omnB;
WMButton *sclB; WMButton *sclB;
WMButton *marginB;
struct { struct {
WMFrame *frame; WMFrame *frame;
@@ -175,6 +174,7 @@ static void showData(_Panel * panel)
WMSetButtonSelected(panel->arrB, GetBoolForKey("AutoArrangeIcons")); WMSetButtonSelected(panel->arrB, GetBoolForKey("AutoArrangeIcons"));
WMSetButtonSelected(panel->omnB, GetBoolForKey("StickyIcons")); WMSetButtonSelected(panel->omnB, GetBoolForKey("StickyIcons"));
WMSetButtonSelected(panel->sclB, GetBoolForKey("SingleClickLaunch")); WMSetButtonSelected(panel->sclB, GetBoolForKey("SingleClickLaunch"));
WMSetButtonSelected(panel->marginB, GetBoolForKey("EnforceIconMargin"));
str = GetStringForKey("IconPosition"); str = GetStringForKey("IconPosition");
if (str != NULL) { if (str != NULL) {
@@ -195,20 +195,12 @@ static void showData(_Panel * panel)
if (i < 0) if (i < 0)
i = 0; i = 0;
else if (i > 9) else if (i > 29)
i = 9; i = 29;
WMSetPopUpButtonSelectedItem(panel->sizeP, i); WMSetPopUpButtonSelectedItem(panel->sizeP, i);
/* Mini-Previews for Icons */ /* Mini-Previews for Icons */
/*
* Backward Compatibility:
* These settings changed names after 0.95.6, so to avoid breaking user's
* config we still support the old names, and silently convert them to the
* new settings
* This hack should be kept for at least 2 years, that means >= 2017.
*/
panel->have_legacy_apercu = False;
str = GetStringForKey("MiniwindowPreviewBalloons"); str = GetStringForKey("MiniwindowPreviewBalloons");
if (str != NULL) { if (str != NULL) {
/* New names found, use them in priority */ /* New names found, use them in priority */
@@ -220,25 +212,6 @@ static void showData(_Panel * panel)
} else { } else {
i = minipreview_minimum_size; i = minipreview_minimum_size;
} }
} else {
/* No new names, try the legacy names */
b = GetBoolForKey("MiniwindowApercuBalloons");
if (b) {
panel->have_legacy_apercu = True;
i = GetIntegerForKey("ApercuSize");
/*
* In the beginning, the option was coded as a multiple of the icon
* size; then it was converted to pixel size
*/
if (i < 24)
i *= GetIntegerForKey("IconSize");
if (i <= minipreview_minimum_size)
i = minipreview_minimum_size + 1; /* +1 to not display as "off" */
} else {
i = minipreview_minimum_size;
}
} }
WMSetSliderValue(panel->minipreview.slider, i); WMSetSliderValue(panel->minipreview.slider, i);
minipreview_slider_changed(panel->minipreview.slider, panel); minipreview_slider_changed(panel->minipreview.slider, panel);
@@ -248,7 +221,7 @@ static void showData(_Panel * panel)
if (str != NULL) { if (str != NULL) {
for (i = 0; i < wlengthof(icon_animation); i++) { for (i = 0; i < wlengthof(icon_animation); i++) {
if (strcasecmp(str, icon_animation[i].db_value) == 0) { if (strcasecmp(str, icon_animation[i].db_value) == 0) {
WMPerformButtonClick(panel->animB[i]); WMSetPopUpButtonSelectedItem(panel->animP, i);
goto found_animation_value; goto found_animation_value;
} }
} }
@@ -256,7 +229,7 @@ static void showData(_Panel * panel)
str, icon_animation[0].db_value); str, icon_animation[0].db_value);
} }
/* If we're here, no valid value have been found so we fall-back to the default */ /* If we're here, no valid value have been found so we fall-back to the default */
WMPerformButtonClick(panel->animB[0]); WMSetPopUpButtonSelectedItem(panel->animP, 0);
found_animation_value: found_animation_value:
; ;
} }
@@ -366,7 +339,7 @@ static void createPanel(Panel * p)
panel->sizeP = WMCreatePopUpButton(panel->sizeF); panel->sizeP = WMCreatePopUpButton(panel->sizeF);
WMResizeWidget(panel->sizeP, 80, 20); WMResizeWidget(panel->sizeP, 80, 20);
WMMoveWidget(panel->sizeP, 10, 19); WMMoveWidget(panel->sizeP, 10, 19);
for (i = 24; i <= 96; i += 8) { for (i = 24; i <= 256; i += 8) {
sprintf(buf, "%ix%i", i, i); sprintf(buf, "%ix%i", i, i);
WMAddPopUpButtonItem(panel->sizeP, buf); WMAddPopUpButtonItem(panel->sizeP, buf);
} }
@@ -399,50 +372,57 @@ static void createPanel(Panel * p)
/***************** Animation ****************/ /***************** Animation ****************/
panel->animF = WMCreateFrame(panel->box); panel->animF = WMCreateFrame(panel->box);
WMResizeWidget(panel->animF, 215, 110); WMResizeWidget(panel->animF, 215, 52);
WMMoveWidget(panel->animF, 292, 6); WMMoveWidget(panel->animF, 292, 6);
WMSetFrameTitle(panel->animF, _("Iconification Animation")); WMSetFrameTitle(panel->animF, _("Iconification Animation"));
for (i = 0; i < wlengthof(icon_animation); i++) { panel->animP = WMCreatePopUpButton(panel->animF);
panel->animB[i] = WMCreateRadioButton(panel->animF); WMResizeWidget(panel->animP, 195, 20);
WMResizeWidget(panel->animB[i], 192, 20); WMMoveWidget(panel->animP, 10, 19);
WMMoveWidget(panel->animB[i], 12, 16 + i * 22); for (i = 0; i < wlengthof(icon_animation); i++)
WMAddPopUpButtonItem(panel->animP, _(icon_animation[i].label));
if (i > 0)
WMGroupButtons(panel->animB[0], panel->animB[i]);
WMSetButtonText(panel->animB[i], _(icon_animation[i].label));
}
WMMapSubwidgets(panel->animF); WMMapSubwidgets(panel->animF);
/***************** Options ****************/ /***************** Options ****************/
panel->optF = WMCreateFrame(panel->box); panel->optF = WMCreateFrame(panel->box);
WMResizeWidget(panel->optF, 215, 90); WMResizeWidget(panel->optF, 215, 148);
WMMoveWidget(panel->optF, 292, 130); WMMoveWidget(panel->optF, 292, 72);
/* WMSetFrameTitle(panel->optF, _("Icon Display")); */ /* WMSetFrameTitle(panel->optF, _("Icon Display")); */
starty = 8 + 14; /* the last term centers the checkboxes within the panel; subtract 13 for a new option */
panel->arrB = WMCreateSwitchButton(panel->optF); panel->arrB = WMCreateSwitchButton(panel->optF);
WMResizeWidget(panel->arrB, 198, 26); WMResizeWidget(panel->arrB, 198, 26);
WMMoveWidget(panel->arrB, 12, 8); WMMoveWidget(panel->arrB, 12, starty);
starty += 26;
WMSetButtonText(panel->arrB, _("Auto-arrange icons")); WMSetButtonText(panel->arrB, _("Auto-arrange icons"));
WMSetBalloonTextForView(_("Keep icons and miniwindows arranged all the time."), WMWidgetView(panel->arrB)); WMSetBalloonTextForView(_("Keep icons and miniwindows arranged all the time."), WMWidgetView(panel->arrB));
panel->omnB = WMCreateSwitchButton(panel->optF); panel->omnB = WMCreateSwitchButton(panel->optF);
WMResizeWidget(panel->omnB, 198, 26); WMResizeWidget(panel->omnB, 198, 26);
WMMoveWidget(panel->omnB, 12, 34); WMMoveWidget(panel->omnB, 12, starty);
starty += 26;
WMSetButtonText(panel->omnB, _("Omnipresent miniwindows")); WMSetButtonText(panel->omnB, _("Omnipresent miniwindows"));
WMSetBalloonTextForView(_("Make miniwindows be present in all workspaces."), WMWidgetView(panel->omnB)); WMSetBalloonTextForView(_("Make miniwindows be present in all workspaces."), WMWidgetView(panel->omnB));
panel->sclB = WMCreateSwitchButton(panel->optF); panel->sclB = WMCreateSwitchButton(panel->optF);
WMResizeWidget(panel->sclB, 198, 26); WMResizeWidget(panel->sclB, 198, 26);
WMMoveWidget(panel->sclB, 12, 60); WMMoveWidget(panel->sclB, 12, starty);
starty += 26;
WMSetButtonText(panel->sclB, _("Single click activation")); WMSetButtonText(panel->sclB, _("Single click activation"));
WMSetBalloonTextForView(_("Launch applications and restore windows with a single click."), WMWidgetView(panel->sclB)); WMSetBalloonTextForView(_("Launch applications and restore windows with a single click."), WMWidgetView(panel->sclB));
panel->marginB = WMCreateSwitchButton(panel->optF);
WMResizeWidget(panel->marginB, 198, 26);
WMMoveWidget(panel->marginB, 12, starty);
starty += 26;
WMSetButtonText(panel->marginB, _("Enforce icon margin"));
WMSetBalloonTextForView(_("Make sure that the icon image does not protrude into the icon frame."), WMWidgetView(panel->marginB));
WMMapSubwidgets(panel->optF); WMMapSubwidgets(panel->optF);
WMRealizeWidget(panel->box); WMRealizeWidget(panel->box);
@@ -458,6 +438,7 @@ static void storeData(_Panel * panel)
SetBoolForKey(WMGetButtonSelected(panel->arrB), "AutoArrangeIcons"); SetBoolForKey(WMGetButtonSelected(panel->arrB), "AutoArrangeIcons");
SetBoolForKey(WMGetButtonSelected(panel->omnB), "StickyIcons"); SetBoolForKey(WMGetButtonSelected(panel->omnB), "StickyIcons");
SetBoolForKey(WMGetButtonSelected(panel->sclB), "SingleClickLaunch"); SetBoolForKey(WMGetButtonSelected(panel->sclB), "SingleClickLaunch");
SetBoolForKey(WMGetButtonSelected(panel->marginB), "EnforceIconMargin");
SetIntegerForKey(WMGetPopUpButtonSelectedItem(panel->sizeP) * 8 + 24, "IconSize"); SetIntegerForKey(WMGetPopUpButtonSelectedItem(panel->sizeP) * 8 + 24, "IconSize");
@@ -478,17 +459,8 @@ static void storeData(_Panel * panel)
} }
SetIntegerForKey(i, "MiniPreviewSize"); SetIntegerForKey(i, "MiniPreviewSize");
} }
if (panel->have_legacy_apercu) {
RemoveObjectForKey("MiniwindowApercuBalloons");
RemoveObjectForKey("ApercuSize");
}
for (i = 0; i < wlengthof(icon_animation); i++) { SetStringForKey(icon_animation[WMGetPopUpButtonSelectedItem(panel->animP)].db_value, "IconificationStyle");
if (WMGetButtonSelected(panel->animB[i])) {
SetStringForKey(icon_animation[i].db_value, "IconificationStyle");
break;
}
}
} }
Panel *InitIcons(WMWidget *parent) Panel *InitIcons(WMWidget *parent)
+194 -50
View File
@@ -23,6 +23,8 @@
#include "WPrefs.h" #include "WPrefs.h"
#include <ctype.h> #include <ctype.h>
#include <sys/select.h>
#include <sys/time.h>
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
@@ -65,7 +67,7 @@ typedef struct _Panel {
* First parameter is the internal keyword known by WMaker * First parameter is the internal keyword known by WMaker
* Second is the text displayed to the user * Second is the text displayed to the user
*/ */
static const struct { static struct keyOption {
const char *key; const char *key;
const char *title; const char *title;
} keyOptions[] = { } keyOptions[] = {
@@ -84,11 +86,14 @@ static const struct {
{ "RHMaximizeKey", N_("Maximize active window right half") }, { "RHMaximizeKey", N_("Maximize active window right half") },
{ "THMaximizeKey", N_("Maximize active window top half") }, { "THMaximizeKey", N_("Maximize active window top half") },
{ "BHMaximizeKey", N_("Maximize active window bottom half") }, { "BHMaximizeKey", N_("Maximize active window bottom half") },
{ "LTCMaximizeKey", N_("Maximize active window left top corner") }, { "TLCMaximizeKey", N_("Maximize active window top left corner") },
{ "RTCMaximizeKey", N_("Maximize active window right top corner") }, { "TRCMaximizeKey", N_("Maximize active window top right corner") },
{ "LBCMaximizeKey", N_("Maximize active window left bottom corner") }, { "BLCMaximizeKey", N_("Maximize active window bottom left corner") },
{ "RBCMaximizeKey", N_("Maximize active window right bottom corner") }, { "BRCMaximizeKey", N_("Maximize active window bottom right corner") },
{ "MaximusKey", N_("Maximus: Tiled maximization ") }, { "MaximusKey", N_("Tile active window") },
{ "CenterKey", N_("Center active window") },
{ "KeepOnTopKey", N_("Toggle window on top status") },
{ "KeepAtBottomKey",N_("Toggle window at bottom status") },
{ "OmnipresentKey", N_("Toggle window omnipresent status") }, { "OmnipresentKey", N_("Toggle window omnipresent status") },
{ "RaiseKey", N_("Raise active window") }, { "RaiseKey", N_("Raise active window") },
{ "LowerKey", N_("Lower active window") }, { "LowerKey", N_("Lower active window") },
@@ -98,9 +103,21 @@ static const struct {
{ "SelectKey", N_("Select active window") }, { "SelectKey", N_("Select active window") },
{ "FocusNextKey", N_("Focus next window") }, { "FocusNextKey", N_("Focus next window") },
{ "FocusPrevKey", N_("Focus previous window") }, { "FocusPrevKey", N_("Focus previous window") },
/* Directional window focus */
{ "FocusWindowLeftKey", N_("Focus the window to the left") },
{ "FocusWindowRightKey", N_("Focus the window to the right") },
{ "FocusWindowUpKey", N_("Focus the window above") },
{ "FocusWindowDownKey", N_("Focus the window below") },
{ "GroupNextKey", N_("Focus next group window") }, { "GroupNextKey", N_("Focus next group window") },
{ "GroupPrevKey", N_("Focus previous group window") }, { "GroupPrevKey", N_("Focus previous group window") },
/* Vim-like Window Marking */
{ "MarkSetKey", N_("Mark window: set mark") },
{ "MarkUnsetKey", N_("Mark window: unset mark") },
{ "MarkBringKey", N_("Mark window: bring marked window here") },
{ "MarkJumpKey", N_("Mark window: jump to marked window") },
{ "MarkSwapKey", N_("Mark window: swap with marked window") },
/* Workspace Related */ /* Workspace Related */
{ "WorkspaceMapKey", N_("Open workspace pager") }, { "WorkspaceMapKey", N_("Open workspace pager") },
{ "NextWorkspaceKey", N_("Switch to next workspace") }, { "NextWorkspaceKey", N_("Switch to next workspace") },
@@ -146,12 +163,20 @@ static const struct {
{ "WindowShortcut9Key", N_("Shortcut for window 9") }, { "WindowShortcut9Key", N_("Shortcut for window 9") },
{ "WindowShortcut10Key", N_("Shortcut for window 10") }, { "WindowShortcut10Key", N_("Shortcut for window 10") },
/* Head Selection */
{ "MoveTo12to6Head", N_("Move to right/bottom/left/top head") },
{ "MoveTo6to12Head", N_("Move to left/top/right/bottom head") },
/* Misc. */ /* Misc. */
{ "WindowRelaunchKey", N_("Launch new instance of application") }, { "WindowRelaunchKey", N_("Launch new instance of application") },
{ "ScreenSwitchKey", N_("Switch to Next Screen/Monitor") }, { "ScreenSwitchKey", N_("Switch to next screen/monitor") },
{ "RunKey", N_("Run application") }, { "RunKey", N_("Run application") },
{ "ExitKey", N_("Exit Window Maker") },
{ "DockRaiseLowerKey", N_("Raise/Lower Dock") }, { "DockRaiseLowerKey", N_("Raise/Lower Dock") },
{ "ClipRaiseLowerKey", N_("Raise/Lower Clip") } { "ClipRaiseLowerKey", N_("Raise/Lower Clip") },
{ "ScreenCaptureKey", N_("Capture the entire screen") },
{ "WindowCaptureKey", N_("Capture a window") },
{ "PartialCaptureKey", N_("Capture a portion of the screen") }
#ifdef XKB_MODELOCK #ifdef XKB_MODELOCK
,{ "ToggleKbdModeKey", N_("Toggle keyboard language") } ,{ "ToggleKbdModeKey", N_("Toggle keyboard language") }
#endif /* XKB_MODELOCK */ #endif /* XKB_MODELOCK */
@@ -296,25 +321,61 @@ static int NumLockMask(Display *dpy)
return mask; return mask;
} }
/* Append the modifier prefix and key name to the keybuf */
static void build_key_combo(unsigned int xkstate, const char *keyname,
unsigned int numlock_mask, char keybuf[64])
{
if (xkstate & ControlMask)
strcat(keybuf, "Control+");
if (xkstate & ShiftMask)
strcat(keybuf, "Shift+");
if ((numlock_mask != Mod1Mask) && (xkstate & Mod1Mask))
strcat(keybuf, "Mod1+");
if ((numlock_mask != Mod2Mask) && (xkstate & Mod2Mask))
strcat(keybuf, "Mod2+");
if ((numlock_mask != Mod3Mask) && (xkstate & Mod3Mask))
strcat(keybuf, "Mod3+");
if ((numlock_mask != Mod4Mask) && (xkstate & Mod4Mask))
strcat(keybuf, "Mod4+");
if ((numlock_mask != Mod5Mask) && (xkstate & Mod5Mask))
strcat(keybuf, "Mod5+");
wstrlcat(keybuf, keyname, 64);
}
/*
* Interactively capture a key shortcut or keychain,
* function waits KeychainTimeoutDelay or 300 ms after
* each key press for another key in the chain,
* and returns the full key specification string.
*/
char *capture_shortcut(Display *dpy, Bool *capturing, Bool convert_case) char *capture_shortcut(Display *dpy, Bool *capturing, Bool convert_case)
{ {
XEvent ev; XEvent ev;
KeySym ksym, lksym, uksym; KeySym ksym, lksym, uksym;
char buffer[64]; /* Large enough for several chained chords */
char *key = NULL; char buffer[512];
char keybuf[64];
char *key;
unsigned int numlock_mask; unsigned int numlock_mask;
Bool have_key = False;
Bool chain_mode;
int timeout_ms;
timeout_ms = GetIntegerForKey("KeychainTimeoutDelay");
if (timeout_ms <= 0)
timeout_ms = 300;
buffer[0] = '\0';
/* ---- Phase 1: capture the first key (blocking) ---- */
while (*capturing) { while (*capturing) {
XAllowEvents(dpy, AsyncKeyboard, CurrentTime); XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
WMNextEvent(dpy, &ev); WMNextEvent(dpy, &ev);
if (ev.type == KeyPress && ev.xkey.keycode != 0) { if (ev.type == KeyPress && ev.xkey.keycode != 0) {
numlock_mask = NumLockMask(dpy); numlock_mask = NumLockMask(dpy);
if (xext_xkb_supported) /* conditional mask check to get numeric keypad keys */
/* conditional mask check to get numeric keypad keys */ ksym = W_KeycodeToKeysym(dpy, ev.xkey.keycode, ev.xkey.state & numlock_mask?1:0);
ksym = XkbKeycodeToKeysym(dpy, ev.xkey.keycode, 0, ev.xkey.state & numlock_mask?1:0);
else
ksym = XKeycodeToKeysym(dpy, ev.xkey.keycode, 0);
if (!IsModifierKey(ksym)) { if (!IsModifierKey(ksym)) {
if (convert_case) { if (convert_case) {
@@ -324,44 +385,95 @@ char *capture_shortcut(Display *dpy, Bool *capturing, Bool convert_case)
key = XKeysymToString(ksym); key = XKeysymToString(ksym);
} }
*capturing = 0; keybuf[0] = '\0';
build_key_combo(ev.xkey.state, key, numlock_mask, keybuf);
wstrlcat(buffer, keybuf, sizeof(buffer));
have_key = True;
break; break;
} }
} }
WMHandleEvent(&ev); WMHandleEvent(&ev);
} }
if (!key) /* ---- Phase 2: collect additional chain keys with timeout ---- */
chain_mode = (timeout_ms > 0);
while (*capturing && chain_mode) {
int xfd = ConnectionNumber(dpy);
fd_set rfds;
struct timeval tv;
if (!XPending(dpy)) {
FD_ZERO(&rfds);
FD_SET(xfd, &rfds);
tv.tv_sec = timeout_ms / 1000;
tv.tv_usec = (timeout_ms % 1000) * 1000;
XFlush(dpy);
if (select(xfd + 1, &rfds, NULL, NULL, &tv) == 0)
break; /* timeout: the chain is complete */
}
XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
WMNextEvent(dpy, &ev);
if (ev.type == KeyPress && ev.xkey.keycode != 0) {
numlock_mask = NumLockMask(dpy);
ksym = W_KeycodeToKeysym(dpy, ev.xkey.keycode,
ev.xkey.state & numlock_mask ? 1 : 0);
if (!IsModifierKey(ksym)) {
if (convert_case) {
XConvertCase(ksym, &lksym, &uksym);
key = XKeysymToString(uksym);
} else {
key = XKeysymToString(ksym);
}
keybuf[0] = '\0';
build_key_combo(ev.xkey.state, key, numlock_mask, keybuf);
wstrlcat(buffer, " ", sizeof(buffer));
wstrlcat(buffer, keybuf, sizeof(buffer));
}
} else {
WMHandleEvent(&ev);
}
}
if (!have_key || !*capturing)
return NULL; return NULL;
buffer[0] = 0; *capturing = 0;
if (ev.xkey.state & ControlMask)
strcat(buffer, "Control+");
if (ev.xkey.state & ShiftMask)
strcat(buffer, "Shift+");
if ((numlock_mask != Mod1Mask) && (ev.xkey.state & Mod1Mask))
strcat(buffer, "Mod1+");
if ((numlock_mask != Mod2Mask) && (ev.xkey.state & Mod2Mask))
strcat(buffer, "Mod2+");
if ((numlock_mask != Mod3Mask) && (ev.xkey.state & Mod3Mask))
strcat(buffer, "Mod3+");
if ((numlock_mask != Mod4Mask) && (ev.xkey.state & Mod4Mask))
strcat(buffer, "Mod4+");
if ((numlock_mask != Mod5Mask) && (ev.xkey.state & Mod5Mask))
strcat(buffer, "Mod5+");
wstrlcat(buffer, key, sizeof(buffer));
return wstrdup(buffer); return wstrdup(buffer);
} }
/*
* check if the keystr entered is already set to another action
* if found it returns the position in the keyOptions
*/
static int isKeySet(_Panel *panel, char *keystr)
{
int i;
char *str;
for (i = 0; i < panel->actionCount; i++) {
str = NULL;
if (panel->shortcuts[i]) {
str = wtrimspace(panel->shortcuts[i]);
if (strlen(str) == 0) {
wfree(str);
str = NULL;
}
}
if (str) {
if (strcmp(keystr, str) == 0) {
wfree(str);
return i;
}
wfree(str);
}
}
return -1;
}
static void captureClick(WMWidget * w, void *data) static void captureClick(WMWidget * w, void *data)
{ {
_Panel *panel = (_Panel *) data; _Panel *panel = (_Panel *) data;
@@ -376,23 +488,37 @@ static void captureClick(WMWidget * w, void *data)
XGrabKeyboard(dpy, WMWidgetXID(panel->parent), True, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabKeyboard(dpy, WMWidgetXID(panel->parent), True, GrabModeAsync, GrabModeAsync, CurrentTime);
shortcut = capture_shortcut(dpy, &panel->capturing, 1); shortcut = capture_shortcut(dpy, &panel->capturing, 1);
if (shortcut) { if (shortcut) {
int key_idx = -1;
int row = WMGetListSelectedItemRow(panel->actLs); int row = WMGetListSelectedItemRow(panel->actLs);
WMSetTextFieldText(panel->shoT, shortcut); key_idx = isKeySet(panel, shortcut);
if (row >= 0) { if (key_idx >= 0 && (key_idx != row)) {
if (panel->shortcuts[row]) char *msg;
wfree(panel->shortcuts[row]);
panel->shortcuts[row] = shortcut;
WMRedisplayWidget(panel->actLs); msg = wstrconcat(_("Key shortcut already in use by the "), _(keyOptions[key_idx].title));
} else { WMRunAlertPanel(WMWidgetScreen(w), GetWindow(),
_("Error"),
msg,
_("OK"), NULL, NULL);
wfree(msg);
wfree(shortcut); wfree(shortcut);
} else {
WMSetTextFieldText(panel->shoT, shortcut);
if (row >= 0) {
if (panel->shortcuts[row])
wfree(panel->shortcuts[row]);
panel->shortcuts[row] = shortcut;
WMRedisplayWidget(panel->actLs);
} else {
wfree(shortcut);
}
} }
} }
} }
panel->capturing = 0; panel->capturing = 0;
WMSetButtonText(w, _("Capture")); WMSetButtonText(w, _("Capture"));
WMSetLabelText(panel->instructionsL, _("Click on Capture to interactively define the shortcut key.")); WMSetLabelText(panel->instructionsL, _("Click on Capture to interactively define the shortcut key(s)."));
XUngrabKeyboard(dpy, CurrentTime); XUngrabKeyboard(dpy, CurrentTime);
} }
@@ -404,6 +530,9 @@ static void clearShortcut(WMWidget * w, void *data)
/* Parameter not used, but tell the compiler that it is ok */ /* Parameter not used, but tell the compiler that it is ok */
(void) w; (void) w;
/* Cancel any ongoing capture so the keychain loop is unblocked */
panel->capturing = 0;
WMSetTextFieldText(panel->shoT, NULL); WMSetTextFieldText(panel->shoT, NULL);
if (row >= 0) { if (row >= 0) {
@@ -493,6 +622,20 @@ static void paintItem(WMList * lPtr, int index, Drawable d, char *text, int stat
WMDrawString(scr, d, panel->black, panel->font, x + 20, y, text, strlen(text)); WMDrawString(scr, d, panel->black, panel->font, x + 20, y, text, strlen(text));
} }
static int cmpKeyOptions(const void *v1, const void *v2)
{
int rc;
const struct keyOption *opt1 = (struct keyOption *)v1;
const struct keyOption *opt2 = (struct keyOption *)v2;
if ((rc = strncmp(opt1->title, opt2->title, 20)) < 0)
return -1;
else if (rc > 0)
return 1;
return 0;
}
static void createPanel(Panel * p) static void createPanel(Panel * p)
{ {
_Panel *panel = (_Panel *) p; _Panel *panel = (_Panel *) p;
@@ -532,6 +675,7 @@ static void createPanel(Panel * p)
WMSetListUserDrawProc(panel->actLs, paintItem); WMSetListUserDrawProc(panel->actLs, paintItem);
WMHangData(panel->actLs, panel); WMHangData(panel->actLs, panel);
qsort(keyOptions, wlengthof(keyOptions), sizeof(keyOptions[0]), cmpKeyOptions);
for (i = 0; i < wlengthof(keyOptions); i++) { for (i = 0; i < wlengthof(keyOptions); i++) {
WMAddListItem(panel->actLs, _(keyOptions[i].title)); WMAddListItem(panel->actLs, _(keyOptions[i].title));
} }
+16 -3
View File
@@ -10,9 +10,20 @@ wpdatadir = @wprefs_datadir@
wpdata_DATA = WPrefs.tiff WPrefs.xpm wpdata_DATA = WPrefs.tiff WPrefs.xpm
applicationsdir = @datadir@/applications
applications_DATA = WPrefs.desktop
WPrefs.desktop: WPrefs.desktop.in
$(AM_V_GEN)sed -e "s:#wprefs_bindir#:${wprefs_bindir}:" \
-e "s:#wprefs_datadir#:${wprefs_datadir}:" $< > $@
EXTRA_DIST = $(wpdata_DATA) \ EXTRA_DIST = $(wpdata_DATA) \
KeyboardSettings.c \ KeyboardSettings.c \
Themes.c Themes.c \
WPrefs.desktop.in
DISTCLEANFILES = WPrefs.desktop
WPrefs_SOURCES = \ WPrefs_SOURCES = \
main.c \ main.c \
@@ -24,6 +35,7 @@ WPrefs_SOURCES = \
Expert.c \ Expert.c \
Focus.c \ Focus.c \
FontSimple.c \ FontSimple.c \
HotCornerShortcuts.c \
Icons.c \ Icons.c \
KeyboardShortcuts.c \ KeyboardShortcuts.c \
Menu.c \ Menu.c \
@@ -45,10 +57,11 @@ WPrefs_SOURCES = \
# KeyboardSettings.c \ # KeyboardSettings.c \
# Themes.c # Themes.c
AM_CFLAGS = AM_CFLAGS = @PANGO_CFLAGS@
AM_CPPFLAGS = -DRESOURCE_PATH=\"$(wpdatadir)\" -DWMAKER_RESOURCE_PATH=\"$(pkgdatadir)\" \ AM_CPPFLAGS = -DRESOURCE_PATH=\"$(wpdatadir)\" -DWMAKER_RESOURCE_PATH=\"$(pkgdatadir)\" \
-I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs @HEADER_SEARCH_PATH@ -I$(top_builddir)/wrlib -I$(top_srcdir)/WINGs -I$(top_builddir)/WINGs \
@HEADER_SEARCH_PATH@
WPrefs_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la WPrefs_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
+81 -20
View File
@@ -22,6 +22,7 @@
#include "WPrefs.h" #include "WPrefs.h"
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <unistd.h>
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
@@ -290,6 +291,8 @@ static void changedItemPad(WMWidget * w, void *data)
_Panel *panel = (_Panel *) data; _Panel *panel = (_Panel *) data;
int padn = WMGetPopUpButtonSelectedItem(w); int padn = WMGetPopUpButtonSelectedItem(w);
if (padn < 0)
return;
WMUnmapWidget(panel->itemPad[panel->currentPad]); WMUnmapWidget(panel->itemPad[panel->currentPad]);
WMMapWidget(panel->itemPad[padn]); WMMapWidget(panel->itemPad[padn]);
@@ -506,7 +509,7 @@ static void createPanel(_Panel * p)
WMSetScrollViewContentView(sview, WMWidgetView(pad)); WMSetScrollViewContentView(sview, WMWidgetView(pad));
data = putNewItem(panel, pad, ExternalInfo, _("Debian Menu")); data = putNewItem(panel, pad, ExternalInfo, _("Debian Menu"));
data->param.pipe.command = "/etc/X11/WindowMaker/menu.hook"; data->param.pipe.command = "/etc/" GSUSER_SUBDIR "/" DEFAULTS_SUBDIR "/menu.hook";
data = putNewItem(panel, pad, PipeInfo, _("RedHat Menu")); data = putNewItem(panel, pad, PipeInfo, _("RedHat Menu"));
data->param.pipe.command = "wmconfig --output wmaker"; data->param.pipe.command = "wmconfig --output wmaker";
@@ -517,19 +520,25 @@ static void createPanel(_Panel * p)
data = putNewItem(panel, pad, DirectoryInfo, _("Themes")); data = putNewItem(panel, pad, DirectoryInfo, _("Themes"));
data->param.directory.command = "setstyle"; data->param.directory.command = "setstyle";
data->param.directory.directory = data->param.directory.directory =
"/usr/share/WindowMaker/Themes /usr/local/share/WindowMaker/Themes $HOME/GNUstep/Library/WindowMaker/Themes"; "/usr/share/" PACKAGE_TARNAME "/Themes"
" /usr/local/share/" PACKAGE_TARNAME "/Themes"
" $HOME/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/" PACKAGE_TARNAME "/Themes";
data->param.directory.stripExt = 1; data->param.directory.stripExt = 1;
data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (scale)")); data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (scale)"));
data->param.directory.command = "wmsetbg -u -s"; data->param.directory.command = "wmsetbg -u -s";
data->param.directory.directory = data->param.directory.directory =
"/opt/kde2/share/wallpapers /usr/share/WindowMaker/Backgrounds $HOME/GNUstep/Library/WindowMaker/Backgrounds"; "/opt/kde2/share/wallpapers"
" /usr/share/" PACKAGE_TARNAME "/Backgrounds"
" $HOME/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/" PACKAGE_TARNAME "/Backgrounds";
data->param.directory.stripExt = 1; data->param.directory.stripExt = 1;
data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (tile)")); data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (tile)"));
data->param.directory.command = "wmsetbg -u -t"; data->param.directory.command = "wmsetbg -u -t";
data->param.directory.directory = data->param.directory.directory =
"/opt/kde2/share/wallpapers /usr/share/WindowMaker/Backgrounds $HOME/GNUstep/Library/WindowMaker/Backgrounds"; "/opt/kde2/share/wallpapers"
" /usr/share/" PACKAGE_TARNAME "/Backgrounds"
" $HOME/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/" PACKAGE_TARNAME "/Backgrounds";
data->param.directory.stripExt = 1; data->param.directory.stripExt = 1;
smenu = putNewSubmenu(pad, _("Assorted XTerms")); smenu = putNewSubmenu(pad, _("Assorted XTerms"));
@@ -613,12 +622,13 @@ static void createPanel(_Panel * p)
WMAddNotificationObserver(dataChanged, panel, WMTextDidChangeNotification, panel->pathT); WMAddNotificationObserver(dataChanged, panel, WMTextDidChangeNotification, panel->pathT);
label = WMCreateLabel(panel->pathF); label = WMCreateLabel(panel->pathF);
WMResizeWidget(label, width - 20, 80); WMResizeWidget(label, width - 20, 90);
WMMoveWidget(label, 10, 50); WMMoveWidget(label, 10, 50);
WMSetLabelText(label, _("Enter the path for a file containing a menu\n" WMSetLabelText(label, _("Enter the path for a file containing a menu\n"
"or a list of directories with the programs you\n" "or a list of directories with the programs you\n"
"want to have listed in the menu. Ex:\n" "want to have listed in the menu. Ex:\n"
"~/GNUstep/Library/WindowMaker/menu\n" "or\n" "/usr/bin ~/xbin")); "~/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/" PACKAGE_TARNAME "/menu\n"
"or\n" "/usr/bin ~/xbin"));
WMMapSubwidgets(panel->pathF); WMMapSubwidgets(panel->pathF);
@@ -913,6 +923,11 @@ static ItemData *parseCommand(WMPropList * item)
data->type = ExecInfo; data->type = ExecInfo;
if (parameter == NULL) {
wfree(data);
return NULL;
}
data->param.exec.command = wstrdup(parameter); data->param.exec.command = wstrdup(parameter);
if (shortcut) if (shortcut)
data->param.exec.shortcut = wstrdup(shortcut); data->param.exec.shortcut = wstrdup(shortcut);
@@ -925,6 +940,12 @@ static ItemData *parseCommand(WMPropList * item)
* |pipe * |pipe
*/ */
p = parameter; p = parameter;
if (p == NULL) {
wfree(data);
return NULL;
}
while (isspace(*p) && *p) while (isspace(*p) && *p)
p++; p++;
if (*p == '|') { if (*p == '|') {
@@ -1435,12 +1456,12 @@ static WEditMenu *buildSubmenu(_Panel * panel, WMPropList * pl)
WSetEditMenuItemImage(item, panel->markerPix[data->type]); WSetEditMenuItemImage(item, panel->markerPix[data->type]);
WSetEditMenuItemData(item, data, (WMCallback *) freeItemData); WSetEditMenuItemData(item, data, (WMCallback *) freeItemData);
} else { } else {
char *buf = wmalloc(1024); char buf[256];
snprintf(buf, 1024, _("Invalid menu command \"%s\" with label \"%s\" cleared"),
snprintf(buf, sizeof(buf), _("Invalid menu command \"%s\" with label \"%s\" cleared"),
WMGetFromPLString(WMGetFromPLArray(pi, 1)), WMGetFromPLString(WMGetFromPLArray(pi, 1)),
WMGetFromPLString(WMGetFromPLArray(pi, 0))); WMGetFromPLString(WMGetFromPLArray(pi, 0)));
WMRunAlertPanel(scr, panel->parent, _("Warning"), buf, _("OK"), NULL, NULL); WMRunAlertPanel(scr, panel->parent, _("Warning"), buf, _("OK"), NULL, NULL);
wfree(buf);
} }
} }
@@ -1481,18 +1502,53 @@ static WMPropList *getDefaultMenu(_Panel * panel)
static void showData(_Panel * panel) static void showData(_Panel * panel)
{ {
const char *gspath; char *menuPath, *labelText;
char *menuPath; char buf[1024];
WMPropList *pmenu; WMPropList *pmenu;
gspath = wusergnusteppath(); menuPath = wdefaultspathfordomain("WMRootMenu");
menuPath = wmalloc(strlen(gspath) + 32);
strcpy(menuPath, gspath);
strcat(menuPath, "/Defaults/WMRootMenu");
pmenu = WMReadPropListFromFile(menuPath); pmenu = WMReadPropListFromFile(menuPath);
/* check if WMRootMenu references another file, and if so,
if that file is in proplist format */
while (WMIsPLString(pmenu)) {
char *path = NULL;
path = wexpandpath(WMGetFromPLString(pmenu));
if (access(path, F_OK) < 0) {
char *old_path = path;
path = wfindfile(DEF_CONFIG_PATHS, path);
wfree(old_path);
}
/* TODO: if needed, concatenate locale suffix to path.
See getLocalizedMenuFile() in src/rootmenu.c. */
if (!path)
break;
if (access(path, W_OK) < 0) {
snprintf(buf, sizeof(buf),
_("The menu file \"%s\" referenced by "
"WMRootMenu is read-only.\n"
"You cannot use WPrefs to modify it."),
path);
WMRunAlertPanel(WMWidgetScreen(panel->parent),
panel->parent,
_("Warning"), buf,
_("OK"), NULL, NULL);
panel->dontSave = True;
wfree(path);
return;
}
pmenu = WMReadPropListFromFile(path);
menuPath = path;
}
if (!pmenu || !WMIsPLArray(pmenu)) { if (!pmenu || !WMIsPLArray(pmenu)) {
int res; int res;
@@ -1517,6 +1573,14 @@ static void showData(_Panel * panel)
panel->menuPath = menuPath; panel->menuPath = menuPath;
snprintf(buf, sizeof(buf),
_("\n\nWhen saved, the menu will be written to the file\n\"%s\"."),
menuPath);
labelText = WMGetLabelText(panel->sections[NoInfo][0]);
labelText = wstrconcat(labelText, buf);
WMSetLabelText(panel->sections[NoInfo][0], labelText);
wfree(labelText);
buildMenuFromPL(panel, pmenu); buildMenuFromPL(panel, pmenu);
WMReleasePropList(pmenu); WMReleasePropList(pmenu);
@@ -1557,15 +1621,12 @@ static WMPropList *processData(const char *title, ItemData * data)
case ExecInfo: case ExecInfo:
if (data->param.exec.command == NULL) if (data->param.exec.command == NULL)
goto return_null; goto return_null;
#if 1
if (strpbrk(data->param.exec.command, "&$*|><?`=;")) { if (strpbrk(data->param.exec.command, "&$*|><?`=;")) {
s1 = "SHEXEC"; s1 = "SHEXEC";
} else { } else {
s1 = "EXEC"; s1 = "EXEC";
} }
#else
s1 = "SHEXEC";
#endif
if (notblank(data->param.exec.shortcut)) { if (notblank(data->param.exec.shortcut)) {
WMAddToPLArray(item, pscut); WMAddToPLArray(item, pscut);
+5 -6
View File
@@ -381,10 +381,7 @@ static void fillModifierPopUp(WMPopUpButton * pop)
if (mapping->modifiermap[idx] != 0) { if (mapping->modifiermap[idx] != 0) {
int l; int l;
for (l = 0; l < 4; l++) { for (l = 0; l < 4; l++) {
if (xext_xkb_supported) ksym = W_KeycodeToKeysym(dpy, mapping->modifiermap[idx], l);
ksym = XkbKeycodeToKeysym(dpy, mapping->modifiermap[idx], 0, l);
else
ksym = XKeycodeToKeysym(dpy, mapping->modifiermap[idx], 0);
if (ksym != NoSymbol) if (ksym != NoSymbol)
break; break;
} }
@@ -650,7 +647,7 @@ static void storeCommandInScript(const char *cmd, const char *line)
umask(permissions); umask(permissions);
permissions = (S_IRWXU | S_IRWXG | S_IRWXO) & (~permissions); permissions = (S_IRWXU | S_IRWXG | S_IRWXO) & (~permissions);
path = wstrconcat(wusergnusteppath(), "/Library/WindowMaker/autostart"); path = wstrconcat(wuserdatapath(), "/" PACKAGE_TARNAME "/autostart");
f = fopen(path, "rb"); f = fopen(path, "rb");
if (!f) { if (!f) {
@@ -668,7 +665,7 @@ static void storeCommandInScript(const char *cmd, const char *line)
char *tmppath; char *tmppath;
FILE *fo; FILE *fo;
tmppath = wstrconcat(wusergnusteppath(), "/Library/WindowMaker/autostart.tmp"); tmppath = wstrconcat(wuserdatapath(), "/" PACKAGE_TARNAME "/autostart.tmp");
fo = fopen(tmppath, "wb"); fo = fopen(tmppath, "wb");
if (!fo) { if (!fo) {
werror(_("could not create temporary file %s"), tmppath); werror(_("could not create temporary file %s"), tmppath);
@@ -751,6 +748,8 @@ static void storeData(_Panel * panel)
int action; int action;
action = WMGetPopUpButtonSelectedItem(panel->mouse_action[i].popup); action = WMGetPopUpButtonSelectedItem(panel->mouse_action[i].popup);
if (action < 0)
continue;
if (button_list[i].type == T_BUTTON) if (button_list[i].type == T_BUTTON)
db_value = button_actions[action].db_value; db_value = button_actions[action].db_value;
else else
+6 -6
View File
@@ -77,11 +77,11 @@ static void showData(_Panel * panel)
if (array) if (array)
wwarning(_("bad value in option IconPath. Using default path list")); wwarning(_("bad value in option IconPath. Using default path list"));
addPathToList(panel->icoL, -1, "~/pixmaps"); addPathToList(panel->icoL, -1, "~/pixmaps");
addPathToList(panel->icoL, -1, "~/GNUstep/Library/Icons"); addPathToList(panel->icoL, -1, "~/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/Icons");
addPathToList(panel->icoL, -1, "/usr/include/X11/pixmaps"); addPathToList(panel->icoL, -1, "/usr/include/X11/pixmaps");
addPathToList(panel->icoL, -1, "/usr/local/share/WindowMaker/Icons"); addPathToList(panel->icoL, -1, "/usr/local/share/" PACKAGE_TARNAME "/Icons");
addPathToList(panel->icoL, -1, "/usr/local/share/WindowMaker/Pixmaps"); addPathToList(panel->icoL, -1, "/usr/local/share/" PACKAGE_TARNAME "/Pixmaps");
addPathToList(panel->icoL, -1, "/usr/share/WindowMaker/Icons"); addPathToList(panel->icoL, -1, "/usr/share/" PACKAGE_TARNAME "/Icons");
} else { } else {
for (i = 0; i < WMGetPropListItemCount(array); i++) { for (i = 0; i < WMGetPropListItemCount(array); i++) {
val = WMGetFromPLArray(array, i); val = WMGetFromPLArray(array, i);
@@ -94,8 +94,8 @@ static void showData(_Panel * panel)
if (array) if (array)
wwarning(_("bad value in option PixmapPath. Using default path list")); wwarning(_("bad value in option PixmapPath. Using default path list"));
addPathToList(panel->pixL, -1, "~/pixmaps"); addPathToList(panel->pixL, -1, "~/pixmaps");
addPathToList(panel->pixL, -1, "~/GNUstep/Library/WindowMaker/Pixmaps"); addPathToList(panel->pixL, -1, "~/" GSUSER_SUBDIR "/" USERDATA_SUBDIR "/" PACKAGE_TARNAME "/Pixmaps");
addPathToList(panel->pixL, -1, "/usr/local/share/WindowMaker/Pixmaps"); addPathToList(panel->pixL, -1, "/usr/local/share/" PACKAGE_TARNAME "/Pixmaps");
} else { } else {
for (i = 0; i < WMGetPropListItemCount(array); i++) { for (i = 0; i < WMGetPropListItemCount(array); i++) {
val = WMGetFromPLArray(array, i); val = WMGetFromPLArray(array, i);
+7 -3
View File
@@ -196,9 +196,13 @@ static void storeData(_Panel * panel)
int i; int i;
i = WMGetPopUpButtonSelectedItem(panel->sizeP); i = WMGetPopUpButtonSelectedItem(panel->sizeP);
if (i < 0)
return;
SetStringForKey(resize_display[i].db_value, "ResizeDisplay"); SetStringForKey(resize_display[i].db_value, "ResizeDisplay");
i = WMGetPopUpButtonSelectedItem(panel->posiP); i = WMGetPopUpButtonSelectedItem(panel->posiP);
if (i < 0)
return;
SetStringForKey(move_display[i].db_value, "MoveDisplay"); SetStringForKey(move_display[i].db_value, "MoveDisplay");
lr = WMGetButtonSelected(panel->lrB); lr = WMGetButtonSelected(panel->lrB);
@@ -280,14 +284,14 @@ static void createPanel(Panel * p)
/***************** Options ****************/ /***************** Options ****************/
panel->optF = WMCreateFrame(panel->box); panel->optF = WMCreateFrame(panel->box);
WMResizeWidget(panel->optF, 255, 94); WMResizeWidget(panel->optF, 255, 96);
WMMoveWidget(panel->optF, 15, 125); WMMoveWidget(panel->optF, 15, 125);
WMSetFrameTitle(panel->optF, _("AppIcon bouncing")); WMSetFrameTitle(panel->optF, _("AppIcon bouncing"));
for (i = 0; i < wlengthof(appicon_bouncing); i++) { for (i = 0; i < wlengthof(appicon_bouncing); i++) {
panel->bounceB[i] = WMCreateSwitchButton(panel->optF); panel->bounceB[i] = WMCreateSwitchButton(panel->optF);
WMResizeWidget(panel->bounceB[i], 237, 26); WMResizeWidget(panel->bounceB[i], 237, 26);
WMMoveWidget(panel->bounceB[i], 9, 14 + i * 25); WMMoveWidget(panel->bounceB[i], 9, 16 + i * 26);
WMSetButtonText(panel->bounceB[i], _(appicon_bouncing[i].label)); WMSetButtonText(panel->bounceB[i], _(appicon_bouncing[i].label));
if (appicon_bouncing[i].default_value) if (appicon_bouncing[i].default_value)
@@ -302,7 +306,7 @@ static void createPanel(Panel * p)
/***************** Workspace border ****************/ /***************** Workspace border ****************/
panel->borderF = WMCreateFrame(panel->box); panel->borderF = WMCreateFrame(panel->box);
WMResizeWidget(panel->borderF, 220, 75); WMResizeWidget(panel->borderF, 220, 77);
WMMoveWidget(panel->borderF, 285, 144); WMMoveWidget(panel->borderF, 285, 144);
WMSetFrameTitle(panel->borderF, _("Workspace border")); WMSetFrameTitle(panel->borderF, _("Workspace border"));
+3 -3
View File
@@ -7,7 +7,7 @@
WPrefs.app is the preferences "editor" for the WindowMaker window WPrefs.app is the preferences "editor" for the WindowMaker window
manager. It can be used to set most of the preference options of WindowMaker manager. It can be used to set most of the preference options of WindowMaker
and define it's applications menu. It also can change some settings and define its applications menu. It also can change some settings
that do not belong to WindowMaker. that do not belong to WindowMaker.
Although WPrefs.app is designed to be easy to use, you should read the Although WPrefs.app is designed to be easy to use, you should read the
@@ -16,7 +16,7 @@ of WindowMaker that are not related to configuration.
To run WPrefs, do not put it in your search path. Instead, run it To run WPrefs, do not put it in your search path. Instead, run it
with the full path, like /usr/local/GNUstep/Applications/WPrefs.app/WPrefs with the full path, like /usr/local/GNUstep/Applications/WPrefs.app/WPrefs
Then, dock it's application icon. The dock will automatically detect it's Then, dock its application icon. The dock will automatically detect its
icon and use it. icon and use it.
If you change configuration often, you might want to leave WPrefs If you change configuration often, you might want to leave WPrefs
@@ -46,7 +46,7 @@ The mouse speed configuration is saved as a call for xset in
~/G/D/L/W/autostart. WindowMaker calls this file when it is started. ~/G/D/L/W/autostart. WindowMaker calls this file when it is started.
If you don't want or can't use the menu definition section, do not If you don't want or can't use the menu definition section, do not
open it's section (or if you do open it, do not Save), or WPrefs will open its section (or if you do open it, do not Save), or WPrefs will
overwrite your ~/G/D/WMRootMenu file. overwrite your ~/G/D/WMRootMenu file.
Only options that have different values than what is found in the Only options that have different values than what is found in the
+81 -81
View File
@@ -117,16 +117,21 @@ typedef struct _TexturePanel {
} _TexturePanel; } _TexturePanel;
#define TYPE_SOLID 0 enum {
#define TYPE_GRADIENT 1 TYPE_SOLID,
#define TYPE_SGRADIENT 2 TYPE_GRADIENT,
#define TYPE_TGRADIENT 3 TYPE_SGRADIENT,
#define TYPE_PIXMAP 4 TYPE_TGRADIENT,
TYPE_PIXMAP
};
#define PTYPE_TILE 0 enum {
#define PTYPE_SCALE 1 PTYPE_TILE,
#define PTYPE_CENTER 2 PTYPE_SCALE,
#define PTYPE_MAXIMIZE 3 PTYPE_CENTER,
PTYPE_MAXIMIZE,
PTYPE_FILL
};
/* /*
*-------------------------------------------------------------------------- *--------------------------------------------------------------------------
@@ -136,7 +141,7 @@ typedef struct _TexturePanel {
/************/ /************/
static void updateGradButtons(TexturePanel * panel) static void updateGradButtons(TexturePanel *panel)
{ {
RImage *image; RImage *image;
WMPixmap *pixmap; WMPixmap *pixmap;
@@ -180,7 +185,7 @@ static void updateGradButtons(TexturePanel * panel)
} }
} }
static void updateTGradImage(TexturePanel * panel) static void updateTGradImage(TexturePanel *panel)
{ {
RImage *image, *gradient; RImage *image, *gradient;
WMPixmap *pixmap; WMPixmap *pixmap;
@@ -201,19 +206,17 @@ static void updateTGradImage(TexturePanel * panel)
to.green = WMGreenComponentOfColor(color) >> 8; to.green = WMGreenComponentOfColor(color) >> 8;
to.blue = WMBlueComponentOfColor(color) >> 8; to.blue = WMBlueComponentOfColor(color) >> 8;
if (panel->image->width < 141 || panel->image->height < 91) { if (panel->image->width < 141 || panel->image->height < 91)
image = RMakeTiledImage(panel->image, 141, 91); image = RMakeTiledImage(panel->image, 141, 91);
} else { else
image = RCloneImage(panel->image); image = RCloneImage(panel->image);
}
if (WMGetButtonSelected(panel->dirhB)) { if (WMGetButtonSelected(panel->dirhB))
gradient = RRenderGradient(image->width, image->height, &from, &to, RHorizontalGradient); gradient = RRenderGradient(image->width, image->height, &from, &to, RHorizontalGradient);
} else if (WMGetButtonSelected(panel->dirvB)) { else if (WMGetButtonSelected(panel->dirvB))
gradient = RRenderGradient(image->width, image->height, &from, &to, RVerticalGradient); gradient = RRenderGradient(image->width, image->height, &from, &to, RVerticalGradient);
} else { else
gradient = RRenderGradient(image->width, image->height, &from, &to, RDiagonalGradient); gradient = RRenderGradient(image->width, image->height, &from, &to, RDiagonalGradient);
}
RCombineImagesWithOpaqueness(image, gradient, WMGetSliderValue(panel->topaS)); RCombineImagesWithOpaqueness(image, gradient, WMGetSliderValue(panel->topaS));
RReleaseImage(gradient); RReleaseImage(gradient);
@@ -225,7 +228,7 @@ static void updateTGradImage(TexturePanel * panel)
RReleaseImage(image); RReleaseImage(image);
} }
static void updateSGradButtons(TexturePanel * panel) static void updateSGradButtons(TexturePanel *panel)
{ {
RImage *image; RImage *image;
WMPixmap *pixmap; WMPixmap *pixmap;
@@ -264,7 +267,7 @@ static void updateSGradButtons(TexturePanel * panel)
/*********** Gradient ************/ /*********** Gradient ************/
static void updateSVSlider(WMSlider * sPtr, Bool saturation, WMFont * font, RHSVColor * hsv) static void updateSVSlider(WMSlider *sPtr, Bool saturation, WMFont *font, RHSVColor *hsv)
{ {
RImage *image; RImage *image;
WMPixmap *pixmap; WMPixmap *pixmap;
@@ -312,7 +315,7 @@ static void updateSVSlider(WMSlider * sPtr, Bool saturation, WMFont * font, RHSV
WMReleasePixmap(pixmap); WMReleasePixmap(pixmap);
} }
static void updateHueSlider(WMSlider * sPtr, WMFont * font, RHSVColor * hsv) static void updateHueSlider(WMSlider *sPtr, WMFont *font, RHSVColor *hsv)
{ {
RColor *colors[8]; RColor *colors[8];
RImage *image; RImage *image;
@@ -353,7 +356,7 @@ static void updateHueSlider(WMSlider * sPtr, WMFont * font, RHSVColor * hsv)
wfree(colors[i]); wfree(colors[i]);
} }
static void sliderChangeCallback(WMWidget * w, void *data) static void sliderChangeCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
RHSVColor hsv; RHSVColor hsv;
@@ -417,9 +420,8 @@ static void sliderChangeCallback(WMWidget * w, void *data)
} }
colors[i] = NULL; colors[i] = NULL;
if (panel->gimage != None) { if (panel->gimage != None)
XFreePixmap(WMScreenDisplay(scr), panel->gimage); XFreePixmap(WMScreenDisplay(scr), panel->gimage);
}
image = RRenderMultiGradient(30, i * WMGetListItemHeight(panel->gcolL), colors, RVerticalGradient); image = RRenderMultiGradient(30, i * WMGetListItemHeight(panel->gcolL), colors, RVerticalGradient);
RConvertImage(WMScreenRContext(scr), image, &panel->gimage); RConvertImage(WMScreenRContext(scr), image, &panel->gimage);
@@ -432,7 +434,7 @@ static void sliderChangeCallback(WMWidget * w, void *data)
updateGradButtons(panel); updateGradButtons(panel);
} }
static void paintGradListItem(WMList * lPtr, int index, Drawable d, char *text, int state, WMRect * rect) static void paintGradListItem(WMList *lPtr, int index, Drawable d, char *text, int state, WMRect *rect)
{ {
TexturePanel *panel = (TexturePanel *) WMGetHangedData(lPtr); TexturePanel *panel = (TexturePanel *) WMGetHangedData(lPtr);
WMScreen *scr = WMWidgetScreen(lPtr); WMScreen *scr = WMWidgetScreen(lPtr);
@@ -465,7 +467,7 @@ static void paintGradListItem(WMList * lPtr, int index, Drawable d, char *text,
WMReleaseColor(gray); WMReleaseColor(gray);
} }
static void gradAddCallback(WMWidget * w, void *data) static void gradAddCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
WMListItem *item; WMListItem *item;
@@ -489,7 +491,7 @@ static void gradAddCallback(WMWidget * w, void *data)
WMSetButtonEnabled(panel->okB, WMGetListNumberOfRows(panel->gcolL) > 1); WMSetButtonEnabled(panel->okB, WMGetListNumberOfRows(panel->gcolL) > 1);
} }
static void gradClickCallback(WMWidget * w, void *data) static void gradClickCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
WMListItem *item; WMListItem *item;
@@ -511,7 +513,7 @@ static void gradClickCallback(WMWidget * w, void *data)
sliderChangeCallback(panel->gsatS, panel); sliderChangeCallback(panel->gsatS, panel);
} }
static void gradDeleteCallback(WMWidget * w, void *data) static void gradDeleteCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
WMListItem *item; WMListItem *item;
@@ -545,7 +547,7 @@ static void gradDeleteCallback(WMWidget * w, void *data)
/*************** Simple Gradient ***************/ /*************** Simple Gradient ***************/
static void colorWellObserver(void *self, WMNotification * n) static void colorWellObserver(void *self, WMNotification *n)
{ {
/* Parameter not used, but tell the compiler that it is ok */ /* Parameter not used, but tell the compiler that it is ok */
(void) n; (void) n;
@@ -553,7 +555,7 @@ static void colorWellObserver(void *self, WMNotification * n)
updateSGradButtons(self); updateSGradButtons(self);
} }
static void opaqChangeCallback(WMWidget * w, void *data) static void opaqChangeCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
@@ -565,7 +567,7 @@ static void opaqChangeCallback(WMWidget * w, void *data)
/****************** Image ******************/ /****************** Image ******************/
static void updateImage(TexturePanel * panel, const char *path) static void updateImage(TexturePanel *panel, const char *path)
{ {
WMScreen *scr = WMWidgetScreen(panel->win); WMScreen *scr = WMWidgetScreen(panel->win);
RImage *image; RImage *image;
@@ -613,12 +615,12 @@ static void updateImage(TexturePanel * panel, const char *path)
} }
} }
static void browseImageCallback(WMWidget * w, void *data) static void browseImageCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
WMOpenPanel *opanel; WMOpenPanel *opanel;
WMScreen *scr = WMWidgetScreen(w); WMScreen *scr = WMWidgetScreen(w);
static char *ipath = NULL; static char *ipath;
opanel = WMGetOpenPanel(scr); opanel = WMGetOpenPanel(scr);
WMSetFilePanelCanChooseDirectories(opanel, False); WMSetFilePanelCanChooseDirectories(opanel, False);
@@ -670,25 +672,24 @@ static void browseImageCallback(WMWidget * w, void *data)
} }
} }
static void buttonCallback(WMWidget * w, void *data) static void buttonCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
if (w == panel->okB) { if (w == panel->okB)
(*panel->okAction) (panel->okData); (*panel->okAction) (panel->okData);
} else { else
(*panel->cancelAction) (panel->cancelData); (*panel->cancelAction) (panel->cancelData);
}
} }
static void changeTypeCallback(WMWidget * w, void *data) static void changeTypeCallback(WMWidget *w, void *data)
{ {
TexturePanel *panel = (TexturePanel *) data; TexturePanel *panel = (TexturePanel *) data;
int newType; int newType;
int i; int i;
newType = WMGetPopUpButtonSelectedItem(w); newType = WMGetPopUpButtonSelectedItem(w);
if (newType == panel->currentType) if (newType < 0 || newType == panel->currentType)
return; return;
if (panel->currentType >= 0) { if (panel->currentType >= 0) {
@@ -731,7 +732,7 @@ static void changeTypeCallback(WMWidget * w, void *data)
* Public functions * Public functions
*-------------------------------------------------------------------------- *--------------------------------------------------------------------------
*/ */
void ShowTexturePanel(TexturePanel * panel) void ShowTexturePanel(TexturePanel *panel)
{ {
Display *dpy = WMScreenDisplay(WMWidgetScreen(panel->win)); Display *dpy = WMScreenDisplay(WMWidgetScreen(panel->win));
Screen *scr = DefaultScreenOfDisplay(dpy); Screen *scr = DefaultScreenOfDisplay(dpy);
@@ -742,24 +743,24 @@ void ShowTexturePanel(TexturePanel * panel)
WMMapWidget(panel->win); WMMapWidget(panel->win);
} }
void HideTexturePanel(TexturePanel * panel) void HideTexturePanel(TexturePanel *panel)
{ {
WMUnmapWidget(panel->win); WMUnmapWidget(panel->win);
} }
void SetTexturePanelOkAction(TexturePanel * panel, WMCallback * action, void *clientData) void SetTexturePanelOkAction(TexturePanel *panel, WMCallback *action, void *clientData)
{ {
panel->okAction = action; panel->okAction = action;
panel->okData = clientData; panel->okData = clientData;
} }
void SetTexturePanelCancelAction(TexturePanel * panel, WMCallback * action, void *clientData) void SetTexturePanelCancelAction(TexturePanel *panel, WMCallback *action, void *clientData)
{ {
panel->cancelAction = action; panel->cancelAction = action;
panel->cancelData = clientData; panel->cancelData = clientData;
} }
void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList * texture) void SetTexturePanelTexture(TexturePanel *panel, const char *name, WMPropList *texture)
{ {
WMScreen *scr = WMWidgetScreen(panel->win); WMScreen *scr = WMWidgetScreen(panel->win);
char *str, *type; char *str, *type;
@@ -775,9 +776,8 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
return; return;
p = WMGetFromPLArray(texture, 0); p = WMGetFromPLArray(texture, 0);
if (!p) { if (!p)
goto bad_texture; goto bad_texture;
}
type = WMGetFromPLString(p); type = WMGetFromPLString(p);
/*............................................... */ /*............................................... */
@@ -786,11 +786,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_SOLID); WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_SOLID);
p = WMGetFromPLArray(texture, 1); p = WMGetFromPLArray(texture, 1);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->defcW, color); WMSetColorWellColor(panel->defcW, color);
@@ -803,11 +802,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_SGRADIENT); WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_SGRADIENT);
p = WMGetFromPLArray(texture, 1); p = WMGetFromPLArray(texture, 1);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->tcol1W, color); WMSetColorWellColor(panel->tcol1W, color);
@@ -815,11 +813,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMReleaseColor(color); WMReleaseColor(color);
p = WMGetFromPLArray(texture, 2); p = WMGetFromPLArray(texture, 2);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->tcol2W, color); WMSetColorWellColor(panel->tcol2W, color);
@@ -846,11 +843,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMSetSliderValue(panel->topaS, i); WMSetSliderValue(panel->topaS, i);
p = WMGetFromPLArray(texture, 3); p = WMGetFromPLArray(texture, 3);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->tcol1W, color); WMSetColorWellColor(panel->tcol1W, color);
@@ -858,11 +854,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMReleaseColor(color); WMReleaseColor(color);
p = WMGetFromPLArray(texture, 4); p = WMGetFromPLArray(texture, 4);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->tcol2W, color); WMSetColorWellColor(panel->tcol2W, color);
@@ -873,9 +868,9 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
if (panel->imageFile) if (panel->imageFile)
wfree(panel->imageFile); wfree(panel->imageFile);
if ((panel->imageFile = wfindfileinarray(panel->pathList, panel->imageFile = wfindfileinarray(panel->pathList,
WMGetFromPLString(WMGetFromPLArray(texture, 1)))) != WMGetFromPLString(WMGetFromPLArray(texture, 1)));
NULL) { if (panel->imageFile != NULL) {
panel->image = RLoadImage(WMScreenRContext(scr), panel->imageFile, 0); panel->image = RLoadImage(WMScreenRContext(scr), panel->imageFile, 0);
updateTGradImage(panel); updateTGradImage(panel);
@@ -899,11 +894,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_GRADIENT); WMSetPopUpButtonSelectedItem(panel->typeP, TYPE_GRADIENT);
p = WMGetFromPLArray(texture, 1); p = WMGetFromPLArray(texture, 1);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
color = WMCreateNamedColor(scr, str, False); color = WMCreateNamedColor(scr, str, False);
WMSetColorWellColor(panel->defcW, color); WMSetColorWellColor(panel->defcW, color);
@@ -915,11 +909,10 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
XColor xcolor; XColor xcolor;
p = WMGetFromPLArray(texture, i); p = WMGetFromPLArray(texture, i);
if (!p) { if (!p)
str = "black"; str = "black";
} else { else
str = WMGetFromPLString(p); str = WMGetFromPLString(p);
}
XParseColor(WMScreenDisplay(scr), WMScreenRContext(scr)->cmap, str, &xcolor); XParseColor(WMScreenDisplay(scr), WMScreenRContext(scr)->cmap, str, &xcolor);
@@ -953,6 +946,9 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
case 'M': case 'M':
WMSetPopUpButtonSelectedItem(panel->arrP, PTYPE_MAXIMIZE); WMSetPopUpButtonSelectedItem(panel->arrP, PTYPE_MAXIMIZE);
break; break;
case 'F':
WMSetPopUpButtonSelectedItem(panel->arrP, PTYPE_FILL);
break;
default: default:
case 'T': case 'T':
WMSetPopUpButtonSelectedItem(panel->arrP, PTYPE_TILE); WMSetPopUpButtonSelectedItem(panel->arrP, PTYPE_TILE);
@@ -1001,13 +997,13 @@ void SetTexturePanelTexture(TexturePanel * panel, const char *name, WMPropList *
} }
char *GetTexturePanelTextureName(TexturePanel * panel) char *GetTexturePanelTextureName(TexturePanel *panel)
{ {
return WMGetTextFieldText(panel->nameT); return WMGetTextFieldText(panel->nameT);
} }
WMPropList *GetTexturePanelTexture(TexturePanel * panel) WMPropList *GetTexturePanelTexture(TexturePanel *panel)
{ {
WMPropList *prop = NULL; WMPropList *prop = NULL;
WMColor *color; WMColor *color;
@@ -1038,6 +1034,10 @@ WMPropList *GetTexturePanelTexture(TexturePanel * panel)
prop = WMCreatePLArray(WMCreatePLString("mpixmap"), prop = WMCreatePLArray(WMCreatePLString("mpixmap"),
WMCreatePLString(panel->imageFile), WMCreatePLString(str), NULL); WMCreatePLString(panel->imageFile), WMCreatePLString(str), NULL);
break; break;
case PTYPE_FILL:
prop = WMCreatePLArray(WMCreatePLString("fpixmap"),
WMCreatePLString(panel->imageFile), WMCreatePLString(str), NULL);
break;
case PTYPE_CENTER: case PTYPE_CENTER:
prop = WMCreatePLArray(WMCreatePLString("cpixmap"), prop = WMCreatePLArray(WMCreatePLString("cpixmap"),
WMCreatePLString(panel->imageFile), WMCreatePLString(str), NULL); WMCreatePLString(panel->imageFile), WMCreatePLString(str), NULL);
@@ -1104,13 +1104,12 @@ WMPropList *GetTexturePanelTexture(TexturePanel * panel)
color = WMGetColorWellColor(panel->defcW); color = WMGetColorWellColor(panel->defcW);
str = WMGetColorRGBDescription(color); str = WMGetColorRGBDescription(color);
if (WMGetButtonSelected(panel->dirdB)) { if (WMGetButtonSelected(panel->dirdB))
prop = WMCreatePLArray(WMCreatePLString("mdgradient"), WMCreatePLString(str), NULL); prop = WMCreatePLArray(WMCreatePLString("mdgradient"), WMCreatePLString(str), NULL);
} else if (WMGetButtonSelected(panel->dirvB)) { else if (WMGetButtonSelected(panel->dirvB))
prop = WMCreatePLArray(WMCreatePLString("mvgradient"), WMCreatePLString(str), NULL); prop = WMCreatePLArray(WMCreatePLString("mvgradient"), WMCreatePLString(str), NULL);
} else { else
prop = WMCreatePLArray(WMCreatePLString("mhgradient"), WMCreatePLString(str), NULL); prop = WMCreatePLArray(WMCreatePLString("mhgradient"), WMCreatePLString(str), NULL);
}
wfree(str); wfree(str);
for (i = 0; i < WMGetListNumberOfRows(panel->gcolL); i++) { for (i = 0; i < WMGetListNumberOfRows(panel->gcolL); i++) {
@@ -1131,12 +1130,12 @@ WMPropList *GetTexturePanelTexture(TexturePanel * panel)
return prop; return prop;
} }
void SetTexturePanelPixmapPath(TexturePanel * panel, WMPropList * array) void SetTexturePanelPixmapPath(TexturePanel *panel, WMPropList *array)
{ {
panel->pathList = array; panel->pathList = array;
} }
TexturePanel *CreateTexturePanel(WMWindow * keyWindow) TexturePanel *CreateTexturePanel(WMWindow *keyWindow)
/*CreateTexturePanel(WMScreen *scr)*/ /*CreateTexturePanel(WMScreen *scr)*/
{ {
TexturePanel *panel; TexturePanel *panel;
@@ -1407,6 +1406,7 @@ TexturePanel *CreateTexturePanel(WMWindow * keyWindow)
WMAddPopUpButtonItem(panel->arrP, _("Scale")); WMAddPopUpButtonItem(panel->arrP, _("Scale"));
WMAddPopUpButtonItem(panel->arrP, _("Center")); WMAddPopUpButtonItem(panel->arrP, _("Center"));
WMAddPopUpButtonItem(panel->arrP, _("Maximize")); WMAddPopUpButtonItem(panel->arrP, _("Maximize"));
WMAddPopUpButtonItem(panel->arrP, _("Fill"));
WMSetPopUpButtonSelectedItem(panel->arrP, 0); WMSetPopUpButtonSelectedItem(panel->arrP, 0);
WMMapSubwidgets(panel->imageF); WMMapSubwidgets(panel->imageF);
@@ -1475,7 +1475,7 @@ TexturePanel *CreateTexturePanel(WMWindow * keyWindow)
char *ProgName = "test"; char *ProgName = "test";
void testOKButton(WMWidget * self, void *data) void testOKButton(WMWidget *self, void *data)
{ {
char *test; char *test;
Display *dpy; Display *dpy;
@@ -1504,13 +1504,13 @@ void testOKButton(WMWidget * self, void *data)
} }
void testCancelButton(WMWidget * self, void *data) void testCancelButton(WMWidget *self, void *data)
{ {
wwarning("Exiting test...."); wwarning("Exiting test....");
exit(0); exit(0);
} }
void wAbort() void wAbort(void)
{ {
exit(1); exit(1);
} }
+11 -1
View File
@@ -23,6 +23,7 @@
#include "WPrefs.h" #include "WPrefs.h"
#include <assert.h> #include <assert.h>
#include <X11/Xatom.h>
#ifdef HAVE_STDNORETURN #ifdef HAVE_STDNORETURN
#include <stdnoreturn.h> #include <stdnoreturn.h>
@@ -516,6 +517,9 @@ void Initialize(WMScreen * scr)
char **list; char **list;
int i; int i;
char *path; char *path;
long pid;
Atom net_wm_pid;
Display *dpy = WMScreenDisplay(scr);
list = RSupportedFileFormats(); list = RSupportedFileFormats();
for (i = 0; list[i] != NULL; i++) { for (i = 0; list[i] != NULL; i++) {
@@ -547,6 +551,11 @@ void Initialize(WMScreen * scr)
WMRealizeWidget(WPrefs.win); WMRealizeWidget(WPrefs.win);
net_wm_pid = XInternAtom(dpy, "_NET_WM_PID", False);
pid = (long)getpid();
XChangeProperty(dpy, WMWidgetXID(WPrefs.win), net_wm_pid, XA_CARDINAL,
32, PropModeReplace, (unsigned char *)&pid, 1);
WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr)); WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr));
WMMapWidget(WPrefs.win); WMMapWidget(WPrefs.win);
@@ -575,6 +584,7 @@ void Initialize(WMScreen * scr)
InitKeyboardSettings(WPrefs.banner); InitKeyboardSettings(WPrefs.banner);
#endif #endif
InitKeyboardShortcuts(WPrefs.banner); InitKeyboardShortcuts(WPrefs.banner);
InitHotCornerShortcuts(WPrefs.banner);
InitMouseSettings(WPrefs.banner); InitMouseSettings(WPrefs.banner);
InitAppearance(WPrefs.banner); InitAppearance(WPrefs.banner);
@@ -602,7 +612,7 @@ static void loadConfigurations(WMScreen * scr, WMWindow * mainw)
char *path; char *path;
FILE *file; FILE *file;
char buffer[1024]; char buffer[1024];
char mbuf[1024]; char mbuf[1069]; /* Size of buffer and extra characters for the sprintfs */
int v1, v2, v3; int v1, v2, v3;
path = wdefaultspathfordomain("WindowMaker"); path = wdefaultspathfordomain("WindowMaker");
+9
View File
@@ -0,0 +1,9 @@
[Desktop Entry]
Version=1.5
Type=Application
Name=WPrefs
Comment=Window Maker Preferences
TryExec=#wprefs_bindir#/WPrefs
Exec=WPrefs
Icon=#wprefs_datadir#/WPrefs.xpm
Categories=Settings;DesktopSettings;
+2 -1
View File
@@ -33,6 +33,7 @@
#include <wraster.h> #include <wraster.h>
#include <WINGs/WINGs.h> #include <WINGs/WINGs.h>
#include <WINGs/WINGsP.h>
/* Needed for HAVE_LIBINTL_H and EXTENDED_WINDOWSHORTCUT */ /* Needed for HAVE_LIBINTL_H and EXTENDED_WINDOWSHORTCUT */
#include "../src/wconfig.h" #include "../src/wconfig.h"
@@ -54,7 +55,6 @@
/****/ /****/
extern char *NOptionValueChanged; extern char *NOptionValueChanged;
extern Bool xext_xkb_supported;
typedef struct _Panel Panel; typedef struct _Panel Panel;
@@ -155,6 +155,7 @@ Panel *InitDocks(WMWidget *parent);
Panel *InitExpert(WMWidget *parent); Panel *InitExpert(WMWidget *parent);
Panel *InitFocus(WMWidget *parent); Panel *InitFocus(WMWidget *parent);
Panel *InitFontSimple(WMWidget *parent); Panel *InitFontSimple(WMWidget *parent);
Panel *InitHotCornerShortcuts(WMWidget *parent);
Panel *InitIcons(WMWidget *parent); Panel *InitIcons(WMWidget *parent);
Panel *InitKeyboardShortcuts(WMWidget *parent); Panel *InitKeyboardShortcuts(WMWidget *parent);
Panel *InitMenu(WMWidget *parent); Panel *InitMenu(WMWidget *parent);
+5 -2
View File
@@ -207,12 +207,15 @@ static void createPanel(Panel * p)
static void storeData(_Panel * panel) static void storeData(_Panel * panel)
{ {
int tmp = WMGetPopUpButtonSelectedItem(panel->posP);
if (tmp < 0)
return;
SetBoolForKey(!WMGetButtonSelected(panel->linkB), "DontLinkWorkspaces"); SetBoolForKey(!WMGetButtonSelected(panel->linkB), "DontLinkWorkspaces");
SetBoolForKey(WMGetButtonSelected(panel->cyclB), "CycleWorkspaces"); SetBoolForKey(WMGetButtonSelected(panel->cyclB), "CycleWorkspaces");
SetBoolForKey(WMGetButtonSelected(panel->newB), "AdvanceToNewWorkspace"); SetBoolForKey(WMGetButtonSelected(panel->newB), "AdvanceToNewWorkspace");
SetStringForKey(WSNamePositions[WMGetPopUpButtonSelectedItem(panel->posP)], SetStringForKey(WSNamePositions[tmp], "WorkspaceNameDisplayPosition");
"WorkspaceNameDisplayPosition");
} }
Panel *InitWorkspace(WMWidget *parent) Panel *InitWorkspace(WMWidget *parent)
+1 -1
View File
@@ -1150,7 +1150,7 @@ static void dragItem(WEditMenu * menu, WEditMenuItem * item, Bool copy)
static XColor back = { 0, 0xffff, 0xffff, 0xffff, DoRed | DoGreen | DoBlue, 0 }; static XColor back = { 0, 0xffff, 0xffff, 0xffff, DoRed | DoGreen | DoBlue, 0 };
Display *dpy = W_VIEW_DISPLAY(menu->view); Display *dpy = W_VIEW_DISPLAY(menu->view);
WMScreen *scr = W_VIEW_SCREEN(menu->view); WMScreen *scr = W_VIEW_SCREEN(menu->view);
int x, y; int x = 0, y = 0;
int dx, dy; int dx, dy;
Bool done = False; Bool done = False;
Window blaw; Window blaw;
-20
View File
@@ -35,8 +35,6 @@
#endif #endif
char *NOptionValueChanged = "NOptionValueChanged"; char *NOptionValueChanged = "NOptionValueChanged";
Bool xext_xkb_supported = False;
#define MAX_DEATHS 64 #define MAX_DEATHS 64
@@ -66,19 +64,6 @@ static void print_help(const char *progname)
puts(_(" --help print this message and exit")); puts(_(" --help print this message and exit"));
} }
#if 0
static RETSIGTYPE handleDeadChild(int sig)
{
pid_t pid;
int status;
pid = waitpid(-1, &status, WNOHANG);
if (pid > 0) {
DeadChildren[DeadChildrenCount++] = pid;
}
}
#endif
void AddDeadChildHandler(pid_t pid, void (*handler) (void *), void *data) void AddDeadChildHandler(pid_t pid, void (*handler) (void *), void *data)
{ {
int i; int i;
@@ -164,17 +149,12 @@ int main(int argc, char **argv)
wfatal(_("could not open display %s"), XDisplayName(display_name)); wfatal(_("could not open display %s"), XDisplayName(display_name));
exit(0); exit(0);
} }
#if 0
XSynchronize(dpy, 1);
#endif
scr = WMCreateScreen(dpy, DefaultScreen(dpy)); scr = WMCreateScreen(dpy, DefaultScreen(dpy));
if (!scr) { if (!scr) {
wfatal(_("could not initialize application")); wfatal(_("could not initialize application"));
exit(0); exit(0);
} }
xext_xkb_supported = XkbQueryExtension(dpy, NULL, NULL, NULL, NULL, NULL);
WMPLSetCaseSensitive(False); WMPLSetCaseSensitive(False);
Initialize(scr); Initialize(scr);
+3 -1
View File
@@ -5,7 +5,8 @@ CATALOGS = @WPREFSMOFILES@
CLEANFILES = $(DOMAIN).pot $(CATALOGS) CLEANFILES = $(DOMAIN).pot $(CATALOGS)
EXTRA_DIST = bg.po ca.po cs.po de.po es.po et.po fi.po fr.po fy.po hr.po hu.po \ EXTRA_DIST = bg.po ca.po cs.po de.po es.po et.po fi.po fr.po fy.po hr.po hu.po \
it.po ja.po ko.po nl.po pt.po ru.po sk.po uk.po zh_CN.po zh_TW.po it.po ja.po ko.po nl.po pt.po ru.po sk.po sr.po tr.po uk.po zh_CN.po \
zh_TW.po
POTFILES = \ POTFILES = \
$(top_srcdir)/WPrefs.app/Appearance.c \ $(top_srcdir)/WPrefs.app/Appearance.c \
@@ -14,6 +15,7 @@ POTFILES = \
$(top_srcdir)/WPrefs.app/Expert.c \ $(top_srcdir)/WPrefs.app/Expert.c \
$(top_srcdir)/WPrefs.app/Focus.c \ $(top_srcdir)/WPrefs.app/Focus.c \
$(top_srcdir)/WPrefs.app/FontSimple.c \ $(top_srcdir)/WPrefs.app/FontSimple.c \
$(top_srcdir)/WPrefs.app/HotCornerShortcuts.c \
$(top_srcdir)/WPrefs.app/Icons.c \ $(top_srcdir)/WPrefs.app/Icons.c \
$(top_srcdir)/WPrefs.app/KeyboardShortcuts.c \ $(top_srcdir)/WPrefs.app/KeyboardShortcuts.c \
$(top_srcdir)/WPrefs.app/Menu.c \ $(top_srcdir)/WPrefs.app/Menu.c \
+3 -2
View File
@@ -1,7 +1,7 @@
File Language Current Maintainer File Language Current Maintainer
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
pt.po Portuguese Eliphas Levy Theodoro <eliphas@conectiva.com.br> pt.po Portuguese Eliphas Levy Theodoro <eliphas@conectiva.com.br>
hr.po Croatian Toni Biliæ <tbilic@oliver.efos.hr> hr.po Croatian Toni Biliæ <tbilic@oliver.efos.hr>
fr.po French Bastien NOCERA <hadess@writeme.com> fr.po French Bastien NOCERA <hadess@writeme.com>
Hadess <hadess@infonie.fr> Hadess <hadess@infonie.fr>
Antoine Hulin <antoine@origan.fdn.org> Antoine Hulin <antoine@origan.fdn.org>
@@ -23,6 +23,7 @@ bg.po Bulgarian Slavei Karadjov <slaff@exco.net>
Anton Zinoviev <zinoviev@debian.org> Anton Zinoviev <zinoviev@debian.org>
sk.po Slovak Jan 'judas' Tomka <judas@linux.sk> sk.po Slovak Jan 'judas' Tomka <judas@linux.sk>
et.po Estonian Ivar Smolin <okul@linux.ee> et.po Estonian Ivar Smolin <okul@linux.ee>
ca.po Catalan Ernest Adrogué <eadrogue@gmx.net> ca.po Catalan Ernest Adrogué <eadrogue@gmx.net>
nl.po Dutch Alwin <translations@ziggo.nl> nl.po Dutch Alwin <translations@ziggo.nl>
fy.po Frisian Alwin <translations@ziggo.nl> fy.po Frisian Alwin <translations@ziggo.nl>
sr.po Serbian Strahinya Radich <sr@strahinja.org>
+1
View File
@@ -8,6 +8,7 @@ msgstr ""
"PO-Revision-Date: 2001-04-18 23:22+03:00\n" "PO-Revision-Date: 2001-04-18 23:22+03:00\n"
"Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n" "Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n"
"Language-Team: Bulgarian <dict@linux.zonebg.com>\n" "Language-Team: Bulgarian <dict@linux.zonebg.com>\n"
"Language: bg\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+1
View File
@@ -14,6 +14,7 @@ msgstr ""
"PO-Revision-Date: 2003-09-16 23:15+0200\n" "PO-Revision-Date: 2003-09-16 23:15+0200\n"
"Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n" "Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n"
"Language-Team: Catalan <ca@dodds.net>\n" "Language-Team: Catalan <ca@dodds.net>\n"
"Language: ca\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
+1
View File
@@ -16,6 +16,7 @@ msgstr ""
"PO-Revision-Date: 2001-10-14 21:07+0000\n" "PO-Revision-Date: 2001-10-14 21:07+0000\n"
"Last-Translator: Jiří Hnídek <jiri.hnidek@vslib.cz>\n" "Last-Translator: Jiří Hnídek <jiri.hnidek@vslib.cz>\n"
"Language-Team: czech <cs@li.org>\n" "Language-Team: czech <cs@li.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: unknown\n" "Content-Transfer-Encoding: unknown\n"
+2 -1
View File
@@ -18,6 +18,7 @@ msgstr ""
"PO-Revision-Date: 2010-02-02 10:49+0100\n" "PO-Revision-Date: 2010-02-02 10:49+0100\n"
"Last-Translator: Carlos R. Mafra <crmafra@gmail.com>\n" "Last-Translator: Carlos R. Mafra <crmafra@gmail.com>\n"
"Language-Team: German <>\n" "Language-Team: German <>\n"
"Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -819,7 +820,7 @@ msgstr "Clip in den Vor-/Hintergrund"
#: ../../WPrefs.app/KeyboardShortcuts.c:518 #: ../../WPrefs.app/KeyboardShortcuts.c:518
msgid "Toggle keyboard language" msgid "Toggle keyboard language"
msgstr "Tastatursbelegung ändern" msgstr "Tastaturbelegung ändern"
#: ../../WPrefs.app/KeyboardShortcuts.c:532 #: ../../WPrefs.app/KeyboardShortcuts.c:532
msgid "Shortcut" msgid "Shortcut"

Some files were not shown because too many files have changed in this diff Show More