Compare commits

...

148 Commits

Author SHA1 Message Date
kikadf 6f403f4930 Merge branch 'master' into master 2022-10-24 05:06:38 -07:00
maxerba 456713da90 Updating french and portuguese translations 2022-10-19 23:09:40 +02:00
kikadf d712789c9a Use default way to locale listing on OpenBSD
Listing /usr/share/locale doesn't work, and
already OpenBSD has support for locale.
2022-09-29 14:41:43 +02:00
Marcel Hollerbach 928cf22f3e fix error message 2022-09-16 01:36:53 -07:00
Marcel Hollerbach f1d43c42a3 e_pointer: try to be sane with x11 and wl
wl does not have fallback rendering, therefore we always fallback to
default. In x11 we fallback to x11 rendering the cursor.

This should logically now not result in the cursor canvas beeing
deleted.
2022-09-16 01:36:53 -07:00
Marcel Hollerbach 5cc6f31035 e_pointer: do not call x11 setup when on wl path 2022-09-16 01:36:53 -07:00
Marcel Hollerbach 9778dc9738 more output 2022-09-16 01:36:53 -07:00
Carsten Haitzler 319b307c59 enlightenment_system - harden - no sysactions.conf - deny all actions 2022-09-15 15:17:53 +01:00
Carsten Haitzler cc7faeccf7 enlightenment_sys - fix security hole CVE-2022-37706
https://github.com/MaherAzzouzi/CVE-2022-37706-LPE-exploit

fixes that.
@fix
2022-09-15 14:38:21 +01:00
Carsten Haitzler fe0945600a win - shapes - set pass events if we have shaped wins but no rects
could be an EMPTY set of input rects but shaped still... so pass
events on the comp obj.

fixes recordmydesktop

@fix
2022-09-11 15:35:54 +01:00
Carsten Haitzler 47e9eae4ed wl desktop session file - some dm's dont like VAR=x without env
add env at the start as they dont seem to like running things with just

VAR=x VAR2=y cmd

enlightenment happily does this... sddm does not it seems.
2022-09-11 11:59:30 +01:00
Carsten Haitzler 2e30f391fb notification - fix property name for suppress sound 2022-09-09 09:40:38 +01:00
Carsten Haitzler 05e150ad43 e wl - force gl for wl mode now due to kernel breaks
also make session file do this by default for wl mode.

@fix (work around kernel changes?)
2022-08-26 08:53:03 +01:00
Christopher Michael a5d004a49b e_int_client_prop: Fix ICCCM/NetWM dialog issues
Make this dialog resizable for reading longer text (window titles,
etc). Also, fix the layout silliness that was going on by aligning the
table entries properly.

This dialog looked like crap :( Let's fix that :)
2022-08-20 11:12:00 -04:00
Carsten Haitzler 2294ea9f8a update id - use longer sha1 hash for id 2022-08-20 08:51:50 +01:00
Carsten Haitzler 3c46a6796a blanking block menu - show more info like reason. 2022-08-09 09:25:10 +01:00
Carsten Haitzler 88d7e3b836 screensaver blanking dbus api - also support /ScreenSaver path 2022-08-09 09:19:19 +01:00
Carsten Haitzler c93c976069 use XSession type - it seems some dm's are enforcing a non-standard
they insist on Type=XSession or you end up with a blank screen. this
was never defined as the standard. wm's have been using
Type=Application for decades! it's still documented in many places as
the way to add a custom session too. this is a workaround these stupid
DM's insisting on this. There is no good reason to make these changes.
2022-08-03 15:28:54 +01:00
Carsten Haitzler aaf317b61d mesgbus - fix nukll name dbus string send
This fixes #11
2022-08-01 17:11:42 +01:00
Carsten Haitzler 225cbac56f watchdog - fix size of ping seq buffer entries 2022-07-20 15:53:56 +01:00
Carsten Haitzler bea94314bd allow multiple mimes and actions on files in efm 2022-07-20 15:36:30 +01:00
Carsten Haitzler db3ea64dd3 terms - expand fallback list of term desktops 2022-07-05 13:06:21 +01:00
Carsten Haitzler c2869268d8 term list - move to a single file to list possible terminal desktops 2022-07-05 12:48:19 +01:00
Carsten Haitzler 5980468f7f enlightenment_open - handle Terminal=true properly not just scheme
This makes termina-ltrue launch properly from enlightemnent_open as
you might expect as it works from core e already when it launches/

@fix
2022-07-05 12:34:58 +01:00
Carsten Haitzler daabedaac1 execution - add more terminal desktops to fallback list 2022-07-05 11:56:38 +01:00
Carsten Haitzler 130535af97 win - first map - fix energyxt unmap bug by wiping ignore unmap
For some reason I have yet to divine we don't get an initial unmap
event due to the reparent of the energyxt dialog windows and the
"ignore that first unmap" flag does not get cleared because it doesn't
happen. later when the dialog is withdrawn {9unmapped) this is ignored
then when you close the dialog... thus keeping it around as far as e
is concerned.

so to fix this - add a small timeout to clean this flag after a
show/map.

@fix
2022-07-05 09:25:35 +01:00
Carsten Haitzler a39341d4a6 fix typo 2022-06-23 11:32:12 +01:00
Carsten Haitzler 3d4789531d fix readme a bit 2022-06-23 11:31:05 +01:00
Carsten Haitzler 70a5f83cf7 reamde - note nvidia issues 2022-06-23 11:25:19 +01:00
Carsten Haitzler 2bc9efc261 e sound - forgot to call init - call init 2022-06-18 12:24:41 +01:00
Carsten Haitzler 2b095b67d1 notification - play sound samples and advertise it in caps 2022-06-18 12:23:02 +01:00
Carsten Haitzler 91e797eab7 add simple sound play api to play samples 2022-06-18 12:20:05 +01:00
Carsten Haitzler b312bb3aa6 notifications - send signals for cateogry and urgency 2022-06-18 10:09:40 +01:00
Carsten Haitzler cdad184547 notification module - handle misnamed desktop files e.g. firefox 2022-06-18 09:35:51 +01:00
Carsten Haitzler bfd175e985 notification - remove unused func 2022-06-18 09:26:52 +01:00
Carsten Haitzler b23eedae98 notifications - extend to support actions, links and img tags
we didn't support enough of noktifications to make everyone happy -
this is why ffox, chrome etc. did their own notification windows and
didn't use e's notifications. we now advertise doing everything. we
say w edo sound though don't.... will add that later, but this now
means we really do a lot more and thus pushes these other
notifications into e's notifications so we're much better now and this
annoyance i have noticed is now gone.

@feat
2022-06-18 00:46:12 +01:00
maxerba 1933f745f2 Updating french and italian translation 2022-06-18 00:04:37 +02:00
Carsten Haitzler 7dcf43051f watchdog - enable. it seems to work fine for me... and that's good. 2022-06-16 15:45:29 +01:00
Carsten Haitzler dbcc56014c fix move to defines for msgbus dbus services for iface/core 2022-06-16 15:45:03 +01:00
Simon Tischer c823c9e97c remove unused 'restore default bindings', default are none bindings 2022-06-15 16:11:46 +02:00
Simon Tischer f0470e0cfd remove unused 'restore default bindings', default are none bindings 2022-06-15 16:10:17 +02:00
Carsten Haitzler 9b0379693d watchdog (currently not used) - fix alloc of right sized ping buf 2022-06-08 11:48:13 +01:00
Christopher Michael bc15cd91e8 readme: Fix some typos, grammar, etc 2022-06-07 10:36:12 -04:00
Carsten Haitzler 495506924c readme - fix icon link 2022-06-06 20:45:45 +01:00
Carsten Haitzler a3ae31ce3f adjust reame icon to be nicer like main page icon 2022-06-06 20:45:07 +01:00
Carsten Haitzler d30f3fcfc3 not using NEWS anymore - it's on e.org and has been for a long time 2022-06-04 17:53:56 +01:00
Carsten Haitzler 9720f05cc5 readme - format improvement 2022-06-04 17:52:09 +01:00
Carsten Haitzler c1d913ff91 readme - clarify xsession errors 2022-06-04 17:49:02 +01:00
Carsten Haitzler e14073ac20 readme - improve formatting 2022-06-04 17:46:13 +01:00
Carsten Haitzler f8a89ce6c8 readme - add one more rule 2022-06-04 17:45:37 +01:00
Carsten Haitzler d0a1539ee1 readme - expand readme a bit more and some fixes. 2022-06-04 17:44:53 +01:00
Carsten Haitzler 14313ac0ce readme - add info on running e for your login 2022-06-04 17:31:35 +01:00
Carsten Haitzler 4b13181f3f readme - add more shots 2022-06-04 17:19:06 +01:00
Carsten Haitzler 82bea2f0a3 update TODO 2022-06-04 17:09:46 +01:00
Carsten Haitzler 601a23954a move todo to todo.md 2022-06-04 17:04:55 +01:00
Carsten Haitzler 843efc94fd readme - mention system.conf too 2022-06-04 16:52:30 +01:00
Carsten Haitzler 01c64f95f0 readme remove typo in compil and install 2022-06-04 16:50:33 +01:00
Carsten Haitzler 1cd1bded2c improve notes 2022-06-04 15:24:48 +01:00
Carsten Haitzler 4d08f166b9 improve readme formatting 2022-06-04 15:22:33 +01:00
Carsten Haitzler 53e7c9999f use readme specific icon 2022-06-04 15:17:35 +01:00
Carsten Haitzler 632ed6f6cf readme icon 2022-06-04 15:17:10 +01:00
Carsten Haitzler 3846dc81f0 move readme to markdown and include install info 2022-06-04 15:14:05 +01:00
Carsten Haitzler d4bada44bc remove file we dont need anymore 2022-06-04 14:07:12 +01:00
l05o dceb969857 e-remote - added -window-sendtodesktop 2022-06-04 13:29:16 +01:00
Carsten Haitzler d641d418c7 update TODO ... 2022-06-03 23:30:02 +01:00
Carsten Haitzler f374da2ef0 sys - add support for logind/systemd lock/unlock dbus api's
@feat
2022-06-03 11:46:34 +01:00
Carsten Haitzler 60d94f771c e comp - fix noisy debug printf due to previous fix
removes noise from 4c6dd08e25

@fix
2022-06-03 11:06:28 +01:00
Carsten Haitzler fc13afced0 add support for org.freedesktop.ScreenSaver dbus inhibit api
this also then can list the inhibitors in a blanking block submenu of
the main menu = select one to remove it as a blocker...

@feat
2022-06-02 18:50:00 +01:00
Carsten Haitzler 5e793df529 msgbus - tidy up code a bit preparing to expand 2022-06-02 10:02:17 +01:00
Carsten Haitzler c6612a7d8a dbus - move service strings to defines completely 2022-06-02 09:24:24 +01:00
maxerba 915875051f Updating french and italian translations 2022-06-01 13:54:26 +02:00
Carsten Haitzler 0d0c49e616 shot - allow escape to escape the shot dialog 2022-05-23 17:35:28 +01:00
Carsten Haitzler 422c0b6765 efm - support system provided desktop files for actions
right clikc -> actions -> ... here

you might want desktop files that have

X-Enlightenment-Action-Mime=inode/directory

in them - then they will be included in that menu and whatever is
executed is passed the dir when run as an argument. example:

[Desktop Entry]
Type=Application
Name=Dir xmessage
Exec=xmessage
Icon=video_player
NoDisplay=true
X-Enlightenment-Action-Mime=inode/directory
2022-05-20 13:24:35 +01:00
Carsten Haitzler cfefb25647 remove tabs and replace with spaces in printf's in main 2022-05-19 19:16:42 +01:00
Carsten Haitzler 0ac04f0545 fix enlightenment help and version optiosn to exit after print
@fix
2022-05-19 19:15:55 +01:00
Carsten Haitzler 4c6dd08e25 gtk frame porp change - if deleted for an existing csd app then adjust
assume it went to 0 size if removed and already a csd frame window
which is what chomium does going fullscreen - i didnt see this as i
used chromium with system titlebars not its own.

@fix
2022-05-19 18:08:51 +01:00
Carsten Haitzler 877fde5eaa e comp wl - fix warning for uninit var
actually code path wouldn't care, but this silences a warning

@fix
2022-05-18 13:03:48 +01:00
Carsten Haitzler d869db87ce popup - simplify buffer alloc for popup body and silence warning
@fix
2022-05-18 12:58:23 +01:00
Carsten Haitzler 7c6adbd6fe open - fix warning with possible uninitted var
@fix
2022-05-18 12:58:19 +01:00
Carsten Haitzler 51e09f2a77 e config - use new eet_sync_sync to ensure data is synced to disk
sync data before the rename - ensure it is on disk first with new eet
func.

@feat
2022-05-16 14:00:22 +01:00
Carsten Haitzler 027a810e84 e config - fix config fallback handling - it was broken
loaded the wrong filename pattern due to a change i made ages to it
from file.N.cfg to file.cfg.N.

@fix
2022-05-16 13:59:29 +01:00
Carsten Haitzler a1600a137f client evas objects - fix - dont use precise for shaped input
shaped input doesnt affect or make custom copies of pixel data, thus
precise inside can't work (it can only work if the pixel data is local
- thus textur efrom pixmap is not going to produce valid data thus...
you get the drift). this fixes some odd focus/event things with some
windows that use shaped input only

@fix
2022-05-14 23:13:06 +01:00
Carsten Haitzler 5cf747d45d wayland support - add watermark and bug message and pause
this will clearly alert a user they are using e in wayland mode. this
is needed as there seems to be far too much confusion if e is in
wayland or not and when it is people having issues. this makes sure
e's wayland session desktop also has the label in it so it's clear etc.
2022-05-13 20:36:58 +01:00
Carsten Haitzler 5ad1680a7d e nice/pri change - centralise to util code
also getrlimit to know if we can lower nice level, you will want
something like:

*                -       nice            0

in /etc/security/limits.conf to allow for users to both raise and
lower nice level up until this limit (ie not negative nice levels).

perhaps enlightenment_system needs to do this...
2022-05-13 20:36:58 +01:00
Spam Me e0ccb08d0a Add german translations 2022-05-09 11:28:08 +02:00
Carsten Haitzler c8b1077de6 gadcon - fix disabled items... this is a radio and switches a/b/c ...
just because an item is not the selected one does not mean it should
be disabled. that is not how radios work. you choose 1 of n menu
items... only items you should NOT select (are not available for
selection) should be disabled.

@fix
2022-04-27 14:51:55 +01:00
Alastair Poole b413ee5d03 procstats: Handle e_client fullscreen requests.
Add an event handler for E_CLIENT_FULLSCREEN. Remove the client,
destroying the popup and icon region.

This resolves the issue where a client fullscreen request would
leave a rogue icon region and popup if switching to full screen
with some applications.

@fix T8996
2022-04-25 15:21:19 +01:00
Carsten Haitzler e4768d53f0 config - remove duplicate bindings for the same acpi event
this is bad - same event does 3 things. dim, undim and show brightness
controls...

@fix
2022-04-15 12:50:50 +01:00
Carsten Haitzler 582cbf8af8 e config - remove upgrade blocks for luncher + sysinfo
these are not even around so... dont enable them if going from a very
old cfg

@fix
2022-04-15 11:03:15 +01:00
maxerba f9b5d44681 Updating french and italian translations 2022-04-13 20:25:44 +02:00
Carsten Haitzler d24370afb6 touchpad input synaptics - fix tap to click props to work
if the driver if synaptics tap to click didnt work. this fixes that.
it didn't get the property values right in the "bitmask" enabling
buttons.

@fix
2022-04-13 15:21:38 +01:00
Carsten Haitzler 7e6736e743 shot - be clear about the shot uploads being unecrypted and available
we were clear, but just to be sure - tell people more expicitly that
it's all totally out-there-public data...
2022-04-12 13:16:25 +01:00
Carsten Haitzler 1fe64f8b01 focus action - raise/unshade/uniconify on focus dir/next/prev action
it's not right that windows stay shaded, iconified or stacked below
when you use a binding to switch focus like "focus prev" to cycle just
with a plain key. this fixes that

@fix
2022-04-11 12:29:14 +01:00
Carsten Haitzler ff90c852a7 ptr - fix cursor getting stuck in resize after blanking
i now saw this... i don't know why now... and consistently. fixed.

@fix
2022-04-07 22:17:43 +01:00
Carsten Haitzler 19724dc3e8 pointer - null out deleted strings
avoids them being accessed incorrectly later
@fix
2022-04-04 15:02:38 +01:00
Carsten Haitzler bb8874930b fix more unfullscreen clicker/toggle when window is small...
another codepath for the fullscreen flicker bug via the job handler

@fix
2022-04-02 11:01:01 +01:00
Carsten Haitzler 1051c77d31 fix fullscreen flicker/toggle when window is small and we get mouse out
we get a spurious mouse out if your window is small then told to go
fullscreen which then causes in ponter focus a unfocus event which
causes e to restore window to its non-fulscreen mode which then may
cause a mouse in again if mouse is positioned right which causes a "go
fullscreen now again" and so on... fix this and ignore that mouse out
right after going fullscreen.

@fix
2022-03-25 10:40:00 +00:00
Carsten Haitzler f81387470f xkb - use new feature to ignore just xmodmap changes
this avoids e re-setting kbd layouts on just "xmomdmap" changes. needs
new feature in efl slated for efl 1.27
2022-03-24 17:54:30 +00:00
Carsten Haitzler 5d430a3fa6 qrt bug workaround - qt does not remove WM_STATE when withdrawing
as per icccm - client should remove WM_STATE when withdrawing... and
qt relies on WM_STATE to know if it re-show a window - the property
it itself refused to remove...
2022-03-22 12:42:33 +00:00
Carsten Haitzler 6f59af7e9f winlist - fix 0 item lenth rows - have at least 1 item
this fixes winlist large mode sometimes losing windows in the view.

@fix
2022-03-22 12:41:01 +00:00
Alastair Poole 0fc17828f6 procstats: fix popup state on maximize/unmaximize 2022-03-08 10:51:21 +00:00
Carsten Haitzler 9e23feb482 comp - fix event shape to account for txt/texblock and img properly
@fix
2022-03-08 01:30:57 +00:00
Carsten Haitzler 6bdd1abbe2 comp - fix shapoe event to skip clippers 2022-03-08 01:30:57 +00:00
Simon Lees 3331e87184 Tasks: choose a readable default preview size.
The preview at 32px is practically unreadable 240px is probably
a much more sensible default value
2022-03-04 19:11:15 +10:30
Carsten Haitzler 6dac5c5cd0 remove unused var. 2022-03-02 11:44:02 +00:00
maxerba d61b06aa77 Updating french and italian translations 2022-02-25 14:28:52 +01:00
Carsten Haitzler fd7b1e4b37 overlay resize regions - properly sety shape rects to account for them
e didn't set shape rects for input overflow areas for the resize
handles in theme to work on top of other clients and client areas.
this should make that all work now and make the resize handle area
bigger than it actually looks.

@fix
2022-02-24 18:44:14 +00:00
Carsten Haitzler bffe5a426c notification - get rid of useless appendix code...
themes have supported notification for as logn as e17 was released
so remove useless "appendix" of code that handles if it isnt.
2022-02-20 11:53:15 +00:00
maxerba 8368850157 Updating french translation 2022-02-18 20:52:28 +01:00
Carsten Haitzler 12cbf43ae2 pkgkit - count pkgs total in gadgets
@fix
2022-02-07 10:45:17 +00:00
Carsten Haitzler e8c5e18fdf deskmirror - donbt show iconified windows
@fix
2022-02-02 19:35:41 +00:00
Carsten Haitzler 2eb76774ef build - fix cc.links for bsd case to use args not link args
@fix
2022-02-02 18:17:58 +00:00
Carsten Haitzler 6ed1e61996 focus - fix some lingering mis-focus issues
finally fix T8980 (i hope)
@fix
2022-02-01 12:30:00 +00:00
Carsten Haitzler b4a05429d0 modules - add procstats to whitelist 2022-02-01 12:28:49 +00:00
Carsten Haitzler 93fa4e6393 pager - don't keep building up more popups on popups on switches
re-use the existing popup and stop stacking more and more.

@fix
2022-01-31 11:39:15 +00:00
Carsten Haitzler 6fe4d9c9b7 efm - recent - fix up mis-sorting on re-load and make icons better
was missing thumbnails - now do them. fix re-sorting of items weirdly
on re-load later.

@fix
2022-01-30 11:34:51 +00:00
Marcel Hollerbach 349acb214d e_client: fix more focus weirdness
parent should be raised, even though it is not the modal.
2022-01-28 18:26:00 +01:00
Carsten Haitzler 18a86f2f64 efm - do same mime lookup method as efm in recents menu
@fix
2022-01-27 17:13:36 +00:00
Carsten Haitzler aa93a66b5f desklock settinghs - fix kbd layout list to fill vert
@fix
2022-01-24 14:14:31 +00:00
maxerba 244e479bc3 Updating french and italian translations 2022-01-22 20:33:54 +01:00
Carsten Haitzler cef95a0189 shot - reset cnp flag once cnp'd
otherwise we segv assuming we are doing cnp still and access a null
cnp_file.

@fix
2022-01-22 18:45:38 +00:00
Carsten Haitzler ea97371770 focus out - ignore all ungrabs as we unfocus a window that should be
this fixes a boundary case on mouse ungrabs

@fix
2022-01-21 21:05:32 +00:00
Carsten Haitzler 921f5208e7 xkb config - fix segv on close advanced mode dialog
didnt remove the lists with del callbacks that accessed the cfdata
struct to set lisrts to null on del before cfdata was freed...
callback hell. yay.

@fix
2022-01-21 16:10:38 +00:00
Christopher Michael 6d2b5e9144 e_about: Update copyright year 2022-01-20 11:37:36 -05:00
Carsten Haitzler b84fc34d08 bz5 - dont ping devices on unpowered adapter
@fix
2022-01-20 11:12:22 +00:00
Carsten Haitzler dcc02e3bd2 notification - fix shadow around extra notifications when all shown
if you show notifications on all screens the extra ones not on the
current screen get a shadow - this is wrong. this fixes that

@fix
2022-01-19 11:52:36 +00:00
Carsten Haitzler 264b59c42f gesture - add an option to turn it all on or off
so - some people have issues if we open devices. why... i don't know,
but add an option to toggle this and be conservative and have it off
by default

@fix
2022-01-18 21:17:54 +00:00
Carsten Haitzler 29e1a12da3 backlight - add option for ddc to work or not
just because libddcutil is installed doesnt mean someone always wants
backlight on monitors controlled, so allow an option.
2022-01-17 22:23:07 +00:00
Carsten Haitzler 58462390be ibar - emit left/right a;ign if gadcon is left/right vertical
@fix
2022-01-17 20:56:45 +00:00
Carsten Haitzler f615a2120d theme - ibar/ibox label overlay - properly align with text min size
@fix
2022-01-17 20:56:03 +00:00
Carsten Haitzler 6ad07d07c2 fileman - fix favorites to scale
@fix
2022-01-12 14:24:34 +00:00
Carsten Haitzler b6da0ac873 bluez5 - dont need the force conenct option it seems - cant find a need
if connected AND trusted it should conenct again next time you power
them on etc. ... so .. let's remove extra option cruft we seemingly
don't need - less confusion for users

@fix
2022-01-09 16:40:21 +00:00
Marcel Hollerbach f7708c6e74 focus: leave frame focus setting here
that might cause bugs, however, everything else might end up in a
endless recursion.
2022-01-09 17:38:55 +01:00
Carsten Haitzler 47767cf645 bluez mod - on unload deregister gadcon class
fix leak of this class on unload.

@fix
2022-01-09 15:26:03 +00:00
Marcel Hollerbach 841c8f477f focus: do not revert to another client when client is unfocused
This was a nice idea to fix most focus bugs at once. However, due to the
runtime of e many things can get "randomly" focused, for exmaple: volume
control on the frame, internal dialogs, config value screens when
grabbing for keys, widgets when they get created in a gadget. The list
is quite long. However, fixing all those little bugs is hard and partly
impossible as the behaviour is correct in the context of a toolkit, not
in the context of a compositor.

Long term we should split window-focus and canvas-focus from each other,
then bugs like these would not be a problem anymore.
2022-01-09 15:51:34 +01:00
Carsten Haitzler aff854b2ea e focus - volume - dont allow obj focus that disturbs the rest of e
this messes up focus on windows etc. ... quick fix - dont allow the
slider to be focused... :)

@fix
2022-01-09 14:48:26 +00:00
maxerba a471788444 Updating french and portuguese translations 2022-01-09 09:31:34 +01:00
Carsten Haitzler 61584a5f57 e focus - fix previous commit segv on no windows left
if window deleted is the focused on... oops - BOOM. not handled.
handle it. also revert x focus to root so bindings work.

fixes previous 2d86d75139

@fix
2022-01-07 00:10:13 +00:00
Marcel Hollerbach 1f69e41daa add forgotten header define 2022-01-06 21:40:14 +01:00
Marcel Hollerbach 2d86d75139 e_client: revert focus instead of setting it to NULL
When closing a client a few different things can happen:
1. Client hides, this will destroy the e_client object, which will
   reverts focus to another client.
2. Client hook del, this will recover focus to the root window if no
   e_client is focused.
3. Client unfocus event, setted the focused to NULL and sets the focus field to 0.

when first 1 happens then 2 or 3 everything is fine. However, it seems
that sometimes first 3 happend, then 2, then 1. Which results in focus
beeing first NULL, then recovered to the root window, resulting in the
wrong things happening.
2022-01-06 20:57:38 +01:00
Carsten Haitzler e2e1b1956d e_icon - switch from edj/std icon to custom img file properly
@fix
2022-01-05 11:50:33 +00:00
Carsten Haitzler 0f17a85674 systray - add more debugging to find clients that act oddly
@fix
2022-01-05 11:50:11 +00:00
Carsten Haitzler 32e65c1f21 let's go back to dev mode .99 2022-01-03 12:11:05 +00:00
Carsten Haitzler 0603300828 e - border list - fix list to filter volume out
the volume style is not a border but the gadget - a mistake made long
ago when this was added. cant change now due to theme compat to filter
out in code

@fix
2021-12-31 13:25:45 +00:00
Carsten Haitzler ba156d2f46 gesture - vm (vbox) detect hack to work around xorg no display bug
so... you go through wizard - only in vbox it seems (or maybe other
vm's - don't know - only tried vbox - this doesnt happen on real
systems). at the end e restarts... and it's blank. e is actually
rendering. you can screengrab (eg import -window root out.png) and see
the screen drawn just fine. xrandr is all set up right - everything is
kosher... but nothing will display except the curosr. xorg is just not
displaying rendered content. somehow e's gesture code and use of
logind/libinput to get inpiut devices for gestures tickles this xorg
bug. i don't quite know why as xorg doesnt seem to be complaining.
once you restart the xorg process everything works fine from there on.
it's some bug inside xorg that just refuses to display output.
manually changing resolution with xrandr will reset things and have
things render... until e restarts. a fukll xorg re-run is needed to
fix it... there just is nothing i can see that e is doing wrong or to
fix in e... so this is a workaround the xorg side by just not using
the gesture support if on a vm. they won't have touchpads anyway and
emulate mice so ... no real loss. this won't affect peolpe on real
systems and it may not always work as a workaround as it relies on
systemd-detect-virt or hostnamectl.

@fix
2021-12-30 17:03:35 +00:00
Carsten Haitzler 0404e68632 windows - netxcloud app - fix constant show/hide cycles
e is not ignoring the first unmap event on this reparent ... this
fixes that and the nextcloud app stops making e sit and spin at full
cpu and flickering tasks etc.

@fix
2021-12-28 18:38:52 +00:00
Carsten Haitzler 45bd61df30 release - 0.25 2021-12-26 14:22:41 +00:00
maxerba 73cf441836 Updating french translation 2021-12-21 14:16:04 +01:00
114 changed files with 15594 additions and 24188 deletions

View File

@ -1,6 +0,0 @@
{
"project_id" : "enlightenment-git",
"projects" : "enlightenment-git",
"conduit_uri" : "https://phab.enlightenment.org/",
"phabricator.uri" : "https://phab.enlightenment.org/"
}

59
INSTALL
View File

@ -1,59 +0,0 @@
** COMPILING and INSTALLING **
------------------------------
Meson is the build system used for this project. For more information please
see:
http://mesonbuild.com
----
Normal compilation in /usr/local:
meson . build
ninja -C build
sudo ninja -C build install
For meson build generic options:
meson --help
For a list of project specific options supported:
cat meson_options.txt
To set 1 or more project specific options:
meson --prefix=/path/to -Doption=value [-Dother=value2] [...] . build
To display current configuration:
meson configure build
The above will only work after at least the following is done:
meson . build
** QUICK AND DIRTY HELP **
--------------------------
How to clean out the build and config and start fresh:
rm -rf build
How to make a dist tarball and check its build:
(must do it from git tree clone and commit all changes to git first)
ninja -C build dist
How to change prefix:
meson --prefix=/path/to/prefix . build
How to install in a specific destination directory for packaging:
DESTDIR=/path/to/destdir ninja -C build install
How to build with verbose output (full commands run):
ninja -C build -v

6753
NEWS

File diff suppressed because it is too large Load Diff

47
README
View File

@ -1,47 +0,0 @@
Enlightenment
-------------
Please report bugs and submit patches at https://phab.enlightenment.org
REQUIREMENTS
------------
Must:
* efl
* libpam (On Linux)
Highly suggested:
* libexif (exif metadata display support)
* evas_generic_loaders (All loaders)
* bluez5 (BT support and l2ping tool)
* connman
* bc (For everything calculator)
* pulseaudio
* acpid (Unless your system doesn't have ACPI at all)
* packagekit (For packagekit module updates status)
* udisks2
* gdb (If you want automatic bactraces in ~/.e-crashdump.txt)
COMPILING AND INSTALLING
------------------------
For sample configuration options please look in the ./confs/ directory
for scripts that pass in commonly used options.
Please see the INSTALL file: https://git.enlightenment.org/core/enlightenment.git/tree/INSTALL
NOTE: Users of DR16 will need to rename the $prefix/bin/enlightenment
file prior to installing this release or it will be overwritten.
NOTE: If you do not want security issues make sure sysactions.conf is in
/etc/enlightenment (not PREFIX/etc/enlightenment) as this is the first place
it looks at. This file is intended to be customized by packagers and
system integrators to match your policies and scripts/tools.
NOTE: To enable wayland support (still considered experimental and not for
regular end users) use the meson -Dwl=true option. To run enlightenment in
wayland mode, just log on on ant vt and run enlightenment_start. If you
wish to debug and see all the output try using something like screen then
attaching to the remote screen session by sshing in etc.

225
README.md Normal file
View File

@ -0,0 +1,225 @@
![Enlightenment](/data/readme/enlightenment.png)
# Enlightenment
![Screenshot](/data/readme/screenshot.png)
-----
*Please report bugs/issues at*
[git.enlightenment.org](https://git.enlightenment.org/enlightenment/enlightenment/issues)
-----
Enlightenment is a Window Manager, Compositor and basic "Desktop
Shell". It replaces your GUI environment that runs your day to day
graphical Desktop. It includes a built-in File Manager, Application
Launcher, Shelves, Settings Dialogs, Menus, Audio Mixer Controls, Network
Control front-end (for Connman), Battery Monitoring, CPU Frequency
Controls, Screen Blanking and Backlight controls, Screenshotting and
editing, Clock and Calendar, Temperature Guages, Mpris2 Music Controls,
Packagekit Update Front-end, Bluetooth controls for BlueZ 5, Screen
resolution and layout controls and much much more.
Enlightenment is one of the lowest resource environments around
relative to its featureset.
Enlightenment is primarly developed for X11, but does have an
experimental Wayland mode that will have issues, so only try it if
you are adventurous or willing to work on it.
For more information please see
[Enlightenment's About Page](https://www.enlightenment.org/about-enlightenment).
![Screenshot 2](/data/readme/screenshot2.png)
![Screenshot 3](/data/readme/screenshot3.png)
![Screenshot 4](/data/readme/screenshot4.png)
![Screenshot 5](/data/readme/screenshot5.png)
![Screenshot 6](/data/readme/screenshot6.png)
-----
Things that need doing:
[TODO](TODO.md)
-----
## Requirements
Must:
* [efl](https://git.enlightenment.org/enlightenment/efl)
* libpam (Required on Linux, not BSD)
Highly suggested:
* libexif (exif metadata display support)
* bluez5 (BT support and l2ping tool)
* connman
* bc (For everything calculator)
* pulseaudio
* acpid (Unless your system doesn't have ACPI at all)
* packagekit (For packagekit module updates status)
* udisks2
* gdb (If you want automatic bactraces in ~/.e-crashdump.txt)
-----
## Compiling and Installing
Meson is the build system used for this project. For more information
please see [mesonbuild.com](https://mesonbuild.com)
You will need normal build tooling installed such as a compiler (gcc
or clang for example), pkg-config, ninja, any relevant package-dev or
package-devel packages if your distribution splits out development
headers (e.g. libc6-dev) etc.
Depending on where dependencies (like efl) are installed, you might have to
set your `PKG_CONFIG_PATH` environment variable like:
```sh
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig
```
Also note that some distributions like to add extra arch directories
to your library locations so you might have to have more like:
```sh
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig
```
You will need to ensure that the destination library directory (e.g.
`/usr/local/lib` is in your /etc/ld.so.conf or /etc/ld.so.conf.d/
files and after installing anything that installs libraries you
re-run `ldconfig`. Please see relevant documentation on ldconfig and
ld.so.conf for your distribution.
You might also want to add the destination bin dir to your environment
variable PATH (see documentation on your shell PATH variable) such as:
```sh
export PATH=/usr/local/bin:/usr/bin:/bin
```
Normal compilation in /usr/local:
```sh
meson . build
ninja -C build
sudo ninja -C build install
```
For meson build generic options:
```sh
meson --help
```
For a list of project specific options supported:
```sh
cat meson_options.txt
```
To set 1 or more project specific options:
```sh
meson --prefix=/path/to -Doption=value [-Dother=value2] [...] . build
```
To display current configuration:
```sh
meson configure build
```
The above will only work after at least the following is done:
```sh
meson . build
```
### Quick build help
How to clean out the build and config and start fresh:
```sh
rm -rf build
```
How to make a dist tarball and check its build:
(must do it from git tree clone and commit all changes to git first)
```sh
ninja -C build dist
```
How to change prefix:
```sh
meson --prefix=/path/to/prefix . build
```
How to install in a specific destination directory for packaging:
```sh
DESTDIR=/path/to/destdir ninja -C build install
```
How to build with verbose output (full commands run):
```sh
ninja -C build -v
```
-----
**NOTE:** Once Enlightenment is started by `enlightenment_start`, all
output logs are put in `~/.e-log.log`. The previous log for the
previous execution of Enlightenment will be moved to `~/.e-log.log.old`.
-----
**NOTE:** If you install enlightenment to the default compile prefix
(`/usr/local`) then you might want to ensure the session file is
accessible to your login manager (assuming you use one) by doing
something like:
```sh
sudo ln -s /usr/local/share/xsessions/enlightenment.desktop /usr/share/xsessions/enlightenment.desktop
```
You can also just set up a custom launcher script. Edit the
`~/.xinitrc` file in your home directory and have it have this content:
```sh
#!/bin/sh
exec /usr/local/bin/enlightenment_start >& ~/.xsession-errors
```
(`exec` tells the shell to replace itself with the following command
and `>& ~/.xsession-errors` ensures all output is logged to the
`~/.xsession-errors` file).
You may also want your `~/.xsession` file to be the same, so make a link:
```sh
ln -s .xinitrc .xsession
```
This assumes `/usr/local` as well and just modify based on your
install prefix location.
If you do not use a login manager you can just log into a text console
and run `startx` after the above `.xinitrc` file is set up.
-----
**NOTE:** If you do not want security issues make sure `sysactions.conf` is in
`/etc/enlightenment` (not `PREFIX/etc/enlightenment`) as this is the first
place it looks at. This file is intended to be customized by packagers and
system integrators to match your policies and scripts/tools. This also
applies to `system.conf` in the same directory.
-----
**NOTE:** To enable Wayland support (still considered experimental and not for
regular end users) use the meson `-Dwl=true option`. To run Enlightenment in
Wayland mode, just login on any text VT and run `enlightenment_start`. If you
wish to debug and see all the output try using something like screen then
attaching to the remote screen session by sshing in etc.
-----
**NOTE:** Nvidia support - do *not* enable Wayland support if you have
Nvidia cards and use Nvidia drivers. You will need to use **full**
OpenGL+GLX with EFL instead of the default OpenGL-ES/EGL for those to not
have problems and this conflicts with any **DRM** and **Wayland** support.
You will

View File

@ -1,4 +1,3 @@
TODO:
* need a better "extra" that allows shot-module like sharing of:
* themes
* wallpapers
@ -51,9 +50,9 @@ TODO:
* bt tethering
* usb tehtering
* wifi tethering
* S fix vkbd to work in wl - e_kbd_send.c - look at ecore_wl2_input.c
* S clean up some old actions that are handled better by newer ones
* S like suspend intelligently is better than regular suspend but
* fix vkbd to work in wl - e_kbd_send.c - look at ecore_wl2_input.c
* clean up some old actions that are handled better by newer ones
* like suspend intelligently is better than regular suspend but
suspend now is very explicit and worth keeping
* clock - add event/alarm/appointment tracking and notifications etc.
* this perhaps can be merged with the cron front-end
@ -77,12 +76,10 @@ TODO:
* face auth (howdy / pam-face / pam-face-authentication / pam-facial-auth)
* yubikey
* usb drive (pam_usb)
* support setting up fingerprint as auth (fprint-enroll)
* support setting up smartcard as auth
* support setting up face auth (howdy / pam-face / pam-face-authentication / pam-facial-auth)
* support setting up yubikey as auth
* support setting up usb drive for auth (pam_usb)
* support fprint auth for polkit agent (ugh)
* wifi/bt net: associate app/desktop(s) or actions to run when:
* bt device comes or goes (alongside lock device feature)
* wifi appears or disappears
@ -246,8 +243,10 @@ TODO:
* display other devices in above list separately
* handle string capacity values like Full, High, Normal, Low, Critical...
* randr: get auto layout to handle screens laid out like:
```
[dp2-2][dp2-1] <- 2 external monitors
[edp-1] <- laptop main display
```
* randr: when losing a zone/screen, put windows in purgatory and then have
purgatory screens available via pager to drag onto a current screen,
or the specific virtual desktops from purgator to be accessible even
@ -293,15 +292,15 @@ TODO:
* look into libratbag too for gaming mouse stuff if its worth using it or
just doing the same
stuff ourselves as we will probably have to via libinput
* S some kind of game mode and detection that will do things like:
* S disable screen dimming/blanking
* S set cpu to max performance
* S lower priority/nice of non-game processes or even sigstop procs
* S disable notifications
* S explicit toggle and possible auto-detect of games running
* some kind of game mode and detection that will do things like:
* disable screen dimming/blanking
* set cpu to max performance
* lower priority/nice of non-game processes or even sigstop procs
* disable notifications
* explicit toggle and possible auto-detect of games running
* per app environment launch config - allow different TZ, LOCALE etc.
per app and set up env appropriately
* apps - ability to flag apps as "single run" so launchgin again from
* apps - ability to flag apps as "single run" so launching again from
menu/ibar will just focus the current window/jump to it etc.
* back-end e system process for monitoring/polling and launching etc.
* split e up into front vs back-end with back-end doing things like
@ -323,7 +322,6 @@ TODO:
* need to allow a CONT every now and again to unblock buffers
* set backlight and dim timeout per powersave level
* battery - set powersave levels based on ac or battery level
* efl: flat theme redo
* efl/eo: start using efl loop as core loop
* begin to move some login out into efl threads+loops
* to change ui - callsync/async back to ui/main loop
@ -334,12 +332,6 @@ TODO:
* have edje object stash
* mixer: improve ui in emixer
* emixer - support selecting recording dev for apps like pavucontrol
* look at showing vu bars per recoridng or maybe output devices
* offer ability to show vu output in mixer gadget
* weather
* forecasts will due feb 2021. yahoo shutting down free api.
given all the changes needed to do a new api...
may as well write a whole new weather gadget.
* free api:
* https://api.met.no/weatherapi/locationforecast/2.0/documentation
* a dependency of this (so we can provide lat/lon)
* bring in forecasts into core e

View File

@ -1,5 +1,5 @@
group "E_Config" struct {
value "config_version" int: 1000033;
value "config_version" int: 1000035;
value "config_type" uint: 0; // this profile seems to just be super minimalist
value "desktop_default_name" string: "%i-%i";
value "desktop_default_window_profile" string: "";
@ -164,6 +164,7 @@ group "E_Config" struct {
value "theme_default_border_style" string: "default";
value "desk_auto_switch" int: 0;
value "thumb_nice" int: 0;
value "gesture_open_input_devices" int: 0;
value "screen_limits" int: 0;
value "menu_favorites_show" int: 1;
value "menu_apps_show" int: 1;
@ -207,6 +208,7 @@ group "E_Config" struct {
value "backlight.timer" double: 30.0;
value "backlight.battery_timer" double: 20.0;
value "backlight.idle_dim" uchar: 1;
value "backlight.ddc" uchar: 0;
value "device_desktop" int: 0;
value "device_auto_mount" int: 0;
value "device_auto_open" int: 0;

View File

@ -1,5 +1,5 @@
group "E_Config" struct {
value "config_version" int: 1000033;
value "config_version" int: 1000035;
value "config_type" uint: 3;
value "desktop_default_name" string: "%i-%i";
value "desktop_default_window_profile" string: "standard";
@ -164,6 +164,7 @@ group "E_Config" struct {
value "theme_default_border_style" string: "default";
value "desk_auto_switch" int: 0;
value "thumb_nice" int: 0;
value "gesture_open_input_devices" int: 0;
value "screen_limits" int: 0;
value "menu_favorites_show" int: 1;
value "menu_apps_show" int: 1;
@ -200,6 +201,7 @@ group "E_Config" struct {
value "backlight.timer" double: 30.0;
value "backlight.battery_timer" double: 20.0;
value "backlight.idle_dim" uchar: 1;
value "backlight.ddc" uchar: 1;
value "deskenv.load_xrdb" uchar: 1;
value "deskenv.load_xmodmap" uchar: 1;
value "deskenv.load_gnome" uchar: 0;

View File

@ -15,18 +15,6 @@ group "E_Config_Bindings" struct {
value "action" string: "backlight_adjust";
value "params" string: "10";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 22;
value "status" int: 0;
value "action" string: "dim_screen";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 22;
value "status" int: 1;
value "action" string: "undim_screen";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 3;

View File

@ -1,5 +1,5 @@
group "E_Config" struct {
value "config_version" int: 1000033;
value "config_version" int: 1000035;
value "config_type" uint: 3;
value "desktop_default_name" string: "%i-%i";
value "desktop_default_window_profile" string: "standard";
@ -164,6 +164,7 @@ group "E_Config" struct {
value "theme_default_border_style" string: "default";
value "desk_auto_switch" int: 0;
value "thumb_nice" int: 0;
value "gesture_open_input_devices" int: 0;
value "screen_limits" int: 0;
value "menu_favorites_show" int: 1;
value "menu_apps_show" int: 1;
@ -200,6 +201,7 @@ group "E_Config" struct {
value "backlight.timer" double: 30.0;
value "backlight.battery_timer" double: 20.0;
value "backlight.idle_dim" uchar: 1;
value "backlight.ddc" uchar: 1;
value "deskenv.load_xrdb" uchar: 1;
value "deskenv.load_xmodmap" uchar: 1;
value "deskenv.load_gnome" uchar: 0;

View File

@ -15,18 +15,6 @@ group "E_Config_Bindings" struct {
value "action" string: "backlight_adjust";
value "params" string: "10";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 22;
value "status" int: 0;
value "action" string: "dim_screen";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 22;
value "status" int: 1;
value "action" string: "undim_screen";
}
group "E_Config_Binding_Acpi" struct {
value "context" int: 0;
value "type" int: 3;

View File

@ -1,19 +1,21 @@
[Desktop Entry]
Type=Link
Name=Tiling (Standard Enlightenment)
Name[ca]=Mosaic (Standard Enlightenment)
Name[de]=Kacheln (Vorgabe Enlightenment)
Name[fi]=Limittävä (Tavallinen Enlightenment)
Name[fr]=Pavage (Enlightenment standard)
Name[it]=Tiling (a piastrelle)
Name[ms]=Penjubinan (Enlightenment Piawai)
Name[ru]=Мозаичный режим (Стандартный Enlightenment)
Name[tr]=Döşeme (Standard Enlightenment)
Comment=Tiling window management configuration for devices with keyboards and mice<br>like your average PC Desktop, Laptop or Netbook<br>with Enlightenment's traditional keyboard bindings<br>and mouse controls.<br>Default tiling bindings are: Win-key + Space, arrows, and left mouse button.<br>See the module settings for more information.
Comment[ca]=Mosaic per la configuració de la gestió de finestres per dispositius amb teclats i ratolins <br>com ara PC d'escriptori, portàtil o netbook<br>amb associacions de tecles típiques d'Enlightenment<br>Tecles d'accés ràpid per defecte són: Tecla Win + Espai, fletxes i botó esquerre del ratolí <br>Veure la configuració del mòdul per obtenir més informació.
Comment[fr]=Gestion de la juxtaposition des fenêtres pour les machines avec clavier<br>et souris comme les PC de bureau et les portables,<br>offrant raccourcis et contrôles traditionnels.<br>Les raccourcis de pavage par défaut sont :<br>Win+Barre d'espace ou flèches, et bouton gauche de la souris.<br>Voir la configuration du module pour plus d'informations.
Comment[it]=Configurazione con finestre in griglia per dispositivi con tastiere e mouse<br>come i normali PC Desktop, Laptop o Netbook<br>con le tradizionali scorciatoie di tastiera e controlli<br>del mouse di Enlightenment.<br>Le associazioni di tasti predefinite proprie di questa modalità sono:<br>Tasto-windows + spazio, frecce, e tasto sinistro del mouse.<br>Vedere le impostazioni del modulo Tiling per maggiori informazioni.
Comment[ms]=Konfigurasi pengurusan tetingkap berjubin untuk peranti dengan papan kekunci dan tetikus<br>seperti Komputer Desktop, Komputer Riba atau Netbook anda<br>dengan pengikatan papan kekunci tradisional Enlightenment<br>dan kawalan tetikus.<br>Pengikatan penjubinan lalai adalah: Win-key + Space, anak panah, dan butang tetikus kiri.<br>Sila rujuk tetapan modul untuk maklumat lanjut.
Comment[ru]=Конфигурация с мозаичным режимом управления окнами<br>пригодная для устройств с клавиатурой и мышью,<br>таких как обычный компьютер или ноутбук,<br>с традиционными для Enlightenment'а сочетаниями<br>клавиш и управлением мышью.<br>Комбинации клавиш для мозаичного режима по умолчанию:<br>Кнопка Win + пробел, стрелки и левая кнопка мыши.
Comment[tr]=Enlightenment'in klavye ve fare kontrol bağlayıcıları ile kullanılan, ortalama <br>PC masaüstü, dizüstü ve netbook gibi klavye ve fare aygıtları bulunan cihazlar <br>için pencere döşeme yönetimi yapılandırması. Öntanımlı döşeme bağlayıcıları:<br>Win Tuşu + Boşluk, ok tuşları ve sol fare tuşu.<br>Daha fazla bilgi için modül ayarlarına bakınız.
Icon=enlightenment-tiling
[Desktop Entry]
Type=Link
Name=Tiling (Standard Enlightenment)
Name[ca]=Mosaic (Standard Enlightenment)
Name[de]=Kacheln (Vorgabe Enlightenment)
Name[fi]=Limittävä (Tavallinen Enlightenment)
Name[fr]=Pavage (Enlightenment standard)
Name[it]=Griglia (Enlightenment standard)
Name[ms]=Penjubinan (Enlightenment Piawai)
Name[pt]=Mosaico (Enlightenment padrão)
Name[ru]=Мозаичный режим (Стандартный Enlightenment)
Name[tr]=Döşeme (Standard Enlightenment)
Comment=Tiling window management configuration for devices with keyboards and mice<br>like your average PC Desktop, Laptop or Netbook<br>with Enlightenment's traditional keyboard bindings<br>and mouse controls.<br>Default tiling bindings are: Win-key + Space, arrows, and left mouse button.<br>See the module settings for more information.
Comment[ca]=Mosaic per la configuració de la gestió de finestres per dispositius amb teclats i ratolins <br>com ara PC d'escriptori, portàtil o netbook<br>amb associacions de tecles típiques d'Enlightenment<br>Tecles d'accés ràpid per defecte són: Tecla Win + Espai, fletxes i botó esquerre del ratolí <br>Veure la configuració del mòdul per obtenir més informació.
Comment[fr]=Gestion de la juxtaposition des fenêtres pour les machines avec clavier<br>et souris comme les PC de bureau et les portables,<br>offrant raccourcis et contrôles traditionnels.<br>Les raccourcis de pavage par défaut sont :<br>Win+Barre d'espace ou flèches, et bouton gauche de la souris.<br>Voir la configuration du module pour plus d'informations.
Comment[it]=Configurazione con finestre in griglia per dispositivi con tastiere e mouse<br>come i normali PC Desktop, Laptop o Netbook<br>con le tradizionali scorciatoie di tastiera e controlli<br>del mouse di Enlightenment.<br>Le associazioni di tasti predefinite proprie di questa modalità sono:<br>Tasto-windows + spazio, frecce, e tasto sinistro del mouse.<br>Vedere le impostazioni del modulo Tiling per maggiori informazioni.
Comment[pt]=Configuração de gestão de janelas em mosaico para dispositivos com teclados e ratos<br>como os computadores de secretária ou portáteis com as tradicionais<br>combinações de teclas e controlos de rato do Enlightenment.<br>As combinações padrão em mosaico são:<br>Tecla Win-key + Espaço, setas, e botão esquerdo do rato.<br>Veja as definições do módulo para mais informações.
Comment[ms]=Konfigurasi pengurusan tetingkap berjubin untuk peranti dengan papan kekunci dan tetikus<br>seperti Komputer Desktop, Komputer Riba atau Netbook anda<br>dengan pengikatan papan kekunci tradisional Enlightenment<br>dan kawalan tetikus.<br>Pengikatan penjubinan lalai adalah: Win-key + Space, anak panah, dan butang tetikus kiri.<br>Sila rujuk tetapan modul untuk maklumat lanjut.
Comment[ru]=Конфигурация с мозаичным режимом управления окнами<br>пригодная для устройств с клавиатурой и мышью,<br>таких как обычный компьютер или ноутбук,<br>с традиционными для Enlightenment'а сочетаниями<br>клавиш и управлением мышью.<br>Комбинации клавиш для мозаичного режима по умолчанию:<br>Кнопка Win + пробел, стрелки и левая кнопка мыши.
Comment[tr]=Enlightenment'in klavye ve fare kontrol bağlayıcıları ile kullanılan, ortalama <br>PC masaüstü, dizüstü ve netbook gibi klavye ve fare aygıtları bulunan cihazlar <br>için pencere döşeme yönetimi yapılandırması. Öntanımlı döşeme bağlayıcıları:<br>Win Tuşu + Boşluk, ok tuşları ve sol fare tuşu.<br>Daha fazla bilgi için modül ayarlarına bakınız.
Icon=enlightenment-tiling

View File

@ -2,7 +2,8 @@ install_data([ 'enlightenment.png',
'test.png',
'test.jpg',
'test.edj',
'test.svg'
'test.svg',
'wayland.png'
],
install_dir: join_paths(dir_data, 'enlightenment/data/images')
)

BIN
data/images/wayland.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
data/readme/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
data/readme/screenshot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
data/readme/screenshot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

BIN
data/readme/screenshot4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
data/readme/screenshot5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

BIN
data/readme/screenshot6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

View File

@ -1,17 +1,2 @@
desktop_config = configuration_data()
desktop_config.set('prefix', dir_prefix)
desktop_config.set('VERSION', e_version_rev)
e_desktop = configure_file(input : 'enlightenment.desktop.in',
output : 'enlightenment.desktop',
configuration: desktop_config
)
if config_h.has('HAVE_WAYLAND') == true
install_data(e_desktop,
install_dir : join_paths(dir_data, 'wayland-sessions'))
endif
if config_h.has('HAVE_WAYLAND_ONLY') == false
install_data(e_desktop,
install_dir : join_paths(dir_data, 'xsessions'))
endif
subdir('x')
subdir('wl')

View File

@ -0,0 +1,38 @@
[Desktop Entry]
Type=Application
Name=Enlightenment (Wayland)
Name[ca]=Enlightenment (Wayland)
Name[de]=Enlightenment (Wayland)
Name[el]=Enlightenment (Wayland)
Name[eo]=Enlightenment (Wayland)
Name[fi]=Enlightenment (Wayland)
Name[fr]=Enlightenment (Wayland)
Name[gl]=Enlightenment (Wayland)
Name[ja]=Enlightenment (Wayland)
Name[ko]=Enlightenment (Wayland)
Name[ms]=Enlightenment (Wayland)
Name[pl]=Enlightenment (Wayland)
Name[ru]=Enlightenment (Wayland)
Name[sr]=Просвећење (Wayland)
Name[tr]=Enlightenment (Wayland)
Comment=Log in using Enlightenment (Version @VERSION@)
Comment[ca]=Iniciar sessió amb Enlightenment (Versió @VERSION@)
Comment[da]=Log ind med Enlightenment (Version @VERSION@)
Comment[de]=Anmelden und Enlightenment verwenden (Version @VERSION@)
Comment[el]=Είσοδος με το Enlightenment (Έκδοση @VERSION@)
Comment[eo]=Ensaluti pere de Enlightenment (Versio @VERSION@)
Comment[es]=Iniciar sesión usando Enlightenment (Versión @VERSION@)
Comment[fi]=Kirjaudu käyttäen Enlightenmentiä (versio @VERSION@)
Comment[fr]=Ouvrir une session Enlightenment (Version @VERSION@)
Comment[gl]=Iniciar sesión usando Enlightenment (Versión @VERSION@)
Comment[it]=Accedi con Enlightenment (Versione @VERSION@)
Comment[ko]=Enlightenment 로그인(버전 @VERSION@)
Comment[ms]=Daftar masuk menggunakan Enligtenment (Versi @VERSION@)
Comment[pt]=Iniciar sessão no Enlightenment (Versão @VERSION@)
Comment[ru]=Войти используя Enlightenment (Версия @VERSION@)
Comment[sr]=Пријавите се за коришћење Просвећења (издања @VERSION@)
Comment[tr]=Enlightenment kullanarak giriş yaın (Version @VERSION@)
Icon=@prefix@/share/enlightenment/data/images/enlightenment.png
TryExec=@prefix@/bin/enlightenment_start
Exec=env E_WL_FORCE=drm E_COMP_ENGINE=gl @prefix@/bin/enlightenment_start
DesktopNames=Enlightenment

View File

@ -0,0 +1,12 @@
desktop_config = configuration_data()
desktop_config.set('prefix', dir_prefix)
desktop_config.set('VERSION', e_version_rev)
e_desktop = configure_file(
input : 'enlightenment.desktop.in',
output : 'enlightenment.desktop',
configuration : desktop_config)
if config_h.has('HAVE_WAYLAND') == true
install_data(e_desktop,
install_dir : join_paths(dir_data, 'wayland-sessions'))
endif

View File

@ -1,5 +1,5 @@
[Desktop Entry]
Type=Application
Type=XSession
Name=Enlightenment
Name[ca]=Enlightenment
Name[de]=Enlightenment

View File

@ -0,0 +1,12 @@
desktop_config = configuration_data()
desktop_config.set('prefix', dir_prefix)
desktop_config.set('VERSION', e_version_rev)
e_desktop = configure_file(
input : 'enlightenment.desktop.in',
output : 'enlightenment.desktop',
configuration : desktop_config)
if config_h.has('HAVE_WAYLAND_ONLY') == false
install_data(e_desktop,
install_dir : join_paths(dir_data, 'xsessions'))
endif

View File

@ -1,6 +1,6 @@
##### project
project('enlightenment', 'c',
version : '0.24.99',
version : '0.25.99',
license : 'BSD 2 clause',
default_options: [ 'buildtype=release', 'c_std=gnu99', 'warning_level=2' ],
meson_version : '>= 0.47.0')
@ -30,7 +30,7 @@ else
config_h.set('E_RELEASE_BUILD' , '1')
endif
efl_version = '>= 1.25.99'
efl_version = '>= 1.26.0'
add_global_arguments('-DHAVE_CONFIG_H=1', language: 'c')
dir_prefix = get_option('prefix')
@ -105,7 +105,7 @@ suid_ldflags = []
dep_crypt = []
if freebsd == true or host_machine.system().startswith('pcbsd')
dep_crypt = cc.find_library('crypt', required: true)
if cc.links('', args: '-fPIE', link_args: '-pie') == true
if cc.links('', args: ['-fPIE', '-pie']) == true
suid_cflags = '-fPIE'
suid_ldflags = '-pie'
endif
@ -293,6 +293,7 @@ dep_ecore_con = dependency('ecore-con' , required: true)
dep_ecore_input = dependency('ecore-input' , required: true)
dep_ecore_input_evas = dependency('ecore-input-evas', required: true)
dep_ecore_evas = dependency('ecore-evas' , required: true)
dep_ecore_audio = dependency('ecore-audio' , required: true)
dep_evas = dependency('evas' , required: true)
dep_edje = dependency('edje' , required: true)
dep_efreet = dependency('efreet' , required: true)

View File

@ -27,7 +27,7 @@ msgstr ""
"Project-Id-Version: Enlightenment\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-19 16:15+0200\n"
"PO-Revision-Date: 2020-04-18 14:50+0200\n"
"PO-Revision-Date: 2022-05-06 11:31+0200\n"
"Last-Translator: Simon Tischer <simon@t-tischer.de>\n"
"Language-Team: E17-de\n"
"Language: de\n"
@ -35,7 +35,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.3\n"
"X-Generator: Poedit 3.0.1\n"
"X-Poedit-Basepath: ../src\n"
"X-Poedit-KeywordsList: N_;_\n"
"X-Poedit-SearchPath-0: .\n"
@ -4738,11 +4738,11 @@ msgstr "Sprechblase"
#: src/modules/shot/e_mod_edit.c:1978
msgid "Kaboom splat"
msgstr "Kaboom! Patch!"
msgstr "Kaboom! Patsch!"
#: src/modules/shot/e_mod_edit.c:1979
msgid "Pow explode"
msgstr "Zack! Explosion!"
msgstr "Zack! Explosion"
#: src/modules/shot/e_mod_edit.c:1987
msgid "Color"
@ -5487,15 +5487,17 @@ msgid_plural ""
">The default keys which must be held to activate these bindings<ps/>is '%s'. "
"Configure the modifiers for this binding below."
msgstr[0] ""
"Enlightenment nutzt mausgesteuerte Aktionen für Fenster. <br> Diese Aktionen "
"beinhalten:<br>* <b>Bewegen</b> (Linke Taste)<br>* <b>Größe ändern</b> "
"(Mittlere Taste)<br>* <b>Menu öffnen</b> (Rechte Taste)<br> Die standard "
"Taste um diese Aktionen bei klick zu aktivieren<br> ist %s."
"Voreingestellte Enlightenment Maus-Aktionen <br> Die voreingestellten "
"Aktionen beinhalten:<br>* <b>Bewegen</b> (Linke Taste)<br>* <b>Größe ändern</"
"b> (Mittlere Taste)<br>* <b>Menu öffnen</b> (Rechte Taste)<br> Die Tastatur-"
"Taste, die gedrückt werden muß, damit dies aktiv ist,<br> ist %s. Die "
"Einstellungen dieser Tasten-Aktionen können unten eingestellt werden."
msgstr[1] ""
"Enlightenment nutzt mausgesteuerte Aktionen für Fenster. <br> Diese Aktionen "
"beinhalten:<br>* <b>Bewegen</b> (Linke Taste)<br>* <b>Größe ändern</b> "
"(Mittlere Taste)<br>* <b>Menu öffnen</b> (Rechte Taste)<br> Die standard "
"Tasten um diese Aktionen bei klick zu aktivieren<br> sind %s.<br>"
"Voreingestellte Enlightenment Maus-Aktionen <br> Die voreingestellten "
"Aktionen beinhalten:<br>* <b>Bewegen</b> (Linke Taste)<br>* <b>Größe ändern</"
"b> (Mittlere Taste)<br>* <b>Menu öffnen</b> (Rechte Taste)<br> Die Tastatur-"
"Tasten, die gedrückt werden müssen, damit dies aktiv ist,<br> sind %s. Die "
"Einstellungen dieser Tasten-Aktionen können unten eingestellt werden."
#: src/modules/wizard/page_150.c:28
msgid "Compositing"
@ -5862,7 +5864,7 @@ msgid ""
"correctly installed and running"
msgstr ""
"Fehler bei der Initialisierung von D-Bus! Prüfen Sie, ob D-Bus korrekt "
"installiert ist und auch läuft."
"installiert ist und auch läuft"
#: src/modules/luncher/config.c:172
msgid "Create new Luncher source"
@ -6163,11 +6165,11 @@ msgstr "Keine Sortirung"
#: src/modules/everything/evry_config.c:506
msgid "By usage"
msgstr "nach Verwendung"
msgstr "Nach Verwendung"
#: src/modules/everything/evry_config.c:509
msgid "Most used"
msgstr "nach meist verwendet"
msgstr "Nach am Meisten verwendet"
#: src/modules/everything/evry_config.c:512
msgid "Last used"
@ -7113,7 +7115,7 @@ msgstr "Die Tastenbelegung die Sie eingegeben haben wird bereits verwendet!"
#: src/modules/quickaccess/e_mod_quickaccess.c:833 src/bin/e_shelf.c:2384
#: src/bin/e_bryce.c:813
msgid "Autohide"
msgstr "autom. ausblenden"
msgstr "Autom. ausblenden"
#: src/modules/quickaccess/e_mod_quickaccess.c:839
msgid "Hide Instead Of Raise"
@ -9479,7 +9481,7 @@ msgstr "Gadget Leiste"
#: src/bin/e_bryce.c:807
msgid "Autosize"
msgstr "autom. Größe"
msgstr "Autom. Größe"
#: src/bin/e_bryce.c:819
msgid "Bar Settings"
@ -9540,9 +9542,9 @@ msgid ""
"<hilight>Backspace</hilight> or <hilight>Delete</hilight> to remove all "
"gadgets from this screen"
msgstr ""
"Zum Beenden auf <hilight>Esc</hilight> drücken oder auf den Hintergrund "
"klicken. <ps/><hilight>Rücktaste</hilight> oder <hilight>Entf.</hilight>, "
"entfernt alle Gadgets von diesem Bildschirm."
"Zum Beenden <hilight>Esc</hilight> drücken oder auf den Hintergrund klicken. "
"<ps/><hilight>Rücklöschen</hilight> oder <hilight>Entf.</hilight> entfernt "
"alle Gadgets von diesem Bildschirm"
#: src/bin/e_color_dialog.c:25
msgid "Color Selector"
@ -10030,7 +10032,7 @@ msgstr ""
#: src/bin/e_module.c:237
msgid "Module does not contain all needed functions"
msgstr "Das Modul enthält nicht alle benötigten Funktionen."
msgstr "Das Modul enthält nicht alle benötigten Funktionen"
#: src/bin/e_module.c:252
#, c-format
@ -10701,7 +10703,7 @@ msgstr "Zu unterer Arbeitsfläche wechseln"
#: src/bin/e_actions.c:3414
msgid "Flip Desktop By..."
msgstr "Arbeitsfläche um ... wechseln"
msgstr "Arbeitsfläche ...mal wechseln"
#: src/bin/e_actions.c:3420
msgid "Flip To Previous Desktop"
@ -10717,15 +10719,15 @@ msgstr "Modulablage anzeigen"
#: src/bin/e_actions.c:3436
msgid "Flip Desktop To..."
msgstr "Zu Arbeitsfläche ... wechseln"
msgstr "Zu Arbeitsfläche ... wechseln."
#: src/bin/e_actions.c:3441
msgid "Switch Desktop To... On Screen..."
msgstr "Zu Arbeitsfläche ... auf Bildschirm ... wechseln"
msgstr "Zu Arbeitsfläche ... auf Bildschirm ... wechseln."
#: src/bin/e_actions.c:3447
msgid "Flip Desktop Linearly..."
msgstr "Linear zu Arbeitsfläche wechseln um... "
msgstr "Linear zu Arbeitsfläche wechseln um..."
#: src/bin/e_actions.c:3453
msgid "Switch To Desktop 0"
@ -10777,7 +10779,7 @@ msgstr "Zu Arbeitsfläche 11 wechseln"
#: src/bin/e_actions.c:3477
msgid "Switch To Desktop..."
msgstr "Zu Arbeitsfläche ... wechseln"
msgstr "Zu Arbeitsfläche ... wechseln."
#: src/bin/e_actions.c:3483
msgid "Flip Desktop Left (All Screens)"
@ -10809,7 +10811,7 @@ msgstr "Arbeitsfläche linear nach ... klappen (alle Bildschirme)"
#: src/bin/e_actions.c:3509
msgid "Flip Desktop In Direction..."
msgstr "Arbeitsfläche in Richtung ... klappen"
msgstr "Arbeitsfläche in Richtung ... wechseln."
#: src/bin/e_actions.c:3514
msgid "Switch To Desktop 0 (All Screens)"
@ -10881,7 +10883,7 @@ msgstr "Maus auf Bildschirm 1 verschieben"
#: src/bin/e_actions.c:3557
msgid "Send Mouse To Screen..."
msgstr "Maus auf Bildschirm ... verschieben"
msgstr "Mauszeiger auf Bildschirm ... verschieben"
#: src/bin/e_actions.c:3563
msgid "Send Mouse Forward 1 Screen"
@ -10893,16 +10895,16 @@ msgstr "Maus einen Bildschirm zurückschieben"
#: src/bin/e_actions.c:3567
msgid "Send Mouse Forward/Back Screens..."
msgstr "Maus ... Bildschirme weiter/zurückschieben"
msgstr "Maus ... Bildschirme weiter/zurückschieben."
#: src/bin/e_actions.c:3572
msgid "Dim"
msgstr "abdunkeln"
msgstr "Abdunkeln"
# better ideas, anyone?
#: src/bin/e_actions.c:3575
msgid "Undim"
msgstr "aufhellen"
msgstr "Aufhellen"
#: src/bin/e_actions.c:3578
msgid "Backlight Set"
@ -11539,12 +11541,12 @@ msgstr "Klicken Sie auf ein Objekt, an dem eine Ausrichtung erfolgen soll."
#: src/bin/e_int_client_menu.c:1203
msgid "On window..."
msgstr "auf Fenster..."
msgstr "Auf Fenster..."
#: src/bin/e_int_client_menu.c:1214 src/bin/e_int_client_menu.c:1225
#: src/bin/e_int_client_menu.c:1236 src/bin/e_int_client_menu.c:1247
msgid "Of window..."
msgstr "von Fenster ..."
msgstr "Von Fenster ..."
#: src/bin/e_int_client_menu.c:1274
#, c-format

2734
po/fr.po

File diff suppressed because it is too large Load Diff

1407
po/it.po

File diff suppressed because it is too large Load Diff

24643
po/pt.po

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,7 @@ e_about_new(void)
snprintf
(buf, sizeof(buf), "%s%s",
_(
"<title>Copyright &copy; 2000-2021, by the Enlightenment "
"<title>Copyright &copy; 2000-2022, by the Enlightenment "
"Development Team</><ps/>"
"<ps/>"
"We hope you enjoy using this software as much as we enjoyed "

View File

@ -3285,15 +3285,18 @@ ACT_FN_GO(window_focus, EINA_UNUSED)
}
if (dir == -1) /* next */
{
if (ec_next) e_client_focus_set_with_pointer(ec_next);
else if (ec_first) e_client_focus_set_with_pointer(ec_first);
if (ec_next) goto do_focus;
else if (ec_first) ec_next = ec_first;
else return;
}
else if (dir == -2)
{
if (ec_prev) e_client_focus_set_with_pointer(ec_prev);
else if (ec_last) e_client_focus_set_with_pointer(ec_last);
if (ec_prev) ec_next = ec_prev;
else if (ec_last) ec_next = ec_last;
else return;
}
return;
else return;
goto do_focus;
}
cx = ec_orig->x + (ec_orig->w / 2);
@ -3368,8 +3371,18 @@ ACT_FN_GO(window_focus, EINA_UNUSED)
ec_next = ec;
distance = d;
}
do_focus:
if (!ec_next) return;
if (ec_next) e_client_focus_set_with_pointer(ec_next);
ec = ec_next;
if (ec->iconic) e_client_uniconify(ec);
if (ec->shaded) e_client_unshade(ec, ec->shade_dir);
if (!ec->lock_user_stacking)
{
evas_object_raise(ec->frame);
e_client_raise_latest_set(ec);
}
e_client_focus_set_with_pointer(ec);
}
/* local subsystem globals */

View File

@ -254,7 +254,8 @@ _backlight_devices_device_set(Backlight_Device *bd, double val)
// fprintf(stderr, "BL: ddc bklight %1.3f @ %1.3f\n", bd->val, ecore_time_get());
if (bd->ddc_max) fval = bd->val * (double)bd->ddc_max;
else fval = bd->val * 100.0;
e_system_send("ddc-val-set", "%s %i %i", bd->dev + 4, 0x10, (int)(fval)); // backlight val in e_system_ddc.c
if (e_config->backlight.ddc)
e_system_send("ddc-val-set", "%s %i %i", bd->dev + 4, 0x10, (int)(fval)); // backlight val in e_system_ddc.c
ecore_event_add(E_EVENT_BACKLIGHT_CHANGE, NULL, NULL, NULL);
}
else

View File

@ -400,8 +400,8 @@ _e_client_mouse_action_end(E_Client *ec)
E_FREE_FUNC(ec->cur_mouse_action, e_object_unref);
}
static void
_e_client_revert_focus(E_Client *ec)
E_API void
e_client_revert_focus(E_Client *ec)
{
E_Client *pec;
E_Desk *desk;
@ -433,12 +433,17 @@ _e_client_revert_focus(E_Client *ec)
}
}
}
else if ((ec->parent) &&
(ec->parent->desk == desk) && (ec->parent->modal == ec))
else if ((ec->parent) && (ec->parent->desk == desk))
{
evas_object_focus_set(ec->parent->frame, 1);
E_Client *goal_ec = NULL;
if (ec->parent->modal != ec && ec->parent->modal) {
goal_ec = ec->parent->modal;
} else {
goal_ec = ec->parent;
}
evas_object_focus_set(goal_ec->frame, 1);
if (e_config->raise_on_revert_focus)
evas_object_raise(ec->parent->frame);
evas_object_raise(goal_ec->frame);
}
else if (e_config->focus_revert_on_hide_or_close)
{
@ -459,6 +464,14 @@ _e_client_revert_focus(E_Client *ec)
static void
_e_client_free(E_Client *ec)
{
if (focused == ec)
{
focused = NULL;
#ifndef HAVE_WAYLAND_ONLY
if (e_comp->comp_type != E_PIXMAP_TYPE_WL)
ecore_x_window_focus(e_comp->root);
#endif
}
if (ec->desk)
ec->desk->fullscreen_clients = eina_list_remove(ec->desk->fullscreen_clients, ec);
if (ec->restore_zone_id)
@ -573,6 +586,8 @@ _e_client_free(E_Client *ec)
if (ec->stack.prev) ec->stack.prev->stack.next = ec->stack.next;
if (ec->stack.next) ec->stack.next->stack.prev = ec->stack.prev;
E_FREE_FUNC(ec->ignore_first_unmap_clear_timer, ecore_timer_del);
ec->e.state.profile.wait_desk = NULL;
evas_object_del(ec->frame);
E_OBJECT(ec)->references--;
@ -644,7 +659,7 @@ _e_client_del(E_Client *ec)
evas_object_hide(ec->internal_elm_win);
if (ec->focused)
_e_client_revert_focus(ec);
e_client_revert_focus(ec);
if (ec->frame) evas_object_focus_set(ec->frame, 0);
E_FREE_FUNC(ec->ping_poller, ecore_poller_del);
@ -1560,7 +1575,7 @@ _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
if (!ec->hidden)
{
if (ec->focused)
_e_client_revert_focus(ec);
e_client_revert_focus(ec);
}
ec->want_focus = ec->take_focus = 0;
@ -4520,6 +4535,7 @@ e_client_fullscreen(E_Client *ec, E_Fullscreen policy)
evas_object_layer_set(ec->frame, E_LAYER_CLIENT_FULLSCREEN);
ec->fullscreen = 1;
ec->fullscreen_time = ecore_time_get();
ec->unfullscreen_forced = 0;
#ifndef HAVE_WAYLAND_ONLY
if ((eina_list_count(e_comp->zones) > 1) ||
@ -4642,7 +4658,7 @@ e_client_iconify(E_Client *ec)
{
if (!ec->new_client)
{
_e_client_revert_focus(ec);
e_client_revert_focus(ec);
evas_object_hide(ec->frame);
}
e_client_urgent_set(ec, ec->icccm.urgent);

View File

@ -302,6 +302,7 @@ struct E_Client
unsigned char ignore_first_unmap;
E_Pointer_Mode resize_mode;
Ecore_Timer *ignore_first_unmap_clear_timer;
struct
{
@ -693,6 +694,8 @@ struct E_Client
int x, y;
} drag;
double fullscreen_time;
Ecore_Timer *raise_timer;
E_Client_Move_Intercept_Cb move_intercept_cb;
E_Remember *remember;
@ -815,6 +818,7 @@ E_API Eina_Bool e_client_focus_track_enabled(void);
E_API void e_client_focus_track_freeze(void);
E_API void e_client_focus_track_thaw(void);
E_API void e_client_refocus(void);
E_API void e_client_revert_focus(E_Client *ec);
E_API void e_client_focus_set_with_pointer(E_Client *ec);
E_API void e_client_activate(E_Client *ec, Eina_Bool just_do_it);
E_API E_Client *e_client_focused_get(void);

View File

@ -434,6 +434,7 @@ e_client_volume_object_add(E_Client *ec, Evas *evas)
if (edje_object_part_exists(bx, "e.swallow.volume"))
{
o = elm_slider_add(e_comp->elm);
elm_object_focus_allow_set(o, EINA_FALSE);
elm_slider_min_max_set(o, ec->volume_min,
ec->volume_max);
elm_slider_span_size_set(o, ec->volume_max

View File

@ -756,6 +756,68 @@ _e_comp_shapes_update_object_checker_function_thingy(Evas_Object *o)
return EINA_FALSE;
}
static Eina_Bool
_tiler_obj_visible(Evas_Object *o)
{
Evas_Object *o2;
if (!evas_object_visible_get(o)) return EINA_FALSE;
o2 = evas_object_clip_get(o);
if (!o2) return EINA_TRUE;
return _tiler_obj_visible(o2);
}
static void
_tiler_add_input_sub(Evas_Object *par, Eina_Tiler *tb)
{
Eina_List *objs = evas_object_smart_members_get(par);
Evas_Coord x, y, w, h;
Evas_Object *o;
const char *type;
void *sd;
EINA_LIST_FREE(objs, o)
{
if (evas_object_clipees_has(o)) continue;
if ((_tiler_obj_visible(o)) &&
(!evas_object_pass_events_get(o)))
{
type = evas_object_type_get(o);
if (type)
{
if (!strcmp(type, "rectangle"))
{
if (!evas_object_clipees_has(o))
{
evas_object_geometry_get(o, &x, &y, &w, &h);
eina_tiler_rect_add(tb, &(Eina_Rectangle){x, y, w, h});
}
}
else if ((!strcmp(type, "image")) ||
(!strcmp(type, "text")) ||
(!strcmp(type, "textblock"))
)
{
const char *name = evas_object_name_get(o);
evas_object_geometry_get(o, &x, &y, &w, &h);
if ((name) && (!strcmp(name, "cw->obj")))
eina_tiler_rect_del(tb, &(Eina_Rectangle){x, y, w, h});
else
eina_tiler_rect_add(tb, &(Eina_Rectangle){x, y, w, h});
}
else if ((!strcmp(type, "edje")) ||
(!strcmp(type, "e_zoomap")))
{
sd = evas_object_smart_data_get(o);
if (sd) _tiler_add_input_sub(o, tb);
}
}
}
}
}
static void
_e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb, Eina_List **rl)
{
@ -823,6 +885,7 @@ _e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb
eina_tiler_rect_del(tb, &(Eina_Rectangle){x, y, w, h});
SHAPE_INF("DEL: %d,%d@%dx%d", x, y, w, h);
}
_tiler_add_input_sub(ec->frame, tb);
return;
}
@ -849,6 +912,8 @@ _e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb
eina_tiler_rect_del(tb, &(Eina_Rectangle){ec->client.x, ec->client.y, ec->client.w, ec->client.h});
SHAPE_INF("DEL: %d,%d@%dx%d", ec->client.x, ec->client.y, ec->client.w, ec->client.h);
}
_tiler_add_input_sub(ec->frame, tb);
}
static void

View File

@ -749,7 +749,7 @@ _e_comp_object_shadow_setup(E_Comp_Object *cw)
else
edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
}
if (cw->input_objs)
if ((cw->input_objs) || ((cw->ec) && (cw->ec->shaped)))
evas_object_pass_events_set(cw->obj, 1);
else
evas_object_pass_events_set(cw->obj, 0);
@ -972,7 +972,7 @@ _e_comp_object_pixels_get(void *data, Evas_Object *obj)
}
if (e_object_is_del(E_OBJECT(ec))) return;
/* shaped clients get precise mouse events to handle transparent pixels */
evas_object_precise_is_inside_set(cw->obj, ec->shaped || ec->shaped_input);
evas_object_precise_is_inside_set(cw->obj, ec->shaped);
//INF("%p PX(%dx%d) EC(%dx%d) CW(%dx%d)", ec, pw, ph, ec->w, ec->h, cw->w, cw->h);
//e_comp_object_frame_wh_adjust(cw->smart_obj, pw, ph, &pw, &ph);
@ -1877,8 +1877,9 @@ _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
}
else
{
if (e_client_focused_get() == ec)
if (e_client_focused_get() == ec) {
e_client_focused_set(NULL);
}
}
evas_object_focus_set(obj, focus);
}
@ -2352,8 +2353,9 @@ _e_comp_smart_hide(Evas_Object *obj)
edje_object_play_set(cw->frame_object, 0);
}
/* ensure focus-out */
if (cw->ec->focused)
evas_object_focus_set(cw->ec->frame, 0);
if (cw->ec->focused) {
e_client_revert_focus(cw->ec);
}
e_comp_render_queue(); //force nocomp recheck
e_comp_shape_queue();
}

View File

@ -534,59 +534,12 @@ _e_comp_wl_evas_cb_multi_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
}
}
static void
_e_comp_wl_client_priority_adjust(int pid, int set, int adj, Eina_Bool use_adj, Eina_Bool adj_child, Eina_Bool do_child)
{
Eina_List *files;
char *file, buff[PATH_MAX];
FILE *f;
int pid2, ppid;
int num_read;
int n;
if (use_adj)
n = (getpriority(PRIO_PROCESS, pid) + adj);
else
n = set;
setpriority(PRIO_PROCESS, pid, n);
if (adj_child)
use_adj = EINA_TRUE;
if (!do_child) return;
files = ecore_file_ls("/proc");
EINA_LIST_FREE(files, file)
{
if (!isdigit(file[0]))
continue;
snprintf(buff, sizeof(buff), "/proc/%s/stat", file);
if ((f = fopen(buff, "r")))
{
pid2 = -1;
ppid = -1;
num_read = fscanf(f, "%i %*s %*s %i %*s", &pid2, &ppid);
fclose(f);
if (num_read == 2 && ppid == pid)
_e_comp_wl_client_priority_adjust(pid2, set,
adj, use_adj,
adj_child, do_child);
}
free(file);
}
}
static void
_e_comp_wl_client_priority_raise(E_Client *ec)
{
if (ec->netwm.pid <= 0) return;
if (ec->netwm.pid == getpid()) return;
_e_comp_wl_client_priority_adjust(ec->netwm.pid,
e_config->priority - 1, -1,
EINA_FALSE, EINA_TRUE, EINA_FALSE);
e_pid_nice_priority_fg(ec->netwm.pid);
}
static void
@ -594,8 +547,7 @@ _e_comp_wl_client_priority_normal(E_Client *ec)
{
if (ec->netwm.pid <= 0) return;
if (ec->netwm.pid == getpid()) return;
_e_comp_wl_client_priority_adjust(ec->netwm.pid, e_config->priority, 1,
EINA_FALSE, EINA_TRUE, EINA_FALSE);
e_pid_nice_priority_bg(ec->netwm.pid);
}
static Eina_Bool

View File

@ -962,7 +962,7 @@ _e_comp_wl_clipboard_create(void)
E_API void
e_comp_wl_data_device_send_enter(E_Client *ec)
{
struct wl_resource *data_device_res, *offer_res;
struct wl_resource *data_device_res = NULL, *offer_res = NULL;
uint32_t serial;
int x, y;

View File

@ -657,58 +657,6 @@ _e_comp_x_add_fail_job(void *d EINA_UNUSED)
"GPU to use OpenGL with compositing."));
}
static void
_pri_adj(int pid, int set, int adj, Eina_Bool use_adj, Eina_Bool adj_children, Eina_Bool do_children)
{
int newpri = set;
if (use_adj) newpri = getpriority(PRIO_PROCESS, pid) + adj;
setpriority(PRIO_PROCESS, pid, newpri);
// shouldn't need to do this as default ionice class is "none" (0), and
// this inherits io priority FROM nice level
// ioprio_set(IOPRIO_WHO_PROCESS, pid,
// IOPRIO_PRIO_VALUE(2, 5));
if (do_children)
{
Eina_List *files;
char *file, buf[PATH_MAX];
FILE *f;
int pid2, ppid;
// yes - this is /proc specific... so this may not work on some
// os's - works on linux. too bad for others.
files = ecore_file_ls("/proc");
EINA_LIST_FREE(files, file)
{
if (isdigit(file[0]))
{
snprintf(buf, sizeof(buf), "/proc/%s/stat", file);
f = fopen(buf, "r");
if (f)
{
pid2 = -1;
ppid = -1;
if (fscanf(f, "%i %*s %*s %i %*s", &pid2, &ppid) == 2)
{
fclose(f);
if (ppid == pid)
{
if (adj_children)
_pri_adj(pid2, set, adj, EINA_TRUE,
adj_children, do_children);
else
_pri_adj(pid2, set, adj, use_adj,
adj_children, do_children);
}
}
else fclose(f);
}
}
free(file);
}
}
}
static E_Client *
_e_comp_x_client_find_by_alarm(Ecore_X_Sync_Alarm al)
{
@ -953,12 +901,7 @@ _e_comp_x_client_pri_raise(E_Client *ec)
{
if (ec->netwm.pid <= 0) return;
if (ec->netwm.pid == getpid()) return;
_pri_adj(ec->netwm.pid,
e_config->priority - 1, -1, EINA_FALSE,
// EINA_TRUE, EINA_TRUE);
EINA_TRUE, EINA_FALSE);
// printf("WIN: pid %i, title %s (HI!!!!!!!!!!!!!!!!!!)\n",
// ec->netwm.pid, e_client_util_name_get(ec));
e_pid_nice_priority_fg(ec->netwm.pid);
}
static void
@ -966,12 +909,7 @@ _e_comp_x_client_pri_norm(E_Client *ec)
{
if (ec->netwm.pid <= 0) return;
if (ec->netwm.pid == getpid()) return;
_pri_adj(ec->netwm.pid,
e_config->priority, 1, EINA_FALSE,
// EINA_TRUE, EINA_TRUE);
EINA_TRUE, EINA_FALSE);
// printf("WIN: pid %i, title %s (NORMAL)\n",
// ec->netwm.pid, e_client_util_name_get(ec));
e_pid_nice_priority_bg(ec->netwm.pid);
}
static void
@ -2510,6 +2448,7 @@ _e_comp_x_mapping_change(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_E
E_Client *ec;
if (_e_comp_x_mapping_change_disabled) return ECORE_CALLBACK_RENEW;
printf("COMPX: _e_comp_x_mapping_change\n");
e_comp_canvas_keys_ungrab();
EINA_LIST_FOREACH(e_comp->clients, l, ec)
{
@ -2601,34 +2540,60 @@ _e_comp_x_powersave(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
static void
_e_comp_x_mouse_in_job(void *d EINA_UNUSED)
{
E_Client *ecf = e_client_focused_get();
// if we're fullscreen and see a mout out within a short time of having
// set this client ot fullscreen - it's a "false flag" that is a bi-product
// of things moving around while becoming fullscreen, so ignore it
if ((ecf) && (ecf != mouse_client))
{
if ((ecf->fullscreen) &&
(ecore_time_get() - ecf->fullscreen_time) < 0.2) // 0.2sec enough
goto done;
}
if (mouse_client)
e_client_mouse_in(mouse_client, e_comp_canvas_x_root_adjust(mouse_in_coords.x), e_comp_canvas_y_root_adjust(mouse_in_coords.y));
done:
mouse_in_job = NULL;
}
static E_Client *
_e_comp_x_e_client_obj_get(Evas_Object *o)
{
Evas_Object *par;
if (evas_object_data_get(o, "comp_object"))
return e_comp_object_client_get(o);
par = evas_object_smart_parent_get(o);
if (!par) return NULL;
return _e_comp_x_e_client_obj_get(par);
}
static Eina_Bool
_e_comp_x_mouse_in_fix_check_timer_cb(void *data EINA_UNUSED)
{
E_Client *ec = NULL, *cec;
E_Client *ec = NULL;
Eina_List *l, *in_list;
Evas_Object *o;
int x, y;
mouse_in_fix_check_timer = NULL;
if (e_grabinput_key_win_get() || e_grabinput_mouse_win_get())
return EINA_FALSE;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
E_CLIENT_REVERSE_FOREACH(cec)
in_list = evas_tree_objects_at_xy_get(e_comp->evas, NULL, x, y);
EINA_LIST_FOREACH(in_list, l, o)
{
/* If a border was specified which should be excluded from the list
* (because it will be closed shortly for example), skip */
if ((!e_client_util_desk_visible(cec, e_desk_current_get(e_zone_current_get())))) continue;
if (!evas_object_visible_get(cec->frame)) continue;
if (!E_INSIDE(x, y, cec->x, cec->y, cec->w, cec->h))
continue;
/* If the layer is higher, the position of the window is higher
* (always on top vs always below) */
if (!ec || (cec->layer > ec->layer))
ec = cec;
ec = _e_comp_x_e_client_obj_get(o);
if (ec)
{
if ((!e_client_util_desk_visible
(ec, e_desk_current_get(e_zone_current_get())))) continue;
break;
}
}
eina_list_free(in_list);
if (ec)
{
mouse_client = ec;
@ -2690,6 +2655,12 @@ _e_comp_x_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_
return ECORE_CALLBACK_PASS_ON;
ec = _e_comp_x_client_find_by_window(ev->win);
if (!ec) return ECORE_CALLBACK_RENEW;
// if we're fullscreen and see a mout out within a short time of having
// set this client ot fullscreen - it's a "false flag" that is a bi-product
// of things moving around while becoming fullscreen, so ignore it
if ((ec->fullscreen) &&
(ecore_time_get() - ec->fullscreen_time) < 0.2) // 0.2sec enough
return ECORE_CALLBACK_RENEW;
if (_e_comp_x_client_data_get(ec)->deleted) return ECORE_CALLBACK_RENEW;
if (mouse_client == ec)
{
@ -2854,6 +2825,8 @@ _e_comp_x_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_
return ECORE_CALLBACK_PASS_ON;
else if (ev->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL)
return ECORE_CALLBACK_PASS_ON;
else if (ev->detail == ECORE_X_EVENT_DETAIL_POINTER)
return ECORE_CALLBACK_PASS_ON;
}
else if (ev->mode == ECORE_X_EVENT_MODE_GRAB)
{
@ -2872,10 +2845,12 @@ _e_comp_x_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_
{
/* for firefox/thunderbird (xul) menu walking */
/* NB: why did i disable this before? */
return ECORE_CALLBACK_PASS_ON;
/* why only filter these out for an ungrab? skip all ungrabs...
if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR)
return ECORE_CALLBACK_PASS_ON;
else if (ev->detail == ECORE_X_EVENT_DETAIL_POINTER)
return ECORE_CALLBACK_PASS_ON;
return ECORE_CALLBACK_PASS_ON; */
}
else if (ev->mode == ECORE_X_EVENT_MODE_WHILE_GRABBED)
{
@ -2883,8 +2858,10 @@ _e_comp_x_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_
return ECORE_CALLBACK_PASS_ON;
else if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR)
return ECORE_CALLBACK_PASS_ON;
else if (ev->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR)
return ECORE_CALLBACK_PASS_ON;
}
evas_object_focus_set(ec->frame, 0);
e_client_revert_focus(ec);
return ECORE_CALLBACK_PASS_ON;
}
@ -3461,6 +3438,41 @@ _e_comp_x_hook_client_post_new_client(void *d EINA_UNUSED, E_Client *ec)
}
}
static void
_e_comp_x_frame_extents_adjust(E_Client *ec, int exl, int exr, int ext, int exb)
{
unsigned int extentscurrent;
unsigned int extentsall = exl | exr | ext | exb;
int insl = 0, insr = 0, inst = 0, insb = 0;
e_comp_object_frame_geometry_get(ec->frame, &insl, &insr, &inst, &insb);
extentscurrent = insl | insr | inst | insb;
extentsall = !!extentsall;
extentscurrent = !!extentscurrent;
if ((!e_comp_object_frame_exists(ec->frame)) &&
(( extentsall && extentscurrent) ||
(!extentsall && extentscurrent) ||
( extentsall && !extentscurrent)))
{
e_comp_object_frame_geometry_set(ec->frame, -exl, -exr, -ext, -exb);
if (ec->override &&
(ec->x == ec->comp_data->initial_attributes.x) &&
(ec->y == ec->comp_data->initial_attributes.y))
e_comp_object_frame_xy_adjust(ec->frame, ec->x, ec->y, &ec->x, &ec->y);
}
}
static Eina_Bool
_cb_e_comp_x_ignore_first_unmap_clear_timer(void *data)
{
E_Client *ec = data;
ec->ignore_first_unmap_clear_timer = NULL;
if (ec->ignore_first_unmap > 0) ec->ignore_first_unmap--;
return EINA_FALSE;
}
static void
_e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED, E_Client *ec)
{
@ -3512,6 +3524,10 @@ _e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED, E_Client *ec)
}
if (!ec->internal)
ecore_x_window_save_set_add(win);
ec->ignore_first_unmap++;
E_FREE_FUNC(ec->ignore_first_unmap_clear_timer, ecore_timer_del);
ec->ignore_first_unmap_clear_timer = ecore_timer_add
(0.2, _cb_e_comp_x_ignore_first_unmap_clear_timer, ec);
ecore_x_window_reparent(win, pwin, 0, 0);
e_pixmap_alias(ep, E_PIXMAP_TYPE_X, pwin);
@ -4838,34 +4854,18 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec)
*/
if (count >= 4)
{
unsigned int extentscurrent;
unsigned int extentsall =
extents[0] | extents[1] | extents[2] | extents[3];
int insl = 0, insr = 0, inst = 0, insb = 0;
e_comp_object_frame_geometry_get(ec->frame, &insl, &insr,
&inst, &insb);
extentscurrent = insl | insr | inst | insb;
extentsall = !!extentsall;
extentscurrent = !!extentscurrent;
if ((!e_comp_object_frame_exists(ec->frame)) &&
(( extentsall && extentscurrent) ||
(!extentsall && extentscurrent) ||
( extentsall && !extentscurrent)))
{
e_comp_object_frame_geometry_set(ec->frame,
-extents[0],
-extents[1],
-extents[2],
-extents[3]);
if (ec->override &&
(ec->x == ec->comp_data->initial_attributes.x) &&
(ec->y == ec->comp_data->initial_attributes.y))
e_comp_object_frame_xy_adjust(ec->frame, ec->x, ec->y, &ec->x, &ec->y);
}
// printf("GTK-FRM: get %i %i %i %i\n",
// extents[0], extents[1], extents[2], extents[3]);
_e_comp_x_frame_extents_adjust
(ec, extents[0], extents[1], extents[2], extents[3]);
}
free(extents);
}
else
{
// printf("GTK-FRM: get fail\n");
_e_comp_x_frame_extents_adjust(ec, 0, 0, 0, 0);
}
cd->fetch_gtk_frame_extents = 0;
}
ec->changes.prop = 0;
@ -5193,6 +5193,11 @@ _e_comp_x_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
else
#endif
{
// work around broken clients that withdraw windows and don't
// remove WM_STATE themselves... like qt6 + telegram and media
// window popups.
ecore_x_window_prop_property_del(e_client_util_win_get(ec),
ECORE_X_ATOM_WM_STATE);
if (e_pixmap_free(ec->pixmap))
e_pixmap_client_set(ec->pixmap, NULL);
ec->pixmap = NULL;
@ -5754,6 +5759,9 @@ _e_comp_x_manage_windows(void)
evas_object_geometry_set(ec->frame, ec->client.x, ec->client.y, ec->client.w, ec->client.h);
}
ec->ignore_first_unmap = 1;
E_FREE_FUNC(ec->ignore_first_unmap_clear_timer, ecore_timer_del);
ec->ignore_first_unmap_clear_timer = ecore_timer_add
(0.2, _cb_e_comp_x_ignore_first_unmap_clear_timer, ec);
if (ec->override || (!ec->icccm.fetch.hints))
evas_object_show(ec->frame);
_e_comp_x_client_stack(ec);

View File

@ -200,28 +200,35 @@ _handle_dev_prop(int dev_slot, const char *dev, const char *prop, Device_Flags d
{
// 7 val, 8 bit bit 0 = off, >0 mouse button reported
// TR, BR, TL, BL, F1, F2, F3
// 0, 0, 0, 0, 1, 2, 3 <- tap to click
// 1, 1, 1, 0, 1, 3, 2 <- tap to click
unsigned char *val = ecore_x_input_device_property_get
(dev_slot, prop, &num, &fmt, &size);
const char tapval[7] = { 1, 1, 1, 0, 1, 3, 2 };
const char notapval[7] = { 0, 0, 0, 0, 0, 0, 0 };
Eina_Bool have_tapval = EINA_FALSE;
Eina_Bool have_notapval = EINA_FALSE;
int i;
if (num >= 7)
{
have_tapval = EINA_TRUE;
for (i = 0; i < 7; i++) if (val[i] != tapval[i]) have_tapval = EINA_FALSE;
have_notapval = EINA_TRUE;
for (i = 0; i < 7; i++) if (val[i] != notapval[i]) have_notapval = EINA_FALSE;
}
if ((val) && (size == 8) && (num >= 7) &&
(((e_config->touch_tap_to_click) &&
((val[4] != 1) || (val[5] != 2) || (val[6] != 3))) ||
((!e_config->touch_tap_to_click) &&
((val[4] != 0) || (val[5] != 0) || (val[6] != 0)))))
(((e_config->touch_tap_to_click) && (!have_tapval)) ||
((!e_config->touch_tap_to_click) && (!have_notapval))))
{
if (e_config->touch_tap_to_click)
{
val[4] = 1;
val[5] = 2;
val[6] = 3;
for (i = 0; i < 7; i++) val[i] = tapval[i];
}
else
{
val[4] = 0;
val[5] = 0;
val[6] = 0;
for (i = 0; i < 7; i++) val[i] = notapval[i];
}
printf("DEV: change [%s] [%s] -> %i %i %i\n", dev, prop, val[4], val[5], val[6]);
printf("DEV: change [%s] [%s] -> %i %i %i %i %i %i %i\n", dev, prop, val[0], val[1], val[2], val[3], val[4], val[5], val[6]);
ecore_x_input_device_property_set
(dev_slot, prop, val, num, fmt, size);
}

View File

@ -122,6 +122,24 @@ _e_config_profile_name_get(Eet_File *ef)
s = eina_stringshare_add_length(data, data_len);
free(data);
}
if (s)
{
char buf[PATH_MAX];
char buf2[PATH_MAX];
e_user_dir_snprintf(buf, sizeof(buf), "config/%s", s);
if (!ecore_file_is_dir(buf))
{
snprintf(buf2, sizeof(buf2), "config/%s", s);
e_prefix_data_concat_static(buf, buf2);
if (!ecore_file_is_dir(buf))
{
printf("CF: warning - profile [%s] dir does not exist in user or system dirs\n", s);
eina_stringshare_del(s);
s = NULL;
}
}
}
return s;
}
@ -172,7 +190,7 @@ _e_config_pending_file_del(const char *path)
eina_hash_del(_e_config_pending_files, path, ef);
eina_lock_release(&_e_config_pending_files_lock);
err = eet_close(ef);
err = eet_sync_sync(ef);
switch (err)
{
case EET_ERROR_NONE:
@ -237,6 +255,7 @@ _e_config_pending_file_del(const char *path)
erstr = _("The error is unknown to Enlightenment.");
break;
}
eet_close(ef);
if (!ok) printf("CF: Write Error: %s\n", erstr);
}
else
@ -879,6 +898,8 @@ _e_config_edd_init(Eina_Bool old)
E_CONFIG_VAL(D, T, thumb_nice, INT);
E_CONFIG_VAL(D, T, gesture_open_input_devices, UCHAR);
E_CONFIG_VAL(D, T, menu_icons_hide, UCHAR);
E_CONFIG_VAL(D, T, menu_favorites_show, INT);
E_CONFIG_VAL(D, T, menu_apps_show, INT);
@ -942,6 +963,7 @@ _e_config_edd_init(Eina_Bool old)
E_CONFIG_VAL(D, T, backlight.battery_timer, DOUBLE);
E_CONFIG_VAL(D, T, backlight.sysdev, STR);
E_CONFIG_VAL(D, T, backlight.idle_dim, UCHAR);
E_CONFIG_VAL(D, T, backlight.ddc, UCHAR);
E_CONFIG_VAL(D, T, deskenv.load_xrdb, UCHAR);
E_CONFIG_VAL(D, T, deskenv.load_xmodmap, UCHAR);
@ -1042,19 +1064,24 @@ e_config_init(void)
for (i = 1; i <= _e_config_revisions; i++)
{
e_user_dir_snprintf(buf, sizeof(buf), "config/profile.%i.cfg", i);
e_user_dir_snprintf(buf, sizeof(buf), "config/profile.cfg.%i", i);
ef = eet_open(buf, EET_FILE_MODE_READ);
if (ef)
{
printf("CF: warning - falling back to %s\n", buf);
_e_config_profile = _e_config_profile_name_get(ef);
eet_close(ef);
ef = NULL;
if (_e_config_profile) break;
printf("CF: warning - fallback to %s can't read profile\n", buf);
}
else if (ecore_file_exists(buf))
printf("CF: warning - fallback to %s failing to open\n", buf);
}
if (!_e_config_profile)
{
/* use system if no user profile config */
printf("CF: fallback to system profile config file\n");
e_prefix_data_concat_static(buf, "data/config/profile.cfg");
ef = eet_open(buf, EET_FILE_MODE_READ);
}
@ -1064,6 +1091,8 @@ e_config_init(void)
_e_config_profile = _e_config_profile_name_get(ef);
eet_close(ef);
ef = NULL;
if (!_e_config_profile)
printf("CF: warning - can't read profile\n");
}
if (!_e_config_profile)
{
@ -1624,52 +1653,10 @@ e_config_load(void)
e_config_save_queue();
}
CONFIG_VERSION_CHECK(22)
{
Eina_List *l;
E_Config_Module *em, *module;
Eina_Bool ibar_en = EINA_FALSE, luncher_en = EINA_FALSE;
CONFIG_VERSION_UPDATE_INFO(22);
EINA_LIST_FOREACH(e_config->modules, l, em)
{
if (!em->enabled) continue;
if (eina_streq(em->name, "ibar"))
ibar_en = EINA_TRUE;
else if (eina_streq(em->name, "luncher"))
luncher_en = EINA_TRUE;
}
if (ibar_en && !luncher_en)
{
module = E_NEW(E_Config_Module, 1);
module->name = eina_stringshare_add("luncher");
module->enabled = 1;
e_config->modules = eina_list_append(e_config->modules, module);
}
e_config_save_queue();
{ // added luncher - not around anymore
}
CONFIG_VERSION_CHECK(23)
{
Eina_List *l;
E_Config_Module *em, *module;
Eina_Bool sysinfo_en = EINA_FALSE;
CONFIG_VERSION_UPDATE_INFO(23);
EINA_LIST_FOREACH(e_config->modules, l, em)
{
if (!em->enabled) continue;
if (eina_streq(em->name, "sysinfo"))
sysinfo_en = EINA_TRUE;
}
if (!sysinfo_en)
{
module = E_NEW(E_Config_Module, 1);
module->name = eina_stringshare_add("sysinfo");
module->enabled = 1;
e_config->modules = eina_list_append(e_config->modules, module);
}
e_config_save_queue();
{ // added sysinfo - not around anymore
}
CONFIG_VERSION_CHECK(24)
{
@ -1808,6 +1795,12 @@ e_config_load(void)
e_config->scale.set_xapp_dpi = 1;
e_config_save_queue();
}
CONFIG_VERSION_CHECK(35)
{
CONFIG_VERSION_UPDATE_INFO(35);
e_config->backlight.ddc = 1;
e_config_save_queue();
}
}
elm_config_profile_set(_e_config_profile);
if (!e_config->remember_internal_fm_windows)
@ -1912,6 +1905,8 @@ e_config_load(void)
E_CONFIG_LIMIT(e_config->desk_auto_switch, 0, 1);
E_CONFIG_LIMIT(e_config->screen_limits, 0, 2);
E_CONFIG_LIMIT(e_config->thumb_nice, -20, 20);
E_CONFIG_LIMIT(e_config->gesture_open_input_devices, 0, 1);
E_CONFIG_LIMIT(e_config->dpms_enable, 0, 1);
E_CONFIG_LIMIT(e_config->dpms_standby_enable, 0, 1);
@ -1992,6 +1987,7 @@ e_config_load(void)
E_CONFIG_LIMIT(e_config->backlight.normal, 0.05, 1.0);
E_CONFIG_LIMIT(e_config->backlight.dim, 0.05, 1.0);
E_CONFIG_LIMIT(e_config->backlight.idle_dim, 0, 1);
E_CONFIG_LIMIT(e_config->backlight.ddc, 0, 1);
E_CONFIG_LIMIT(e_config->keyboard.repeat_delay, -1, 1000); // 1 second
E_CONFIG_LIMIT(e_config->keyboard.repeat_rate, -1, 1000); // 1 second
@ -2205,16 +2201,21 @@ e_config_domain_load(const char *domain, E_Config_DD *edd)
for (i = 1; i <= _e_config_revisions; i++)
{
e_user_dir_snprintf(buf, sizeof(buf), "config/%s/%s.%i.cfg",
e_user_dir_snprintf(buf, sizeof(buf), "config/%s/%s.cfg.%i",
_e_config_profile, domain, i);
ef = eet_open(buf, EET_FILE_MODE_READ);
if (ef)
{
printf("CF: warning - falling back to %s\n", buf);
data = eet_data_read(ef, edd, "config");
eet_close(ef);
if (data) return data;
printf("CF: warning - fallback to %s can't read config\n", buf);
}
else if (ecore_file_exists(buf))
printf("CF: warning - fallback to %s failing to open\n", buf);
}
printf("CF: fallback to system config config file for [%s]\n", domain);
return e_config_domain_system_load(domain, edd);
}
@ -2234,6 +2235,7 @@ e_config_domain_system_load(const char *domain, E_Config_DD *edd)
eet_close(ef);
return data;
}
printf("CF: system config load for %s failed\n", buf);
return data;
}

View File

@ -47,7 +47,7 @@ typedef enum
/* increment this whenever a new set of config values are added but the users
* config doesn't need to be wiped - simply new values need to be put in
*/
#define E_CONFIG_FILE_GENERATION 34
#define E_CONFIG_FILE_GENERATION 35
#define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH * 1000000) + E_CONFIG_FILE_GENERATION)
#define E_CONFIG_BINDINGS_VERSION 0 // DO NOT INCREMENT UNLESS YOU WANT TO WIPE ALL BINDINGS!!!!!
@ -291,6 +291,8 @@ struct _E_Config
int thumb_nice;
unsigned char gesture_open_input_devices; // GUI
int ping_clients_interval; // GUI
int thumbscroll_enable; // GUI
@ -371,6 +373,7 @@ struct _E_Config
double battery_timer; // GUI
const char *sysdev; // GUI
unsigned char idle_dim; // GUI
unsigned char ddc; // GUI
} backlight;
struct

View File

@ -454,8 +454,9 @@ e_desk_last_focused_focus(E_Desk *desk)
evas_object_raise(ecs->frame);
return ecs;
}
if (e_client_focused_get())
if (e_client_focused_get()) {
evas_object_focus_set(e_client_focused_get()->frame, 0);
}
return NULL;
}

View File

@ -318,6 +318,7 @@ _desklock_show_internal(Eina_Bool suspend)
if (getenv("E_START_MANAGER")) kill(getppid(), SIGUSR2);
_e_desklock_state = EINA_TRUE;
e_sys_locked_set(_e_desklock_state);
e_bindings_disabled_set(1);
e_screensaver_update();
e_dpms_force_update();
@ -386,6 +387,7 @@ _desklock_hide_internal(void)
}
_e_desklock_state = EINA_FALSE;
e_sys_locked_set(_e_desklock_state);
e_bindings_disabled_set(0);
ev = E_NEW(E_Event_Desklock, 1);
ev->on = 0;

View File

@ -79,6 +79,7 @@ _e_deskmirror_visible_get(E_Smart_Data *sd, Mirror *m)
*/
if (m->sd->handlers && m->ec->iconic)
visible = evas_object_visible_get(m->ec->frame);
if (m->ec->iconic) visible = EINA_FALSE;
if (visible)
{
visible = (sd->desk == m->ec->desk) || (m->ec->sticky && (!m->ec->hidden));
@ -592,7 +593,7 @@ _e_deskmirror_mirror_setup(Mirror *m)
evas_object_pass_events_set(m->mirror, !m->ec);
}
if (m->ec) evas_object_data_set(m->mirror, "E_Client", m->ec);
evas_object_precise_is_inside_set(m->mirror, m->ec && (m->ec->shaped || m->ec->shaped_input));
evas_object_precise_is_inside_set(m->mirror, m->ec && (m->ec->shaped));
e_layout_pack(m->sd->layout, m->mirror);
_e_deskmirror_mirror_reconfigure(m);
if (m->sd->handlers) // no handlers = we're setting up = there's no possible listeners

View File

@ -104,6 +104,7 @@ _e_exec_recent_exists_filter(void)
{
_e_exec_recent->files =
eina_list_remove_list(_e_exec_recent->files, l);
eina_stringshare_del(fl->file);
free(fl);
}
}
@ -160,7 +161,7 @@ _e_exec_recent_load(void)
}
fl->file = eina_stringshare_add(buf);
fl->timestamp = (double)timi / 100.0;
_e_exec_recent->files = eina_list_prepend(_e_exec_recent->files, fl);
_e_exec_recent->files = eina_list_append(_e_exec_recent->files, fl);
}
fclose(f);
}

View File

@ -35,8 +35,9 @@ e_focus_event_mouse_out(E_Client *ec)
{
if (!ec->lock_focus_in)
{
if (ec->focused)
evas_object_focus_set(ec->frame, 0);
if (ec->focused) {
e_client_revert_focus(ec);
}
}
}
E_FREE_FUNC(ec->raise_timer, ecore_timer_del);

View File

@ -1821,7 +1821,6 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget
else if ((!gcc->style) &&
(!e_util_strcmp(gcc->client_class->default_style, E_GADCON_CLIENT_STYLE_PLAIN)))
e_menu_item_toggle_set(mi, 1);
e_menu_item_disabled_set(mi, mi->toggle);
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_style_plain, gcc);
mi = e_menu_item_new(mo);
@ -1834,7 +1833,6 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget
else if ((!gcc->style) &&
(!e_util_strcmp(gcc->client_class->default_style, E_GADCON_CLIENT_STYLE_INSET)))
e_menu_item_toggle_set(mi, 1);
e_menu_item_disabled_set(mi, mi->toggle);
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_style_inset, gcc);
mi = e_menu_item_new(menu_gadget);

View File

@ -22,6 +22,7 @@ typedef struct {
static int gesture_capable_devices = 0;
static E_Bindings_Swipe_Live_Update live_update;
static void* live_update_data;
static Eina_List *handlers = NULL;
static Swipe_Stats*
_find_swipe_gesture_recognizition(Elput_Device *dev)
@ -208,10 +209,41 @@ _shutdown_for_x11(void)
elput_shutdown();
}
static int
_detect_vm(void)
{
static int on_vm = -1;
int ret;
if (on_vm >= 0) return on_vm;
ret = system("systemd-detect-virt");
if (ret == 0) on_vm = 1;
else if (ret == 1) on_vm = 0;
else
{
ret = system("hostnamectl status | grep 'Chassis: vm'");
if (ret == 0) on_vm = 1;
else if (ret == 1) on_vm = 0;
// fallback to assuming not on vm
else on_vm = 0;
}
return on_vm;
}
E_API int
e_gesture_init(void)
{
// we have some bizarre bug on vbox -> this causes xorg to stop displaying
// the screen output even though it's rendered and you can grab it through
// screenshots, xrandr reports a perfectly well configured display.
// somehow using elput to get input devices from logind causes xorg
// internally to not handle e's first restart after wizard - as if
// the xserver goes into some bixarre internal state - it doesn't report
// any errors though. this works around that by just avoiding the gesture
// support on vm's - they wont have touchpads anyway as they will emulate
// a normal mouse mostly... :)
if (_detect_vm()) return 1;
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
{
_init_for_x11();
@ -219,10 +251,10 @@ e_gesture_init(void)
active_gestures = eina_hash_pointer_new(_stats_free);
ecore_event_handler_add(ELPUT_EVENT_SWIPE_BEGIN, _swipe_cb, NULL);
ecore_event_handler_add(ELPUT_EVENT_SWIPE_UPDATE, _swipe_cb, NULL);
ecore_event_handler_add(ELPUT_EVENT_SWIPE_END, _swipe_cb, NULL);
ecore_event_handler_add(ELPUT_EVENT_SEAT_CAPS, _debug, NULL);
E_LIST_HANDLER_APPEND(handlers, ELPUT_EVENT_SWIPE_BEGIN, _swipe_cb, NULL);
E_LIST_HANDLER_APPEND(handlers, ELPUT_EVENT_SWIPE_UPDATE, _swipe_cb, NULL);
E_LIST_HANDLER_APPEND(handlers, ELPUT_EVENT_SWIPE_END, _swipe_cb, NULL);
E_LIST_HANDLER_APPEND(handlers, ELPUT_EVENT_SEAT_CAPS, _debug, NULL);
return 1;
}
@ -230,6 +262,21 @@ e_gesture_init(void)
E_API int
e_gesture_shutdown(void)
{
Ecore_Event_Handler *hand;
if (_detect_vm()) return 1;
if (active_gestures)
{
eina_hash_free(active_gestures);
active_gestures = NULL;
}
EINA_LIST_FREE(handlers, hand)
{
ecore_event_handler_del(hand);
}
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
{
_shutdown_for_x11();

View File

@ -174,6 +174,7 @@ e_icon_file_set(Evas_Object *obj, const char *file)
if ((sd->url) && (!strcmp(sd->url, file))) return;
/* smart code here */
sd->edje = EINA_FALSE;
_e_icon_obj_prepare(obj, sd);
/* FIXME: 64x64 - unhappy about this. use icon size */
sd->loading = 0;

16
src/bin/e_inc_terms.h Normal file
View File

@ -0,0 +1,16 @@
"terminology.desktop",
"xterm.desktop",
"rxvt.desktop",
"gnome-terminal.desktop",
"konsole.desktop",
"Alacritty.desktop",
"cool-retro-term.desktop",
"kitty.desktop",
"urxvt.desktop",
"terminator.desktop",
"termite.desktop",
"qterminal.desktop",
"xfce4-terminal.desktop",
"lxterminal.desktop",
"com.gexperts.Tilix.desktop",
"deepin-terminal.desktop",

View File

@ -155,6 +155,7 @@
#include "e_comp_x_randr.h"
#include "e_watchdog.h"
#include "e_gesture.h"
#include "e_sound.h"
#ifdef HAVE_WAYLAND
# include "e_comp_wl.h"

View File

@ -72,6 +72,7 @@ e_int_client_prop(E_Client *ec)
if (ec->border_prop_dialog) return;
dia = e_dialog_new(NULL, "E", "_window_props");
e_dialog_resizable_set(dia, 1);
e_object_del_attach_func_set(E_OBJECT(dia), _ec_cb_dialog_del);
_create_data(dia, ec);
@ -455,30 +456,30 @@ _ec_icccm_create(E_Dialog *dia, void *data EINA_UNUSED)
e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Minimum Size"), 0, 6, icccm.min);
STR_ENTRY(_("Maximum Size"), 0, 7, icccm.max);
STR_ENTRY(_("Base Size"), 0, 8, icccm.base);
STR_ENTRY(_("Resize Steps"), 0, 9, icccm.step);
STR_ENTRY(_("Minimum Size"), 0, 0, icccm.min);
STR_ENTRY(_("Maximum Size"), 0, 1, icccm.max);
STR_ENTRY(_("Base Size"), 0, 2, icccm.base);
STR_ENTRY(_("Resize Steps"), 0, 3, icccm.step);
e_widget_toolbook_page_append(otb, NULL, _("Sizing"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Aspect Ratio"), 2, 0, icccm.aspect);
STR_ENTRY(_("Initial State"), 2, 1, icccm.initial_state);
STR_ENTRY(_("State"), 2, 2, icccm.state);
STR_ENTRY(_("Window ID"), 2, 3, icccm.window_id);
STR_ENTRY(_("Window Group"), 2, 4, icccm.window_group);
STR_ENTRY(_("Transient For"), 2, 5, icccm.transient_for);
STR_ENTRY(_("Client Leader"), 2, 6, icccm.client_leader);
STR_ENTRY(_("Gravity"), 2, 7, icccm.gravity);
STR_ENTRY(_("Command"), 2, 8, icccm.command);
STR_ENTRY(_("Aspect Ratio"), 0, 0, icccm.aspect);
STR_ENTRY(_("Initial State"), 0, 1, icccm.initial_state);
STR_ENTRY(_("State"), 0, 2, icccm.state);
STR_ENTRY(_("Window ID"), 0, 3, icccm.window_id);
STR_ENTRY(_("Window Group"), 0, 4, icccm.window_group);
STR_ENTRY(_("Transient For"), 0, 5, icccm.transient_for);
STR_ENTRY(_("Client Leader"), 0, 6, icccm.client_leader);
STR_ENTRY(_("Gravity"), 0, 7, icccm.gravity);
STR_ENTRY(_("Command"), 0, 8, icccm.command);
e_widget_toolbook_page_append(otb, NULL, _("States"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
CHK_ENTRY(_("Take Focus"), 0, 11, icccm.take_focus);
CHK_ENTRY(_("Accepts Focus"), 0, 12, icccm.accepts_focus);
CHK_ENTRY(_("Urgent"), 0, 13, icccm.urgent);
CHK_ENTRY(_("Request Delete"), 2, 11, icccm.delete_request);
CHK_ENTRY(_("Request Position"), 2, 12, icccm.request_pos);
CHK_ENTRY(_("Take Focus"), 0, 0, icccm.take_focus);
CHK_ENTRY(_("Accepts Focus"), 0, 1, icccm.accepts_focus);
CHK_ENTRY(_("Urgent"), 0, 2, icccm.urgent);
CHK_ENTRY(_("Request Delete"), 2, 0, icccm.delete_request);
CHK_ENTRY(_("Request Position"), 2, 1, icccm.request_pos);
e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);
@ -501,19 +502,19 @@ _ec_netwm_create(E_Dialog *dia, void *data EINA_UNUSED)
evas = evas_object_evas_get(dia->win);
otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Name"), 0, 1, netwm.name);
STR_ENTRY(_("Icon Name"), 0, 2, netwm.icon_name);
STR_ENTRY(_("Stacking"), 0, 3, netwm.stacking);
STR_ENTRY(_("Name"), 0, 0, netwm.name);
STR_ENTRY(_("Icon Name"), 0, 1, netwm.icon_name);
STR_ENTRY(_("Stacking"), 0, 2, netwm.stacking);
e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
CHK_ENTRY(_("Modal"), 0, 4, netwm.modal);
CHK_ENTRY(_("Sticky"), 0, 5, netwm.sticky);
CHK_ENTRY(_("Shaded"), 0, 6, netwm.shaded);
CHK_ENTRY(_("Skip Taskbar"), 0, 7, netwm.skip_taskbar);
CHK_ENTRY(_("Skip Pager"), 0, 8, netwm.skip_pager);
CHK_ENTRY(_("Hidden"), 0, 9, netwm.hidden);
CHK_ENTRY(_("Fullscreen"), 0, 10, netwm.fullscreen);
CHK_ENTRY(_("Modal"), 0, 0, netwm.modal);
CHK_ENTRY(_("Sticky"), 0, 1, netwm.sticky);
CHK_ENTRY(_("Shaded"), 0, 2, netwm.shaded);
CHK_ENTRY(_("Skip Taskbar"), 2, 0, netwm.skip_taskbar);
CHK_ENTRY(_("Skip Pager"), 2, 1, netwm.skip_pager);
CHK_ENTRY(_("Hidden"), 2, 2, netwm.hidden);
CHK_ENTRY(_("Fullscreen"), 2, 3, netwm.fullscreen);
e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);

View File

@ -12,6 +12,7 @@ struct _Main_Data
E_Menu *enlightenment;
E_Menu *config;
E_Menu *lost_clients;
E_Menu *inhibitors;
};
/* local subsystem functions */
@ -63,6 +64,7 @@ static void _e_int_menus_desk_item_cb(void *data, E_Menu *m, E_Menu_Item
static void _e_int_menus_item_label_set(Efreet_Menu *entry, E_Menu_Item *mi);
static Efreet_Menu *_e_int_menus_apps_thread_new(E_Menu *m, const char *dir);
static Eina_Bool _e_int_menus_efreet_desktop_cache_update(void *d, int type, void *e);
static void _e_int_menus_inhibit_cb(void *data, E_Menu *m, E_Menu_Item *mi);
//static void _e_int_menus_apps_drag_finished(E_Drag *drag, int dropped EINA_UNUSED);
/* local subsystem globals */
@ -194,6 +196,16 @@ e_int_menus_main_new(void)
e_util_menu_item_theme_icon_set(mi, "preferences-desktop");
e_menu_item_submenu_set(mi, subm);
if ((e_msgbus_data) && (e_msgbus_data->screensaver_inhibits))
{
subm = e_int_menus_inhibitors_new();
dat->inhibitors = subm;
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Blanking Block"));
e_util_menu_item_theme_icon_set(mi, "preferences-screen-normal");
e_menu_item_submenu_set(mi, subm);
}
subm = e_int_menus_clients_new();
dat->clients = subm;
mi = e_menu_item_new(m);
@ -418,6 +430,46 @@ e_int_menus_lost_clients_new(void)
return m;
}
static void
_e_int_menus_inhibit_cb(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
{
uintptr_t cookie = (uintptr_t)data;
e_msgbus_screensaver_inhibit_remove((unsigned int)cookie);
}
E_API E_Menu *
e_int_menus_inhibitors_new(void)
{
E_Menu *m;
E_Menu_Item *mi;
Eina_List *l;
E_Msgbus_Data_Screensaver_Inhibit *inhibit;
char buf[1024];
m = e_menu_new();
if (!((e_msgbus_data) && (e_msgbus_data->screensaver_inhibits)))
return NULL;
EINA_LIST_FOREACH(e_msgbus_data->screensaver_inhibits, l, inhibit)
{
mi = e_menu_item_new(m);
if ((inhibit->application) && (inhibit->reason))
snprintf(buf, sizeof(buf), "%s (%s)", inhibit->application, inhibit->reason);
else if (inhibit->application)
snprintf(buf, sizeof(buf), "%s", inhibit->application);
else if (inhibit->reason)
snprintf(buf, sizeof(buf), "(%s)", inhibit->reason);
else
snprintf(buf, sizeof(buf), "???");
e_menu_item_label_set(mi, buf);
e_menu_item_check_set(mi, 1);
e_menu_item_toggle_set(mi, 1);
e_menu_item_callback_set(mi, _e_int_menus_inhibit_cb,
(void *)((uintptr_t)inhibit->cookie));
}
return m;
}
E_API E_Int_Menu_Augmentation *
e_int_menus_menu_augmentation_add_sorted(const char *menu,
const char *sort_key,
@ -593,6 +645,7 @@ _e_int_menus_main_del_hook(void *obj)
if (dat->lost_clients) e_object_del(E_OBJECT(dat->lost_clients));
if (dat->enlightenment) e_object_del(E_OBJECT(dat->enlightenment));
if (dat->config) e_object_del(E_OBJECT(dat->config));
if (dat->inhibitors) e_object_del(E_OBJECT(dat->inhibitors));
free(dat);
_e_int_menus_augmentation_del(m, _e_int_menus_augmentation_find("main/0"));

View File

@ -67,6 +67,7 @@ E_API E_Menu *e_int_menus_all_apps_new(void);
E_API E_Menu *e_int_menus_config_new(void);
E_API E_Menu *e_int_menus_lost_clients_new(void);
E_API E_Menu *e_int_menus_shelves_new(void);
E_API E_Menu *e_int_menus_inhibitors_new(void);
E_API E_Int_Menu_Augmentation *e_int_menus_menu_augmentation_add(const char *menu,
void (*func_add) (void *data, E_Menu *m),

View File

@ -865,11 +865,7 @@ _e_intl_locale_system_locales_get(void)
locales = NULL;
/* FIXME: Maybe needed for other BSD OS, or even Solaris */
#ifdef __OpenBSD__
output = popen("ls /usr/share/locale", "r");
#else
output = popen("locale -a", "r");
#endif
if (output)
{
char line[32];

View File

@ -800,6 +800,10 @@ main(int argc, char **argv)
TS("E_Powersave Init Done");
_e_main_shutdown_push(e_powersave_shutdown);
TS("E_Sound Init");
e_sound_init();
_e_main_shutdown_push(e_sound_shutdown);
TS("Screens Init");
if (!_e_main_screens_init())
{
@ -1059,10 +1063,13 @@ main(int argc, char **argv)
e_comp_canvas_keys_grab();
TS("E_Comp_Canvas Keys Grab Done");
#ifdef HAVE_ELPUT
TS("E_Gesture Init");
e_gesture_init();
TS("E_Gesture Init Done");
_e_main_shutdown_push(e_gesture_shutdown);
if (e_config->gesture_open_input_devices)
{
TS("E_Gesture Init");
e_gesture_init();
TS("E_Gesture Init Done");
_e_main_shutdown_push(e_gesture_shutdown);
}
#endif
TS("Run Startup Apps");
@ -1113,7 +1120,7 @@ main(int argc, char **argv)
E_LIST_FOREACH(e_comp->zones, e_comp_canvas_zone_restarted);
}
// e_watchdog_begin();
e_watchdog_begin();
TS("MAIN LOOP AT LAST");
if (!setjmp(x_fatal_buff))
{
@ -1122,7 +1129,7 @@ main(int argc, char **argv)
}
else
CRI("FATAL: X Died. Connection gone. Abbreviated Shutdown\n");
// e_watchdog_end();
e_watchdog_end();
e_main_loop_running = EINA_FALSE;
inloop = EINA_FALSE;
@ -1247,7 +1254,7 @@ _e_main_parse_arguments(int argc, char **argv)
(!strcmp(argv[i], "--version")))
{
printf(_("Version: %s\n"), PACKAGE_VERSION);
_e_main_shutdown(0);
_e_main_shutdown(11);
}
else if ((!strcmp(argv[i], "-h")) ||
(!strcmp(argv[i], "-help")) ||
@ -1256,31 +1263,31 @@ _e_main_parse_arguments(int argc, char **argv)
printf
(_(
"Options:\n"
"\t-display DISPLAY\n"
"\t\tConnect to display named DISPLAY.\n"
"\t\tEG: -display :1.0\n"
"\t-fake-xinerama-screen WxH+X+Y\n"
"\t\tAdd a FAKE xinerama screen (instead of the real ones)\n"
"\t\tgiven the geometry. Add as many as you like. They all\n"
"\t\treplace the real xinerama screens, if any. This can\n"
"\t\tbe used to simulate xinerama.\n"
"\t\tEG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
"\t-profile CONF_PROFILE\n"
"\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
"\t-good\n"
"\t\tBe good.\n"
"\t-evil\n"
"\t\tBe evil.\n"
"\t-psychotic\n"
"\t\tBe psychotic.\n"
"\t-locked\n"
"\t\tStart with desklock on, so password will be asked.\n"
"\t-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
"\t\tIf you need this help, you don't need this option.\n"
"\t-version\n"
" -display DISPLAY\n"
" Connect to display named DISPLAY.\n"
" EG: -display :1.0\n"
" -fake-xinerama-screen WxH+X+Y\n"
" Add a FAKE xinerama screen (instead of the real ones)\n"
" given the geometry. Add as many as you like. They all\n"
" replace the real xinerama screens, if any. This can\n"
" be used to simulate xinerama.\n"
" EG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
" -profile CONF_PROFILE\n"
" Use the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
" -good\n"
" Be good.\n"
" -evil\n"
" Be evil.\n"
" -psychotic\n"
" Be psychotic.\n"
" -locked\n"
" Start with desklock on, so password will be asked.\n"
" -i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
" If you need this help, you don't need this option.\n"
" -version\n"
)
);
_e_main_shutdown(0);
_e_main_shutdown(11);
}
}
@ -1561,13 +1568,13 @@ _e_main_path_shutdown(void)
static int
_e_main_screens_init(void)
{
TS("\tscreens: client");
TS(" screens: client");
if (!e_client_init()) return 0;
TS("E_Screensaver Init");
if (!e_screensaver_init()) return 0;
TS("\tscreens: client volume");
TS(" screens: client volume");
if (!e_client_volume_init()) return 0;
TS("\tscreens: win");
TS(" screens: win");
if (!e_win_init()) return 0;
TS("Compositor Init");
if (!e_comp_init())

View File

@ -786,6 +786,7 @@ _e_module_whitelist_check(void)
"policy_mobile",
"geolocation",
"xwayland",
"procstats",
NULL // end marker
};

View File

@ -1,15 +1,15 @@
#include "e.h"
#define PATH "/org/enlightenment/wm/RemoteObject"
/* local subsystem functions */
static void _e_msgbus_request_name_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending);
///////////////////////////////////////////////////////////////////////////
#define E_BUS "org.enlightenment.wm.service"
#define E_IFACE "org.enlightenment.wm.Core"
#define E_PATH "/org/enlightenment/wm/RemoteObject"
static void _e_msgbus_core_request_name_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending);
static Eldbus_Message *_e_msgbus_core_version_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_core_restart_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_core_shutdown_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static const Eldbus_Method core_methods[] =
static const Eldbus_Method _e_core_methods[] =
{
{ "Version", NULL, ELDBUS_ARGS({"s", "version"}), _e_msgbus_core_version_cb, 0 },
{ "Restart", NULL, NULL, _e_msgbus_core_restart_cb, 0 },
@ -17,65 +17,103 @@ static const Eldbus_Method core_methods[] =
{ NULL, NULL, NULL, NULL, 0}
};
static const Eldbus_Service_Interface_Desc core_desc = {
"org.enlightenment.wm.Core", core_methods, NULL, NULL, NULL, NULL
static const Eldbus_Service_Interface_Desc _e_core_desc = {
E_IFACE, _e_core_methods, NULL, NULL, NULL, NULL
};
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#define SCREENSAVER_BUS "org.freedesktop.ScreenSaver"
#define SCREENSAVER_IFACE "org.freedesktop.ScreenSaver"
#define SCREENSAVER_PATH "/org/freedesktop/ScreenSaver"
#define SCREENSAVER_PATH2 "/ScreenSaver"
static void _e_msgbus_screensaver_request_name_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending);
static void _e_msgbus_screensaver_inhibit_free(E_Msgbus_Data_Screensaver_Inhibit *inhibit);
static void _e_msgbus_screensaver_owner_change_cb(void *data EINA_UNUSED, const char *bus, const char *old_id, const char *new_id);
static Eldbus_Message *_e_msgbus_screensaver_inhibit_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_screensaver_uninhibit_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_screensaver_getactive_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static const Eldbus_Method _screensaver_core_methods[] =
{
{ "Inhibit", ELDBUS_ARGS({"s", "application_name"}, {"s", "reason_for_inhibit"}), ELDBUS_ARGS({"u", "cookie"}), _e_msgbus_screensaver_inhibit_cb, 0 },
{ "UnInhibit", ELDBUS_ARGS({"u", "cookie"}), NULL, _e_msgbus_screensaver_uninhibit_cb, 0 },
{ "GetActive", NULL, ELDBUS_ARGS({"b", "active"}), _e_msgbus_screensaver_getactive_cb, 0 },
{ NULL, NULL, NULL, NULL, 0}
};
/* local subsystem globals */
static E_Msgbus_Data *_e_msgbus_data = NULL;
static const Eldbus_Service_Interface_Desc _screensaver_core_desc = {
SCREENSAVER_IFACE, _screensaver_core_methods, NULL, NULL, NULL, NULL
};
///////////////////////////////////////////////////////////////////////////
E_API E_Msgbus_Data *e_msgbus_data = NULL;
/* externally accessible functions */
EINTERN int
e_msgbus_init(void)
{
_e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
eldbus_init();
_e_msgbus_data->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
if (!_e_msgbus_data->conn)
e_msgbus_data->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
if (!e_msgbus_data->conn)
{
WRN("Cannot get ELDBUS_CONNECTION_TYPE_SESSION");
return 0;
}
e_msgbus_data->e_iface = eldbus_service_interface_register
(e_msgbus_data->conn, E_PATH, &_e_core_desc);
eldbus_name_request(e_msgbus_data->conn, E_BUS, 0,
_e_msgbus_core_request_name_cb, NULL);
_e_msgbus_data->iface = eldbus_service_interface_register
(_e_msgbus_data->conn, PATH, &core_desc);
eldbus_name_request(_e_msgbus_data->conn,
"org.enlightenment.wm.service",
0, _e_msgbus_request_name_cb, NULL);
e_msgbus_data->screensaver_iface = eldbus_service_interface_register
(e_msgbus_data->conn, SCREENSAVER_PATH, &_screensaver_core_desc);
e_msgbus_data->screensaver_iface2 = eldbus_service_interface_register
(e_msgbus_data->conn, SCREENSAVER_PATH2, &_screensaver_core_desc);
eldbus_name_request(e_msgbus_data->conn, SCREENSAVER_BUS, 0,
_e_msgbus_screensaver_request_name_cb, NULL);
return 1;
}
EINTERN int
e_msgbus_shutdown(void)
{
if (_e_msgbus_data->iface)
eldbus_service_object_unregister(_e_msgbus_data->iface);
if (_e_msgbus_data->conn)
E_Msgbus_Data_Screensaver_Inhibit *inhibit;
if (e_msgbus_data->screensaver_iface2)
eldbus_service_object_unregister(e_msgbus_data->screensaver_iface2);
if (e_msgbus_data->screensaver_iface)
eldbus_service_object_unregister(e_msgbus_data->screensaver_iface);
if (e_msgbus_data->e_iface)
eldbus_service_object_unregister(e_msgbus_data->e_iface);
if (e_msgbus_data->conn)
{
eldbus_name_release(_e_msgbus_data->conn,
"org.enlightenment.wm.service",
NULL, NULL);
eldbus_connection_unref(_e_msgbus_data->conn);
eldbus_name_release(e_msgbus_data->conn, E_BUS, NULL, NULL);
eldbus_connection_unref(e_msgbus_data->conn);
}
eldbus_shutdown();
E_FREE(_e_msgbus_data);
_e_msgbus_data = NULL;
EINA_LIST_FREE(e_msgbus_data->screensaver_inhibits, inhibit)
_e_msgbus_screensaver_inhibit_free(inhibit);
E_FREE(e_msgbus_data);
return 1;
}
E_API Eldbus_Service_Interface *
e_msgbus_interface_attach(const Eldbus_Service_Interface_Desc *desc)
{
if (!_e_msgbus_data->iface) return NULL;
return eldbus_service_interface_register(_e_msgbus_data->conn, PATH, desc);
if (!e_msgbus_data->e_iface) return NULL;
return eldbus_service_interface_register(e_msgbus_data->conn, E_PATH, desc);
}
///////////////////////////////////////////////////////////////////////////
static void
_e_msgbus_request_name_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
_e_msgbus_core_request_name_cb(void *data EINA_UNUSED,
const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
{
unsigned int flag;
@ -84,23 +122,21 @@ _e_msgbus_request_name_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
ERR("Could not request bus name");
return;
}
if (!eldbus_message_arguments_get(msg, "u", &flag))
{
ERR("Could not get arguments on on_name_request");
return;
}
if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER))
WRN("Name already in use\n");
WRN("Enlightenment core name already in use\n");
}
/* Core Handlers */
static Eldbus_Message *
_e_msgbus_core_version_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
EINA_SAFETY_ON_NULL_RETURN_VAL(reply, NULL);
eldbus_message_arguments_append(reply, "s", VERSION);
return reply;
@ -127,3 +163,171 @@ _e_msgbus_core_shutdown_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
e_sys_action_do(E_SYS_EXIT, NULL);
return eldbus_message_method_return_new(msg);
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
static void
_e_msgbus_screensaver_request_name_cb(void *data EINA_UNUSED,
const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
{
unsigned int flag;
if (eldbus_message_error_get(msg, NULL, NULL))
{
ERR("Could not request bus name");
return;
}
if (!eldbus_message_arguments_get(msg, "u", &flag))
{
ERR("Could not get arguments on on_name_request");
return;
}
if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER))
WRN("Screensaver name already in use\n");
}
static void
_e_msgbus_screensaver_inhibit_free(E_Msgbus_Data_Screensaver_Inhibit *inhibit)
{
printf("INH: inhibit remove %i [%s] [%s] [%s]\n", inhibit->cookie, inhibit->application, inhibit->reason, inhibit->sender);
if (inhibit->application) eina_stringshare_del(inhibit->application);
if (inhibit->reason) eina_stringshare_del(inhibit->reason);
if (inhibit->sender)
{
eldbus_name_owner_changed_callback_del(e_msgbus_data->conn,
inhibit->sender,
_e_msgbus_screensaver_owner_change_cb,
NULL);
eina_stringshare_del(inhibit->sender);
}
free(inhibit);
}
static void
_e_msgbus_screensaver_owner_change_cb(void *data EINA_UNUSED, const char *bus EINA_UNUSED, const char *old_id, const char *new_id)
{
Eina_List *l, *ll;
E_Msgbus_Data_Screensaver_Inhibit *inhibit;
Eina_Bool removed = EINA_FALSE;
printf("INH: owner change... [%s] [%s] [%s]\n", bus, old_id, new_id);
if ((new_id) && (!new_id[0]))
{
EINA_LIST_FOREACH_SAFE(e_msgbus_data->screensaver_inhibits, l, ll, inhibit)
{
if ((inhibit->sender) && (!strcmp(inhibit->sender, old_id)))
{
_e_msgbus_screensaver_inhibit_free(inhibit);
e_msgbus_data->screensaver_inhibits =
eina_list_remove_list
(e_msgbus_data->screensaver_inhibits, l);
removed = EINA_TRUE;
}
}
if ((removed) && (!e_msgbus_data->screensaver_inhibits))
{
// stop inhibiting SS
e_screensaver_update();
}
}
}
static Eldbus_Message *
_e_msgbus_screensaver_inhibit_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
Eldbus_Message *reply = NULL;
static unsigned int cookie = 1;
const char *application_name = NULL, *reason_for_inhibit = NULL;
E_Msgbus_Data_Screensaver_Inhibit *inhibit;
if (!eldbus_message_arguments_get(msg, "ss",
&application_name, &reason_for_inhibit))
{
ERR("Can't get application_name and reason_for_inhibit");
goto err;
}
inhibit = E_NEW(E_Msgbus_Data_Screensaver_Inhibit, 1);
if (inhibit)
{
cookie++;
inhibit->application = eina_stringshare_add(application_name);
inhibit->reason = eina_stringshare_add(reason_for_inhibit);
inhibit->sender = eina_stringshare_add(eldbus_message_sender_get(msg));
if (inhibit->sender)
eldbus_name_owner_changed_callback_add(e_msgbus_data->conn,
inhibit->sender,
_e_msgbus_screensaver_owner_change_cb,
NULL, EINA_FALSE);
inhibit->cookie = cookie;
printf("INH: inhibit [%s] [%s] [%s] -> %i\n", inhibit->application, inhibit->reason, inhibit->sender, inhibit->cookie);
e_msgbus_data->screensaver_inhibits =
eina_list_append(e_msgbus_data->screensaver_inhibits, inhibit);
reply = eldbus_message_method_return_new(msg);
if (reply)
eldbus_message_arguments_append(reply, "u", inhibit->cookie);
}
if ((e_msgbus_data->screensaver_inhibits) &&
(eina_list_count(e_msgbus_data->screensaver_inhibits) == 1))
{
// start inhibiting SS
e_screensaver_deactivate();
e_screensaver_update();
}
err:
return reply;
}
static Eldbus_Message *
_e_msgbus_screensaver_uninhibit_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
unsigned int cookie = 0;
if (!eldbus_message_arguments_get(msg, "u", &cookie))
return NULL;
e_msgbus_screensaver_inhibit_remove(cookie);
return eldbus_message_method_return_new(msg);
}
static Eldbus_Message *
_e_msgbus_screensaver_getactive_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
Eldbus_Message *reply = NULL;
reply = eldbus_message_method_return_new(msg);
printf("INH: getactive = %i\n", e_screensaver_on_get());
if (reply)
eldbus_message_arguments_append(reply, "b", e_screensaver_on_get());
return reply;
}
E_API void
e_msgbus_screensaver_inhibit_remove(unsigned int cookie)
{
Eina_Bool removed = EINA_FALSE;
Eina_List *l;
E_Msgbus_Data_Screensaver_Inhibit *inhibit;
EINA_LIST_FOREACH(e_msgbus_data->screensaver_inhibits, l, inhibit)
{
if (inhibit->cookie == cookie)
{
_e_msgbus_screensaver_inhibit_free(inhibit);
e_msgbus_data->screensaver_inhibits =
eina_list_remove_list
(e_msgbus_data->screensaver_inhibits, l);
removed = EINA_TRUE;
break;
}
}
if ((removed) && (!e_msgbus_data->screensaver_inhibits))
{
// stop inhibiting SS
e_screensaver_update();
}
}
///////////////////////////////////////////////////////////////////////////

View File

@ -1,6 +1,7 @@
#ifdef E_TYPEDEFS
typedef struct _E_Msgbus_Data E_Msgbus_Data;
typedef struct _E_Msgbus_Data E_Msgbus_Data;
typedef struct _E_Msgbus_Data_Screensaver_Inhibit E_Msgbus_Data_Screensaver_Inhibit;
#else
#ifndef E_MSGBUS_H
@ -10,13 +11,27 @@ typedef struct _E_Msgbus_Data E_Msgbus_Data;
struct _E_Msgbus_Data
{
Eldbus_Connection *conn;
Eldbus_Service_Interface *iface;
Eldbus_Connection *conn;
Eldbus_Service_Interface *e_iface;
Eldbus_Service_Interface *screensaver_iface;
Eldbus_Service_Interface *screensaver_iface2;
Eina_List *screensaver_inhibits;
};
struct _E_Msgbus_Data_Screensaver_Inhibit
{
const char *application;
const char *reason;
const char *sender;
unsigned int cookie;
};
EINTERN int e_msgbus_init(void);
EINTERN int e_msgbus_shutdown(void);
E_API Eldbus_Service_Interface *e_msgbus_interface_attach(const Eldbus_Service_Interface_Desc *desc);
E_API void e_msgbus_screensaver_inhibit_remove(unsigned int cookie);
E_API extern E_Msgbus_Data *e_msgbus_data;
#endif
#endif

View File

@ -2,8 +2,8 @@
typedef struct _Notification_Data
{
Eldbus_Connection *conn;
Eldbus_Service_Interface *iface;
Eldbus_Connection *conn;
Eldbus_Service_Interface *iface;
E_Notification_Notify_Cb notify_cb;
E_Notification_Close_Cb close_cb;
void *data;
@ -15,15 +15,28 @@ static Notification_Data *n_data = NULL;
static void
_notification_free(E_Notification_Notify *notify)
{
int i;
EINA_SAFETY_ON_NULL_RETURN(notify);
eina_stringshare_del(notify->app_name);
eina_stringshare_del(notify->body);
eina_stringshare_del(notify->icon.icon);
if (notify->icon.icon_path)
eina_stringshare_del(notify->icon.icon_path);
eina_stringshare_del(notify->summary);
if (notify->icon.raw.data)
free(notify->icon.raw.data);
if (notify->app_name) eina_stringshare_del(notify->app_name);
if (notify->body) eina_stringshare_del(notify->body);
if (notify->icon.icon) eina_stringshare_del(notify->icon.icon);
if (notify->icon.icon_path) eina_stringshare_del(notify->icon.icon_path);
if (notify->summary) eina_stringshare_del(notify->summary);
if (notify->icon.raw.data) free(notify->icon.raw.data);
if (notify->category) eina_stringshare_del(notify->category);
if (notify->desktop_entry) eina_stringshare_del(notify->desktop_entry);
if (notify->sound_file) eina_stringshare_del(notify->sound_file);
if (notify->sound_name) eina_stringshare_del(notify->sound_name);
if (notify->actions)
{
for (i = 0; notify->actions[i].action; i++)
{
eina_stringshare_del(notify->actions[i].action);
eina_stringshare_del(notify->actions[i].label);
}
free(notify->actions);
}
free(notify);
}
@ -31,12 +44,15 @@ static void
hints_dict_iter(void *data, const void *key, Eldbus_Message_Iter *var)
{
E_Notification_Notify *n = data;
if (!strcmp(key, "image-data") || !strcmp(key, "image_data"))
if ((!strcmp(key, "image-data")) || (!strcmp(key, "image_data")) ||
(!strcmp(key, "icon_data")))
{
Eldbus_Message_Iter *st, *data_iter;
int w, h, r, bits, channels;
Eina_Bool alpha;
unsigned char *raw_data;
if (!eldbus_message_iter_arguments_get(var, "(iiibiiay)", &st))
return;
if (!eldbus_message_iter_arguments_get(st, "iiibiiay", &w, &h, &r,
@ -54,173 +70,318 @@ hints_dict_iter(void *data, const void *key, Eldbus_Message_Iter *var)
n->icon.raw.data = malloc(sizeof(char) * n->icon.raw.data_size);
EINA_SAFETY_ON_NULL_RETURN(n->icon.raw.data);
memcpy(n->icon.raw.data, raw_data, sizeof(char) * n->icon.raw.data_size);
}
else if (!strcmp(key, "urgency"))
{
unsigned char urgency;
eldbus_message_iter_arguments_get(var, "y", &urgency);
if (urgency < 3)
n->urgency = urgency;
printf("NOT: image-data=%ix%i,a=%i\n", w, h, alpha);
}
else if (!strcmp(key, "image-path") || !strcmp(key, "image_path"))
{
eldbus_message_iter_arguments_get(var, "s", &n->icon.icon_path);
n->icon.icon_path = eina_stringshare_add(n->icon.icon_path);
printf("NOT: image-path=[%s]\n", n->icon.icon_path);
// path to image file
}
else if (!strcmp(key, "urgency"))
{
unsigned char urgency;
eldbus_message_iter_arguments_get(var, "y", &urgency);
if (urgency < 3) n->urgency = urgency;
printf("NOT: urgency=%i\n", n->urgency);
// 0=low, 1=normal, 2=critical
}
else if (!strcmp(key, "category"))
{ // XXX: store category
const char *val = NULL;
eldbus_message_iter_arguments_get(var, "s", &val);
printf("NOT: category=[%s]\n", val);
// "device" A generic device-related notification that doesn't fit into any other category.
// "device.added" A device, such as a USB device, was added to the system.
// "device.error" A device had some kind of error.
// "device.removed" A device, such as a USB device, was removed from the system.
// "email" A generic e-mail-related notification that doesn't fit into any other category.
// "email.arrived" A new e-mail notification.
// "email.bounced" A notification stating that an e-mail has bounced.
// "im" A generic instant message-related notification that doesn't fit into any other category.
// "im.error" An instant message error notification.
// "im.received" A received instant message notification.
// "network" A generic network notification that doesn't fit into any other category.
// "network.connected" A network connection notification, such as successful sign-on to a network service. This should not be confused with device.added for new network devices.
// "network.disconnected" A network disconnected notification. This should not be confused with device.removed for disconnected network devices.
// "network.error" A network-related or connection-related error.
// "presence" A generic presence change notification that doesn't fit into any other category, such as going away or idle.
// "presence.offline" An offline presence change notification.
// "presence.online" An online presence change notification.
// "transfer" A generic file transfer or download notification that doesn't fit into any other category.
// "transfer.complete" A file transfer or download complete notification.
// "transfer.error" A file transfer or download error.
if (val) n->category = eina_stringshare_add(val);
}
else if (!strcmp(key, "desktop-entry"))
{
const char *val = NULL;
eldbus_message_iter_arguments_get(var, "s", &val);
printf("NOT: desktop-entry=[%s]\n", val);
// if rage.desktop -> "rage"
// if terminology.desktop -> "terminology"
if (val) n->desktop_entry = eina_stringshare_add(val);
}
else if (!strcmp(key, "icon-actions"))
{
Eina_Bool val = 0;
eldbus_message_iter_arguments_get(var, "b", &val);
printf("NOT: icon-actions=%i\n", val);
// 1 == interpret action identifier == named icon in icon naming standards
n->icon_actions = val;
}
else if (!strcmp(key, "resident"))
{
Eina_Bool val = 0;
eldbus_message_iter_arguments_get(var, "b", &val);
printf("NOT: resident=%i\n", val);
// 1== remove notification when action invoked - no timeout
n->resident = val;
}
else if (!strcmp(key, "suppress-sound"))
{
Eina_Bool val = 0;
eldbus_message_iter_arguments_get(var, "b", &val);
printf("NOT: suppress-sound=%i\n", val);
// 1== remove notification when action invoked - no timeout
n->suppress_sound = val;
}
else if (!strcmp(key, "sound-file"))
{
const char *val = NULL;
eldbus_message_iter_arguments_get(var, "s", &val);
printf("NOT: sound-file=[%s]\n", val);
// path to sound file to play
if (val) n->sound_file = eina_stringshare_add(val);
}
else if (!strcmp(key, "sound-name"))
{
const char *val = NULL;
eldbus_message_iter_arguments_get(var, "s", &val);
printf("NOT: sound-file=[%s]\n", val);
// sound naming spec to play
// http://0pointer.de/public/sound-naming-spec.html
if (val) n->sound_name = eina_stringshare_add(val);
}
else if (!strcmp(key, "transient"))
{
Eina_Bool val = 0;
eldbus_message_iter_arguments_get(var, "b", &val);
printf("NOT: transient=%i\n", val);
n->transient = val;
}
else if (!strcmp(key, "x"))
{
int val = 0;
eldbus_message_iter_arguments_get(var, "i", &val);
printf("NOT: x=%i\n", val);
n->x = val;
n->have_xy = EINA_TRUE;
}
else if (!strcmp(key, "y"))
{
int val = 0;
eldbus_message_iter_arguments_get(var, "i", &val);
printf("NOT: y=%i\n", val);
n->y = val;
n->have_xy = EINA_TRUE;
}
}
/* this function should be external in edje for use in cases such as this module.
*
* happily, it was decided that the function would not be external so that it could
* be duplicated into the module in full.
*/
static int
_text_escape(Eina_Strbuf *txt, const char *text)
_tag_len(const char *txt)
{
const char *escaped;
int advance;
const char *s;
Eina_Bool backslash = EINA_FALSE;
Eina_Bool inquote = EINA_FALSE, indblquote = EINA_FALSE;
escaped = evas_textblock_string_escape_get(text, &advance);
if (!escaped)
if (txt[0] != '<') return 0;
for (s = txt; *s; s++)
{
eina_strbuf_append_char(txt, text[0]);
advance = 1;
if (!backslash)
{
if (*s == '\\') backslash = EINA_TRUE;
else
{
if (inquote)
{
if (*s == '\'') inquote = EINA_FALSE;
}
else if (indblquote)
{
if (*s == '"') indblquote = EINA_FALSE;
}
else
{
if (*s == '>')
{
s++;
break;
}
else if (*s == '\'') inquote = EINA_TRUE;
else if (*s == '\"') indblquote = EINA_TRUE;
}
}
}
else backslash = EINA_FALSE;
}
else
eina_strbuf_append(txt, escaped);
return advance;
return s - txt;
}
/* hardcoded list of allowed tags based on
* https://people.gnome.org/~mccann/docs/notification-spec/notification-spec-latest.html#markup
*/
static const char *tags[] =
static char *
_path_get(const char *txt)
{
"<b",
"<i",
"<u",
//"<a", FIXME: we can't actually display these right now
//"<img",
};
Eina_Strbuf *buf;
char *ret;
const char *s;
Eina_Bool backslash = EINA_FALSE;
Eina_Bool inquote = EINA_FALSE, indblquote = EINA_FALSE;
static const char *
_get_tag(const char *c)
{
unsigned int i;
if (txt[0] == '>') return NULL;
if (c[1] != '>') return NULL;
for (i = 0; i < EINA_C_ARRAY_LENGTH(tags); i++)
if (tags[i][1] == c[0]) return tags[i];
return NULL;
buf = eina_strbuf_new();
if (!buf) return NULL;
for (s = txt; *s; s++)
{
if (!backslash)
{
if (*s == '\\') backslash = EINA_TRUE;
else
{
if (inquote)
{
if (*s == '\'') inquote = EINA_FALSE;
else eina_strbuf_append_char(buf, *s);
}
else if (indblquote)
{
if (*s == '"') indblquote = EINA_FALSE;
else eina_strbuf_append_char(buf, *s);
}
else
{
if (*s == '>') break;
else if (*s == ' ') break;
else if (*s == '\'') inquote = EINA_TRUE;
else if (*s == '\"') indblquote = EINA_TRUE;
else eina_strbuf_append_char(buf, *s);
}
}
}
else
{
eina_strbuf_append_char(buf, *s);
backslash = EINA_FALSE;
}
}
ret = eina_strbuf_string_steal(buf);
eina_strbuf_free(buf);
return ret;
}
char *
static char *
_nedje_text_escape(const char *text)
{
Eina_Strbuf *txt;
char *ret;
const char *text_end;
size_t text_len;
Eina_Array *arr;
const char *cur_tag = NULL;
int taglen;
if (!text) return NULL;
txt = eina_strbuf_new();
text_len = strlen(text);
arr = eina_array_new(3);
if (!txt) return NULL;
text_end = text + strlen(text);
text_end = text + text_len;
while (text < text_end)
{
int advance;
if ((text[0] == '<') && text[1])
taglen = _tag_len(text);
if (taglen == 0)
{
const char *tag, *popped;
Eina_Bool closing = EINA_FALSE;
if (text[1] == '/') //closing tag
{
closing = EINA_TRUE;
tag = _get_tag(text + 2);
}
else
tag = _get_tag(text + 1);
if (closing)
{
if (cur_tag && (tag != cur_tag))
{
/* tag mismatch: autoclose all failure tags
* not technically required by the spec,
* but it makes me feel better about myself
*/
do
{
popped = eina_array_pop(arr);
if (eina_array_count(arr))
cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1);
else
cur_tag = NULL;
eina_strbuf_append_printf(txt, "</%c>", popped[1]);
} while (cur_tag && (popped != tag));
advance = 4;
}
else if (cur_tag)
{
/* tag match: just pop */
popped = eina_array_pop(arr);
if (eina_array_count(arr))
cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1);
else
cur_tag = NULL;
eina_strbuf_append_printf(txt, "</%c>", popped[1]);
advance = 4;
}
else
{
/* no current tag: escape */
advance = _text_escape(txt, text);
}
}
else
{
if (tag)
{
cur_tag = tag;
eina_array_push(arr, tag);
eina_strbuf_append_printf(txt, "<%c>", tag[1]);
advance = 3;
}
else
advance = _text_escape(txt, text);
}
}
else if (text[0] == '&')
{
const char *s;
s = strchr(text, ';');
if (s)
s = evas_textblock_escape_string_range_get(text, s + 1);
if (s)
{
eina_strbuf_append_char(txt, text[0]);
advance = 1;
}
else
advance = _text_escape(txt, text);
eina_strbuf_append_char(txt, text[0]);
text++;
}
else
advance = _text_escape(txt, text);
{
if (!strncmp(text, "<b>", 3)) eina_strbuf_append(txt, "<b>");
else if (!strncmp(text, "</b>", 4)) eina_strbuf_append(txt, "</b>");
else if (!strncmp(text, "<i>", 3)) eina_strbuf_append(txt, "<i>");
else if (!strncmp(text, "</i>", 4)) eina_strbuf_append(txt, "</i>");
else if (!strncmp(text, "<u>", 3)) eina_strbuf_append(txt, "<u>");
else if (!strncmp(text, "</u>", 4)) eina_strbuf_append(txt, "</u>");
else if (!strncmp(text, "<a ", 3))
{
eina_strbuf_append(txt, "<link>");
eina_strbuf_append_n(txt, text, taglen);
}
else if (!strncmp(text, "</a>", 3))
{
eina_strbuf_append(txt, "</a></link>");
}
else if (!strncmp(text, "<img src=", 9))
{
Evas_Object *o;
int w = 0, h = 0;
char *path;
text += advance;
path = _path_get(text + 9);
if ((path) && (strlen(path) > 0))
{
o = evas_object_image_add(e_comp->evas);
evas_object_image_file_set(o, path, NULL);
evas_object_image_size_get(o, &w, &h);
printf("NOT: imgpath=%s %ix%i\n", path, w, h);
if ((w > 0) && (h > 0))
{
double neww = w, newh = h;
if (neww > 200.0)
{
double oldw = neww;
neww = 200.0;
newh = (newh * neww) / oldw;
}
if (newh > 100.0)
{
double oldh = newh;
newh = 100.0;
neww = (neww * newh) / oldh;
}
neww *= e_scale;
newh *= e_scale;
w = neww + 0.5;
h = newh + 0.5;
eina_strbuf_append_printf
(txt, "<item absize=%ix%i href=", w, h);
eina_strbuf_append_n(txt, text + 9, taglen - 9);
eina_strbuf_append(txt, "</item>");
}
evas_object_del(o);
}
free(path);
}
text += taglen;
}
}
eina_array_free(arr);
ret = eina_strbuf_string_steal(txt);
printf("NOT: body -> [%s]\n", ret);
eina_strbuf_free(txt);
return ret;
}
@ -231,28 +392,30 @@ notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Messag
E_Notification_Notify *n;
Eldbus_Message_Iter *actions_iter, *hints_iter;
Eldbus_Message *reply;
char *txt;
char *txt, *txt2;
int num;
if (!n_data->notify_cb)
return NULL;
if (!n_data->notify_cb) return NULL;
n = E_OBJECT_ALLOC(E_Notification_Notify, E_NOTIFICATION_TYPE, _notification_free);
n->urgency = E_NOTIFICATION_NOTIFY_URGENCY_NORMAL;
if (!eldbus_message_arguments_get(msg, "susssasa{sv}i", &n->app_name,
&n->replaces_id, &n->icon.icon, &n->summary,
&n->body, &actions_iter, &hints_iter,
&n->timeout))
if (!eldbus_message_arguments_get(msg, "susssasa{sv}i",
&n->app_name, &n->replaces_id,
&n->icon.icon, &n->summary, &n->body,
&actions_iter, &hints_iter, &n->timeout))
{
ERR("Reading message.");
e_object_del(E_OBJECT(n));
return NULL;
}
if (e_screensaver_on_get() && e_config->screensaver_wake_on_notify)
{
{ // XXX: this is an attempt to wake the screen? should be an option
int x, y;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
ecore_evas_pointer_warp(e_comp->ee, x, y);
}
// walk hints
eldbus_message_iter_dict_iterate(hints_iter, "sv", hints_dict_iter, n);
n->app_name = eina_stringshare_add(n->app_name);
n->icon.icon = eina_stringshare_add(n->icon.icon);
@ -261,22 +424,43 @@ notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Messag
n->body = eina_stringshare_add(txt);
free(txt);
num = 0;
while (eldbus_message_iter_get_and_next(actions_iter, 's', &txt))
{
if (eldbus_message_iter_get_and_next(actions_iter, 's', &txt2))
{ // XXX: add actions to notification
E_Notification_Notify_Action *actions;
printf("NOT: act=[%s] [%s]\n", txt, txt2);
num++;
actions = realloc(n->actions, (num + 1) * sizeof(E_Notification_Notify));
if (actions)
{
n->actions = actions;
n->actions[num - 1].action = eina_stringshare_add(txt);
n->actions[num - 1].label = eina_stringshare_add(txt2);
n->actions[num].action = NULL;
n->actions[num].label = NULL;
}
}
}
e_object_ref(E_OBJECT(n));
n->id = n_data->notify_cb(n_data->data, n);
reply = eldbus_message_method_return_new(msg);
eldbus_message_arguments_append(reply, "u", n->id);
e_object_unref(E_OBJECT(n));
return reply;
}
static Eldbus_Message *
close_notification_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
unsigned id;
if (!eldbus_message_arguments_get(msg, "u", &id))
return NULL;
if (n_data->close_cb)
n_data->close_cb(n_data->data, id);
unsigned int id;
if (!eldbus_message_arguments_get(msg, "u", &id)) return NULL;
if (n_data->close_cb) n_data->close_cb(n_data->data, id);
return eldbus_message_method_return_new(msg);
}
@ -291,8 +475,10 @@ capabilities_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_
eldbus_message_iter_arguments_append(main_iter, "as", &array);
for (i = 0; n_data->server_info->capabilities[i]; i++)
eldbus_message_iter_arguments_append(array, "s",
n_data->server_info->capabilities[i]);
{
eldbus_message_iter_arguments_append
(array, "s", n_data->server_info->capabilities[i]);
}
eldbus_message_iter_container_close(main_iter, array);
return reply;
}
@ -301,23 +487,32 @@ static Eldbus_Message *
server_info_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
eldbus_message_arguments_append(reply, "ssss", n_data->server_info->name,
n_data->server_info->vendor,
n_data->server_info->version,
n_data->server_info->spec_version);
eldbus_message_arguments_append(reply, "ssss",
n_data->server_info->name,
n_data->server_info->vendor,
n_data->server_info->version,
n_data->server_info->spec_version);
return reply;
}
static const Eldbus_Method methods[] = {
{ "Notify",
ELDBUS_ARGS({"s", "app_name"}, {"u", "replaces_id"}, {"s", "app_icon"}, {"s", "summary"}, {"s", "body"}, {"as", "actions"}, {"a{sv}", "hints"}, {"i", "expire_timeout"}),
ELDBUS_ARGS({"u", "id"}), notify_cb, 0 },
{ "CloseNotification", ELDBUS_ARGS({"u", "id"}), NULL, close_notification_cb, 0 },
{ "GetCapabilities", NULL, ELDBUS_ARGS({"as", "capabilities"}),
capabilities_cb, 0 },
{ "GetServerInformation", NULL,
ELDBUS_ARGS({"s", "name"}, {"s", "vendor"}, {"s", "version"}, {"s", "spec_version"}),
server_info_cb, 0 },
ELDBUS_ARGS({"s", "app_name"}, {"u", "replaces_id"}, {"s", "app_icon"}, {"s", "summary"}, {"s", "body"}, {"as", "actions"}, {"a{sv}", "hints"}, {"i", "expire_timeout"}),
ELDBUS_ARGS({"u", "id"}),
notify_cb, 0 },
{ "CloseNotification",
ELDBUS_ARGS({"u", "id"}),
NULL,
close_notification_cb, 0 },
{ "GetCapabilities",
NULL,
ELDBUS_ARGS({"as", "capabilities"}),
capabilities_cb, 0 },
{ "GetServerInformation",
NULL,
ELDBUS_ARGS({"s", "name"}, {"s", "vendor"}, {"s", "version"}, {"s", "spec_version"}),
server_info_cb, 0 },
{ NULL, NULL, NULL, NULL, 0 }
};
@ -332,6 +527,7 @@ static const Eldbus_Signal signals[] = {
{ "NotificationClosed", ELDBUS_ARGS({"u", "id"}, {"u", "reason"}), 0 },
[SIGNAL_ACTION_INVOKED] =
{ "ActionInvoked", ELDBUS_ARGS({"u", "id"}, {"s", "action_key"}), 0 },
{ NULL, NULL, 0}
};
@ -347,8 +543,8 @@ E_API Eina_Bool
e_notification_server_register(const E_Notification_Server_Info *server_info, E_Notification_Notify_Cb n_cb, E_Notification_Close_Cb close_cb, const void *data)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(server_info, EINA_FALSE);
if (n_data)
return EINA_FALSE;
if (n_data) return EINA_FALSE;
n_data = calloc(1, sizeof(Notification_Data));
EINA_SAFETY_ON_NULL_RETURN_VAL(n_data, EINA_FALSE);
@ -359,8 +555,7 @@ e_notification_server_register(const E_Notification_Server_Info *server_info, E_
n_data->data = (void *)data;
n_data->server_info = server_info;
eldbus_name_request(n_data->conn, BUS,
ELDBUS_NAME_REQUEST_FLAG_REPLACE_EXISTING, NULL, NULL);
ELDBUS_NAME_REQUEST_FLAG_REPLACE_EXISTING, NULL, NULL);
return EINA_TRUE;
}
@ -381,7 +576,17 @@ e_notification_notify_close(E_Notification_Notify *notify, E_Notification_Notify
EINA_SAFETY_ON_NULL_RETURN(notify);
EINA_SAFETY_ON_FALSE_RETURN(reason <= E_NOTIFICATION_NOTIFY_CLOSED_REASON_UNDEFINED);
eldbus_service_signal_emit(n_data->iface, SIGNAL_NOTIFICATION_CLOSED,
notify->id, reason);
notify->id, reason);
}
E_API void
e_notification_notify_action(E_Notification_Notify *notify, const char *action)
{
EINA_SAFETY_ON_NULL_RETURN(n_data);
EINA_SAFETY_ON_NULL_RETURN(notify);
if (!action) action = "";
eldbus_service_signal_emit(n_data->iface, SIGNAL_ACTION_INVOKED,
notify->id, action);
}
E_API Evas_Object *
@ -491,6 +696,7 @@ notification_client_dbus_send(E_Notification_Notify *notify, E_Notification_Clie
{
Eldbus_Message_Iter *st, *data_iter;
int i;
eldbus_message_iter_arguments_append(hints, "{sv}", &entry);
eldbus_message_iter_arguments_append(entry, "s", "image-data");
var = eldbus_message_iter_container_new(entry, 'v', "(iiibiiay)");
@ -533,8 +739,7 @@ notification_client_dbus_send(E_Notification_Notify *notify, E_Notification_Clie
p = eldbus_connection_send(conn, msg, client_notify_cb, data, 5000);
EINA_SAFETY_ON_NULL_GOTO(p, error);
if (cb)
eldbus_pending_data_set(p, "cb", cb);
if (cb) eldbus_pending_data_set(p, "cb", cb);
eldbus_pending_data_set(p, "conn", conn);
return EINA_TRUE;
@ -547,8 +752,7 @@ error:
static void
normalize_notify(E_Notification_Notify *notify)
{
if (!notify->timeout)
notify->timeout = -1;
if (!notify->timeout) notify->timeout = -1;
}
E_API Eina_Bool
@ -562,11 +766,12 @@ e_notification_client_send(E_Notification_Notify *notify, E_Notification_Client_
if (!n_data)
{
fprintf(stderr, "UNHANDLED NOTIFICATION:\nSummary: %s\nBody: %s\n", notify->summary, notify->body);
fprintf(stderr, "UNHANDLED NOTIFICATION:\nSummary: %s\nBody: %s\n",
notify->summary, notify->body);
return notification_client_dbus_send(notify, cb, data);
}
//local
// local
copy = malloc(sizeof(E_Notification_Notify));
EINA_SAFETY_ON_NULL_RETURN_VAL(copy, EINA_FALSE);
memcpy(copy, notify, sizeof(E_Notification_Notify));
@ -579,8 +784,7 @@ e_notification_client_send(E_Notification_Notify *notify, E_Notification_Client_
copy->icon.icon_path = eina_stringshare_add(notify->icon.icon_path);
id = n_data->notify_cb(n_data->data, copy);
if (cb)
cb((void *)data, id);
if (cb) cb((void *)data, id);
return EINA_TRUE;
}

View File

@ -7,35 +7,39 @@
typedef enum _E_Notification_Notify_Urgency
{
E_NOTIFICATION_NOTIFY_URGENCY_LOW,
E_NOTIFICATION_NOTIFY_URGENCY_NORMAL,
E_NOTIFICATION_NOTIFY_URGENCY_CRITICAL
E_NOTIFICATION_NOTIFY_URGENCY_LOW = 0,
E_NOTIFICATION_NOTIFY_URGENCY_NORMAL = 1,
E_NOTIFICATION_NOTIFY_URGENCY_CRITICAL = 2
} E_Notification_Notify_Urgency;
typedef enum _E_Notification_Notify_Closed_Reason
{
E_NOTIFICATION_NOTIFY_CLOSED_REASON_EXPIRED, /** The notification expired. */
E_NOTIFICATION_NOTIFY_CLOSED_REASON_DISMISSED, /** The notification was dismissed by the user. */
E_NOTIFICATION_NOTIFY_CLOSED_REASON_REQUESTED, /** The notification was closed by a call to CloseNotification method. */
E_NOTIFICATION_NOTIFY_CLOSED_REASON_UNDEFINED /** Undefined/reserved reasons. */
E_NOTIFICATION_NOTIFY_CLOSED_REASON_EXPIRED = 1,
E_NOTIFICATION_NOTIFY_CLOSED_REASON_DISMISSED = 2,
E_NOTIFICATION_NOTIFY_CLOSED_REASON_REQUESTED = 3,
E_NOTIFICATION_NOTIFY_CLOSED_REASON_UNDEFINED = 4
} E_Notification_Notify_Closed_Reason;
typedef struct _E_Notification_Notify_Action
{
const char *action;
const char *label;
} E_Notification_Notify_Action;
typedef struct _E_Notification_Notify
{
E_Object e_obj_inherit;
unsigned int id;
const char *app_name;
unsigned replaces_id;
unsigned int replaces_id;
const char *summary;
const char *body;
int timeout;
int timeout; // time in ms
E_Notification_Notify_Urgency urgency;
struct
{
struct {
const char *icon;
const char *icon_path;
struct
{
struct {
int width;
int height;
int rowstride;
@ -46,6 +50,17 @@ typedef struct _E_Notification_Notify
int data_size;
} raw;
} icon;
const char *category;
const char *desktop_entry;
const char *sound_file;
const char *sound_name;
int x, y;
Eina_Bool have_xy;
Eina_Bool icon_actions;
Eina_Bool resident;
Eina_Bool suppress_sound;
Eina_Bool transient;
E_Notification_Notify_Action *actions;
} E_Notification_Notify;
typedef unsigned int (*E_Notification_Notify_Cb)(void *data, E_Notification_Notify *n);
@ -80,7 +95,9 @@ E_API Evas_Object *e_notification_notify_raw_image_get(E_Notification_Notify *no
//client
typedef void (*E_Notification_Client_Send_Cb)(void *data, unsigned int id);
E_API Eina_Bool e_notification_client_send(E_Notification_Notify *notify, E_Notification_Client_Send_Cb cb, const void *data);
E_API void e_notification_notify_action(E_Notification_Notify *notify, const char *action);
E_API Eina_Bool e_notification_util_send(const char *summary, const char *body);
#endif

View File

@ -16,10 +16,13 @@ static Eina_Bool init = EINA_FALSE;
static inline void
_e_pointer_theme_buf(E_Pointer *ptr, char cursor[1024])
{
const char *type = ptr->type;
if (!type) type = "default";
if (ptr->color)
snprintf(cursor, 1024, "e/pointer/enlightenment/%s/color", ptr->type);
snprintf(cursor, 1024, "e/pointer/enlightenment/%s/color", type);
else
snprintf(cursor, 1024, "e/pointer/enlightenment/%s/mono", ptr->type);
snprintf(cursor, 1024, "e/pointer/enlightenment/%s/mono", type);
}
static inline void
@ -388,26 +391,17 @@ _e_pointer_cb_free(E_Pointer *ptr)
free(ptr);
}
/*
* Fallback to x11 setting the correct cursor and shape.
*
* Not rendering any application rendered canvas, only works for x11 compositors
*/
static void
_e_pointer_x11_setup(E_Pointer *ptr, const char *cursor)
_e_pointer_x11_fallback_to_x11_pointer(E_Pointer *ptr)
{
if (ptr->e_cursor && (e_comp->comp_type != E_PIXMAP_TYPE_WL))
{
/* create a pointer canvas if we need to */
if ((!ptr->buffer_evas) && ptr->win) _e_pointer_canvas_add(ptr);
if (ptr->buffer_o_ptr && (ptr->buffer_o_ptr != ptr->o_ptr))
{
e_theme_edje_object_set(ptr->buffer_o_ptr, "base/theme/pointer", cursor);
edje_object_part_swallow(ptr->buffer_o_ptr, "e.swallow.hotspot", ptr->buffer_o_hot);
if (!init)
{
edje_object_signal_emit(ptr->o_ptr, "e,state,init", "e");
edje_object_message_signal_process(ptr->o_ptr);
init = EINA_TRUE;
}
}
return;
}
EINA_SAFETY_ON_FALSE_RETURN((e_comp->comp_type != E_PIXMAP_TYPE_WL));
// Remove any application rendered pointer canvas, x11 is going to render
if (ptr->buffer_evas) _e_pointer_canvas_del(ptr);
#ifndef HAVE_WAYLAND_ONLY
if (!e_comp_util_has_x()) return;
@ -456,6 +450,43 @@ _e_pointer_x11_setup(E_Pointer *ptr, const char *cursor)
#endif
}
static Eina_Bool
_e_pointer_theme_object_setup(Evas_Object *edje, const char *cursor, Evas_Object *hotspot)
{
/* try to set the edje object theme */
if (!e_theme_edje_object_set(edje, "base/theme/pointer", cursor))
return EINA_FALSE;
if (!edje_object_part_swallow(edje, "e.swallow.hotspot", hotspot))
return EINA_FALSE;
if (!init)
{
edje_object_signal_emit(edje, "e,state,init", "e");
edje_object_message_signal_process(edje);
init = EINA_TRUE;
}
return EINA_TRUE;
}
static void
_e_pointer_x11_setup(E_Pointer *ptr, const char *cursor)
{
EINA_SAFETY_ON_FALSE_RETURN((e_comp->comp_type != E_PIXMAP_TYPE_WL));
if (ptr->e_cursor)
{
/* create a pointer canvas if we need to */
if ((!ptr->buffer_evas) && ptr->win) _e_pointer_canvas_add(ptr);
if (ptr->buffer_o_ptr && (ptr->buffer_o_ptr != ptr->o_ptr))
{
if (!_e_pointer_theme_object_setup(ptr->buffer_o_ptr, cursor, ptr->buffer_o_hot))
{
_e_pointer_x11_fallback_to_x11_pointer(ptr);
}
}
return;
}
_e_pointer_x11_fallback_to_x11_pointer(ptr);
}
static void
_e_pointer_type_set(E_Pointer *ptr, const char *type)
{
@ -483,18 +514,17 @@ _e_pointer_type_set(E_Pointer *ptr, const char *type)
if ((!ptr->buffer_evas) && ptr->win) _e_pointer_canvas_add(ptr);
_e_pointer_theme_buf(ptr, cursor);
/* try to set the edje object theme */
if (!e_theme_edje_object_set(ptr->o_ptr, "base/theme/pointer", cursor))
cursor[0] = 0;
edje_object_part_swallow(ptr->o_ptr, "e.swallow.hotspot", ptr->o_hot);
if (!init)
if (!_e_pointer_theme_object_setup(ptr->o_ptr, cursor, ptr->o_hot))
{
edje_object_signal_emit(ptr->o_ptr, "e,state,init", "e");
edje_object_message_signal_process(ptr->o_ptr);
init = EINA_TRUE;
if (e_comp->comp_type != E_PIXMAP_TYPE_WL)
{
_e_pointer_x11_setup(ptr, cursor);
}
else
{
_e_pointer_theme_object_setup(ptr->o_ptr, "default", ptr->o_hot);
}
}
_e_pointer_x11_setup(ptr, cursor);
if (!cursor[0]) return;
_hot_update(ptr);
@ -504,7 +534,17 @@ _e_pointer_type_set(E_Pointer *ptr, const char *type)
evas_object_show(ptr->o_ptr);
}
else
_e_pointer_x11_setup(ptr, NULL);
{
if (e_comp->comp_type != E_PIXMAP_TYPE_WL)
{
_e_pointer_x11_fallback_to_x11_pointer(ptr);
}
else
{
CRI("WL must always use the application pointer!!!");
_e_pointer_theme_object_setup(ptr->o_ptr, "default", ptr->o_hot);
}
}
}
EINTERN int
@ -846,7 +886,7 @@ e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y)
int px, py;
EINA_SAFETY_ON_NULL_RETURN(ptr);
EINA_SAFETY_ON_NULL_RETURN(ptr->o_ptr);
EINA_SAFETY_ON_NULL_GOTO(ptr->o_ptr, misst);
ecore_evas_cursor_get(ptr->ee, &o, NULL, &px, &py);
if (o)
@ -882,6 +922,10 @@ e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y)
ptr->client.ec = ec;
ptr->client.x = x;
ptr->client.y = y;
return;
misst:
INF("The ptr object of pointer %p is missing.", ptr);
}
E_API void
@ -922,7 +966,9 @@ e_pointer_reset(E_Pointer *ptr)
E_FREE_LIST(ptr->stack, _e_pointer_stack_free);
eina_stringshare_del(ptr->type);
ptr->type = NULL;
eina_stringshare_del(ptr->deferred_type);
ptr->deferred_type = NULL;
/* reset pointer to default */
e_pointer_type_push(ptr, ptr, "default");

View File

@ -114,6 +114,10 @@ e_screensaver_update(void)
(!((e_util_fullscreen_current_any()) &&
(e_config->no_dpms_on_fullscreen)))))
timeout = 0;
if (e_msgbus_data)
{
if (e_msgbus_data->screensaver_inhibits) timeout = 0;
}
if (_e_screensaver_timeout != timeout)
{

123
src/bin/e_sound.c Normal file
View File

@ -0,0 +1,123 @@
#include <e.h>
#include <Ecore_Audio.h>
static int _can_sound_out = -1;
static Eo *_sound_out = NULL;
static int _outs = 0;
static Ecore_Timer *_outs_end_timer = NULL;
static void
_cb_out_fail(void *data EINA_UNUSED, const Efl_Event *event)
{
efl_unref(event->object);
_sound_out = NULL;
_can_sound_out = 0;
}
static void
_cb_out_ready(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUSED)
{
_can_sound_out = 1;
}
static Eina_Bool
_cb_outs_end_timer(void *data EINA_UNUSED)
{
efl_unref(_sound_out);
_sound_out = NULL;
return EINA_FALSE;
}
static void
_out_end(void)
{
if (_outs > 0) _outs--;
if (_outs == 0)
{
if (_outs_end_timer) ecore_timer_del(_outs_end_timer);
_outs_end_timer = ecore_timer_add(2.0, _cb_outs_end_timer, NULL);
}
}
static void
_cb_in_stopped(void *data EINA_UNUSED, const Efl_Event *event)
{
efl_unref(event->object);
_out_end();
}
E_API int
e_sound_init(void)
{
ecore_audio_init();
return 1;
}
E_API int
e_sound_shutdown(void)
{
if (_outs_end_timer)
{
ecore_timer_del(_outs_end_timer);
_outs_end_timer = NULL;
}
if (_sound_out)
{
efl_unref(_sound_out);
_sound_out = NULL;
}
ecore_audio_shutdown();
return 1;
}
E_API void
e_sound_file_play(const char *file, double vol)
{
Eo *in;
char buf[PATH_MAX];
if (_can_sound_out == 0) return;
if (!_sound_out)
_sound_out = efl_add_ref
(ECORE_AUDIO_OUT_PULSE_CLASS, NULL,
efl_event_callback_add(efl_added,
ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_FAIL,
_cb_out_fail, NULL),
efl_event_callback_add(efl_added,
ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_READY,
_cb_out_ready, NULL)
);
if (!_sound_out) return;
if (_outs_end_timer)
{
ecore_timer_del(_outs_end_timer);
_outs_end_timer = NULL;
}
_outs++;
snprintf(buf, sizeof(buf), "sound-file[%s]", file);
in = efl_add_ref(ECORE_AUDIO_IN_SNDFILE_CLASS, NULL,
efl_name_set(efl_added, buf),
efl_event_callback_add(efl_added,
ECORE_AUDIO_IN_EVENT_IN_STOPPED,
_cb_in_stopped, NULL));
if (!in)
{
_out_end();
return;
}
if (!ecore_audio_obj_source_set(in, file))
{
efl_unref(in);
_out_end();
return;
}
ecore_audio_obj_volume_set(in, vol);
if (!ecore_audio_obj_out_input_attach(_sound_out, in))
{
efl_unref(in);
_out_end();
return;
}
}

10
src/bin/e_sound.h Normal file
View File

@ -0,0 +1,10 @@
#ifdef E_TYPEDEFS
#else
#ifndef E_SOUND_H
#define E_SOUND_H
E_API int e_sound_init(void);
E_API int e_sound_shutdown(void);
E_API void e_sound_file_play(const char *file, double vol);
#endif
#endif

View File

@ -566,6 +566,32 @@ main(int argc, char **argv)
env_set("E_START", argv[0]);
putenv("E_START_MANAGER=1");
if ((!getenv("DISPLAY")) && (!getenv("E_WL_FORCE")))
{
printf("***************************************************************\n");
printf("* You are probably starting Enlightenment in wayland DRM/KMS *\n");
printf("***************************************************************\n");
printf(" \n");
printf(" Wayland support is experimental. It may work for you. \n");
printf(" It may not. If you wish you help out then please do, but \n");
printf(" for a proper experience use Enlightenment in X11. \n");
printf(" \n");
printf(" If you do not want this pause and message, please set \n");
printf(" the following environment variable: \n");
printf(" \n");
printf(" E_WL_FORCE=drm \n");
printf(" \n");
printf(" Example: \n");
printf(" \n");
printf(" E_WL_FORCE=drm enlightenment_start \n");
printf(" \n");
printf(" If you wish to set software or GL rendering too then also: \n");
printf(" \n");
printf(" E_WL_FORCE=drm E_COMP_ENGINE=gl enlightenment_start \n");
printf(" E_WL_FORCE=drm E_COMP_ENGINE=sw enlightenment_start \n");
printf(" \n");
sleep(10);
}
for (i = 1; i < argc; i++)
{
if ((!strcmp(argv[i], "-h")) || (!strcmp(argv[i], "-help")) ||

View File

@ -48,6 +48,7 @@ static const int E_LOGOUT_WAIT_TIME = 3.0;
static Ecore_Timer *action_timeout = NULL;
static Eldbus_Proxy *login1_manger_proxy = NULL;
static Eldbus_Proxy *login1_session_proxy = NULL;
static int _e_sys_comp_waiting = 0;
@ -380,12 +381,75 @@ _e_sys_systemd_signal_prepare_sleep(void *data EINA_UNUSED, const Eldbus_Message
}
}
static void
_e_sys_systemd_signal_session_lock(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED)
{
printf("SSS: systemd said to lock\n");
if (!e_desklock_state_get())
{
e_desklock_show(EINA_FALSE);
}
}
static void
_e_sys_systemd_signal_session_unlock(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED)
{
printf("SSS: systemd said to unlock\n");
if (e_desklock_state_get())
{
e_desklock_hide();
}
}
static Eina_Bool _e_sys_session_locked = EINA_FALSE;
E_API void
e_sys_locked_set(Eina_Bool locked)
{
Eldbus_Message *m;
if (_e_sys_session_locked == locked) return;
_e_sys_session_locked = locked;
if (!login1_session_proxy) return;
m = eldbus_proxy_method_call_new(login1_session_proxy, "SetLockedHint");
eldbus_message_arguments_append(m, "b", _e_sys_session_locked);
eldbus_proxy_send(login1_manger_proxy, m, NULL, NULL, -1);
}
static void
_e_sys_systemd_getsession_cb(void *data EINA_UNUSED, const Eldbus_Message *m, Eldbus_Pending *p EINA_UNUSED)
{
const char *path = NULL;
Eldbus_Connection *conn;
Eldbus_Object *obj;
Eldbus_Message *m2;
if (eldbus_message_error_get(m, NULL, NULL)) return;
if (!eldbus_message_arguments_get(m, "o", &path)) return;
printf("SSS: session path [%s]\n", path);
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
obj = eldbus_object_get(conn, "org.freedesktop.login1", path);
login1_session_proxy = eldbus_proxy_get(obj,
"org.freedesktop.login1.Session");
eldbus_proxy_signal_handler_add(login1_session_proxy, "Lock",
_e_sys_systemd_signal_session_lock,
NULL);
eldbus_proxy_signal_handler_add(login1_session_proxy, "Unlock",
_e_sys_systemd_signal_session_unlock,
NULL);
m2 = eldbus_proxy_method_call_new(login1_session_proxy, "SetLockedHint");
eldbus_message_arguments_append(m2, "b", _e_sys_session_locked);
eldbus_proxy_send(login1_manger_proxy, m2, NULL, NULL, -1);
}
/* externally accessible functions */
EINTERN int
e_sys_init(void)
{
Eldbus_Connection *conn;
Eldbus_Object *obj;
Eldbus_Message *m;
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
obj = eldbus_object_get(conn, "org.freedesktop.login1",
@ -402,6 +466,33 @@ e_sys_init(void)
_e_sys_systemd_exists_cb, NULL);
_e_sys_systemd_handle_inhibit();
if (login1_manger_proxy)
{
char buf[256];
int fd;
ssize_t siz;
fd = open("/proc/self/sessionid", O_RDONLY);
if (fd >= 0)
{
siz = read(fd, buf, 255);
close(fd);
if ((siz > 0) && (siz < 255))
{
buf[siz] = 0;
m = eldbus_proxy_method_call_new
(login1_manger_proxy, "GetSession");
if (m)
{
eldbus_message_arguments_append(m, "s", buf);
eldbus_proxy_send(login1_manger_proxy, m,
_e_sys_systemd_getsession_cb,
NULL, -1);
}
}
}
}
E_EVENT_SYS_SUSPEND = ecore_event_type_new();
E_EVENT_SYS_HIBERNATE = ecore_event_type_new();
E_EVENT_SYS_RESUME = ecore_event_type_new();
@ -429,6 +520,18 @@ e_sys_shutdown(void)
_e_sys_resume_delay_timer = NULL;
_e_sys_screensaver_unignore_timer = NULL;
_e_sys_acpi_handler = NULL;
if (login1_session_proxy)
{
Eldbus_Connection *conn;
Eldbus_Object *obj;
obj = eldbus_proxy_object_get(login1_session_proxy);
conn = eldbus_object_connection_get(obj);
eldbus_proxy_unref(login1_session_proxy);
eldbus_object_unref(obj);
eldbus_connection_unref(conn);
login1_session_proxy = NULL;
}
if (login1_manger_proxy)
{
Eldbus_Connection *conn;

View File

@ -48,6 +48,7 @@ E_API E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label,
E_API void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca);
E_API const Eina_List *e_sys_con_extra_action_list_get(void);
E_API Eina_Bool e_sys_on_the_way_out_get(void);
E_API void e_sys_locked_set(Eina_Bool locked);
#endif
#endif

View File

@ -358,6 +358,19 @@ main(int argc,
/* local subsystem functions */
#ifdef HAVE_EEZE_MOUNT
static Eina_Bool
check_is_num_to_comma(const char *s)
{
const char *p;
for (p = s; *p && (*p != ','); p++)
{
if (!((*p >= '0') && (*p <= '9'))) return EINA_FALSE;
}
return EINA_TRUE;
}
static Eina_Bool
mountopts_check(const char *opts)
{
@ -400,6 +413,8 @@ mountopts_check(const char *opts)
{
p += 4;
errno = 0;
if (!check_is_num_to_comma(p)) return EINA_FALSE;
muid = strtoul(p, &end, 10);
if (muid == ULONG_MAX) return EINA_FALSE;
if (errno) return EINA_FALSE;
@ -414,13 +429,53 @@ mountopts_check(const char *opts)
return EINA_TRUE;
}
static Eina_Bool
check_is_alpha_num(char c)
{
if (((c >= '0') && (c <= '9')) ||
((c >= 'a') && (c <= 'z')) ||
((c >= 'A') && (c <= 'Z'))) return EINA_TRUE;
return EINA_FALSE;
}
static Eina_Bool
check_uuid(const char *uuid)
{
const char *p;
for (p = uuid; p[0]; p++)
if ((!isalnum(*p)) && (*p != '-')) return EINA_FALSE;
{
if ((!check_is_alpha_num(*p)) && (*p != '-')) return EINA_FALSE;
}
return EINA_TRUE;
}
static Eina_Bool
check_sane_path(const char *path)
{
const char *forbidden_ch = "`~!#$%^&*()[]{}|\\;'\"<>?";
const char *p;
if (strstr(path, "..")) return EINA_FALSE; // just don't allow .. anywhere
for (p = forbidden_ch; *p; p++) // no invalid chars like above
{
if (strchr(path, *p)) return EINA_FALSE;
}
for (p = path; *p; p++) // nothing in lower ascii ctrl chars or high ascii
{
if ((*p <= ' ') || (*p >= 0x7f)) return EINA_FALSE;
}
return EINA_TRUE;
}
static Eina_Bool
check_sane_dev(const char *dev)
{
struct stat st;
if (strncmp(dev, "/dev/", 5)) return EINA_FALSE; // not a /dev file
if (!check_sane_path(dev)) return EINA_FALSE;
if (stat(dev, &st)) return EINA_FALSE; // must actually exist
return EINA_TRUE;
}
@ -428,9 +483,9 @@ static Eina_Bool
mount_args_check(int argc, char **argv, const char *action)
{
Eina_Bool opts = EINA_FALSE;
struct stat st;
const char *node;
char buf[PATH_MAX];
struct stat st;
if (!strcmp(action, "mount"))
{
@ -451,9 +506,9 @@ mount_args_check(int argc, char **argv, const char *action)
}
else
{
if (strncmp(argv[4], "/dev/", 5)) return EINA_FALSE;
if (stat(argv[4], &st)) return EINA_FALSE;
if (!check_sane_dev(argv[4])) return EINA_FALSE;
}
if (!check_sane_path(argv[5])) return EINA_FALSE;
node = strrchr(argv[5], '/');
if (!node) return EINA_FALSE;
@ -468,8 +523,7 @@ mount_args_check(int argc, char **argv, const char *action)
/path/to/umount /dev/$devnode
*/
if (argc != 3) return EINA_FALSE;
if (strncmp(argv[2], "/dev/", 5)) return EINA_FALSE;
if (stat(argv[2], &st)) return EINA_FALSE;
if (!check_sane_dev(argv[2])) return EINA_FALSE;
node = strrchr(argv[2], '/');
if (!node) return EINA_FALSE;
if (!node[1]) return EINA_FALSE;
@ -488,8 +542,7 @@ mount_args_check(int argc, char **argv, const char *action)
/path/to/eject /dev/$devnode
*/
if (argc != 3) return EINA_FALSE;
if (strncmp(argv[2], "/dev/", 5)) return EINA_FALSE;
if (stat(argv[2], &st)) return EINA_FALSE;
if (!check_sane_dev(argv[2])) return EINA_FALSE;
node = strrchr(argv[2], '/');
if (!node) return EINA_FALSE;
if (!node[1]) return EINA_FALSE;
@ -545,10 +598,8 @@ auth_action_ok(char *a,
*/
ret = auth_etc_enlightenment_sysactions(a, usr, grp);
if (ret == 1) return 1;
else if (ret == -1)
return 0;
/* the DEFAULT - allow */
return 1;
else if (ret == -1) return 0;
return 0; // no sysactions.conf file found - just say no. bad system
}
static int

View File

@ -134,7 +134,23 @@ e_theme_border_find(const char *border)
E_API Eina_List *
e_theme_border_list(void)
{
return e_theme_collection_items_find(NULL, "e/widgets/border");
Eina_List *list, *l;
const char *s;
list = e_theme_collection_items_find(NULL, "e/widgets/border");
// XXX: a horrible hack due to history and bad group naming choices
// but filter out volume as a border because it is the volume gadget
// thing not a border
EINA_LIST_FOREACH(list, l, s)
{
if (!strcmp(s, "volume"))
{
list = eina_list_remove_list(list, l);
eina_stringshare_del(s);
break;
}
}
return list;
}
E_API int

View File

@ -146,8 +146,12 @@ static void
_update_machid_get(void)
{
FILE *f;
char buf[4096], *c;
static const char appid[] = "EnL+7',xkDv&!@*)df%@#hcs$;l%o$fc#^$%&%$FDFeJ$%c^$#";
static const char hex[] = "0123456789abcdef";
char buf[4096], buf2[4096 + 1024], *c;
unsigned char sha[20];
size_t len;
int i;
f = fopen("/etc/machine-id", "r");
if (!f) f = fopen("/var/lib/dbus/machine-id", "r");
@ -159,7 +163,7 @@ _update_machid_get(void)
if (f)
{
len = fread(buf, 1, sizeof(buf) - 1, f);
if (len > 10)
if ((len > 10) && (len < 4000))
{
buf[len] = 0;
for (c = buf; *c; c++)
@ -170,6 +174,14 @@ _update_machid_get(void)
break;
}
}
snprintf(buf2, sizeof(buf2), "{{%s}}/{{%s}}", buf, appid);
e_sha1_sum((unsigned char *)buf2, strlen(buf2), sha);
for (i = 0; i < 20; i++)
{
buf[(i * 2) + 0] = hex[((sha[i] >> 4) & 0xf)];
buf[(i * 2) + 1] = hex[((sha[i] ) & 0xf)];
}
buf[(i * 2)] = 0;
machid = strdup(buf);
fclose(f);
return;
@ -187,7 +199,6 @@ _update_machid_get(void)
t = ecore_time_unix_get();
fprintf(f, "%1.16f-%i-%i\n", t, rand(), rand());
fclose(f);
_update_machid_get();
return;
}
// this just is all a wash - just use this
@ -259,6 +270,7 @@ e_update_init(void)
_update_timeout_cb(NULL);
e_config->update.check = 1;
}
_update_machid_get();
}
return 1;
}

View File

@ -1174,10 +1174,7 @@ e_util_terminal_desktop_get(void)
{
const char *terms[] =
{
"terminology.desktop",
"rxvt.desktop",
"gnome-terminal.desktop",
"konsole.desktop",
#include "e_inc_terms.h"
NULL
};
const char *s;
@ -1591,3 +1588,151 @@ e_username_get(void)
if (pw) return pw->pw_name;
return "";
}
typedef struct
{
int pid;
int pri_set, pri_adj;
int pri_only_filter;
Eina_Bool do_adj : 1;
Eina_Bool do_adj_children : 1;
Eina_Bool do_children : 1;
} E_Pri_Set_Adj_Data;
static void
_pri_adj(int pid, int pri_set, int pri_adj, int pri_only_filter,
Eina_Bool do_adj, Eina_Bool do_adj_children, Eina_Bool do_children)
{
Eina_List *files;
char *file, buf[PATH_MAX];
int pid2, ppid, newpri, ret;
FILE *f;
newpri = getpriority(PRIO_PROCESS, pid) + pri_adj;
if ((pri_only_filter == -99) || (pri_only_filter != newpri))
{
if (do_adj) newpri += pri_adj;
else newpri = pri_set;
if (newpri > 19) newpri = 19;
// printf("PRI: %i -> %i (adj=%i, adj_ch=%i ch=%i)\n", pid, newpri, do_adj, do_adj_children, do_children);
ret = setpriority(PRIO_PROCESS, pid, newpri);
// if (ret < 0) printf("PRI: ret = %i | %s\n", ret, strerror(errno));
}
// shouldn't need to do this as default ionice class is "none" (0), and
// this inherits io priority FROM nice level
// ioprio_set(IOPRIO_WHO_PROCESS, pid,
// IOPRIO_PRIO_VALUE(2, 5));
if (do_children)
{
// yes - this is /proc specific... so this may not work on some
// os's - works on linux. too bad for others.
files = ecore_file_ls("/proc");
EINA_LIST_FREE(files, file)
{
if (isdigit(file[0]))
{
snprintf(buf, sizeof(buf), "/proc/%s/stat", file);
f = fopen(buf, "r");
if (f)
{
pid2 = ppid = -1;
ret = fscanf(f, "%i %*s %*s %i %*s", &pid2, &ppid);
fclose(f);
if (ret == 2)
{
if (ppid == pid)
{
if (do_adj_children)
_pri_adj(pid2, pri_set, pri_adj,
pri_only_filter,
EINA_TRUE,
do_adj_children,
do_children);
else
_pri_adj(pid2, pri_set, pri_adj,
pri_only_filter,
do_adj,
do_adj_children,
do_children);
}
}
}
}
free(file);
}
}
}
static void
_e_pid_nice_priority_set_adjust_thread(void *data,
Ecore_Thread *eth EINA_UNUSED)
{
E_Pri_Set_Adj_Data *dat = data;
// printf("PRI: --------\n");
_pri_adj(dat->pid, dat->pri_set, dat->pri_adj, dat->pri_only_filter,
dat->do_adj, dat->do_adj_children, dat->do_children);
free(dat);
}
static void
_e_pid_nice_priority_set_adjust(int pid, int pri_set, int pri_adj,
int pri_only_filter,
Eina_Bool do_adj, Eina_Bool do_adj_children,
Eina_Bool do_children)
{
E_Pri_Set_Adj_Data *dat = calloc(1, sizeof(E_Pri_Set_Adj_Data));
if (!dat) return;
dat->pid = pid;
dat->pri_set = pri_set;
dat->pri_adj = pri_adj;
dat->pri_only_filter = pri_only_filter;
dat->do_adj = do_adj;
dat->do_adj_children = do_adj_children;
dat->do_children = do_children;
ecore_thread_run(_e_pid_nice_priority_set_adjust_thread, NULL, NULL, dat);
}
static Eina_Bool
_e_pid_nice_priority_lower_can(void)
{
#ifdef RLIMIT_NICE
static int checked = -1;
struct rlimit rlim;
again:
if (checked == 0) return EINA_FALSE;
else if (checked == 1) return EINA_TRUE;
checked = 1;
if (getrlimit(RLIMIT_NICE, &rlim) == 0)
{
// if we can't lower pri to at least 20 (nice 0 ...) then assume
// we can only raise nice level never lower it
if (rlim.rlim_cur < 20) checked = 0;
}
goto again; // set checked now - try again
#endif
return EINA_TRUE;
}
E_API void
e_pid_nice_priority_fg(int pid)
{
int pri = e_config->priority - 1;
if (!_e_pid_nice_priority_lower_can()) pri = e_config->priority;
_e_pid_nice_priority_set_adjust(pid, pri, -1, -99, // only these procs
EINA_FALSE, EINA_FALSE, EINA_FALSE);
}
E_API void
e_pid_nice_priority_bg(int pid)
{
int pri = e_config->priority;
if (!_e_pid_nice_priority_lower_can()) pri = e_config->priority;
_e_pid_nice_priority_set_adjust(pid, pri, 1, -99, // only these procs
EINA_FALSE, EINA_FALSE, EINA_FALSE);
}

View File

@ -72,6 +72,9 @@ E_API Ecore_Exe *e_util_exe_safe_run(const char *cmd, void *data);
E_API const char *e_username_get(void);
E_API void e_pid_nice_priority_fg(int pid);
E_API void e_pid_nice_priority_bg(int pid);
typedef enum
{
E_UTIL_ACTION_NONE,

View File

@ -8,7 +8,7 @@ static void
_cb_watchdog_thread_pingpong_pipe(void *data EINA_UNUSED, void *buf, unsigned int bytes)
{
unsigned long long *seq = buf;
unsigned long long seq_num = bytes / sizeof(int);
unsigned long long seq_num = bytes / sizeof(unsigned long long);
if (seq_num < 1)
{
@ -26,7 +26,7 @@ _cb_watchdog_thread_pingpong(void *data EINA_UNUSED, Ecore_Thread *thread)
while (!ecore_thread_check(thread))
{
// send ping
seq_new = malloc(sizeof(unsigned long));
seq_new = malloc(sizeof(unsigned long long));
if (seq_new)
{
seq++;
@ -54,8 +54,9 @@ _cb_watchdog_thread_pingpong(void *data EINA_UNUSED, Ecore_Thread *thread)
static void
_cb_watchdog_thread_pingpong_reply(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, void *msg)
{
// repluy back to mainloop with same ping number
// reply back to mainloop with same ping number
unsigned long long *seq = msg;
ecore_pipe_write(_watchdog_pipe, seq, sizeof(unsigned long long));
free(seq);
}

View File

@ -77,15 +77,21 @@ _e_xkb_save_group(void *data)
static Eina_Bool
_xkb_new_keyboard(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
{
Ecore_X_Event_Xkb *ev = event;
if (skip_new_keyboard > 0)
{
skip_new_keyboard --;
return ECORE_CALLBACK_PASS_ON;
}
// skip just "xmodmap" changes
if ((ev) && (ev->map_notify)) return ECORE_CALLBACK_PASS_ON;
printf("XKB: EV: _xkb_new_keyboard\n");
//we have to restore our settings here
e_xkb_reconfig();
e_xkb_update(e_config->xkb.cur_group);
e_deskenv_xmodmap_run();
return ECORE_CALLBACK_PASS_ON;
}
@ -104,6 +110,7 @@ _xkb_new_state(void* data EINA_UNUSED, int type EINA_UNUSED, void *event)
static Eina_Bool
_xkb_keymap(void* data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
{
printf("XKB: EV: _xkb_keymap\n");
return ECORE_CALLBACK_PASS_ON;
}
#endif
@ -134,6 +141,7 @@ e_xkb_init(E_Pixmap_Type comp_type)
}
#endif
if (e_config->xkb.dont_touch_my_damn_keyboard) return 1;
printf("XKB: e_xkb_init\n");
_e_xkb_type_reconfig(comp_type);
@ -173,6 +181,7 @@ _e_x_xkb_reconfig(void)
Eina_Strbuf *buf;
if (e_config->xkb.dont_touch_my_damn_keyboard) return;
printf("XKB: _e_x_xkb_reconfig\n");
if ((!e_config->xkb.used_layouts) && (!e_config->xkb.used_options) && (!e_config->xkb.default_model)) return;
if (!getenv("DISPLAY")) return;
@ -256,6 +265,7 @@ static void
_e_x_xkb_update(int cur_group)
{
if (e_config->xkb.dont_touch_my_damn_keyboard) return;
printf("XKB: _e_x_xkb_update\n");
if ((!e_config->xkb.used_layouts) && (!e_config->xkb.used_options) && (!e_config->xkb.default_model)) return;
if (!getenv("DISPLAY")) return;
if (cur_group != _e_xkb_cur_group)
@ -354,6 +364,7 @@ _e_wl_xkb_reconfig(void)
static void
_e_xkb_type_reconfig(E_Pixmap_Type comp_type)
{
printf("XKB: _e_xkb_type_reconfig\n");
if (comp_type == E_PIXMAP_TYPE_X)
_e_x_xkb_reconfig();
else if (comp_type == E_PIXMAP_TYPE_WL)
@ -391,6 +402,7 @@ e_xkb_layout_next(void)
E_Config_XKB_Layout *cl;
if (e_config->xkb.dont_touch_my_damn_keyboard) return;
printf("XKB: e_xkb_layout_next\n");
if (!e_config->xkb.used_layouts) return;
l = eina_list_nth_list(e_config->xkb.used_layouts, e_config->xkb.cur_group);
l = eina_list_next(l);
@ -413,6 +425,7 @@ e_xkb_layout_prev(void)
E_Config_XKB_Layout *cl;
if (e_config->xkb.dont_touch_my_damn_keyboard) return;
printf("XKB: e_xkb_layout_prev\n");
if (!e_config->xkb.used_layouts) return;
l = eina_list_nth_list(e_config->xkb.used_layouts, e_config->xkb.cur_group);
l = eina_list_prev(l);
@ -438,6 +451,7 @@ e_xkb_layout_get(void)
unsigned int n = 0;
if (e_config->xkb.dont_touch_my_damn_keyboard) return NULL;
printf("XKB: e_xkb_layout_get\n");
if (e_config->xkb.current_layout) return e_config->xkb.current_layout;
if (_e_xkb_cur_group >= 0)
n = _e_xkb_cur_group;
@ -453,6 +467,7 @@ e_xkb_layout_set(const E_Config_XKB_Layout *cl)
EINA_SAFETY_ON_NULL_RETURN(cl);
if (e_config->xkb.dont_touch_my_damn_keyboard) return;
printf("XKB: e_xkb_layout_set\n");
if (e_config_xkb_layout_eq(e_config->xkb.current_layout, cl)) return;
cl2 = e_config_xkb_layout_dup(e_config->xkb.current_layout);
e_config_xkb_layout_free(e_config->xkb.current_layout);

View File

@ -25,6 +25,7 @@ deps_e = [
dep_ecore_con,
dep_ecore_input,
dep_ecore_input_evas,
dep_ecore_audio,
dep_evas,
dep_efreet,
dep_efreet_mime,
@ -59,6 +60,7 @@ requires_e = ' '.join([
'ecore-con',
'ecore-input',
'ecore-input-evas',
'ecore-audio',
'evas',
'efreet',
'efreet-mime',
@ -224,6 +226,7 @@ src = [
'e_zoomap.c',
'e_zone.c',
'e_gesture.c',
'e_sound.c',
'efx/efx_bumpmapping.c',
'efx/efx.c',
'efx/efx_fade.c',
@ -403,7 +406,8 @@ hdr = [
'e_xsettings.h',
'e_zoomap.h',
'e_zone.h',
'e_gesture.h'
'e_gesture.h',
'e_sound.h'
]
if config_h.has('HAVE_WAYLAND') == true

View File

@ -153,7 +153,7 @@ _cb_worker_message(void *data EINA_UNUSED, Ecore_Thread *th EINA_UNUSED, void *m
if (lig->max > 0)
{
val = ((1000 * lig->val) + 500) / lig->max;
val = (1000 * lig->val) / lig->max;
if (val < 0) val = 0;
else if (val > 1000) val = 1000;
}

View File

@ -3,15 +3,17 @@ Encoding=UTF-8
Type=Application
Name=Fingerprint Password Settings
Name[de]=Fingerprint Passwort Einstellungen
Name[fr]=Reconnaissance des empreintes digitales
Name[it]=Impostazioni impronte digitali
Name[fr]=Reconnaissance par empreinte digitale
Name[it]=Impostazioni autenticazione con impronta digitale
Name[pt]=Definições de palavras-passe de impressão digital
Icon=enlightenment_fprint
Exec=enlightenment_fprint
Comment=Tool to set up or modify fingerprint authentication
Comment[fr]=Outil pour configurer ou modifier l'authentification par empreintes digitales.
Comment[fr]=Outil pour configurer ou modifier l'authentification par empreintes digitales
Comment[it]=Utilità per impostare o modificare l'autenticazione mediante sensore di impronte digitali
Comment[pt]=Ferramenta para configurar ou modificar a autenticação das impressões digitais
GenericName=GUI for Fingerprint Authentication
GenericName[fr]=Interface d'authentification par empreintes digitales
GenericName[it]=Interfaccia autenticazione con impronta digitale
Categories=Settings;DesktopSettings;
StartupWMClass=enlightenment_fprint

View File

@ -154,6 +154,94 @@ get_command(void *data, Efreet_Desktop *desktop EINA_UNUSED, char *command, int
return NULL;
}
static Efreet_Desktop *
_terminal_get(const char *defaults_list)
{
Efreet_Desktop *tdesktop = NULL;
Efreet_Ini *ini;
const char *s;
ini = efreet_ini_new(defaults_list);
if ((ini) && (ini->data) &&
(efreet_ini_section_set(ini, "Default Applications")) &&
(ini->section))
{
s = efreet_ini_string_get(ini, "x-scheme-handler/terminal");
if (s) tdesktop = efreet_util_desktop_file_id_find(s);
}
if (ini) efreet_ini_free(ini);
return tdesktop;
}
static char **
terminal_open(void)
{
const char *terms[] =
{
#include "e_inc_terms.h"
NULL
};
const char *s;
char buf[PATH_MAX], **ret;
Efreet_Desktop *tdesktop = NULL, *td;
Eina_List *l;
int i;
s = efreet_data_home_get();
if (s)
{
snprintf(buf, sizeof(buf), "%s/mimeapps.list",
efreet_config_home_get());
tdesktop = _terminal_get(buf);
}
if (tdesktop) goto have_desktop;
EINA_LIST_FOREACH(efreet_data_dirs_get(), l, s)
{
snprintf(buf, sizeof(buf), "%s/applications/defaults.list", s);
tdesktop = _terminal_get(buf);
if (tdesktop) goto have_desktop;
}
for (i = 0; terms[i]; i++)
{
tdesktop = efreet_util_desktop_file_id_find(terms[i]);
if (tdesktop) goto have_desktop;
}
if (!tdesktop)
{
l = efreet_util_desktop_category_list("TerminalEmulator");
if (l)
{
// just take first one since above list doesn't work.
tdesktop = l->data;
EINA_LIST_FREE(l, td)
{
// free/unref the desktosp we are not going to use
if (td != tdesktop) efreet_desktop_free(td);
}
}
}
if (!tdesktop) return NULL;
have_desktop:
if (!tdesktop->exec)
{
efreet_desktop_free(tdesktop);
return NULL;
}
ret = malloc(sizeof(char *) * 2);
if (!ret) return NULL;
ret[0] = strdup(tdesktop->exec);
ret[1] = NULL;
if (!ret[0])
{
free(ret);
efreet_desktop_free(tdesktop);
return NULL;
}
efreet_desktop_free(tdesktop);
return ret;
}
static char **
mime_open(const char *mime, const char *const *argv, int argc)
{
@ -178,10 +266,38 @@ mime_open(const char *mime, const char *const *argv, int argc)
ret = calloc(eina_list_count(cmds) + 1, sizeof(char *));
if (ret)
{
unsigned int i = 0;
unsigned int i = 0, j;
EINA_LIST_FREE(cmds, c)
{
ret[i] = c; /* was strdup by efreet_desktop_command_get() */
if (desktop->terminal)
{
Eina_Strbuf *buf = eina_strbuf_new();
char **tcmds = terminal_open();
if ((tcmds) && (buf))
{
for (j = 0; tcmds[j]; j++)
{
eina_strbuf_append(buf, tcmds[j]);
eina_strbuf_append(buf, " ");
}
eina_strbuf_append(buf, "-e ");
eina_strbuf_append(buf, c);
ret[i] = eina_strbuf_string_steal(buf);
}
if (tcmds)
{
for (j = 0; tcmds[j]; j++) free(tcmds[j]);
free(tcmds);
}
if (buf) eina_strbuf_free(buf);
free(c);
}
else
{
ret[i] = c; /* was strdup by efreet_desktop_command_get() */
}
i++;
}
ret[i] = NULL;
@ -192,7 +308,6 @@ mime_open(const char *mime, const char *const *argv, int argc)
free(c);
}
}
eina_list_free(files);
return ret;
@ -294,97 +409,6 @@ single_command_open(const char *command, const char *const *argv, int argc)
return ret;
}
static Efreet_Desktop *
_terminal_get(const char *defaults_list)
{
Efreet_Desktop *tdesktop = NULL;
Efreet_Ini *ini;
const char *s;
ini = efreet_ini_new(defaults_list);
if ((ini) && (ini->data) &&
(efreet_ini_section_set(ini, "Default Applications")) &&
(ini->section))
{
s = efreet_ini_string_get(ini, "x-scheme-handler/terminal");
if (s) tdesktop = efreet_util_desktop_file_id_find(s);
}
if (ini) efreet_ini_free(ini);
return tdesktop;
}
static char **
terminal_open(void)
{
const char *terms[] =
{
"terminology.desktop",
"rxvt.desktop",
"gnome-terimnal.desktop",
"konsole.desktop",
NULL
};
const char *s;
char buf[PATH_MAX], **ret;
Efreet_Desktop *tdesktop = NULL, *td;
Eina_List *l;
int i;
s = efreet_data_home_get();
if (s)
{
snprintf(buf, sizeof(buf), "%s/mimeapps.list",
efreet_config_home_get());
tdesktop = _terminal_get(buf);
}
if (tdesktop) goto have_desktop;
EINA_LIST_FOREACH(efreet_data_dirs_get(), l, s)
{
snprintf(buf, sizeof(buf), "%s/applications/defaults.list", s);
tdesktop = _terminal_get(buf);
if (tdesktop) goto have_desktop;
}
for (i = 0; terms[i]; i++)
{
tdesktop = efreet_util_desktop_file_id_find(terms[i]);
if (tdesktop) goto have_desktop;
}
if (!tdesktop)
{
l = efreet_util_desktop_category_list("TerminalEmulator");
if (l)
{
// just take first one since above list doesn't work.
tdesktop = l->data;
EINA_LIST_FREE(l, td)
{
// free/unref the desktosp we are not going to use
if (td != tdesktop) efreet_desktop_free(td);
}
}
}
if (!tdesktop) return NULL;
have_desktop:
if (!tdesktop->exec)
{
efreet_desktop_free(tdesktop);
return NULL;
}
ret = malloc(sizeof(char *) * 2);
if (!ret) return NULL;
ret[0] = strdup(tdesktop->exec);
ret[1] = NULL;
if (!ret[0])
{
free(ret);
efreet_desktop_free(tdesktop);
return NULL;
}
efreet_desktop_free(tdesktop);
return ret;
}
static char **
browser_open(const char *const *argv, int argc)
{
@ -508,7 +532,7 @@ main(int argc, char *argv[])
ECORE_GETOPT_VALUE_NONE
};
int args;
char **cmds;
char **cmds = NULL;
args = ecore_getopt_parse(&options, values, argc, argv);
if (args < 0)

View File

@ -1,6 +1,6 @@
executable('enlightenment_open',
[ 'e_open.c' ],
include_directories: include_directories('../../../..'),
include_directories: include_directories('../../../..', '../..'),
dependencies : [ dep_eina, dep_ecore, dep_efreet, dep_efreet_mime ],
install_dir : dir_bin,
install : true

View File

@ -52,6 +52,7 @@ OPTIONS:
-window-uniconify OPT1 Request uniconify of window with xwin id OPT1
-window-maximize OPT1 Request maximize of window with xwin id OPT1
-window-unmaximize OPT1 Request unmaximize of window with xwin id OPT1
-window-sendtodesktop OPT1 OPT2 OPT3 OPT4 Send window to ZONE DESK_X DESK_Y
Note: This is a new implementation of enlightenment_remote,
for more information about it see the '--help-new' option.
@ -175,6 +176,16 @@ ERGMST(){
unset result value
}
#=== FUNCTION ================================================================
# NAME: ERCIIII
# DESCRIPTION: eremote call with int, int, int, int parameter
# PARAMETERS: interface/method call, int, int, int, int
# RETURNS:
#===============================================================================
ERCIIII(){
dbus-send --print-reply=literal --dest=org.enlightenment.wm.service /org/enlightenment/wm/RemoteObject "$1" int32:"$2" int32:"$3" int32:"$4" int32:"$5"
}
#=== FUNCTION ================================================================
# NAME: ERCIIIS
# DESCRIPTION: eremote call with int, int, int, string parameter
@ -441,6 +452,13 @@ er_window_unmaximize(){
ERCI org.enlightenment.wm.Window.Unmaximize "$2"
}
#-------------------------------------------------------------------------------
# E Window sendtodesktop
#-------------------------------------------------------------------------------
er_window_sendtodesktop(){
ERCIIII org.enlightenment.wm.Window.SendToDesktop "$2" "$3" "$4" "$5"
}
#=== FUNCTION ================================================================
# NAME: Main
@ -545,6 +563,9 @@ case "$1" in
-window-unmaximize)
er_window_unmaximize "$@"
;;
-window-sendtodesktop)
er_window_sendtodesktop "$@"
;;
# This entry needs to be always the last option of the list (*)
-h|-help|--help|--h|*)

View File

@ -36,7 +36,10 @@ cb_obj_prop_entry(void *data, const void *key, Eldbus_Message_Iter *var)
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->connected = val;
{
o->connected = val;
printf("BZ: change connected for %s to %i\n", o->address, o->connected);
}
}
else if (!strcmp(skey, "Trusted"))
{

View File

@ -294,7 +294,7 @@ ebluez5_instances_update(void)
static void
_device_prop_clean(Config_Device *dev)
{
if ((!dev->unlock) && (!dev->force_connect))
if (!dev->unlock)
{
ebluez5_config->devices = eina_list_remove(ebluez5_config->devices, dev);
eina_stringshare_del(dev->addr);
@ -332,27 +332,6 @@ ebluez5_device_prop_find(const char *address)
return NULL;
}
void
ebluez5_device_prop_force_connect_set(const char *address, Eina_Bool enable)
{
Config_Device *dev;
if (!address) return;
dev = ebluez5_device_prop_find(address);
if (dev)
{
dev->force_connect = enable;
_device_prop_clean(dev);
return;
}
if (enable)
{
dev = _device_prop_new(address);
dev->force_connect = enable;
}
}
void
ebluez5_device_prop_unlock_set(const char *address, Eina_Bool enable)
{
@ -405,7 +384,6 @@ e_modapi_init(E_Module *m)
#define T Config_Device
#define D conf_device_edd
E_CONFIG_VAL(D, T, addr, STR);
E_CONFIG_VAL(D, T, force_connect, UCHAR);
E_CONFIG_VAL(D, T, unlock, UCHAR);
conf_edd = E_CONFIG_DD_NEW("Config", Config);
@ -438,6 +416,7 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
Config_Adapter *ad;
Config_Device *dev;
e_gadcon_provider_unregister(&_gc_class);
if (zero_adapters_check_timer)
{
ecore_timer_del(zero_adapters_check_timer);

View File

@ -32,7 +32,6 @@ typedef struct _Config_Device Config_Device;
struct _Config_Device
{
const char *addr;
Eina_Bool force_connect;
Eina_Bool unlock;
};

View File

@ -43,21 +43,12 @@ _devices_eval(void)
if (o->paired)
{
Eina_Bool need_ping = EINA_FALSE;
Obj *adapter = bz_obj_find(o->adapter);
dev = _devices_conifg_find(o->address);
if (dev)
if ((dev) && (adapter) && (adapter->powered))
{
printf("=== dev: %s|%s [%s]\n", dev->addr, o->address, o->name);
if ((dev->force_connect) && (!o->connected))
{
printf("=== %s force con, not conn, ping ok=%i\n", o->address, o->ping_ok);
if (o->ping_ok)
{
printf("=== %s force con, not conn, ping ok=%i\n", o->address, o->ping_ok);
bz_obj_connect(o);
}
else need_ping = EINA_TRUE;
}
if (dev->unlock)
{
printf("=== unlock...\n");
@ -303,24 +294,6 @@ _cb_unlock_stop(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
_unflip(o, obj);
}
static void
_cb_force_connect_start(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Obj *o = data;
ebluez5_device_prop_force_connect_set(o->address, EINA_TRUE);
ebluez5_popup_adapter_change(o);
_unflip(o, obj);
}
static void
_cb_force_connect_stop(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Obj *o = data;
ebluez5_device_prop_force_connect_set(o->address, EINA_FALSE);
ebluez5_popup_adapter_change(o);
_unflip(o, obj);
}
static void
_cb_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
@ -582,23 +555,6 @@ _cb_dev_content_get(void *data, Evas_Object *obj,
}
elm_box_pack_end(bx, bt);
evas_object_show(bt);
if ((dev) && (dev->force_connect))
{
bt = util_button_icon_add(obj, "bt-force-connect-off",
_("Stop this device from being forcefully connected"));
evas_object_data_set(bt, "genlist", obj);
evas_object_smart_callback_add(bt, "clicked", _cb_force_connect_stop, o);
}
else
{
bt = util_button_icon_add(obj, "bt-force-connect-on",
_("Force this device to be connected when detected"));
evas_object_data_set(bt, "genlist", obj);
evas_object_smart_callback_add(bt, "clicked", _cb_force_connect_start, o);
}
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
if (o->connected)
{

View File

@ -30,7 +30,6 @@ static void _binding_change_cb(void *data);
static void _action_change_cb(void *data);
static void _delete_all_edge_binding_cb(void *data, void *data2);
static void _delete_edge_binding_cb(void *data, void *data2);
static void _restore_edge_binding_defaults_cb(void *data, void *data2);
static void _add_edge_binding_cb(void *data, void *data2);
static void _modify_edge_binding_cb(void *data, void *data2);
@ -270,8 +269,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
cfdata->gui.o_del_all = ob;
e_widget_disabled_set(ob, 1);
e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Restore Default Bindings"), "enlightenment", _restore_edge_binding_defaults_cb, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 0, 3, 2, 1, 1, 0, 1, 0);
e_widget_list_object_append(ol, of, 1, 1, 0.5);
ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
@ -498,53 +495,6 @@ _delete_edge_binding_cb(void *data, void *data2 EINA_UNUSED)
}
}
static void
_restore_edge_binding_defaults_cb(void *data, void *data2 EINA_UNUSED)
{
E_Config_Bindings *ecb;
Eina_Stringshare *prof;
E_Config_Dialog_Data *cfdata = data;
ecb = e_config_domain_system_load("e_bindings", e_config_descriptor_find("E_Config_Bindings"));
if (!ecb)
{
const char *type;
prof = eina_stringshare_ref(e_config_profile_get());
switch (e_config->config_type)
{
case E_CONFIG_PROFILE_TYPE_DESKTOP:
type = "standard";
break;
case E_CONFIG_PROFILE_TYPE_MOBILE:
type = "mobile";
break;
//case E_CONFIG_PROFILE_TYPE_TABLET: FIXME - not used
default:
type = "default";
break;
}
e_config_profile_set(type);
ecb = e_config_domain_system_load("e_bindings", e_config_descriptor_find("E_Config_Bindings"));
e_config_profile_set(prof);
eina_stringshare_del(prof);
}
if (!ecb) return;
E_FREE_LIST(cfdata->binding.edge, e_config_binding_edge_free);
cfdata->binding.edge = ecb->edge_bindings, ecb->edge_bindings = NULL;
e_config_bindings_free(ecb);
eina_stringshare_del(cfdata->locals.cur);
cfdata->locals.cur = NULL;
_update_edge_binding_list(cfdata);
_update_buttons(cfdata);
e_widget_ilist_unselect(cfdata->gui.o_action_list);
e_widget_entry_clear(cfdata->gui.o_params);
e_widget_disabled_set(cfdata->gui.o_params, 1);
}
/**************** Updates ***********/
static void
_update_action_list(E_Config_Dialog_Data *cfdata)

View File

@ -24,6 +24,7 @@ struct _E_Config_Dialog_Data
double error;
double length;
unsigned int fingers;
int gesture_open_input_devices;
} locals;
struct
{
@ -75,6 +76,15 @@ _auto_apply_changes(E_Config_Dialog_Data *cfdata)
E_Action_Group *actg;
E_Action_Description *actd;
if (cfdata->locals.gesture_open_input_devices != e_config->gesture_open_input_devices)
{
E_Action *act;
e_config->gesture_open_input_devices = cfdata->locals.gesture_open_input_devices;
act = e_action_find("restart");
if ((act) && (act->func.go)) act->func.go(NULL, NULL);
}
if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0]) ||
(!cfdata->locals.action) || (!cfdata->locals.action[0])) return;
@ -133,6 +143,7 @@ _fill_data(E_Config_Dialog_Data *cfdata)
cfdata->locals.source = eina_stringshare_add("");
cfdata->locals.cur = NULL;
cfdata->locals.dia = NULL;
cfdata->locals.gesture_open_input_devices = e_config->gesture_open_input_devices;
cfdata->binding.swipe = NULL;
EINA_LIST_FOREACH(e_bindings->swipe_bindings, l, bi)
@ -912,7 +923,7 @@ _help_swipe_bindings_cb(void *data EINA_UNUSED, void *data2 EINA_UNUSED)
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *ol, *ot, *of, *ob;
Evas_Object *o, *ol, *ot, *of, *ob, *oc;
cfdata->evas = evas;
o = e_widget_list_add(evas, 0, 0);
@ -963,6 +974,9 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_list_object_append(o, ol, 1, 1, 0.5);
oc = e_widget_check_add(evas, _("Open input devices"), &(cfdata->locals.gesture_open_input_devices));
e_widget_list_object_append(o, oc, 1, 1, 0.5);
_update_swipe_binding_list(cfdata);
_fill_actions_list(cfdata);

View File

@ -289,7 +289,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
grp++;
}
e_widget_toolbook_page_append(otb, NULL, _("Keyboard Layout"), ol,
1, 1, 1, 0, 0.0, 0.0);
1, 1, 1, 1, 0.0, 0.0);
/* Login */
ol = e_widget_list_add(evas, 0, 0);

View File

@ -17,6 +17,7 @@ struct _E_Config_Dialog_Data
Evas_Object *backlight_slider_fade;
int enable_idle_dim;
int ddc;
double backlight_normal;
double backlight_dim;
@ -56,6 +57,7 @@ _fill_data(E_Config_Dialog_Data *cfdata)
cfdata->backlight_dim = e_config->backlight.dim * 100.0;
cfdata->backlight_transition = e_config->backlight.transition;
cfdata->enable_idle_dim = e_config->backlight.idle_dim;
cfdata->ddc = e_config->backlight.ddc;
cfdata->backlight_timeout = e_config->backlight.timer;
cfdata->backlight_battery_timeout = e_config->backlight.battery_timer;
}
@ -87,6 +89,7 @@ _apply_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
e_config->backlight.timer = lround(cfdata->backlight_timeout);
e_config->backlight.battery_timer = lround(cfdata->backlight_battery_timeout);
e_config->backlight.idle_dim = cfdata->enable_idle_dim;
e_config->backlight.ddc = cfdata->ddc;
e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL);
e_backlight_level_set(NULL, e_config->backlight.normal, -1.0);
@ -121,7 +124,8 @@ _advanced_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *
(!EINA_DBL_EQ(e_config->backlight.transition, cfdata->backlight_transition)) ||
(!EINA_DBL_EQ(e_config->backlight.timer, cfdata->backlight_timeout)) ||
(!EINA_DBL_EQ(e_config->backlight.battery_timer, cfdata->backlight_battery_timeout)) ||
(e_config->backlight.idle_dim != cfdata->enable_idle_dim);
(e_config->backlight.idle_dim != cfdata->enable_idle_dim) ||
(e_config->backlight.ddc != cfdata->ddc);
}
static int
@ -152,6 +156,9 @@ _advanced_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_
&(cfdata->backlight_dim), NULL, 100);
e_widget_list_object_append(o, ob, 1, 1, 0.5);
ob = e_widget_check_add(evas, _("Desktop Monitor Support (DDC)"), &(cfdata->ddc));
e_widget_list_object_append(o, ob, 1, 1, 0.5);
ob = e_widget_check_add(evas, _("Idle Fade Time"), &(cfdata->enable_idle_dim));
e_widget_list_object_append(o, ob, 1, 1, 0.5);
ob = e_widget_slider_add(evas, 1, 0, _("%1.0f second(s)"), 5.0, 300.0, 1.0, 0,

View File

@ -649,11 +649,7 @@ _fill_data(E_Config_Dialog_Data *cfdata)
e_lang_list = e_intl_language_list();
/* Get list of all locales and start making map */
#ifdef __OpenBSD__
output = popen("ls /usr/share/locale", "r");
#else
output = popen("locale -a", "r");
#endif
if ( output )
{
char line[32];

View File

@ -7,7 +7,7 @@ Name[el]=Everything (Starter)
Name[eo]=Ĉio (lanĉilo)
Name[es]=Everything (Lanzador)
Name[fi]=Everything (Käynnistin)
Name[fr]=Omni
Name[fr]=Omni (Everything)
Name[gl]=Everything (Iniciador)
Name[it]=Everything
Name[ms]=Segalanya (Pemula)
@ -23,7 +23,7 @@ Comment[el]=Το άρθρωμα της εκτέλεση εντολής παρέ
Comment[eo]=La modulo de lanĉo de komandoj provizas dialogon de lanĉilo de aplikaĵoj.
Comment[es]=El módulo de ejecutar comandos provee un diálogo para ejecutar aplicaciones.
Comment[fi]='Aja komento'-moduuli tuo käytettäväksi ikkunan sovellusten käynnistämiseen.
Comment[fr]=Fournit une fenêtre de commande pour lancer des applications.
Comment[fr]=Fournit une boîte de dialogue pour lancer des applications.
Comment[gl]=Este módulo ofrece un diálogo para iniciar aplicativos.
Comment[hu]=A parancs futtató modul egy alkalmazásindítót biztosít a számunkra.
Comment[it]=Questo modulo fornisce una finestra di dialogo per l'esecuzione di comandi.

View File

@ -259,12 +259,139 @@ _e_fwin_client_hook_focus_unset(void *d EINA_UNUSED, E_Client *ec)
evas_object_focus_set(fwin->cur_page->fm_obj, 1);
}
typedef struct _E_Fwin_Mime_Handler
{
const char *mime;
Efreet_Desktop *desktop;
E_Fm2_Mime_Handler *handler;
} E_Fwin_Mime_Handler;
static Ecore_Event_Handler *_e_fwin_efreet_desktop_update_handler = NULL;
static Eina_List *_e_fwin_mime_all_handlers_list = NULL;
static int
_e_fwin_cb_dir_mime_handler_test(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *path)
{
const char *rp;
rp = e_fm2_real_path_get(obj);
if ((rp) && (!strcmp(path, rp))) return 1;
if (rp) return 1;
return 0;
}
static void
_e_fwin_cb_dir_mime_handler(void *data, Evas_Object *obj, const char *path)
{
E_Fwin_Mime_Handler *h = data;
Eina_Stringshare *rp;
Eina_List *files = NULL;
const char *f;
rp = e_fm2_real_path_get(obj);
if ((rp) && (rp == path) &&
(!evas_object_data_del(obj, "fileman_terminal_realpath")))
{
files = eina_list_append(files, eina_stringshare_add(rp));
}
else
{
Eina_List *selected;
E_Fm2_Icon_Info *ici;
selected = e_fm2_selected_list_get(obj);
EINA_LIST_FREE(selected, ici)
{
files = eina_list_append(files, eina_stringshare_add(ici->file));
}
}
e_exec(e_zone_current_get(), h->desktop, NULL, files, "fileman");
EINA_LIST_FREE(files, f) eina_stringshare_del(f);
}
static void
_e_fwin_mime_all_handlers_fill(void)
{
E_Fwin_Mime_Handler *h;
Eina_List *desktops, *mimes;
Efreet_Desktop *desktop;
desktops = efreet_util_desktop_name_glob_list("*");
EINA_LIST_FREE(desktops, desktop)
{
const char *m, *mime = eina_hash_find
(desktop->x, "X-Enlightenment-Action-Mime");
if (!mime) continue;
mimes = efreet_desktop_string_list_parse(mime);
EINA_LIST_FREE(mimes, m)
{
h = calloc(1, sizeof(E_Fwin_Mime_Handler));
if (!h) continue;
h->mime = eina_stringshare_add(m);
h->desktop = desktop;
efreet_desktop_ref(desktop);
h->handler = e_fm2_mime_handler_new
(desktop->name, desktop->icon,
_e_fwin_cb_dir_mime_handler, h,
_e_fwin_cb_dir_mime_handler_test, h);
e_fm2_mime_handler_mime_add(h->handler, h->mime);
_e_fwin_mime_all_handlers_list =
eina_list_append(_e_fwin_mime_all_handlers_list, h);
eina_stringshare_del(m);
}
}
}
static void
_e_fwin_mime_all_handlers_clear(void)
{
E_Fwin_Mime_Handler *h;
EINA_LIST_FREE(_e_fwin_mime_all_handlers_list, h)
{
efreet_desktop_free(h->desktop);
e_fm2_mime_handler_mime_del(h->handler, h->mime);
e_fm2_mime_handler_free(h->handler);
eina_stringshare_del(h->mime);
free(h);
}
}
static Eina_Bool
_e_fwin_cb_efreet_cache_update(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
{
_e_fwin_mime_all_handlers_clear();
_e_fwin_mime_all_handlers_fill();
return ECORE_CALLBACK_RENEW;
}
static void
_e_fwin_mime_all_handlers_init(void)
{
_e_fwin_efreet_desktop_update_handler =
ecore_event_handler_add(EFREET_EVENT_DESKTOP_CACHE_UPDATE,
_e_fwin_cb_efreet_cache_update, NULL);
_e_fwin_mime_all_handlers_fill();
}
static void
_e_fwin_mime_all_handlers_shutdown(void)
{
_e_fwin_mime_all_handlers_clear();
ecore_event_handler_del(_e_fwin_efreet_desktop_update_handler);
}
/* externally accessible functions */
int
e_fwin_init(void)
{
focus_out_hook = e_client_hook_add(E_CLIENT_HOOK_FOCUS_UNSET, _e_fwin_client_hook_focus_unset, NULL);
fwin_class = eina_stringshare_add("e_fwin");
_e_fwin_mime_all_handlers_init();
tdesktop = e_util_terminal_desktop_get();
if (!tdesktop) return 1;
dir_handler = e_fm2_mime_handler_new(_("Open Terminal here"),
@ -272,6 +399,7 @@ e_fwin_init(void)
_e_fwin_cb_dir_handler, NULL,
_e_fwin_cb_dir_handler_test, NULL);
e_fm2_mime_handler_mime_add(dir_handler, "inode/directory");
return 1;
}
@ -283,16 +411,26 @@ e_fwin_shutdown(void)
EINA_LIST_FREE(fwins, fwin)
e_object_del(E_OBJECT(fwin));
eina_stringshare_replace(&fwin_class, NULL);
if (dir_handler)
{
e_fm2_mime_handler_mime_del(dir_handler, "inode/directory");
e_fm2_mime_handler_free(dir_handler);
dir_handler = NULL;
}
if (tdesktop)
{
efreet_desktop_free(tdesktop);
tdesktop = NULL;
}
efreet_desktop_free(tdesktop);
tdesktop = NULL;
dir_handler = NULL;
_e_fwin_mime_all_handlers_shutdown();
eina_stringshare_replace(&fwin_class, NULL);
if (focus_out_hook)
{
e_client_hook_del(focus_out_hook);
focus_out_hook = NULL;
}
return 1;
}
@ -1078,7 +1216,7 @@ _e_fwin_page_favorites_add(E_Fwin_Page *page)
e_widget_scrollframe_focus_object_set(o, page->flist);
page->flist_frame = o;
evas_object_size_hint_min_set(o, 128, 0);
evas_object_size_hint_min_set(o, 128 * e_scale, 0);
edje_object_part_swallow(page->fwin->bg_obj, "e.swallow.favorites", o);
}

View File

@ -163,7 +163,10 @@ _e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const Eina_
return;
}
}
mime = efreet_mime_type_get(mi->label);
mime = efreet_mime_special_type_get(path);
if (!mime) mime = efreet_mime_globs_type_get(path);
if (!mime) mime = efreet_mime_fallback_type_get(path);
if (!mime) return;
if (!strncmp(mime, "image/", 6))
{
@ -406,7 +409,10 @@ _e_mod_menu_recent_cb(void *data EINA_UNUSED,
if (file)
{
const char *mime = efreet_mime_type_get(file);
const char *mime = efreet_mime_special_type_get(file);
if (!mime) mime = efreet_mime_globs_type_get(file);
if (!mime) mime = efreet_mime_fallback_type_get(file);
if (mime)
{
@ -437,13 +443,12 @@ _e_mod_menu_recent_cb(void *data EINA_UNUSED,
}
}
static void
_e_mod_menu_populate_recent_cb(void *data EINA_UNUSED,
_e_mod_menu_populate_recent_cb(void *data EINA_UNUSED,
E_Menu *m EINA_UNUSED,
E_Menu_Item *mi EINA_UNUSED)
{
Eina_List *l;
Eina_List *l, *ll;
Eina_List *files = (Eina_List *)e_exec_recent_files_get();
E_Exec_Recent_File *fl;
E_Menu *subm;
@ -459,7 +464,10 @@ _e_mod_menu_populate_recent_cb(void *data EINA_UNUSED,
fname = ecore_file_file_get(fl->file);
if (fname)
{
const char *mime = efreet_mime_type_get(fl->file);
const char *mime = efreet_mime_special_type_get(fl->file);
if (!mime) mime = efreet_mime_globs_type_get(fl->file);
if (!mime) mime = efreet_mime_fallback_type_get(fl->file);
mi2 = e_menu_item_new(subm);
e_menu_item_label_set(mi2, fname);
@ -469,19 +477,25 @@ _e_mod_menu_populate_recent_cb(void *data EINA_UNUSED,
e_menu_item_callback_set(mi2, _e_mod_menu_recent_cb, NULL);
if (mime)
{
const char *icon = NULL;
char buf[1024];
const char *icon_file, *edje_file;
const E_Config_Mime_Icon *minf;
snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", mime);
edje_file = e_theme_edje_file_get("base/theme/icons", buf);
if (edje_file)
EINA_LIST_FOREACH(e_config->mime_icons, ll, minf)
{
e_menu_item_icon_edje_set(mi2, edje_file, buf);
if (!strcmp(minf->mime, mime))
{
icon = minf->icon;
break;
}
}
if ((icon) && (!strcmp(icon, "THUMB")))
e_menu_item_icon_file_set(mi2, fl->file);
else
{
icon_file = efreet_mime_type_icon_get(mime, e_config->icon_theme, 48);
e_menu_item_icon_file_set(mi2, icon_file);
snprintf(buf, sizeof(buf), "fileman/mime/%s", mime);
if (!e_util_menu_item_theme_icon_set(mi2, buf))
e_util_menu_item_theme_icon_set(mi2, "fileman/mime/unknown");
}
}
}
@ -489,7 +503,6 @@ _e_mod_menu_populate_recent_cb(void *data EINA_UNUSED,
e_menu_thaw(subm);
}
static void
_e_mod_fileman_add_recent(E_Menu *m,
Eina_Bool need_separator)

View File

@ -1948,10 +1948,21 @@ _ibar_cb_icon_move(void *data, Evas *e, Evas_Object *obj, void *event_info EINA_
if (!zone)
zone = eina_list_data_get(e_comp->zones);
}
if (chx - (len / 2) < zone->x)
if ((ic->ibar->inst->orient == E_GADCON_ORIENT_LEFT) ||
(ic->ibar->inst->orient == E_GADCON_ORIENT_CORNER_LT) ||
(ic->ibar->inst->orient == E_GADCON_ORIENT_CORNER_LB))
sig = "e,origin,left";
else if ((chx + (len / 2) > cw) || ((chx + (len / 2) > zone->x + zone->w)))
else if ((ic->ibar->inst->orient == E_GADCON_ORIENT_RIGHT) ||
(ic->ibar->inst->orient == E_GADCON_ORIENT_CORNER_RT) ||
(ic->ibar->inst->orient == E_GADCON_ORIENT_CORNER_RB))
sig = "e,origin,right";
else
{
if (chx - (len / 2) < zone->x)
sig = "e,origin,left";
else if ((chx + (len / 2) > cw) || ((chx + (len / 2) > zone->x + zone->w)))
sig = "e,origin,right";
}
_ibar_icon_signal_emit(ic, sig, "e");
}

View File

@ -25,7 +25,7 @@ Comment[de]=Ein Modul, dass einen Mixer zum Ändern der Lautstärke bereit stell
Comment[eo]=Modulo de sonmiksilo por sxanĝi la sonfortecon.
Comment[es]=Un módulo que proporciona un mezclador para cambiar el volumen.
Comment[fi]=Tämä moduuli tuo käyttöön mikserin äänenvoimakkuuksien säätämistä varten
Comment[fr]=Fournit un mélangeur pour régler le volume.
Comment[fr]=Un module pour paramétrer le volume et les flux.
Comment[gl]=Un módulo que fornece un control para cambiar o volume.
Comment[it]=Un modulo che fornisce un mixer per regolare il volume.
Comment[ms]=Modul untuk sediakan penadun bagi volum yang berubah.

View File

@ -62,12 +62,15 @@ _e_msgbus_window_list_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
EINA_LIST_FOREACH(e_comp->clients, l, ec)
{
Eldbus_Message_Iter *s;
const char *name;
if (e_client_util_ignored_get(ec)) continue;
eldbus_message_iter_arguments_append(array, "(si)", &s);
if (!s) continue;
eldbus_message_iter_arguments_append(s, "si", ec->icccm.name,
name = ec->icccm.name;
if (!name) name = "";
eldbus_message_iter_arguments_append(s, "si", name,
e_client_util_win_get(ec));
eldbus_message_iter_container_close(array, s);
}

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