Commit Graph

19 Commits

Author SHA1 Message Date
Jehan 58b3b14082 app, libgimp*, pdb, plug-ins: reimplement generic inter-process transient window.
Having windows ID as guint32 is a mistake. Different systems have
different protocols. In Wayland in particular, Windows handles are
exchanged as strings. What this commit does is the following:

In core:

- get_window_id() virtual function in core GimpProgress is changed to
  return a GBytes, as a generic "data" to represent a window differently
  on different systems.
- All implementations of get_window_id() in various classes implementing
  this interface are updated accordingly:
  * GimpSubProgress
  * GimpDisplay returns the handle of its shell.
  * GimpDisplayShell now creates its window handle at construction with
    libgimpwidget's gimp_widget_set_native_handle() and simply return
    this handle every time it's requested.
  * GimpFileDialog also creates its window handle at construction with
    gimp_widget_set_native_handle().
- gimp_window_set_transient_for() in core is changed to take a
  GimpProgress as argument (instead of a guint32 ID), requests and
  process the ID itself, according to the running platform. In
  particular, the following were improved:
  * Unlike old code, it will work even if the window is not visible yet.
    In such a case, the function simply adds a signal handler to set
    transient at mapping. It makes it easier to use it at construction
    in a reliable way.
  * It now works for Wayland too, additionally to X11.
- GimpPdbProgress now exchanges a GBytes too with the command
  GIMP_PROGRESS_COMMAND_GET_WINDOW.
- display_get_window_id() in gimp-gui.h also returns a GBytes now.

PDB/libgimp:

- gimp_display_get_window_handle() and gimp_progress_get_window_handle()
  now return a GBytes to represent a window handle in an opaque way
  (depending on the running platform).

In libgimp:

- GimpProgress's get_window() virtual function changed to return a
  GBytes and renamed get_window_handle().
- In particular GimpProgressBar is the only implementation of
  get_window_handle(). It creates its handle at object construction with
  libgimpwidget's gimp_widget_set_native_handle() and the virtual
  method's implementation simply returns the GBytes.

In libgimpUi:

- gimp_ui_get_display_window() and gimp_ui_get_progress_window() were
  removed. We should not assume anymore that it is possible to create a
  GdkWindow to be used. For instance this is not possible with Wayland
  which has its own way to set a window transient with a string handle.
- gimp_window_set_transient_for_display() and
  gimp_window_set_transient() now use an internal implementation similar
  to core gimp_window_set_transient_for(), with the same improvements
  (works even at construction when the window is not visible yet + works
  for Wayland too).

In libgimpwidgets:

- New gimp_widget_set_native_handle() is a helper function used both in
  core and libgimp* libraries for widgets which we want to be usable as
  possible parents. It takes care of getting the relevant window handle
  (depending on the running platform) and stores it in a given pointer,
  either immediately or after a callback once the widget is mapped. So
  it can be used at construction. Also it sets a handle for X11 or
  Wayland.

In plug-ins:

- Screenshot uses the new gimp_progress_get_window_handle() directly now
  in its X11 code path and creates out of it a GdkWindows itself with
  gdk_x11_window_foreign_new_for_display().

Our inter-process transient implementation only worked for X11, and with
this commit, it works for Wayland too.

There is code for Windows but it is currently disabled as it apparently
hangs (there is a comment in-code which links to this old report:
https://bugzilla.gnome.org/show_bug.cgi?id=359538). NikcDC tested
yesterday with re-enabling the code and said they experienced a freeze.
;-(

Finally there is no infrastructure yet to make this work on macOS and
apparently there is no implementation of window handle in GDK for macOS
that I could find. I'm not sure if macOS doesn't have this concept of
setting transient on another processus's window or GDK is simply lacking
the implementation.
2023-10-01 21:02:33 +02:00
Jehan a021b1999a libgimp: change signature of get_window() of GimpProgressVtable.
As diagnosed in #8649, using a guint32 for windows identifier may have been
right long ago (was it?), but is definitely not anymore. I can see that a XID is
an unsigned long nowadays (usually 64-bit on 64-bit Linux).

As far as I can see, on Windows, it would be a void* behind (which also
corresponds to the error message in #8649 description):

> typedef void *PVOID;
> typedef PVOID HANDLE;
> typedef HANDLE HWND;

Cf. https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types

I *think* that pointers would be 64-bit on Windows 64-bit, though I'm unsure
(after all, this is an OS with 32-bit long int on 64-bit arch!).

Anyway, it's just better to move to 64-bit window identifiers.
2022-09-28 22:41:05 +02:00
Niels De Graef 693eeae96b gimpprogress: Add arg descriptions to vfuncs
That squashes some gtk-doc warnings.
2020-05-08 10:39:33 +02:00
Niels De Graef b680945752 gir: Make use of typedefs for GimpProgressVtable vfuncs
GObject introspection has issues handling random vfuncs (i.e. not part
of a GObject). Most of all, it needs to be able to give these a name
(so they can be used to cast in some higher level languages for
example). As such, give each vfunc in `GimpProgressVtable` a separate
typedef.
2020-05-06 11:40:26 +00:00
Michael Natterer 6622cf0dc4 libgimp: add and fix docs, reorder GimpParamData and remove d_boundary 2019-08-11 15:38:07 +02:00
Michael Natterer fad59611bc libgimp: port gimpprogress to the new plug-in API, untested
It's tested to still work when using the old API though.
2019-08-04 17:51:59 +02:00
Michael Natterer 5f700549e7 Change the license URL from http://www.gnu.org/licenses/ to https:// 2018-07-11 23:29:46 +02:00
Michael Natterer 0dd8459a1f libgimp: deprecate more cruft, everything not needed by cruft plug-ins 2018-05-20 21:06:29 +02:00
Michael Natterer 0d481702c7 libgimp*: add GIMP_DEPRECATED macros using G_DEPRECATED
and start using them instead of GIMP_DISABLE_DEPRECATED where possible.
2012-05-03 00:54:21 +02:00
Michael Natterer 856c89a845 libgimp: add guards that #error out if individual files are included 2011-04-28 19:59:52 +02:00
Michael Natterer d9b5207aa2 Change licence to GPLv3 (and to LGPLv3 for libgimp).
2009-01-17  Michael Natterer  <mitch@gimp.org>

	* all files with a GPL header and all COPYING files:

	Change licence to GPLv3 (and to LGPLv3 for libgimp).

	Cleaned up some copyright headers and regenerated the parsers in
	the ImageMap plugin.


svn path=/trunk/; revision=27913
2009-01-17 22:28:01 +00:00
Sven Neumann 37fdbeacad tools/pdbgen/pdb/progress.pdb applied slightly modified patch from
2006-02-20  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/pdb/progress.pdb
	* libgimp/gimpprogress.[ch]: applied slightly modified patch from
	Stephane Chauveau.  Wraps the gimp_progress_update() PDB call so
	that redundant progress updates are suppressed in libgimp.  This
	gives a noticeable speedup for all plug-ins that update the
	progress too often (bug #331470).

	* libgimp/gimpprogress_pdb.[ch]: regenerated.
2006-02-20 07:35:42 +00:00
Michael Natterer e3da6be9b5 removed the "wrap" from gimp_progress_set_text() so it shows up as libgimp
2005-09-29  Michael Natterer  <mitch@gimp.org>

	* tools/pdbgen/pdb/progress.pdb: removed the "wrap" from
	gimp_progress_set_text() so it shows up as libgimp function again.

	* libgimp/gimpprogress_pdb.[ch]: regenerated.

	* libgimp/gimpprogress.[ch]: changed the old
	gimp_progress_set_text() to gimp_progress_set_text_printf() and
	added gimp_progress_init_printf(). (did this because the method of
	calling init(NULL) followed by set_text("foo") caused popup
	progress windows to be resized after they were shown).

	* libgimp/gimp.def: changed accordingly.

	* plug-ins/*/*.c: use gimp_progress_init_printf() instead of
	init(NULL) plus set_text(foo) and changed users of set_text() to
	use set_text_printf().
2005-09-29 18:34:08 +00:00
Sven Neumann d7abe43826 match parameter name in .c file.
2005-09-10  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpprogress.h: match parameter name in .c file.
2005-09-10 00:33:41 +00:00
Michael Natterer b10adabb5e Added parent window API to the GimpProgress interface and to the libgimp
2005-09-09  Michael Natterer  <mitch@gimp.org>

	Added parent window API to the GimpProgress interface and to
	the libgimp progress stuff. Might look strange, but does
	the right thing in almost all cases (image window, file dialog,
	script-fu dialog etc). Fixes bug #62988.

	* app/core/gimpprogress.[ch]: added GimpProgress::get_window()
	which should return a toplevel window ID if the progress is in a
	window that wants to be the transient parent of plug-in dialogs.

	* app/widgets/gimpwidgets-utils.[ch] (gimp_window_get_native): new
	function which returns the window handle of a GtkWindow's GdkWindow.

	* app/widgets/gimpfiledialog.c: implement ::get_window().

	* app/display/gimpdisplay.[ch]: ditto. Removed window handle API.

	* app/gui/gui-vtable.c: changed accordingly.

	* libgimpbase/gimpbaseenums.[ch] (enum GimpProgressCommand):
	added GIMP_PROGRESS_COMMAND_GET_WINDOW.

	* app/plug-in/plug-in-progress.[ch] (plug_in_progress_get_window):
	new function. Also renamed some functions to match the
	GimpProgress interface, and not the legacy PDB procedure names.

	* tools/pdbgen/pdb/progress.pdb
	* app/core/gimppdbprogress.c: implement get_window() on both
	sides of the wire, keeping backward compatibility (hopefully).

	* libgimp/gimpprogress.[ch]: deprecated gimp_progress_install()
	and added gimp_progress_install_vtable() which takes a vtable with
	padding to be extensible. Added get_window() vtable entry and
	dispatch it accordingly. Also added pulse() which was implemented
	in a hackish way before. Everything is of course backward
	compatible.

	* libgimp/gimpprogressbar.c: inmplement the get_window() stuff
	so a plug-in dialog containing a progress can be the transient
	parent of another dialog in another plug-in.

	* libgimp/gimpui.[ch] (gimp_ui_get_progress_window): new function
	which returns a foreign GdkWindow of this plug-ins progress
	window.

	Renamed gimp_window_set_transient_for_default_display() to
	gimp_window_set_transient() and make it use the progress' window
	handle instead of the display's (which is the right thing to do in
	almost all cases).

	* libgimp/gimp.def
	* libgimp/gimpui.def: add the new functions.

	* tools/pdbgen/enums.pl
	* app/pdb/internal_procs.c
	* app/pdb/progress_cmds.c
	* libgimp/gimpprogress_pdb.[ch]: regenerated.

	* libgimp/gimpexport.c
	* plug-ins/*/*.c: follow API change.
2005-09-09 18:07:31 +00:00
Sven Neumann 04f08db690 gimp_progress_set_text() has boolean return value.
2005-02-13  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpprogress.[ch]: gimp_progress_set_text() has boolean
	return value.
2005-02-13 01:43:07 +00:00
Sven Neumann 4cf9d0e429 accept an empty string.
2005-02-13  Sven Neumann  <sven@gimp.org>

	* app/core/gimpprogress.c (gimp_progress_start): accept an empty
	string.

	* app/plug-in/plug-in-progress.c: if NULL is passed as message to
	plug_in_progress_start(), set an empty string on the progress.

	* tools/pdbgen/pdb/progress.pdb:
	* libgimp/gimpprogress.[ch]: wrap the new gimp_progress_set_text()
	PDP function with a function that accepts printf-like arguments.

	* libgimp/gimpprogress_pdb.[ch]: regenerated.

	* lots of plug-ins, most of them file plug-ins:
	use gimp_progress_init(NULL) followed by gimp_progress_set_text()
	to initialize the progress using the new API instead of constructing
	a temporary string.
2005-02-13 00:11:24 +00:00
Manish Singh 13d9596812 return the user_data pointer on uninstall. Eases language binding work.
2004-08-30  Manish Singh  <yosh@gimp.org>

        * libgimp/gimpprogress.[ch] (gimp_progress_uninstall): return the
        user_data pointer on uninstall. Eases language binding work.
2004-08-30 18:36:43 +00:00
Michael Natterer 065db21d0a Added an API to allow plug-ins to embed the progress for the actions they
2004-08-29  Michael Natterer  <mitch@gimp.org>

	Added an API to allow plug-ins to embed the progress for the
	actions they trigger into their own GUI (attention: half-done and
	broken code ahead...)

	* app/core/Makefile.am
	* app/core/core-types.h
	* app/core/gimppdbprogress.[ch]: new object implementing dispatching
	progress calls to a temporary PDB procedure in a plug-in.

	* app/Makefile.am: force to link gimppdbprogress.o, bah!

	* app/plug-in/plug-in-progress.[ch]: added API to install,
	uninstall and cancel a PDB progress for this plug-in, but disabled
	the implementation because it doesn't work yet.

	* tools/pdbgen/pdb/progress.pdb: added pdb wrappers for the new
	install, uninstall and cancel functions.

	* libgimp/Makefile.am
	* libgimp/gimp.h
	* libgimp/gimpprogress.[ch]: added an API around the PDB progress
	stuff.

	* app/pdb/internal_procs.c
	* app/pdb/progress_cmds.c
	* libgimp/gimpprogress_pdb.[ch]: regenerated.

	* plug-ins/script-fu/script-fu-scripts.c: use the new API to show
	the progress in the script-fu dialog.
2004-08-29 18:36:30 +00:00