magiclinux中自动运行补丁的错误及我的补丁
magiclinux中自动运行补丁的错误及我的补丁一、关于旧补丁与我新补丁的工作原理比较
1、kdebase-3.4.1_autoplay.patch
缘起
这个补丁让我感兴趣是因为我这两天把原来笔记本中的硬盘扩充到60g,然后把原来40g
的装到移动硬盘盒中,然后插到magiclinux中,因为原来的硬盘有四个分区所以自动弹出时,
莫名奇妙的不断的弹出窗口,奇怪的是四个分区应该最多弹出四个浏览窗口,但是它却弹出十
个左右的浏览窗口来。
lovewilliam的dirty hack
于是我研究了一下kdebase-3.4.1_autoplay.patch这个补丁,因为大略的阅读了一下,
评述有不当的地方还请原谅,可爱的william在KDE代码kdebase/kioslave/media代码的两处回调
函数中调用了createMediumEntry这个函数,该函数继续调用原作者的automount_autoplay函数,
该函数负责处理外围设备的挂载和播放。上面说的两处回调:一个是列举外围媒体设备时调用;
另一处是查询外围设备挂载点等信息时调用,我觉得这两个地方都不是理想的设备挂载和自动播
放的地方,一个原因时造成时间的延误,另一个就是上面那个莫名奇妙的被其他代码调用弹出多
个窗口出来。
2、kde-3.4.2-media-autoplayer_wj.diff
缘灭
学习lovewilliam代码中的方法,在KDE代码中找更加合适的挂接点,重写自己的发现的
较理想方法代码
我的较干净的补丁
在代码kdebase/kioslave/media/kdedmodule/mediamanager.cpp中发现不管是HAL还是监
视fstab的方法发现添加新设备都会调用MediaManager的插桩函数slotMediumAdded,该函数负责
向外发送发现并添加的新设备的通知,于是我在该函数中实现了自己的设备挂载和播放的补丁。
说明:
该补丁通过读<HOME>/.kde/autorun配置文件来设置新设备添加以后的操作,只要发现该
文件就会装载该文件并按类型装载新设备的处理方法,如果将该文件删除就不会对新设备做挂载
和播放等操作。
配置文件如下:
<HOME>/.kde/autorun
#
#按文件类型自动运行外围设备配置文件
#
#说明: 配置文件以单行为一个配置信息,KDE环境发现新设备时会按配置信息指定的"设备类型"
# 执行后面的"加载新设备的操作语句",在装载的程序中有默认的几个操作(见下面),
# 当在autorun中未定制操作时,会按默认操作运行。
#命名: 文件命名为 <HOME>/.kde/autorun,如果不存在该文件,KDE中装载模块不会进行自动
# 操作,哪怕是默认操作,所以该文件实际上是自动挂载和运行的开关。
#格式: "设备类型"="加载新设备的操作语句"
#"设备类型"包括:
# media/audiocd -- 音频CD 默认操作:"kaffeine AudioCD"
# media/svcd -- VCD? 默认操作:"kaffeine VCD"
# media/vcd -- VCD 默认操作:"kaffeine VCD"
# media/dvdvideo -- DVD 默认操作:"kaffeine DVD"
# media/cdrom_unmounted -- 未挂载的cdrom 默认操作:"pmount -t %t %d"
# media/dvd_unmounted -- 未挂载的dvdrom 默认操作:"pmount -t %t %d"
# media/blankcd -- 空白CD 默认操作:"k3b"
# media/blankdvd -- 空白DVD 默认操作:"k3b"
# media/removable_unmounted -- 未挂载的USB移动盘 默认操作:"pmount -t %t %d"
# media/gphoto2camera -- 数码相机存储卡 默认操作:"pmount -t %t %d"
# 更多类型参看kdebase-3.4.2/kioslave/media/mimetypes/目录中.desktop文件
#"加载新设备的操作语句"中的参数:
# %d -- 某设备设备文件名称比如:/dev/sda1
# %t -- 某设备文件系统类型比如:vfat、ntfs等
# %p -- HAL提供的挂载点 不可靠,尽量不要用
#这个操作是按发现的usb盘的文件系统和设备信息挂载usb盘,然后用konqueror打开该挂载的目录
"media/removable_unmounted"="pmount -t %t %d && konqueror `mount | grep -i %d | awk -F' ' '{print $3}'` &"
#对cdrom操作,内容同上
"media/cdrom_unmounted"="pmount -t %t %d %p && konqueror `mount | grep -i %d | awk -F' ' '{print $3}'` &"
#对dvd操作,内容同上
"media/dvd_unmounted"="pmount -t %t %d %p && konqueror `mount | grep -i %d | awk -F' ' '{print $3}'` &" 忘记说了,打这个补丁要把原来的卸掉
patch -R -p1 < kdebase-3.4.1_autoplay.patch 很不错呀,顶一下,开发组的看到这个帖子了吗?吭个声。 我不是开发组的,不过我看到了,吭一声。 :-D
不知道这个包是谁在维护,相信能看到的。 又更新了几个地方,上面的补丁已更新,
现在:
如果配置文件中写成这样,比如usb移动硬盘
"media/removable_unmounted"=""
将对这类新发现的硬件不做任何操作。 不好意思,昨天俺没在。
wall_john ,配置文件最好配合 Magiconf 里的定义写,这样俺用这个补丁时要省很多事,大家配置起来也方便的多:mrgreen:
这个已经用不着了
看看kde3.5中官方新添加的功能,类似与winXP,自动运行外设。见贴图 看样子不错。不过不知对 hal-0.5.x 的支持如何。 :P 我用的还是0.4.8的,0.5.x应该没问题吧,有空我再测一下,
不过现在还为时过早,kde-3.5还只是alpha版,不过用konstruct
编译出来还是挺稳定的。 嗯,我等正式版出来再编译。没那么多时间:P
你有时间便帮忙看一下 kaffeine 嵌入 konqueror 引起崩溃的问题吧。问题我想可能是出在 XInitThreads()这个函数上。
ML的 kaffeine 编译用了 --with-xinit-workaround 参数,这样其打开时不会运行 XInitThreads() ,避免了在 kaffeine 的播放列表过滤器上打开输入法会死锁的问题。 领命 :twisted: 太感谢了:P hal 0.5.x 能在kde3.5beta1下使用,看了看代码,其中
kdebase-3.4.91/kioslave/media/mediamanager/halbackend.h:
/* The HAL API changed between 0.4 and 0.5 series.
These defines enable backward compatibility */
#ifdef HAL_0_4
// libhal-storage 0.4 API
#define LibHalStoragePolicy HalStoragePolicy
#define LibHalDrive HalDrive
#define LibHalVolume HalVolume
#define LibHalVolumeDiscType HalVolumeDiscType
#define libhal_storage_policy_free hal_storage_policy_free
#define libhal_storage_policy_new hal_storage_policy_new
#define libhal_drive_from_udi hal_drive_from_udi
#define libhal_drive_find_all_volumes hal_drive_find_all_volumes
#define libhal_drive_get_type hal_drive_get_type
#define libhal_drive_get_device_file hal_drive_get_device_file
#define libhal_drive_free hal_drive_free
#define libhal_drive_policy_compute_display_name hal_drive_policy_compute_display_name
#define libhal_drive_is_hotpluggable hal_drive_is_hotpluggable
#define libhal_drive_get_physical_device_udi hal_drive_get_physical_device_udi
#define libhal_volume_from_udi hal_volume_from_udi
#define libhal_volume_get_device_file hal_volume_get_device_file
#define libhal_volume_get_mount_point hal_volume_get_mount_point
#define libhal_volume_get_fstype hal_volume_get_fstype
#define libhal_volume_is_mounted hal_volume_is_mounted
#define libhal_volume_get_disc_type hal_volume_get_disc_type
#define libhal_volume_free hal_volume_free
#define libhal_volume_policy_compute_display_name hal_volume_policy_compute_display_name
#define libhal_volume_disc_has_data hal_volume_disc_has_data
#define libhal_volume_disc_has_audio hal_volume_disc_has_audio
#define libhal_volume_disc_is_blank hal_volume_disc_is_blank
#define libhal_volume_is_disc hal_volume_is_disc
#define libhal_volume_get_storage_device_udi hal_volume_get_storage_device_udi
#define LIBHAL_VOLUME_DISC_TYPE_CDROM HAL_VOLUME_DISC_TYPE_CDROM
#define LIBHAL_VOLUME_DISC_TYPE_CDR HAL_VOLUME_DISC_TYPE_CDR
#define LIBHAL_VOLUME_DISC_TYPE_CDRW HAL_VOLUME_DISC_TYPE_CDRW
#define LIBHAL_VOLUME_DISC_TYPE_DVDROM HAL_VOLUME_DISC_TYPE_DVDROM
#define LIBHAL_VOLUME_DISC_TYPE_DVDRAM HAL_VOLUME_DISC_TYPE_DVDRAM
#define LIBHAL_VOLUME_DISC_TYPE_DVDR HAL_VOLUME_DISC_TYPE_DVDR
#define LIBHAL_VOLUME_DISC_TYPE_DVDRW HAL_VOLUME_DISC_TYPE_DVDRW
#define LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR HAL_VOLUME_DISC_TYPE_DVDPLUSR
#define LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW HAL_VOLUME_DISC_TYPE_DVDPLUSRW
#define LIBHAL_DRIVE_TYPE_COMPACT_FLASH HAL_DRIVE_TYPE_COMPACT_FLASH
#define LIBHAL_DRIVE_TYPE_MEMORY_STICK HAL_DRIVE_TYPE_MEMORY_STICK
#define LIBHAL_DRIVE_TYPE_SMART_MEDIA HAL_DRIVE_TYPE_SMART_MEDIA
#define LIBHAL_DRIVE_TYPE_SD_MMC HAL_DRIVE_TYPE_SD_MMC
#define LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER HAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER
#define LIBHAL_DRIVE_TYPE_CAMERA HAL_DRIVE_TYPE_CAMERA
#define LIBHAL_DRIVE_TYPE_TAPE HAL_DRIVE_TYPE_TAPE
// libhal 0.4 API
#define libhal_free_string hal_free_string
#define libhal_device_exists(ctx, udi, error) hal_device_exists(ctx, udi)
#define libhal_device_property_watch_all(ctx, error) hal_device_property_watch_all(ctx)
#define libhal_get_all_devices(ctx, num_devices, error) hal_get_all_devices(ctx, num_devices)
#define libhal_device_property_exists(ctx, udi, key, error) hal_device_property_exists(ctx, udi, key)
#define libhal_device_get_property_bool(ctx, udi, key, error) hal_device_get_property_bool(ctx, udi, key)
#define libhal_device_get_property_string(ctx, udi, key, error) hal_device_get_property_string(ctx, udi, key)
#define libhal_device_query_capability(ctx, udi, capability, error) hal_device_query_capability(ctx, udi, capability)
#endif
这标明了hal-0.4.x与hal-0.5.x的区别,另外,这个脚本:
/usr/share/hal/fdi/policy/10osvendor/60-pmount-hal.fdi
在kde3.5中不要了,这个脚本是自动mount新发现设备的,因为kde3.5会自动处理。 强啊,希望Magic多一些编程的大牛 :-)
页:
[1]