如何找回打开文件/应用程序时丢失的忙光标?

如何找回打开文件/应用程序时丢失的忙光标?

有一个关于此问题的错误报告https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/862662,虽然最近我不确定这是否真的是 Nautilus 的错误。在安装 Precise 之前,我通过安装 PCManFM 进行了测试,以查看从它打开文件时是否在等待时显示忙光标,但忙光标仍然没有显示。

忙碌光标在 Oneiric 和 Precise Live USB 中均有效,在我之前使用 Oneiric 时,它也有效。然后,我安装了 Precise,保留了我的主文件夹未格式化,但问题仍然存在。我还尝试删除主文件夹中的配置文件夹和文件(实际上将其移动到一个文件夹中以便可以恢复),注销并重新登录,但问题仍然存在(在 Oneiric 中,我创建了一个新用户来查看这是否是配置问题,但也没有用)。

因此,考虑到忙碌光标在实时会话中起作用,有什么办法可以让忙光标在已安装的系统中正常工作(例如编辑某些系统配置)?

这是一个常见问题还是仅发生在特定硬件上?

答案1

解决此错误的两种可能方法:

  • 安装“gdm” 包安装程序会询问您喜欢的登录管理器,请选择“gdm”而不是“lightdm”。
  • 坚持使用 lightdm,但配置您的帐户,以便您不必输入密码即可登录。如果您的主文件夹已加密,那就没办法了。如果没有,请在系统设置面板的“用户帐户”部分下激活“自动登录”选项。

请注意,此解决方案并不完美。只有 GTK 应用程序在启动时才会出现忙光标。Qt 和其他应用程序(如 VLC 和 Libreoffice)仍然不会出现忙光标。

答案2

很快,另一个可能的解决方法:

查看/doc/startup-notification-devel-0.12/examples 索引并获取test-monitor.c;修改文件以使其匹配:

...
//#include <config.h>
#ifndef SN_API_NOT_YET_FROZEN
#define SN_API_NOT_YET_FROZEN
#endif
#include <libsn/sn.h>
...
int
main (int argc, char **argv)
{
  Display *xdisplay;
  SnDisplay *display;
  SnMonitorContext *context;

  setbuf (stdout, NULL);

  xdisplay = XOpenDisplay (NULL);
...

构建方式:

sudo apt-get install libstartup-notification0-dev
gcc -I/usr/include/startup-notification-1.0 test-monitor.c -o test-monitor -lX11 -lstartup-notification-1

然后:

$ sudo apt-get install python-osd
$ cat > osd.py <<"EOF" 
import pyosd # XOSD
import time
import sys
import os

# default_font="-*-helvetica-medium-r-normal-*-*-360-*-*-p-*-*-*"
# xlsfonts | less # to find fonts, say
# -misc-fixed-bold-r-normal--0-0-75-75-c-0-iso10646-1:
tfont="-*-fixed-bold-r-normal--*-*-100-*-c-*-*-*"
osd = pyosd.osd(font=tfont, colour='#FF0000', lines=3)
osd.set_align(pyosd.ALIGN_CENTER)
osd.set_pos(pyosd.POS_MID)
display = osd.display
osd.set_timeout(1)
# display will last as long the python program hasn't exited!
#display("Hello") 
#display(50, type=pyosd.TYPE_SLIDER, line=0) 

display("Hello from pyosd/XOSD", line=1)


# disable stdin buffering (ok on Python 2.7)
ttfo = os.fdopen(sys.stdin.fileno(), 'r', 0)

while 1:
  try:
    inline = ttfo.readline().rstrip()
  except KeyboardInterrupt:
    break
  if not inline:
    break
  print(inline)
  for ix in range(0,50):
    display(ix, type=pyosd.TYPE_PERCENT, line=0) 
    display(inline, line=1)
    display(ix, type=pyosd.TYPE_PERCENT, line=2) 
    time.sleep(0.02)
  time.sleep(1)
EOF

...并测试:

./test-monitor | stdbuf -oL grep description | python osd.py

添加/etc/lightdm/lightdm.conf;session-setup-script=/path/to/mylightdm-startup.sh并在 mylightdm-startup.sh` 中:

SND=/path/to/folder
($SND/test-monitor | stdbuf -oL grep description | python $SND/osd.py) &

这应该会给你一个简单的屏幕显示通知;另一个(更复杂)的可能性是使用Ghosd——具有透明度的屏幕显示(OSD)(还这里)。

答案3

如果您使用 lightdm 登录管理器,则会出现此错误。此错误由 lightdm、GDK3 和 Xorg 的规范协调,详情请参阅启动板错误 #1024482

要修复此问题,您必须设置GDK_CORE_DEVICE_EVENTS环境变量,使得 GDK3 不会错误地使用 Xorg 调用。

echo "GDK_CORE_DEVICE_EVENTS=true" | sudo tee ~lightdm/.pam_environment

相关内容