1 /* 2 * This file is part of gtkD. 3 * 4 * gtkD is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * as published by the Free Software Foundation; either version 3 7 * of the License, or (at your option) any later version, with 8 * some exceptions, please read the COPYING file. 9 * 10 * gtkD is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with gtkD; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA 18 */ 19 20 // generated automatically - do not change 21 // find conversion definition on APILookup.txt 22 // implement new conversion functionalities on the wrap.utils pakage 23 24 25 module gio.MountT; 26 27 public import gio.AsyncResultIF; 28 public import gio.Cancellable; 29 public import gio.Drive; 30 public import gio.DriveIF; 31 public import gio.File; 32 public import gio.FileIF; 33 public import gio.Icon; 34 public import gio.IconIF; 35 public import gio.MountOperation; 36 public import gio.Volume; 37 public import gio.VolumeIF; 38 public import glib.ErrorG; 39 public import glib.GException; 40 public import glib.Str; 41 public import gobject.ObjectG; 42 public import gobject.Signals; 43 public import gtkc.gdktypes; 44 public import gtkc.gio; 45 public import gtkc.giotypes; 46 47 48 /** 49 * The #GMount interface represents user-visible mounts. Note, when 50 * porting from GnomeVFS, #GMount is the moral equivalent of #GnomeVFSVolume. 51 * 52 * #GMount is a "mounted" filesystem that you can access. Mounted is in 53 * quotes because it's not the same as a unix mount, it might be a gvfs 54 * mount, but you can still access the files on it if you use GIO. Might or 55 * might not be related to a volume object. 56 * 57 * Unmounting a #GMount instance is an asynchronous operation. For 58 * more information about asynchronous operations, see #GAsyncResult 59 * and #GTask. To unmount a #GMount instance, first call 60 * g_mount_unmount_with_operation() with (at least) the #GMount instance and a 61 * #GAsyncReadyCallback. The callback will be fired when the 62 * operation has resolved (either with success or failure), and a 63 * #GAsyncReady structure will be passed to the callback. That 64 * callback should then call g_mount_unmount_with_operation_finish() with the #GMount 65 * and the #GAsyncReady data to see if the operation was completed 66 * successfully. If an @error is present when g_mount_unmount_with_operation_finish() 67 * is called, then it will be filled with any error information. 68 */ 69 public template MountT(TStruct) 70 { 71 /** Get the main Gtk struct */ 72 public GMount* getMountStruct() 73 { 74 return cast(GMount*)getStruct(); 75 } 76 77 78 /** 79 * Checks if @mount can be eject. 80 * 81 * Return: %TRUE if the @mount can be ejected. 82 */ 83 public bool canEject() 84 { 85 return g_mount_can_eject(getMountStruct()) != 0; 86 } 87 88 /** 89 * Checks if @mount can be mounted. 90 * 91 * Return: %TRUE if the @mount can be unmounted. 92 */ 93 public bool canUnmount() 94 { 95 return g_mount_can_unmount(getMountStruct()) != 0; 96 } 97 98 /** 99 * Ejects a mount. This is an asynchronous operation, and is 100 * finished by calling g_mount_eject_finish() with the @mount 101 * and #GAsyncResult data returned in the @callback. 102 * 103 * Deprecated: Use g_mount_eject_with_operation() instead. 104 * 105 * Params: 106 * flags = flags affecting the unmount if required for eject 107 * cancellable = optional #GCancellable object, %NULL to ignore. 108 * callback = a #GAsyncReadyCallback, or %NULL. 109 * userData = user data passed to @callback. 110 */ 111 public void eject(GMountUnmountFlags flags, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 112 { 113 g_mount_eject(getMountStruct(), flags, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 114 } 115 116 /** 117 * Finishes ejecting a mount. If any errors occurred during the operation, 118 * @error will be set to contain the errors and %FALSE will be returned. 119 * 120 * Deprecated: Use g_mount_eject_with_operation_finish() instead. 121 * 122 * Params: 123 * result = a #GAsyncResult. 124 * 125 * Return: %TRUE if the mount was successfully ejected. %FALSE otherwise. 126 * 127 * Throws: GException on failure. 128 */ 129 public bool ejectFinish(AsyncResultIF result) 130 { 131 GError* err = null; 132 133 auto p = g_mount_eject_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err) != 0; 134 135 if (err !is null) 136 { 137 throw new GException( new ErrorG(err) ); 138 } 139 140 return p; 141 } 142 143 /** 144 * Ejects a mount. This is an asynchronous operation, and is 145 * finished by calling g_mount_eject_with_operation_finish() with the @mount 146 * and #GAsyncResult data returned in the @callback. 147 * 148 * Params: 149 * flags = flags affecting the unmount if required for eject 150 * mountOperation = a #GMountOperation or %NULL to avoid 151 * user interaction. 152 * cancellable = optional #GCancellable object, %NULL to ignore. 153 * callback = a #GAsyncReadyCallback, or %NULL. 154 * userData = user data passed to @callback. 155 * 156 * Since: 2.22 157 */ 158 public void ejectWithOperation(GMountUnmountFlags flags, MountOperation mountOperation, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 159 { 160 g_mount_eject_with_operation(getMountStruct(), flags, (mountOperation is null) ? null : mountOperation.getMountOperationStruct(), (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 161 } 162 163 /** 164 * Finishes ejecting a mount. If any errors occurred during the operation, 165 * @error will be set to contain the errors and %FALSE will be returned. 166 * 167 * Params: 168 * result = a #GAsyncResult. 169 * 170 * Return: %TRUE if the mount was successfully ejected. %FALSE otherwise. 171 * 172 * Since: 2.22 173 * 174 * Throws: GException on failure. 175 */ 176 public bool ejectWithOperationFinish(AsyncResultIF result) 177 { 178 GError* err = null; 179 180 auto p = g_mount_eject_with_operation_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err) != 0; 181 182 if (err !is null) 183 { 184 throw new GException( new ErrorG(err) ); 185 } 186 187 return p; 188 } 189 190 /** 191 * Gets the default location of @mount. The default location of the given 192 * @mount is a path that reflects the main entry point for the user (e.g. 193 * the home directory, or the root of the volume). 194 * 195 * Return: a #GFile. 196 * The returned object should be unreffed with 197 * g_object_unref() when no longer needed. 198 */ 199 public FileIF getDefaultLocation() 200 { 201 auto p = g_mount_get_default_location(getMountStruct()); 202 203 if(p is null) 204 { 205 return null; 206 } 207 208 return ObjectG.getDObject!(File, FileIF)(cast(GFile*) p); 209 } 210 211 /** 212 * Gets the drive for the @mount. 213 * 214 * This is a convenience method for getting the #GVolume and then 215 * using that object to get the #GDrive. 216 * 217 * Return: a #GDrive or %NULL if @mount is not associated with a volume or a drive. 218 * The returned object should be unreffed with 219 * g_object_unref() when no longer needed. 220 */ 221 public DriveIF getDrive() 222 { 223 auto p = g_mount_get_drive(getMountStruct()); 224 225 if(p is null) 226 { 227 return null; 228 } 229 230 return ObjectG.getDObject!(Drive, DriveIF)(cast(GDrive*) p); 231 } 232 233 /** 234 * Gets the icon for @mount. 235 * 236 * Return: a #GIcon. 237 * The returned object should be unreffed with 238 * g_object_unref() when no longer needed. 239 */ 240 public IconIF getIcon() 241 { 242 auto p = g_mount_get_icon(getMountStruct()); 243 244 if(p is null) 245 { 246 return null; 247 } 248 249 return ObjectG.getDObject!(Icon, IconIF)(cast(GIcon*) p); 250 } 251 252 /** 253 * Gets the name of @mount. 254 * 255 * Return: the name for the given @mount. 256 * The returned string should be freed with g_free() 257 * when no longer needed. 258 */ 259 public string getName() 260 { 261 return Str.toString(g_mount_get_name(getMountStruct())); 262 } 263 264 /** 265 * Gets the root directory on @mount. 266 * 267 * Return: a #GFile. 268 * The returned object should be unreffed with 269 * g_object_unref() when no longer needed. 270 */ 271 public FileIF getRoot() 272 { 273 auto p = g_mount_get_root(getMountStruct()); 274 275 if(p is null) 276 { 277 return null; 278 } 279 280 return ObjectG.getDObject!(File, FileIF)(cast(GFile*) p); 281 } 282 283 /** 284 * Gets the sort key for @mount, if any. 285 * 286 * Return: Sorting key for @mount or %NULL if no such key is available. 287 * 288 * Since: 2.32 289 */ 290 public string getSortKey() 291 { 292 return Str.toString(g_mount_get_sort_key(getMountStruct())); 293 } 294 295 /** 296 * Gets the symbolic icon for @mount. 297 * 298 * Return: a #GIcon. 299 * The returned object should be unreffed with 300 * g_object_unref() when no longer needed. 301 * 302 * Since: 2.34 303 */ 304 public IconIF getSymbolicIcon() 305 { 306 auto p = g_mount_get_symbolic_icon(getMountStruct()); 307 308 if(p is null) 309 { 310 return null; 311 } 312 313 return ObjectG.getDObject!(Icon, IconIF)(cast(GIcon*) p); 314 } 315 316 /** 317 * Gets the UUID for the @mount. The reference is typically based on 318 * the file system UUID for the mount in question and should be 319 * considered an opaque string. Returns %NULL if there is no UUID 320 * available. 321 * 322 * Return: the UUID for @mount or %NULL if no UUID can be computed. 323 * The returned string should be freed with g_free() 324 * when no longer needed. 325 */ 326 public string getUuid() 327 { 328 return Str.toString(g_mount_get_uuid(getMountStruct())); 329 } 330 331 /** 332 * Gets the volume for the @mount. 333 * 334 * Return: a #GVolume or %NULL if @mount is not associated with a volume. 335 * The returned object should be unreffed with 336 * g_object_unref() when no longer needed. 337 */ 338 public VolumeIF getVolume() 339 { 340 auto p = g_mount_get_volume(getMountStruct()); 341 342 if(p is null) 343 { 344 return null; 345 } 346 347 return ObjectG.getDObject!(Volume, VolumeIF)(cast(GVolume*) p); 348 } 349 350 /** 351 * Tries to guess the type of content stored on @mount. Returns one or 352 * more textual identifiers of well-known content types (typically 353 * prefixed with "x-content/"), e.g. x-content/image-dcf for camera 354 * memory cards. See the 355 * [shared-mime-info](http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec) 356 * specification for more on x-content types. 357 * 358 * This is an asynchronous operation (see 359 * g_mount_guess_content_type_sync() for the synchronous version), and 360 * is finished by calling g_mount_guess_content_type_finish() with the 361 * @mount and #GAsyncResult data returned in the @callback. 362 * 363 * Params: 364 * forceRescan = Whether to force a rescan of the content. 365 * Otherwise a cached result will be used if available 366 * cancellable = optional #GCancellable object, %NULL to ignore 367 * callback = a #GAsyncReadyCallback 368 * userData = user data passed to @callback 369 * 370 * Since: 2.18 371 */ 372 public void guessContentType(bool forceRescan, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 373 { 374 g_mount_guess_content_type(getMountStruct(), forceRescan, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 375 } 376 377 /** 378 * Finishes guessing content types of @mount. If any errors occurred 379 * during the operation, @error will be set to contain the errors and 380 * %FALSE will be returned. In particular, you may get an 381 * %G_IO_ERROR_NOT_SUPPORTED if the mount does not support content 382 * guessing. 383 * 384 * Params: 385 * result = a #GAsyncResult 386 * 387 * Return: a %NULL-terminated array of content types or %NULL on error. 388 * Caller should free this array with g_strfreev() when done with it. 389 * 390 * Since: 2.18 391 * 392 * Throws: GException on failure. 393 */ 394 public string[] guessContentTypeFinish(AsyncResultIF result) 395 { 396 GError* err = null; 397 398 auto p = g_mount_guess_content_type_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err); 399 400 if (err !is null) 401 { 402 throw new GException( new ErrorG(err) ); 403 } 404 405 return Str.toStringArray(p); 406 } 407 408 /** 409 * Tries to guess the type of content stored on @mount. Returns one or 410 * more textual identifiers of well-known content types (typically 411 * prefixed with "x-content/"), e.g. x-content/image-dcf for camera 412 * memory cards. See the 413 * [shared-mime-info](http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec) 414 * specification for more on x-content types. 415 * 416 * This is an synchronous operation and as such may block doing IO; 417 * see g_mount_guess_content_type() for the asynchronous version. 418 * 419 * Params: 420 * forceRescan = Whether to force a rescan of the content. 421 * Otherwise a cached result will be used if available 422 * cancellable = optional #GCancellable object, %NULL to ignore 423 * 424 * Return: a %NULL-terminated array of content types or %NULL on error. 425 * Caller should free this array with g_strfreev() when done with it. 426 * 427 * Since: 2.18 428 * 429 * Throws: GException on failure. 430 */ 431 public string[] guessContentTypeSync(bool forceRescan, Cancellable cancellable) 432 { 433 GError* err = null; 434 435 auto p = g_mount_guess_content_type_sync(getMountStruct(), forceRescan, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err); 436 437 if (err !is null) 438 { 439 throw new GException( new ErrorG(err) ); 440 } 441 442 return Str.toStringArray(p); 443 } 444 445 /** 446 * Determines if @mount is shadowed. Applications or libraries should 447 * avoid displaying @mount in the user interface if it is shadowed. 448 * 449 * A mount is said to be shadowed if there exists one or more user 450 * visible objects (currently #GMount objects) with a root that is 451 * inside the root of @mount. 452 * 453 * One application of shadow mounts is when exposing a single file 454 * system that is used to address several logical volumes. In this 455 * situation, a #GVolumeMonitor implementation would create two 456 * #GVolume objects (for example, one for the camera functionality of 457 * the device and one for a SD card reader on the device) with 458 * activation URIs `gphoto2://[usb:001,002]/store1/` 459 * and `gphoto2://[usb:001,002]/store2/`. When the 460 * underlying mount (with root 461 * `gphoto2://[usb:001,002]/`) is mounted, said 462 * #GVolumeMonitor implementation would create two #GMount objects 463 * (each with their root matching the corresponding volume activation 464 * root) that would shadow the original mount. 465 * 466 * The proxy monitor in GVfs 2.26 and later, automatically creates and 467 * manage shadow mounts (and shadows the underlying mount) if the 468 * activation root on a #GVolume is set. 469 * 470 * Return: %TRUE if @mount is shadowed. 471 * 472 * Since: 2.20 473 */ 474 public bool isShadowed() 475 { 476 return g_mount_is_shadowed(getMountStruct()) != 0; 477 } 478 479 /** 480 * Remounts a mount. This is an asynchronous operation, and is 481 * finished by calling g_mount_remount_finish() with the @mount 482 * and #GAsyncResults data returned in the @callback. 483 * 484 * Remounting is useful when some setting affecting the operation 485 * of the volume has been changed, as these may need a remount to 486 * take affect. While this is semantically equivalent with unmounting 487 * and then remounting not all backends might need to actually be 488 * unmounted. 489 * 490 * Params: 491 * flags = flags affecting the operation 492 * mountOperation = a #GMountOperation or %NULL to avoid 493 * user interaction. 494 * cancellable = optional #GCancellable object, %NULL to ignore. 495 * callback = a #GAsyncReadyCallback, or %NULL. 496 * userData = user data passed to @callback. 497 */ 498 public void remount(GMountMountFlags flags, MountOperation mountOperation, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 499 { 500 g_mount_remount(getMountStruct(), flags, (mountOperation is null) ? null : mountOperation.getMountOperationStruct(), (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 501 } 502 503 /** 504 * Finishes remounting a mount. If any errors occurred during the operation, 505 * @error will be set to contain the errors and %FALSE will be returned. 506 * 507 * Params: 508 * result = a #GAsyncResult. 509 * 510 * Return: %TRUE if the mount was successfully remounted. %FALSE otherwise. 511 * 512 * Throws: GException on failure. 513 */ 514 public bool remountFinish(AsyncResultIF result) 515 { 516 GError* err = null; 517 518 auto p = g_mount_remount_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err) != 0; 519 520 if (err !is null) 521 { 522 throw new GException( new ErrorG(err) ); 523 } 524 525 return p; 526 } 527 528 /** 529 * Increments the shadow count on @mount. Usually used by 530 * #GVolumeMonitor implementations when creating a shadow mount for 531 * @mount, see g_mount_is_shadowed() for more information. The caller 532 * will need to emit the #GMount::changed signal on @mount manually. 533 * 534 * Since: 2.20 535 */ 536 public void shadow() 537 { 538 g_mount_shadow(getMountStruct()); 539 } 540 541 /** 542 * Unmounts a mount. This is an asynchronous operation, and is 543 * finished by calling g_mount_unmount_finish() with the @mount 544 * and #GAsyncResult data returned in the @callback. 545 * 546 * Deprecated: Use g_mount_unmount_with_operation() instead. 547 * 548 * Params: 549 * flags = flags affecting the operation 550 * cancellable = optional #GCancellable object, %NULL to ignore. 551 * callback = a #GAsyncReadyCallback, or %NULL. 552 * userData = user data passed to @callback. 553 */ 554 public void unmount(GMountUnmountFlags flags, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 555 { 556 g_mount_unmount(getMountStruct(), flags, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 557 } 558 559 /** 560 * Finishes unmounting a mount. If any errors occurred during the operation, 561 * @error will be set to contain the errors and %FALSE will be returned. 562 * 563 * Deprecated: Use g_mount_unmount_with_operation_finish() instead. 564 * 565 * Params: 566 * result = a #GAsyncResult. 567 * 568 * Return: %TRUE if the mount was successfully unmounted. %FALSE otherwise. 569 * 570 * Throws: GException on failure. 571 */ 572 public bool unmountFinish(AsyncResultIF result) 573 { 574 GError* err = null; 575 576 auto p = g_mount_unmount_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err) != 0; 577 578 if (err !is null) 579 { 580 throw new GException( new ErrorG(err) ); 581 } 582 583 return p; 584 } 585 586 /** 587 * Unmounts a mount. This is an asynchronous operation, and is 588 * finished by calling g_mount_unmount_with_operation_finish() with the @mount 589 * and #GAsyncResult data returned in the @callback. 590 * 591 * Params: 592 * flags = flags affecting the operation 593 * mountOperation = a #GMountOperation or %NULL to avoid 594 * user interaction. 595 * cancellable = optional #GCancellable object, %NULL to ignore. 596 * callback = a #GAsyncReadyCallback, or %NULL. 597 * userData = user data passed to @callback. 598 * 599 * Since: 2.22 600 */ 601 public void unmountWithOperation(GMountUnmountFlags flags, MountOperation mountOperation, Cancellable cancellable, GAsyncReadyCallback callback, void* userData) 602 { 603 g_mount_unmount_with_operation(getMountStruct(), flags, (mountOperation is null) ? null : mountOperation.getMountOperationStruct(), (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData); 604 } 605 606 /** 607 * Finishes unmounting a mount. If any errors occurred during the operation, 608 * @error will be set to contain the errors and %FALSE will be returned. 609 * 610 * Params: 611 * result = a #GAsyncResult. 612 * 613 * Return: %TRUE if the mount was successfully unmounted. %FALSE otherwise. 614 * 615 * Since: 2.22 616 * 617 * Throws: GException on failure. 618 */ 619 public bool unmountWithOperationFinish(AsyncResultIF result) 620 { 621 GError* err = null; 622 623 auto p = g_mount_unmount_with_operation_finish(getMountStruct(), (result is null) ? null : result.getAsyncResultStruct(), &err) != 0; 624 625 if (err !is null) 626 { 627 throw new GException( new ErrorG(err) ); 628 } 629 630 return p; 631 } 632 633 /** 634 * Decrements the shadow count on @mount. Usually used by 635 * #GVolumeMonitor implementations when destroying a shadow mount for 636 * @mount, see g_mount_is_shadowed() for more information. The caller 637 * will need to emit the #GMount::changed signal on @mount manually. 638 * 639 * Since: 2.20 640 */ 641 public void unshadow() 642 { 643 g_mount_unshadow(getMountStruct()); 644 } 645 646 int[string] connectedSignals; 647 648 void delegate(MountIF)[] _onChangedListeners; 649 @property void delegate(MountIF)[] onChangedListeners() 650 { 651 return _onChangedListeners; 652 } 653 /** 654 * Emitted when the mount has been changed. 655 */ 656 void addOnChanged(void delegate(MountIF) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 657 { 658 if ( "changed" !in connectedSignals ) 659 { 660 Signals.connectData( 661 this, 662 "changed", 663 cast(GCallback)&callBackChanged, 664 cast(void*)cast(MountIF)this, 665 null, 666 connectFlags); 667 connectedSignals["changed"] = 1; 668 } 669 _onChangedListeners ~= dlg; 670 } 671 extern(C) static void callBackChanged(GMount* mountStruct, MountIF _mount) 672 { 673 foreach ( void delegate(MountIF) dlg; _mount.onChangedListeners ) 674 { 675 dlg(_mount); 676 } 677 } 678 679 void delegate(MountIF)[] _onPreUnmountListeners; 680 @property void delegate(MountIF)[] onPreUnmountListeners() 681 { 682 return _onPreUnmountListeners; 683 } 684 /** 685 * This signal is emitted when the #GMount is about to be 686 * unmounted. 687 * 688 * Since: 2.22 689 */ 690 void addOnPreUnmount(void delegate(MountIF) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 691 { 692 if ( "pre-unmount" !in connectedSignals ) 693 { 694 Signals.connectData( 695 this, 696 "pre-unmount", 697 cast(GCallback)&callBackPreUnmount, 698 cast(void*)cast(MountIF)this, 699 null, 700 connectFlags); 701 connectedSignals["pre-unmount"] = 1; 702 } 703 _onPreUnmountListeners ~= dlg; 704 } 705 extern(C) static void callBackPreUnmount(GMount* mountStruct, MountIF _mount) 706 { 707 foreach ( void delegate(MountIF) dlg; _mount.onPreUnmountListeners ) 708 { 709 dlg(_mount); 710 } 711 } 712 713 void delegate(MountIF)[] _onUnmountedListeners; 714 @property void delegate(MountIF)[] onUnmountedListeners() 715 { 716 return _onUnmountedListeners; 717 } 718 /** 719 * This signal is emitted when the #GMount have been 720 * unmounted. If the recipient is holding references to the 721 * object they should release them so the object can be 722 * finalized. 723 */ 724 void addOnUnmounted(void delegate(MountIF) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 725 { 726 if ( "unmounted" !in connectedSignals ) 727 { 728 Signals.connectData( 729 this, 730 "unmounted", 731 cast(GCallback)&callBackUnmounted, 732 cast(void*)cast(MountIF)this, 733 null, 734 connectFlags); 735 connectedSignals["unmounted"] = 1; 736 } 737 _onUnmountedListeners ~= dlg; 738 } 739 extern(C) static void callBackUnmounted(GMount* mountStruct, MountIF _mount) 740 { 741 foreach ( void delegate(MountIF) dlg; _mount.onUnmountedListeners ) 742 { 743 dlg(_mount); 744 } 745 } 746 }