hrevr1alpha4-44607 adds 14 changesets to branch 'r1alpha4' old head: 560f50437bba9579738bc92e0e90ef3ed8fff085 new head: 64911a689adf3fb7ce10f18d7c6a0ac1d8befc75 ---------------------------------------------------------------------------- cd9795d: Tracker: Moving columns could make an horizontal scrollbar appear [ Philippe Saint-Pierre <stpere@xxxxxxxxx> ] b4962fe: Added drag & drop of disk/partition paths; drag a list item to terminal, pe, etc. and release to copy the path. (ticket #8872) Signed-off-by: Stephan Aßmus <superstippi@xxxxxx> [ Jacob Waterman <jwlhc172@xxxxxxxxx> ] 65ff809: Small cleanups to dragging partition entries code. [ Stephan Aßmus <superstippi@xxxxxx> ] a7056fa: Refactored the stripping of debug symbols to be a per-archive basis. Setting 'HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES = 1' will enable the mechanism. By default all packages will be stripped. Passing anything other than '1' or 'true' in the InstallOptionalHaikuImagePackage call will disable it for a particular package. [ Matt Madia <mattmadia@xxxxxxxxx> ] 0e63108: Updated comment. [ Matt Madia <mattmadia@xxxxxxxxx> ] 66647c4: Ensure that wpa_supplicant does not get stripped. See #8603 for history. [ Matt Madia <mattmadia@xxxxxxxxx> ] 6a69e0c: Re-enable stripping of debug symbols for @alpha-*, @nightly-* For a GCC 2 hybrid image, this brings the size down from 781MiB to 743MiB. [ Matt Madia <mattmadia@xxxxxxxxx> ] 072771e: cache_abort_sub_transaction() did not maintain num_blocks. * When a block was only used in a sub-transaction, it was thrown away, but the transaction::num_blocks field was not decremented. * This caused transactions never considered finished which eventually led to bug #8942. This does not explain the disk corruption occurring in #8969, though. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] c9b21d2: Extract demo packages to /boot. Added image package. [ Humdinger <humdingerb@xxxxxxxxx> ] 7f96ce1: Fixed saving the column state to a message. * This fixes copy/pasting the column state when the "display-as" feature is used. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] 7adf516: Reset controller::active_codec on uninit. * The controller structure is static, so if you closed the device, and the driver failed to initialize correctly (ie. finds no codec) on the second try, it would have crashed accessing an already freed codec. * Not sure why it fails to detect any codecs on second open, yet, though. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] 59592d6: Don't start showing the hint for each solved number. * Instead, only keep it visible when the user made it visible. * Minor cleanup. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] 5a00495: Cleanup. * Sort methods like they are declared in the header. * Fixed a number of coding style violations and other oddities. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] 64911a6: Always set a minimum size for the list view. * Otherwise it doesn't look good when the media server is just being launched (so there are no nodes yet). [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- 17 files changed, 369 insertions(+), 297 deletions(-) build/jam/HaikuCD | 2 - build/jam/HaikuImage | 2 - build/jam/ImageRules | 31 +- build/jam/OptionalPackages | 20 +- build/jam/ReleaseBuildProfiles | 2 + build/jam/UserBuildConfig.ReadMe | 1 + build/scripts/build_haiku_image | 6 +- .../kernel/drivers/audio/hda/hda_controller.cpp | 1 + src/apps/drivesetup/PartitionList.cpp | 41 +- src/apps/drivesetup/PartitionList.h | 5 + src/apps/sudoku/SudokuView.cpp | 13 +- src/kits/tracker/PoseView.cpp | 3 +- src/kits/tracker/ViewState.cpp | 3 +- src/preferences/media/MediaWindow.cpp | 442 ++++++++-------- src/preferences/media/MediaWindow.h | 54 +- src/system/kernel/cache/block_cache.cpp | 2 + src/tests/system/kernel/cache/block_cache_test.cpp | 38 +- ############################################################################ Commit: cd9795d5b4d68ffbf033f500d0d43551c474bb7f URL: http://cgit.haiku-os.org/haiku/commit/?id=cd9795d Author: Philippe Saint-Pierre <stpere@xxxxxxxxx> Date: Sat Sep 15 23:29:12 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:44:47 2012 UTC Tracker: Moving columns could make an horizontal scrollbar appear ---------------------------------------------------------------------------- diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index ec2f087..5e228fc 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -9324,7 +9324,8 @@ BPoseView::MoveColumnTo(BColumn* src, BColumn* dest) BColumn* column = fColumnList->ItemAt(index); column->SetOffset(offset); last = column; - offset = last->Offset() + last->Width() + kTitleColumnExtraMargin; + offset = last->Offset() + last->Width() + kTitleColumnExtraMargin + - kRoomForLine / 2; } // invalidate everything to the right of miny ############################################################################ Commit: b4962fe9f8d74e828f17ea891473d6e647d41fdd URL: http://cgit.haiku-os.org/haiku/commit/?id=b4962fe Author: Jacob Waterman <jwlhc172@xxxxxxxxx> Date: Thu Aug 23 16:11:33 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:45:37 2012 UTC Ticket: https://dev.haiku-os.org/ticket/8872 Added drag & drop of disk/partition paths; drag a list item to terminal, pe, etc. and release to copy the path. (ticket #8872) Signed-off-by: Stephan Aßmus <superstippi@xxxxxx> ---------------------------------------------------------------------------- diff --git a/src/apps/drivesetup/PartitionList.cpp b/src/apps/drivesetup/PartitionList.cpp index 49b9b84..b2e2a60 100644 --- a/src/apps/drivesetup/PartitionList.cpp +++ b/src/apps/drivesetup/PartitionList.cpp @@ -224,7 +224,7 @@ PartitionListRow::PartitionListRow(BPartition* partition) if (partition->ContainsFileSystem()) SetField(new BStringField(partition->Type()), kFilesystemColumn); else - SetField(new BStringField(kUnavailableString), kFilesystemColumn); + SetField(new BStringField(kUnavailableString), kFilesystemColumn); SetField(new BStringField(kUnavailableString), kVolumeNameColumn); } @@ -250,7 +250,7 @@ PartitionListRow::PartitionListRow(BPartition* partition) delete_driver_settings(handle); } - + SetField(new BStringField(parameters), kParametersColumn); } else { SetField(new BStringField(kUnavailableString), kParametersColumn); @@ -281,6 +281,19 @@ PartitionListRow::PartitionListRow(partition_id parentID, partition_id id, } +const char* +PartitionListRow::DevicePath() +{ + BBitmapStringField* stringField + = dynamic_cast<BBitmapStringField*>(GetField(kDeviceColumn)); + + if (stringField == NULL) + return ""; + + return stringField->String(); +} + + // #pragma mark - PartitionListView @@ -312,6 +325,30 @@ PartitionListView::AttachedToWindow() } +bool +PartitionListView::InitiateDrag(BPoint rowPoint, bool wasSelected) +{ + PartitionListRow* draggedRow + = dynamic_cast<PartitionListRow*>(RowAt(rowPoint)); + if (draggedRow != NULL) { + BRect draggedRowRect; + GetRowRect(draggedRow, &draggedRowRect); + + const char* draggedPath = draggedRow->DevicePath(); + if (draggedPath != NULL) { + BMessage *drag = new BMessage(B_MIME_DATA); + drag->AddData("text/plain", B_MIME_TYPE, draggedPath, strlen(draggedPath)); + + DragMessage(drag, draggedRowRect, NULL); + + return true; + } + } + + return false; +} + + PartitionListRow* PartitionListView::FindRow(partition_id id, PartitionListRow* parent) { diff --git a/src/apps/drivesetup/PartitionList.h b/src/apps/drivesetup/PartitionList.h index c3319ce..f4e504e 100644 --- a/src/apps/drivesetup/PartitionList.h +++ b/src/apps/drivesetup/PartitionList.h @@ -77,6 +77,8 @@ public: { return fOffset; } off_t Size() const { return fSize; } + + const char* DevicePath(); private: partition_id fPartitionID; partition_id fParentID; @@ -93,6 +95,8 @@ public: virtual void AttachedToWindow(); + virtual bool InitiateDrag(BPoint rowPoint, bool wasSelected); + PartitionListRow* FindRow(partition_id id, PartitionListRow* parent = NULL); PartitionListRow* AddPartition(BPartition* partition); ############################################################################ Commit: 65ff80987a31c8fbfb3fe037ccb36e5589bc59db URL: http://cgit.haiku-os.org/haiku/commit/?id=65ff809 Author: Stephan Aßmus <superstippi@xxxxxx> Date: Sun Sep 16 09:11:40 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:45:39 2012 UTC Small cleanups to dragging partition entries code. ---------------------------------------------------------------------------- diff --git a/src/apps/drivesetup/PartitionList.cpp b/src/apps/drivesetup/PartitionList.cpp index b2e2a60..f711aa3 100644 --- a/src/apps/drivesetup/PartitionList.cpp +++ b/src/apps/drivesetup/PartitionList.cpp @@ -288,7 +288,7 @@ PartitionListRow::DevicePath() = dynamic_cast<BBitmapStringField*>(GetField(kDeviceColumn)); if (stringField == NULL) - return ""; + return NULL; return stringField->String(); } @@ -330,22 +330,22 @@ PartitionListView::InitiateDrag(BPoint rowPoint, bool wasSelected) { PartitionListRow* draggedRow = dynamic_cast<PartitionListRow*>(RowAt(rowPoint)); - if (draggedRow != NULL) { - BRect draggedRowRect; - GetRowRect(draggedRow, &draggedRowRect); + if (draggedRow == NULL) + return false; - const char* draggedPath = draggedRow->DevicePath(); - if (draggedPath != NULL) { - BMessage *drag = new BMessage(B_MIME_DATA); - drag->AddData("text/plain", B_MIME_TYPE, draggedPath, strlen(draggedPath)); + const char* draggedPath = draggedRow->DevicePath(); + if (draggedPath == NULL) + return false; - DragMessage(drag, draggedRowRect, NULL); + BRect draggedRowRect; + GetRowRect(draggedRow, &draggedRowRect); - return true; - } - } + BMessage dragMessage(B_MIME_DATA); + dragMessage.AddData("text/plain", B_MIME_TYPE, draggedPath, + strlen(draggedPath)); - return false; + DragMessage(&dragMessage, draggedRowRect, NULL); + return true; } diff --git a/src/apps/drivesetup/PartitionList.h b/src/apps/drivesetup/PartitionList.h index f4e504e..8ed7952 100644 --- a/src/apps/drivesetup/PartitionList.h +++ b/src/apps/drivesetup/PartitionList.h @@ -79,6 +79,7 @@ public: { return fSize; } const char* DevicePath(); + private: partition_id fPartitionID; partition_id fParentID; ############################################################################ Commit: a7056faafa58e2fd7287e76db0f73b3951cd0f6c URL: http://cgit.haiku-os.org/haiku/commit/?id=a7056fa Author: Matt Madia <mattmadia@xxxxxxxxx> Date: Sun Sep 16 23:41:24 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:46:13 2012 UTC Refactored the stripping of debug symbols to be a per-archive basis. Setting 'HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES = 1' will enable the mechanism. By default all packages will be stripped. Passing anything other than '1' or 'true' in the InstallOptionalHaikuImagePackage call will disable it for a particular package. ---------------------------------------------------------------------------- diff --git a/build/jam/HaikuCD b/build/jam/HaikuCD index e88ba3b..d77e752 100644 --- a/build/jam/HaikuCD +++ b/build/jam/HaikuCD @@ -28,8 +28,6 @@ AddVariableToScript $(script) : isCD : 1 ; AddVariableToScript $(script) : cdLabel : $(HAIKU_CD_LABEL) ; AddVariableToScript $(script) : addBuildCompatibilityLibDir : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; -AddVariableToScript $(script) : stripOptionalPackageDebugSymbols - : $(HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES) ; AddTargetVariableToScript $(script) : <build>addattr ; AddTargetVariableToScript $(script) : <build>copyattr ; AddTargetVariableToScript $(script) : <build>rc ; diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 81e9f08..759a1c8 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -892,8 +892,6 @@ AddVariableToScript $(script) : addBuildCompatibilityLibDir : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; AddVariableToScript $(script) : dontClearImage : $(HAIKU_DONT_CLEAR_IMAGE) ; AddVariableToScript $(script) : updateOnly : [ IsUpdateHaikuImageOnly ] ; -AddVariableToScript $(script) : stripOptionalPackageDebugSymbols - : $(HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES) ; AddTargetVariableToScript $(script) : <build>addattr ; AddTargetVariableToScript $(script) : <build>bfs_shell : bfsShell ; AddTargetVariableToScript $(script) : <build>fs_shell_command : fsShellCommand ; diff --git a/build/jam/ImageRules b/build/jam/ImageRules index 48ebb82..c227540 100644 --- a/build/jam/ImageRules +++ b/build/jam/ImageRules @@ -283,16 +283,17 @@ rule CopyDirectoryToContainer container : directoryTokens : sourceDirectory } rule ExtractArchiveToContainer container : directoryTokens : archiveFile - : extractedSubDir + : extractedSubDir : stripDebugSymbols { # ExtractArchiveToContainer <container> : <directory> : <archiveFile> - # : <extractedSubDir> ; + # : <extractedSubDir> : <stripDebugSymbols> ; local directory = [ AddDirectoryToContainer $(container) : $(directoryTokens) ] ; ARCHIVE_FILES_TO_INSTALL on $(directory) += $(archiveFile) ; ARCHIVE_SUBDIR_TO_INSTALL_FROM on $(archiveFile) = $(extractedSubDir) ; + ARCHIVE_FILES_TO_STRIP on $(archiveFile) = $(stripDebugSymbols) ; } rule AddDriversToContainer container : relativeDirectoryTokens : targets @@ -607,6 +608,11 @@ rule CreateContainerExtractFilesScript container : script ARCHIVE_SUBDIR_TO_INSTALL_FROM on $(dummyTarget) = $(extractedSubDir:E=.) ; + local stripDebugSymbols = [ on $(archiveFile) + return $(ARCHIVE_FILES_TO_STRIP) ] ; + STRIP_DEBUG_SYMBOLS_FROM_ARCHIVE on $(dummyTarget) = + $(stripDebugSymbols) ; + Depends $(dummyTarget) : $(initScript) $(archiveFile) $(serializationDependency) ; Depends $(script) : $(dummyTarget) ; @@ -622,7 +628,8 @@ rule CreateContainerExtractFilesScript container : script actions AddExtractFileToContainerExtractFilesScript { echo extractFile "\"$(2[2])\"" "\"$(TARGET_DIR)\"" \ - "\"$(ARCHIVE_SUBDIR_TO_INSTALL_FROM)\"" >> $(2[1]) + "\"$(ARCHIVE_SUBDIR_TO_INSTALL_FROM)\"" \ + "\"$(STRIP_DEBUG_SYMBOLS_FROM_ARCHIVE)\"" >> $(2[1]) } @@ -729,7 +736,7 @@ rule AddWifiFirmwareToHaikuImage driver : package : archive : extract } rule ExtractArchiveToHaikuImage dirTokens : archiveFile : alwaysUpdate - : extractedSubDir + : extractedSubDir : stripDebugSymbols { # ExtractArchiveToHaikuImage <dirTokens> : <archiveFile> : <alwaysUpdate> # : <extractedSubDir> ; @@ -738,7 +745,7 @@ rule ExtractArchiveToHaikuImage dirTokens : archiveFile : alwaysUpdate # requested. if ! [ IsUpdateHaikuImageOnly ] || $(alwaysUpdate) { ExtractArchiveToContainer $(HAIKU_IMAGE_CONTAINER_NAME) : $(dirTokens) - : $(archiveFile) : $(extractedSubDir) ; + : $(archiveFile) : $(extractedSubDir) : $(stripDebugSymbols) ; } } @@ -825,6 +832,7 @@ rule InstallSourceArchive file : url } rule InstallOptionalHaikuImagePackage package : url : dirTokens : isCDPackage + : stripDebugSymbols { # download archive file local archiveFile = [ DownloadFile $(package) : $(url) ] ; @@ -835,8 +843,17 @@ rule InstallOptionalHaikuImagePackage package : url : dirTokens : isCDPackage # copy onto image AddFilesToHaikuImage _packages_ : $(archiveFile) ; } else { + if $(HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES) = 1 { + stripDebugSymbols ?= 1 ; + # The script will only test for = 1. This is in case someone + # manually set the flag 'true' + if $(stripDebugSymbols) = true { + stripDebugSymbols = 1 ; + } + } # extract onto image - ExtractArchiveToHaikuImage $(dirTokens) : $(archiveFile) ; + ExtractArchiveToHaikuImage $(dirTokens) : $(archiveFile) + : : : $(stripDebugSymbols) ; } } @@ -1472,7 +1489,7 @@ actions BuildCDBootPPCImage1 bind MAPS || \ genisoimage -v -hfs -part -map $(MAPS) -no-desktop -hfs-volid bootimg \ -V bootimg -hfs-bless $(HAIKU_OUTPUT_DIR)/cd/ppc -prep-boot \ - ppc/$(>[2]:D=) -r -o $(<) $(HAIKU_OUTPUT_DIR)/cd + ppc/$(>[2]:D=) -r -o $(<) $(HAIKU_OUTPUT_DIR)/cd #$(RM) -R $(HAIKU_OUTPUT_DIR)/cd } diff --git a/build/scripts/build_haiku_image b/build/scripts/build_haiku_image index d6001f9..155e5f6 100755 --- a/build/scripts/build_haiku_image +++ b/build/scripts/build_haiku_image @@ -16,7 +16,6 @@ set -o errexit # dontClearImage # isVMwareImage # optionalPackageDescriptions -# stripOptionalPackageDebugSymbols # # addattr # copyattr @@ -158,10 +157,11 @@ stripDebugInfo() extractFile() { - # extractFile <archive> <directory> + # extractFile <archive> <directory> <extractedSubDir> <stripDebugSymbols> archiveFile=$1 targetExtractedDir=$2 extractedSubDir=$3 + stripDebugSymbols=$4 echo "Extracting $archiveFile ..." @@ -188,7 +188,7 @@ extractFile() rm $extractDir/.OptionalPackageDescription fi - if [ "$stripOptionalPackageDebugSymbols" = "1" ]; then + if [ "$stripDebugSymbols" = "1" ]; then # strip executables in common/bin if [ -d $extractDir/common/bin ]; then for file in `find $extractDir/common/bin -type f -a -perm +100 \ ############################################################################ Commit: 0e63108c644dac111f9ec7c7886f4a84be2b3066 URL: http://cgit.haiku-os.org/haiku/commit/?id=0e63108 Author: Matt Madia <mattmadia@xxxxxxxxx> Date: Sun Sep 16 23:45:09 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:46:18 2012 UTC Updated comment. ---------------------------------------------------------------------------- diff --git a/build/jam/UserBuildConfig.ReadMe b/build/jam/UserBuildConfig.ReadMe index d1c9eb1..637de80 100644 --- a/build/jam/UserBuildConfig.ReadMe +++ b/build/jam/UserBuildConfig.ReadMe @@ -63,6 +63,7 @@ HAIKU_IMAGE_DIR = /tmp ; HAIKU_IMAGE_SIZE = 100 ; # Enable stripping the debug symbols from optional packages. +# Note, some optional packages may override this to prevent stripping. HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES = 1 ; # Set image volume label to "Walter". Default label is "Haiku". ############################################################################ Commit: 66647c47bab22e076e627b7e668e21ed932031c6 URL: http://cgit.haiku-os.org/haiku/commit/?id=66647c4 Author: Matt Madia <mattmadia@xxxxxxxxx> Date: Sun Sep 16 23:45:44 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:46:22 2012 UTC Ticket: https://dev.haiku-os.org/ticket/8603 Ensure that wpa_supplicant does not get stripped. See #8603 for history. ---------------------------------------------------------------------------- diff --git a/build/jam/OptionalPackages b/build/jam/OptionalPackages index f0067ec..c52c30e 100644 --- a/build/jam/OptionalPackages +++ b/build/jam/OptionalPackages @@ -849,7 +849,7 @@ if [ IsOptionalHaikuImagePackageAdded DevelopmentMin ] && $(TARGET_ARCH) = x86 { AddHeaderDirectoryToHaikuImage libs tiff : 3rdparty ; AddHeaderDirectoryToHaikuImage libs zlib : 3rdparty ; - CopyDirectoryToHaikuImage develop headers : + CopyDirectoryToHaikuImage develop headers : [ FDirName $(HAIKU_FREETYPE_DIR) develop headers 3rdparty ] ; CopyDirectoryToHaikuImage develop headers : $(HAIKU_JPEG_HEADERS) : 3rdparty ; @@ -2051,11 +2051,13 @@ if [ IsOptionalHaikuImagePackageAdded wpa_supplicant ] { } else if $(HAIKU_GCC_VERSION[1]) >= 4 { InstallOptionalHaikuImagePackage wpa_supplicant-0.7.3-x86-gcc4-2012-04-03.zip - : $(baseURL)/wpa_supplicant-0.7.3-x86-gcc4-2012-04-03.zip ; + : $(baseURL)/wpa_supplicant-0.7.3-x86-gcc4-2012-04-03.zip + : : : false ; } else { InstallOptionalHaikuImagePackage wpa_supplicant-0.7.3-x86-gcc2-2012-04-03.zip - : $(baseURL)/wpa_supplicant-0.7.3-x86-gcc2-2012-04-03.zip ; + : $(baseURL)/wpa_supplicant-0.7.3-x86-gcc2-2012-04-03.zip + : : : false ; } } ############################################################################ Commit: 6a69e0cad5aba3e6ae506d45f801c9e0b4a678fa URL: http://cgit.haiku-os.org/haiku/commit/?id=6a69e0c Author: Matt Madia <mattmadia@xxxxxxxxx> Date: Sun Sep 16 23:47:29 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:47:15 2012 UTC Re-enable stripping of debug symbols for @alpha-*, @nightly-* For a GCC 2 hybrid image, this brings the size down from 781MiB to 743MiB. ---------------------------------------------------------------------------- diff --git a/build/jam/ReleaseBuildProfiles b/build/jam/ReleaseBuildProfiles index 8857651..8de37d9 100644 --- a/build/jam/ReleaseBuildProfiles +++ b/build/jam/ReleaseBuildProfiles @@ -16,6 +16,7 @@ switch $(HAIKU_BUILD_PROFILE) { HAIKU_ROOT_USER_REAL_NAME = "Yourself" ; AddGroupToHaikuImage party : 101 : user sshd ; HAIKU_IMAGE_HOST_NAME = shredder ; + HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES = 1 ; HAIKU_IMAGE_SIZE = 800 ; AddOptionalHaikuImagePackages TimGMSoundFont TrackerNewTemplates @@ -37,6 +38,7 @@ switch $(HAIKU_BUILD_PROFILE) { HAIKU_ROOT_USER_NAME = user ; HAIKU_ROOT_USER_REAL_NAME = "Yourself" ; AddGroupToHaikuImage party : 101 : user sshd ; + HAIKU_STRIP_DEBUG_FROM_OPTIONAL_PACKAGES = 1 ; HAIKU_IMAGE_HOST_NAME = shredder ; HAIKU_IMAGE_SIZE = 600 ; ############################################################################ Commit: 072771e7cd0d0a64fa946130575b0856fff282ca URL: http://cgit.haiku-os.org/haiku/commit/?id=072771e Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Wed Sep 19 18:06:19 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:47:34 2012 UTC Ticket: https://dev.haiku-os.org/ticket/8942 Ticket: https://dev.haiku-os.org/ticket/8969 cache_abort_sub_transaction() did not maintain num_blocks. * When a block was only used in a sub-transaction, it was thrown away, but the transaction::num_blocks field was not decremented. * This caused transactions never considered finished which eventually led to bug #8942. This does not explain the disk corruption occurring in #8969, though. ---------------------------------------------------------------------------- diff --git a/src/system/kernel/cache/block_cache.cpp b/src/system/kernel/cache/block_cache.cpp index 22e20cc..b18dc1b 100644 --- a/src/system/kernel/cache/block_cache.cpp +++ b/src/system/kernel/cache/block_cache.cpp @@ -3059,6 +3059,8 @@ cache_abort_sub_transaction(void* _cache, int32 id) block->transaction_next = NULL; block->transaction = NULL; + transaction->num_blocks--; + if (block->previous_transaction == NULL) { cache->Free(block->original_data); block->original_data = NULL; diff --git a/src/tests/system/kernel/cache/block_cache_test.cpp b/src/tests/system/kernel/cache/block_cache_test.cpp index d0b88f1..561f6ec 100644 --- a/src/tests/system/kernel/cache/block_cache_test.cpp +++ b/src/tests/system/kernel/cache/block_cache_test.cpp @@ -20,6 +20,8 @@ #define TEST_BLOCKS(number, count) \ test_blocks(number, count, __LINE__) +#define TEST_TRANSACTION(id, num, mainNum, subNum) \ + test_transaction(id, num, mainNum, subNum, __LINE__) #define TEST_BLOCK_DATA(block, number, type) \ if ((block)->type ## _data != NULL && gBlocks[(number)]. type == 0) \ @@ -158,6 +160,28 @@ init_test_blocks() void +test_transaction(int32 id, int32 numBlocks, int32 numMainBlocks, + int32 numSubBlocks, int32 line) +{ + MutexLocker locker(&gCache->lock); + cache_transaction* transaction = lookup_transaction(gCache, id); + + if (numBlocks != transaction->num_blocks) { + error(line, "Transaction %d has wrong num_blocks (is %d, should be " + "%d)!", id, transaction->num_blocks, numBlocks); + } + if (numMainBlocks != transaction->main_num_blocks) { + error(line, "Transaction %d has wrong num_blocks (is %d, should be " + "%d)!", id, transaction->main_num_blocks, numMainBlocks); + } + if (numSubBlocks != transaction->sub_num_blocks) { + error(line, "Transaction %d has wrong num_blocks (is %d, should be " + "%d)!", id, transaction->sub_num_blocks, numSubBlocks); + } +} + + +void test_blocks(off_t number, int32 count, int32 line) { printf(" %ld\n", gSubTest++); @@ -391,7 +415,9 @@ test_abort_sub_transaction() block_cache_put(gCache, 1); + TEST_TRANSACTION(id, 2, 2, 1); cache_abort_sub_transaction(gCache, id); + TEST_TRANSACTION(id, 2, 2, 0); gBlocks[0].write = true; gBlocks[0].is_dirty = false; @@ -417,7 +443,9 @@ test_abort_sub_transaction() gBlocks[1].is_dirty = true; TEST_BLOCKS(1, 1); + TEST_TRANSACTION(id, 1, 0, 0); cache_start_sub_transaction(gCache, id); + TEST_TRANSACTION(id, 1, 1, 0); gBlocks[0].present = true; @@ -427,7 +455,9 @@ test_abort_sub_transaction() block_cache_put(gCache, 0); + TEST_TRANSACTION(id, 2, 1, 1); cache_abort_sub_transaction(gCache, id); + TEST_TRANSACTION(id, 1, 1, 0); gBlocks[0].write = false; gBlocks[0].is_dirty = false; @@ -445,9 +475,6 @@ test_abort_sub_transaction() void test_block_cache_discard() { - // TODO: test transaction-less block caches - // TODO: test read-only block caches - // Test transactions and block caches start_test("Discard in main"); @@ -469,11 +496,14 @@ test_block_cache_discard() gBlocks[2].present = false; + TEST_TRANSACTION(id, 1, 0, 0); block = block_cache_get_empty(gCache, 2, id); + TEST_TRANSACTION(id, 2, 0, 0); block_cache_discard(gCache, 2, 1); block_cache_put(gCache, 2); cache_end_transaction(gCache, id, NULL, NULL); + TEST_TRANSACTION(id, 1, 0, 0); cache_sync_transaction(gCache, id); start_test("Discard in sub"); @@ -606,6 +636,8 @@ main(int argc, char** argv) { block_cache_init(); + // TODO: test transaction-less block caches + // TODO: test read-only block caches test_abort_transaction(); test_abort_sub_transaction(); test_block_cache_discard(); ############################################################################ Commit: c9b21d27156fcff930defc91f7bfaabe0f8475dd URL: http://cgit.haiku-os.org/haiku/commit/?id=c9b21d2 Author: Humdinger <humdingerb@xxxxxxxxx> Date: Sat Sep 22 10:32:22 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:54:42 2012 UTC Extract demo packages to /boot. Added image package. ---------------------------------------------------------------------------- diff --git a/build/jam/OptionalPackages b/build/jam/OptionalPackages index c52c30e..10cbfbf 100644 --- a/build/jam/OptionalPackages +++ b/build/jam/OptionalPackages @@ -579,7 +579,7 @@ if [ IsOptionalHaikuImagePackageAdded CVS ] { if [ IsOptionalHaikuImagePackageAdded DemoPackage_Audio ] { InstallOptionalHaikuImagePackage DemoPackage_Audio-0.1-2012-02-19.zip : $(baseURL)/DemoPackage_Audio-0.1-2012-02-19.zip - : home ; + : ; } @@ -587,15 +587,15 @@ if [ IsOptionalHaikuImagePackageAdded DemoPackage_Audio ] { if [ IsOptionalHaikuImagePackageAdded DemoPackage_Data ] { InstallOptionalHaikuImagePackage DemoPackage_Data-0.1-2012-02-19.zip : $(baseURL)/DemoPackage_Data-0.1-2012-02-19.zip - : home ; + : ; } # DemoPackage_Image if [ IsOptionalHaikuImagePackageAdded DemoPackage_Image ] { - InstallOptionalHaikuImagePackage DemoPackage_Image-0.1-2012-02-19.zip - : $(baseURL)/DemoPackage_Image-0.1-2012-02-19.zip - : home ; + InstallOptionalHaikuImagePackage DemoPackage_Image-0.2-2012-09-22.zip + : $(baseURL)/DemoPackage_Image-0.2-2012-09-22.zip + : ; } @@ -603,7 +603,7 @@ if [ IsOptionalHaikuImagePackageAdded DemoPackage_Image ] { if [ IsOptionalHaikuImagePackageAdded DemoPackage_Video ] { InstallOptionalHaikuImagePackage DemoPackage_Video-0.1-2012-02-19.zip : $(baseURL)/DemoPackage_Video-0.1-2012-02-19.zip - : home ; + : ; } ############################################################################ Commit: 7f96ce148534a2ce8687e22c271d234bbb1ecb09 URL: http://cgit.haiku-os.org/haiku/commit/?id=7f96ce1 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Sun Sep 23 06:30:35 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:55:33 2012 UTC Fixed saving the column state to a message. * This fixes copy/pasting the column state when the "display-as" feature is used. ---------------------------------------------------------------------------- diff --git a/src/kits/tracker/ViewState.cpp b/src/kits/tracker/ViewState.cpp index 8ebaaf6..831ccf4 100644 --- a/src/kits/tracker/ViewState.cpp +++ b/src/kits/tracker/ViewState.cpp @@ -238,8 +238,7 @@ BColumn::ArchiveToMessage(BMessage &message) const message.AddString(kColumnAttrName, fAttrName); message.AddInt32(kColumnAttrHashName, static_cast<int32>(fAttrHash)); message.AddInt32(kColumnAttrTypeName, static_cast<int32>(fAttrType)); - if (fDisplayAs.Length() > 0) - message.AddString(kColumnDisplayAsName, fDisplayAs.String()); + message.AddString(kColumnDisplayAsName, fDisplayAs.String()); message.AddBool(kColumnStatFieldName, fStatField); message.AddBool(kColumnEditableName, fEditable); } ############################################################################ Commit: 7adf5162e73c55a592eed9026cc46160f91e9a0e URL: http://cgit.haiku-os.org/haiku/commit/?id=7adf516 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Sun Sep 23 09:16:28 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:55:55 2012 UTC Reset controller::active_codec on uninit. * The controller structure is static, so if you closed the device, and the driver failed to initialize correctly (ie. finds no codec) on the second try, it would have crashed accessing an already freed codec. * Not sure why it fails to detect any codecs on second open, yet, though. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp index f3a6891..9c404ce 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -1006,5 +1006,6 @@ hda_hw_uninit(hda_controller* controller) if (controller->codecs[index] != NULL) hda_codec_delete(controller->codecs[index]); } + controller->active_codec = NULL; } ############################################################################ Commit: 59592d6539421098c7d50be978fc24b2f8274511 URL: http://cgit.haiku-os.org/haiku/commit/?id=59592d6 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Sun Sep 23 09:23:29 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 02:56:37 2012 UTC Don't start showing the hint for each solved number. * Instead, only keep it visible when the user made it visible. * Minor cleanup. ---------------------------------------------------------------------------- diff --git a/src/apps/sudoku/SudokuView.cpp b/src/apps/sudoku/SudokuView.cpp index 8d5d111..e595047 100644 --- a/src/apps/sudoku/SudokuView.cpp +++ b/src/apps/sudoku/SudokuView.cpp @@ -889,7 +889,7 @@ SudokuView::MouseDown(BPoint where) fLastField = field; } - if (value + 1 != fValueHintValue) + if (value + 1 != fValueHintValue && fValueHintValue != ~0UL) _SetValueHintValue(value + 1); if (wasCompleted != fField->IsValueCompleted(value + 1)) @@ -1208,17 +1208,14 @@ SudokuView::_DrawHints(uint32 x, uint32 y) for (uint32 j = 0; j < fBlockSize; j++) { for (uint32 i = 0; i < fBlockSize; i++) { uint32 value = j * fBlockSize + i; - if (hintMask & (1UL << value)) { -// if (value + 1 == fValueHintValue) -// SetHighColor(kValueHintBackgroundColor); -// else - SetHighColor(kHintColor); - }else { + if ((hintMask & (1UL << value)) != 0) { + SetHighColor(kHintColor); + } else { if (!showAll) continue; if ((fHintFlags & kMarkValidHints) == 0 - || validMask & (1UL << value)) + || (validMask & (1UL << value)) != 0) SetHighColor(110, 110, 80); else SetHighColor(180, 180, 120); ############################################################################ Commit: 5a00495b7d35e57b32d8de7a686e284367e4e099 URL: http://cgit.haiku-os.org/haiku/commit/?id=5a00495 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Sun Sep 23 13:44:21 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 03:00:08 2012 UTC Cleanup. * Sort methods like they are declared in the header. * Fixed a number of coding style violations and other oddities. ---------------------------------------------------------------------------- diff --git a/src/preferences/media/MediaWindow.cpp b/src/preferences/media/MediaWindow.cpp index c283904..049b5cc 100644 --- a/src/preferences/media/MediaWindow.cpp +++ b/src/preferences/media/MediaWindow.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003-2010, Haiku, Inc. + * Copyright 2003-2012, Haiku, Inc. * Distributed under the terms of the MIT license. * * Authors: @@ -148,7 +148,9 @@ MediaWindow::SmartNode::_FreeNode() } -// MediaWindow - Constructor +// #pragma mark - + + MediaWindow::MediaWindow(BRect frame) : BWindow(frame, B_TRANSLATE_SYSTEM_NAME("Media"), B_TITLED_WINDOW, @@ -162,14 +164,7 @@ MediaWindow::MediaWindow(BRect frame) fAlert(NULL), fInitCheck(B_OK) { - InitWindow(); -} - - -status_t -MediaWindow::InitCheck() -{ - return fInitCheck; + _InitWindow(); } @@ -187,14 +182,20 @@ MediaWindow::~MediaWindow() BPath path; if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { path.Append(SETTINGS_FILE); - BFile file(path.Path(), B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE); - if (file.InitCheck()==B_OK) { + BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); + if (file.InitCheck() == B_OK) file.Write(buffer, strlen(buffer)); - } } } +status_t +MediaWindow::InitCheck() +{ + return fInitCheck; +} + + void MediaWindow::SelectNode(const dormant_node_info* node) { @@ -260,123 +261,91 @@ MediaWindow::UpdateOutputListItem(MediaListItem::media_type type, } -void -MediaWindow::_FindNodes() +bool +MediaWindow::QuitRequested() { - _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); - _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); - _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); - _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); - _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); - _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); - _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); - _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); + // stop watching the MediaRoster + fCurrentNode.SetTo(NULL); + be_app->PostMessage(B_QUIT_REQUESTED); + return true; } void -MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into) -{ - dormant_node_info node_info[64]; - int32 node_info_count = 64; - - media_format format; - media_format* nodeInputFormat = NULL, *nodeOutputFormat = NULL; - format.type = type; - - // output nodes must be BBufferConsumers => they have an input format - // input nodes must be BBufferProducers => they have an output format - if (kind & B_PHYSICAL_OUTPUT) - nodeInputFormat = &format; - else if (kind & B_PHYSICAL_INPUT) - nodeOutputFormat = &format; - else - return; - - BMediaRoster* roster = BMediaRoster::Roster(); - - if (roster->GetDormantNodes(node_info, &node_info_count, nodeInputFormat, - nodeOutputFormat, NULL, kind) != B_OK) { - // TODO: better error reporting! - fprintf(stderr, "error\n"); - return; - } - - for (int32 i = 0; i < node_info_count; i++) { - PRINT(("node : %s, media_addon %i, flavor_id %i\n", - node_info[i].name, (int)node_info[i].addon, - (int)node_info[i].flavor_id)); - - dormant_node_info* info = new dormant_node_info(); - strncpy(info->name, node_info[i].name, B_MEDIA_NAME_LENGTH); - info->flavor_id = node_info[i].flavor_id; - info->addon = node_info[i].addon; - into.AddItem(info); - } -} - - -NodeListItem* -MediaWindow::_FindNodeListItem(dormant_node_info* info) +MediaWindow::MessageReceived(BMessage* message) { - NodeListItem audioItem(info, MediaListItem::AUDIO_TYPE); - NodeListItem videoItem(info, MediaListItem::VIDEO_TYPE); - - NodeListItem::Comparator audioComparator(&audioItem); - NodeListItem::Comparator videoComparator(&videoItem); - - for (int32 i = 0; i < fListView->CountItems(); i++) { - MediaListItem* item - = static_cast<MediaListItem*>(fListView->ItemAt(i)); - item->Accept(audioComparator); - if (audioComparator.result == 0) - return static_cast<NodeListItem*>(item); - - item->Accept(videoComparator); - if (videoComparator.result == 0) - return static_cast<NodeListItem*>(item); - } - return NULL; -} - + switch (message->what) { + case ML_INIT_MEDIA: + _InitMedia(false); + break; + case ML_RESTART_MEDIA_SERVER: + { + thread_id thread = spawn_thread(&MediaWindow::_RestartMediaServices, + "restart_thread", B_NORMAL_PRIORITY, this); + if (thread < 0) + fprintf(stderr, "couldn't create restart thread\n"); + else + resume_thread(thread); + break; + } + case B_MEDIA_WEB_CHANGED: + case ML_SELECTED_NODE: + { + PRINT_OBJECT(*message); -void -MediaWindow::_UpdateListViewMinWidth() -{ - float width = 0; - for (int32 i = 0; i < fListView->CountItems(); i++) { - BListItem* item = fListView->ItemAt(i); - width = max_c(width, item->Width()); - } - fListView->SetExplicitMinSize(BSize(width, B_SIZE_UNSET)); - fListView->InvalidateLayout(); -} + MediaListItem* item = static_cast<MediaListItem*>( + fListView->ItemAt(fListView->CurrentSelection())); + if (item == NULL) + break; + fCurrentNode.SetTo(NULL); + _ClearParamView(); + item->AlterWindow(this); + break; + } + case B_SOME_APP_LAUNCHED: + { + PRINT_OBJECT(*message); + if (fAlert == NULL) + break; -void -MediaWindow::_AddNodeItems(NodeList &list, MediaListItem::media_type type) -{ - int32 count = list.CountItems(); - for (int32 i = 0; i < count; i++) { - dormant_node_info* info = list.ItemAt(i); - if (!_FindNodeListItem(info)) - fListView->AddItem(new NodeListItem(info, type)); + BString mimeSig; + if (message->FindString("be:signature", &mimeSig) == B_OK + && (mimeSig == "application/x-vnd.Be.addon-host" + || mimeSig == "application/x-vnd.Be.media-server")) { + fAlert->Lock(); + fAlert->TextView()->SetText( + B_TRANSLATE("Starting media server" B_UTF8_ELLIPSIS)); + fAlert->Unlock(); + } + break; + } + case B_SOME_APP_QUIT: + { + PRINT_OBJECT(*message); + BString mimeSig; + if (message->FindString("be:signature", &mimeSig) == B_OK) { + if (mimeSig == "application/x-vnd.Be.addon-host" + || mimeSig == "application/x-vnd.Be.media-server") { + BMediaRoster* roster = BMediaRoster::CurrentRoster(); + if (roster != NULL && roster->Lock()) + roster->Quit(); + } + } + break; + } + default: + BWindow::MessageReceived(message); + break; } } -void -MediaWindow::_EmptyNodeLists() -{ - fAudioOutputs.MakeEmpty(); - fAudioInputs.MakeEmpty(); - fVideoOutputs.MakeEmpty(); - fVideoInputs.MakeEmpty(); -} +// #pragma mark - private void -MediaWindow::InitWindow() +MediaWindow::_InitWindow() { fListView = new BListView("media_list_view"); fListView->SetSelectionMessage(new BMessage(ML_SELECTED_NODE)); @@ -400,7 +369,6 @@ MediaWindow::InitWindow() fVideoView = new VideoSettingsView(); fContentLayout->AddView(fVideoView); - // Layout all views BLayoutBuilder::Group<>(this, B_HORIZONTAL) .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, @@ -412,19 +380,16 @@ MediaWindow::InitWindow() .Add(fContentLayout); // Start the window - fInitCheck = InitMedia(true); + fInitCheck = _InitMedia(true); if (fInitCheck != B_OK) PostMessage(B_QUIT_REQUESTED); else if (IsHidden()) - Show(); + Show(); } -// #pragma mark - - - status_t -MediaWindow::InitMedia(bool first) +MediaWindow::_InitMedia(bool first) { status_t err = B_OK; BMediaRoster* roster = BMediaRoster::Roster(&err); @@ -432,7 +397,7 @@ MediaWindow::InitMedia(bool first) if (first && err != B_OK) { BAlert* alert = new BAlert("start_media_server", B_TRANSLATE("Could not connect to the media server.\n" - "Would you like to start it ?"), + "Would you like to start it ?"), B_TRANSLATE("Quit"), B_TRANSLATE("Start media server"), NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); @@ -440,9 +405,8 @@ MediaWindow::InitMedia(bool first) if (alert->Go() == 0) return B_ERROR; - fAlert = new MediaAlert(BRect(0, 0, 300, 60), - "restart_alert", B_TRANSLATE( - "Restarting media services\nStarting media server" + fAlert = new MediaAlert(BRect(0, 0, 300, 60), "restart_alert", + B_TRANSLATE("Restarting media services\nStarting media server" B_UTF8_ELLIPSIS "\n")); fAlert->Show(); @@ -454,7 +418,8 @@ MediaWindow::InitMedia(bool first) Lock(); bool isVideoSelected = true; - if (!first && fListView->ItemAt(0) && fListView->ItemAt(0)->IsSelected()) + if (!first && fListView->ItemAt(0) != NULL + && fListView->ItemAt(0)->IsSelected()) isVideoSelected = false; if ((!first || (first && err) ) && fAlert) { @@ -499,46 +464,44 @@ MediaWindow::InitMedia(bool first) _UpdateListViewMinWidth(); // Set default nodes for our setting views - media_node default_node; - dormant_node_info node_info; + media_node defaultNode; + dormant_node_info nodeInfo; int32 outputID; BString outputName; - if (roster->GetAudioInput(&default_node) == B_OK) { - roster->GetDormantNodeFor(default_node, &node_info); - fAudioView->SetDefaultInput(&node_info); + if (roster->GetAudioInput(&defaultNode) == B_OK) { + roster->GetDormantNodeFor(defaultNode, &nodeInfo); + fAudioView->SetDefaultInput(&nodeInfo); // this causes our listview to be updated as well } - if (roster->GetAudioOutput(&default_node, &outputID, &outputName)==B_OK) { - roster->GetDormantNodeFor(default_node, &node_info); - fAudioView->SetDefaultOutput(&node_info); + if (roster->GetAudioOutput(&defaultNode, &outputID, &outputName) == B_OK) { + roster->GetDormantNodeFor(defaultNode, &nodeInfo); + fAudioView->SetDefaultOutput(&nodeInfo); fAudioView->SetDefaultChannel(outputID); // this causes our listview to be updated as well } - if (roster->GetVideoInput(&default_node)==B_OK) { - roster->GetDormantNodeFor(default_node, &node_info); - fVideoView->SetDefaultInput(&node_info); + if (roster->GetVideoInput(&defaultNode) == B_OK) { + roster->GetDormantNodeFor(defaultNode, &nodeInfo); + fVideoView->SetDefaultInput(&nodeInfo); // this causes our listview to be updated as well } - if (roster->GetVideoOutput(&default_node)==B_OK) { - roster->GetDormantNodeFor(default_node, &node_info); - fVideoView->SetDefaultOutput(&node_info); + if (roster->GetVideoOutput(&defaultNode) == B_OK) { + roster->GetDormantNodeFor(defaultNode, &nodeInfo); + fVideoView->SetDefaultOutput(&nodeInfo); // this causes our listview to be updated as well } - if (first) { + if (first) fListView->Select(fListView->IndexOf(mixer)); - } else { - if (isVideoSelected) - fListView->Select(fListView->IndexOf(video)); - else - fListView->Select(fListView->IndexOf(audio)); - } + else if (isVideoSelected) + fListView->Select(fListView->IndexOf(video)); + else + fListView->Select(fListView->IndexOf(audio)); - if (fAlert) { + if (fAlert != NULL) { snooze(800000); fAlert->PostMessage(B_QUIT_REQUESTED); } @@ -550,101 +513,123 @@ MediaWindow::InitMedia(bool first) } -bool -MediaWindow::QuitRequested() +void +MediaWindow::_FindNodes() { - // stop watching the MediaRoster - fCurrentNode.SetTo(NULL); - be_app->PostMessage(B_QUIT_REQUESTED); - return true; + _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); + _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); + _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); + _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); + _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); + _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); + _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); + _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); } -// ErrorAlert -- Displays a BAlert Box with a Custom Error or Debug Message void -ErrorAlert(char* errorMessage) { - printf("%s\n", errorMessage); - BAlert* alert = new BAlert("BAlert", errorMessage, B_TRANSLATE("OK"), - NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); - alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); - alert->Go(); - exit(1); +MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into) +{ + dormant_node_info nodeInfo[64]; + int32 nodeInfoCount = 64; + + media_format format; + media_format* nodeInputFormat = NULL; + media_format* nodeOutputFormat = NULL; + format.type = type; + + // output nodes must be BBufferConsumers => they have an input format + // input nodes must be BBufferProducers => they have an output format + if ((kind & B_PHYSICAL_OUTPUT) != 0) + nodeInputFormat = &format; + else if ((kind & B_PHYSICAL_INPUT) != 0) + nodeOutputFormat = &format; + else + return; + + BMediaRoster* roster = BMediaRoster::Roster(); + + if (roster->GetDormantNodes(nodeInfo, &nodeInfoCount, nodeInputFormat, + nodeOutputFormat, NULL, kind) != B_OK) { + // TODO: better error reporting! + fprintf(stderr, "error\n"); + return; + } + + for (int32 i = 0; i < nodeInfoCount; i++) { + PRINT(("node : %s, media_addon %i, flavor_id %i\n", + nodeInfo[i].name, (int)nodeInfo[i].addon, + (int)nodeInfo[i].flavor_id)); + + dormant_node_info* info = new dormant_node_info(); + strncpy(info->name, nodeInfo[i].name, B_MEDIA_NAME_LENGTH); + info->flavor_id = nodeInfo[i].flavor_id; + info->addon = nodeInfo[i].addon; + into.AddItem(info); + } } void -MediaWindow::MessageReceived(BMessage* message) +MediaWindow::_AddNodeItems(NodeList& list, MediaListItem::media_type type) { - switch(message->what) - { - case ML_INIT_MEDIA: - InitMedia(false); - break; - case ML_RESTART_MEDIA_SERVER: - { - thread_id thread = spawn_thread(&MediaWindow::RestartMediaServices, - "restart_thread", B_NORMAL_PRIORITY, this); - if (thread < B_OK) - fprintf(stderr, "couldn't create restart thread\n"); - else - resume_thread(thread); - break; - } - case B_MEDIA_WEB_CHANGED: - case ML_SELECTED_NODE: - { - PRINT_OBJECT(*message); + int32 count = list.CountItems(); + for (int32 i = 0; i < count; i++) { + dormant_node_info* info = list.ItemAt(i); + if (_FindNodeListItem(info) == NULL) + fListView->AddItem(new NodeListItem(info, type)); + } +} - MediaListItem* item = static_cast<MediaListItem*>( - fListView->ItemAt(fListView->CurrentSelection())); - if (!item) - break; - fCurrentNode.SetTo(NULL); - _ClearParamView(); - item->AlterWindow(this); - break; - } - case B_SOME_APP_LAUNCHED: - { - PRINT_OBJECT(*message); - if (!fAlert) - break; - - BString mimeSig; - if (message->FindString("be:signature", &mimeSig) == B_OK - && (mimeSig == "application/x-vnd.Be.addon-host" - || mimeSig == "application/x-vnd.Be.media-server")) { - fAlert->Lock(); - fAlert->TextView()->SetText( - B_TRANSLATE("Starting media server" B_UTF8_ELLIPSIS)); - fAlert->Unlock(); - } - } - break; - case B_SOME_APP_QUIT: - { - PRINT_OBJECT(*message); - BString mimeSig; - if (message->FindString("be:signature", &mimeSig) == B_OK) { - if (mimeSig == "application/x-vnd.Be.addon-host" - || mimeSig == "application/x-vnd.Be.media-server") { - BMediaRoster* roster = BMediaRoster::CurrentRoster(); - if (roster && roster->Lock()) - roster->Quit(); - } - } +void +MediaWindow::_EmptyNodeLists() +{ + fAudioOutputs.MakeEmpty(); + fAudioInputs.MakeEmpty(); + fVideoOutputs.MakeEmpty(); + fVideoInputs.MakeEmpty(); +} - } - break; - default: - BWindow::MessageReceived(message); - break; + +NodeListItem* +MediaWindow::_FindNodeListItem(dormant_node_info* info) +{ + NodeListItem audioItem(info, MediaListItem::AUDIO_TYPE); + NodeListItem videoItem(info, MediaListItem::VIDEO_TYPE); + + NodeListItem::Comparator audioComparator(&audioItem); + NodeListItem::Comparator videoComparator(&videoItem); + + for (int32 i = 0; i < fListView->CountItems(); i++) { + MediaListItem* item = static_cast<MediaListItem*>(fListView->ItemAt(i)); + item->Accept(audioComparator); + if (audioComparator.result == 0) + return static_cast<NodeListItem*>(item); + + item->Accept(videoComparator); + if (videoComparator.result == 0) + return static_cast<NodeListItem*>(item); } + return NULL; } + +void +MediaWindow::_UpdateListViewMinWidth() +{ + float width = 0; + for (int32 i = 0; i < fListView->CountItems(); i++) { + BListItem* item = fListView->ItemAt(i); + width = max_c(width, item->Width()); + } + fListView->SetExplicitMinSize(BSize(width, B_SIZE_UNSET)); + fListView->InvalidateLayout(); +} + + status_t -MediaWindow::RestartMediaServices(void* data) +MediaWindow::_RestartMediaServices(void* data) { MediaWindow* window = (MediaWindow*)data; window->fAlert = new MediaAlert(BRect(0, 0, 300, 60), @@ -653,7 +638,7 @@ MediaWindow::RestartMediaServices(void* data) window->fAlert->Show(); - shutdown_media_server(B_INFINITE_TIMEOUT, MediaWindow::UpdateProgress, + shutdown_media_server(B_INFINITE_TIMEOUT, MediaWindow::_UpdateProgress, window->fAlert); { @@ -669,7 +654,7 @@ MediaWindow::RestartMediaServices(void* data) bool -MediaWindow::UpdateProgress(int stage, const char * message, void * cookie) +MediaWindow::_UpdateProgress(int stage, const char* message, void* cookie) { MediaAlert* alert = static_cast<MediaAlert*>(cookie); PRINT(("stage : %i\n", stage)); diff --git a/src/preferences/media/MediaWindow.h b/src/preferences/media/MediaWindow.h index ec3967d..7b03aa2 100644 --- a/src/preferences/media/MediaWindow.h +++ b/src/preferences/media/MediaWindow.h @@ -1,19 +1,13 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003, OpenBeOS -// -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -// -// -// File: MediaWindow.h -// Author: Sikosis, Jérôme Duval -// Description: Media Preferences -// Created : June 25, 2003 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -#ifndef __MEDIAWINDOWS_H__ -#define __MEDIAWINDOWS_H__ +/* + * Copyright 2003-2012, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Sikosis, Jérôme Duval + * yourpalal, Alex Wilson + */ +#ifndef MEDIA_WINDOW_H +#define MEDIA_WINDOW_H #include <ListView.h> @@ -35,14 +29,13 @@ class BCardLayout; class BSeparatorView; -// struct dormant_node_info; -class MediaWindow : public BWindow -{ +class MediaWindow : public BWindow { public: MediaWindow(BRect frame); ~MediaWindow(); + status_t InitCheck(); // methods to be called by MediaListItems... @@ -63,24 +56,23 @@ public: virtual void MessageReceived(BMessage* message); private: - typedef BObjectList<dormant_node_info> NodeList; + void _InitWindow(); + status_t _InitMedia(bool first); - status_t InitMedia(bool first); void _FindNodes(); void _FindNodes(media_type type, uint64 kind, - NodeList& into); + NodeList& into); void _AddNodeItems(NodeList &from, MediaListItem::media_type type); void _EmptyNodeLists(); void _UpdateListViewMinWidth(); NodeListItem* _FindNodeListItem(dormant_node_info* info); - void InitWindow(); - static status_t RestartMediaServices(void* data); - static bool UpdateProgress(int stage, const char * message, + static status_t _RestartMediaServices(void* data); + static bool _UpdateProgress(int stage, const char * message, void * cookie); void _ClearParamView(); @@ -90,6 +82,7 @@ private: struct SmartNode { SmartNode(const BMessenger& notifyHandler); ~SmartNode(); + void SetTo(const dormant_node_info* node); void SetTo(const media_node& node); bool IsSet(); @@ -100,24 +93,25 @@ private: media_node* fNode; BMessenger fMessenger; }; - + BListView* fListView; BSeparatorView* fTitleView; BCardLayout* fContentLayout; AudioSettingsView* fAudioView; VideoSettingsView* fVideoView; - + SmartNode fCurrentNode; BParameterWeb* fParamWeb; - + NodeList fAudioInputs; NodeList fAudioOutputs; NodeList fVideoInputs; NodeList fVideoOutputs; - + MediaAlert* fAlert; status_t fInitCheck; }; -#endif + +#endif // MEDIA_WINDOW_H ############################################################################ Revision: hrevr1alpha4-44607 Commit: 64911a689adf3fb7ce10f18d7c6a0ac1d8befc75 URL: http://cgit.haiku-os.org/haiku/commit/?id=64911a6 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Sun Sep 23 13:50:42 2012 UTC Committer: Ryan Leavengood <leavengood@xxxxxxxxx> Commit-Date: Mon Sep 24 03:00:10 2012 UTC Always set a minimum size for the list view. * Otherwise it doesn't look good when the media server is just being launched (so there are no nodes yet). ---------------------------------------------------------------------------- diff --git a/src/preferences/media/MediaWindow.cpp b/src/preferences/media/MediaWindow.cpp index 049b5cc..9590cb9 100644 --- a/src/preferences/media/MediaWindow.cpp +++ b/src/preferences/media/MediaWindow.cpp @@ -349,6 +349,7 @@ MediaWindow::_InitWindow() { fListView = new BListView("media_list_view"); fListView->SetSelectionMessage(new BMessage(ML_SELECTED_NODE)); + fListView->SetExplicitMinSize(BSize(140, B_SIZE_UNSET)); // Add ScrollView to Media Menu for pretty border BScrollView* scrollView = new BScrollView("listscroller",