QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1532|回复: 13

magiclinux中自动运行补丁的错误及我的补丁

[复制链接]
发表于 2005-8-18 21:49:14 | 显示全部楼层 |阅读模式
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}'` &"

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2005-8-18 22:15:11 | 显示全部楼层
忘记说了,打这个补丁要把原来的卸掉
patch -R -p1 < kdebase-3.4.1_autoplay.patch
回复

使用道具 举报

发表于 2005-8-19 07:31:47 | 显示全部楼层
很不错呀,顶一下,开发组的看到这个帖子了吗?吭个声。
回复

使用道具 举报

发表于 2005-8-19 08:06:18 | 显示全部楼层
我不是开发组的,不过我看到了,吭一声。

不知道这个包是谁在维护,相信能看到的。
回复

使用道具 举报

 楼主| 发表于 2005-8-19 08:59:17 | 显示全部楼层
又更新了几个地方,上面的补丁已更新,
现在:
如果配置文件中写成这样,比如usb移动硬盘
"media/removable_unmounted"=""
将对这类新发现的硬件不做任何操作。
回复

使用道具 举报

发表于 2005-8-19 09:52:38 | 显示全部楼层
不好意思,昨天俺没在。
wall_john ,配置文件最好配合 Magiconf 里的定义写,这样俺用这个补丁时要省很多事,大家配置起来也方便的多  
回复

使用道具 举报

 楼主| 发表于 2005-9-19 00:57:04 | 显示全部楼层

这个已经用不着了

看看kde3.5中官方新添加的功能,类似与winXP,自动运行外设。
见贴图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2005-9-19 01:09:41 | 显示全部楼层
看样子不错。不过不知对 hal-0.5.x 的支持如何。
回复

使用道具 举报

 楼主| 发表于 2005-9-19 01:18:13 | 显示全部楼层
我用的还是0.4.8的,0.5.x应该没问题吧,有空我再测一下,
不过现在还为时过早,kde-3.5还只是alpha版,不过用konstruct
编译出来还是挺稳定的。
回复

使用道具 举报

发表于 2005-9-19 01:31:41 | 显示全部楼层
嗯,我等正式版出来再编译。没那么多时间  
你有时间便帮忙看一下 kaffeine 嵌入 konqueror 引起崩溃的问题吧。问题我想可能是出在 XInitThreads()  这个函数上。

ML的 kaffeine 编译用了 --with-xinit-workaround 参数,这样其打开时不会运行 XInitThreads() ,避免了在 kaffeine 的播放列表过滤器上打开输入法会死锁的问题。
回复

使用道具 举报

 楼主| 发表于 2005-9-19 01:36:32 | 显示全部楼层
领命
回复

使用道具 举报

发表于 2005-9-19 01:42:22 | 显示全部楼层
太感谢了  
回复

使用道具 举报

 楼主| 发表于 2005-10-6 20:28:01 | 显示全部楼层
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会自动处理。
回复

使用道具 举报

发表于 2005-10-6 20:40:39 | 显示全部楼层
强啊,希望Magic多一些编程的大牛 :-)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-25 21:31 , Processed in 0.087821 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表