• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • khtml
 

khtml

  • khtml
khtml_ext.cpp
1 // -*- c-basic-offset: 2 -*-
2 /* This file is part of the KDE project
3  *
4  * Copyright (C) 2000-2003 Simon Hausmann <hausmann@kde.org>
5  * 2001-2003 George Staikos <staikos@kde.org>
6  * 2001-2003 Laurent Montel <montel@kde.org>
7  * 2001-2003 Dirk Mueller <mueller@kde.org>
8  * 2001-2003 Waldo Bastian <bastian@kde.org>
9  * 2001-2003 David Faure <faure@kde.org>
10  * 2001-2003 Daniel Naber <dnaber@kde.org>
11  *
12  * This library is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Library General Public
14  * License as published by the Free Software Foundation; either
15  * version 2 of the License, or (at your option) any later version.
16  *
17  * This library is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Library General Public License for more details.
21  *
22  * You should have received a copy of the GNU Library General Public License
23  * along with this library; see the file COPYING.LIB. If not, write to
24  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25  * Boston, MA 02110-1301, USA.
26  */
27 
28 #include <assert.h>
29 #include "khtml_ext.h"
30 #include "khtmlview.h"
31 #include "khtml_pagecache.h"
32 #include "rendering/render_form.h"
33 #include "rendering/render_image.h"
34 #include "html/html_imageimpl.h"
35 #include "misc/loader.h"
36 #include "dom/html_form.h"
37 #include "dom/html_image.h"
38 #include <tqclipboard.h>
39 #include <tqfileinfo.h>
40 #include <tqpopupmenu.h>
41 #include <tqurl.h>
42 #include <tqmetaobject.h>
43 #include <tqucomextra_p.h>
44 #include <tqdragobject.h>
45 
46 #include <kdebug.h>
47 #include <klocale.h>
48 #include <kfiledialog.h>
49 #include <kio/job.h>
50 #include <kprocess.h>
51 #include <ktoolbarbutton.h>
52 #include <ktoolbar.h>
53 #include <ksavefile.h>
54 #include <kurldrag.h>
55 #include <kstringhandler.h>
56 #include <kapplication.h>
57 #include <kmessagebox.h>
58 #include <kstandarddirs.h>
59 #include <krun.h>
60 #include <kurifilter.h>
61 #include <kiconloader.h>
62 #include <kdesktopfile.h>
63 #include <kmultipledrag.h>
64 #include <kinputdialog.h>
65 
66 #include "khtml_factory.h"
67 
68 #include "dom/dom_element.h"
69 #include "misc/htmltags.h"
70 
71 #include "khtmlpart_p.h"
72 
73 KHTMLPartBrowserExtension::KHTMLPartBrowserExtension( KHTMLPart *parent, const char *name )
74 : KParts::BrowserExtension( parent, name )
75 {
76  m_part = parent;
77  setURLDropHandlingEnabled( true );
78 
79  enableAction( "cut", false );
80  enableAction( "copy", false );
81  enableAction( "paste", false );
82 
83  m_connectedToClipboard = false;
84 }
85 
86 int KHTMLPartBrowserExtension::xOffset()
87 {
88  return m_part->view()->contentsX();
89 }
90 
91 int KHTMLPartBrowserExtension::yOffset()
92 {
93  return m_part->view()->contentsY();
94 }
95 
96 void KHTMLPartBrowserExtension::saveState( TQDataStream &stream )
97 {
98  //kdDebug( 6050 ) << "saveState!" << endl;
99  m_part->saveState( stream );
100 }
101 
102 void KHTMLPartBrowserExtension::restoreState( TQDataStream &stream )
103 {
104  //kdDebug( 6050 ) << "restoreState!" << endl;
105  m_part->restoreState( stream );
106 }
107 
108 void KHTMLPartBrowserExtension::editableWidgetFocused( TQWidget *widget )
109 {
110  m_editableFormWidget = widget;
111  updateEditActions();
112 
113  if ( !m_connectedToClipboard && m_editableFormWidget )
114  {
115  connect( TQApplication::clipboard(), TQT_SIGNAL( dataChanged() ),
116  this, TQT_SLOT( updateEditActions() ) );
117 
118  if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) || m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) )
119  connect( m_editableFormWidget, TQT_SIGNAL( selectionChanged() ),
120  this, TQT_SLOT( updateEditActions() ) );
121 
122  m_connectedToClipboard = true;
123  }
124  editableWidgetFocused();
125 }
126 
127 void KHTMLPartBrowserExtension::editableWidgetBlurred( TQWidget * /*widget*/ )
128 {
129  TQWidget *oldWidget = m_editableFormWidget;
130 
131  m_editableFormWidget = 0;
132  enableAction( "cut", false );
133  enableAction( "paste", false );
134  m_part->emitSelectionChanged();
135 
136  if ( m_connectedToClipboard )
137  {
138  disconnect( TQApplication::clipboard(), TQT_SIGNAL( dataChanged() ),
139  this, TQT_SLOT( updateEditActions() ) );
140 
141  if ( oldWidget )
142  {
143  if ( oldWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) || oldWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) )
144  disconnect( oldWidget, TQT_SIGNAL( selectionChanged() ),
145  this, TQT_SLOT( updateEditActions() ) );
146  }
147 
148  m_connectedToClipboard = false;
149  }
150  editableWidgetBlurred();
151 }
152 
153 void KHTMLPartBrowserExtension::setExtensionProxy( KParts::BrowserExtension *proxy )
154 {
155  if ( m_extensionProxy )
156  {
157  disconnect( m_extensionProxy, TQT_SIGNAL( enableAction( const char *, bool ) ),
158  this, TQT_SLOT( extensionProxyActionEnabled( const char *, bool ) ) );
159  if ( m_extensionProxy->inherits( "KHTMLPartBrowserExtension" ) )
160  {
161  disconnect( m_extensionProxy, TQT_SIGNAL( editableWidgetFocused() ),
162  this, TQT_SLOT( extensionProxyEditableWidgetFocused() ) );
163  disconnect( m_extensionProxy, TQT_SIGNAL( editableWidgetBlurred() ),
164  this, TQT_SLOT( extensionProxyEditableWidgetBlurred() ) );
165  }
166  }
167 
168  m_extensionProxy = proxy;
169 
170  if ( m_extensionProxy )
171  {
172  connect( m_extensionProxy, TQT_SIGNAL( enableAction( const char *, bool ) ),
173  this, TQT_SLOT( extensionProxyActionEnabled( const char *, bool ) ) );
174  if ( m_extensionProxy->inherits( "KHTMLPartBrowserExtension" ) )
175  {
176  connect( m_extensionProxy, TQT_SIGNAL( editableWidgetFocused() ),
177  this, TQT_SLOT( extensionProxyEditableWidgetFocused() ) );
178  connect( m_extensionProxy, TQT_SIGNAL( editableWidgetBlurred() ),
179  this, TQT_SLOT( extensionProxyEditableWidgetBlurred() ) );
180  }
181 
182  enableAction( "cut", m_extensionProxy->isActionEnabled( "cut" ) );
183  enableAction( "copy", m_extensionProxy->isActionEnabled( "copy" ) );
184  enableAction( "paste", m_extensionProxy->isActionEnabled( "paste" ) );
185  }
186  else
187  {
188  updateEditActions();
189  enableAction( "copy", false ); // ### re-check this
190  }
191 }
192 
193 void KHTMLPartBrowserExtension::cut()
194 {
195  if ( m_extensionProxy )
196  {
197  callExtensionProxyMethod( "cut()" );
198  return;
199  }
200 
201  if ( !m_editableFormWidget )
202  return;
203 
204  if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) )
205  static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->cut();
206  else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) )
207  static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->cut();
208 }
209 
210 void KHTMLPartBrowserExtension::copy()
211 {
212  if ( m_extensionProxy )
213  {
214  callExtensionProxyMethod( "copy()" );
215  return;
216  }
217 
218  kdDebug( 6050 ) << "************! KHTMLPartBrowserExtension::copy()" << endl;
219  if ( !m_editableFormWidget )
220  {
221  // get selected text and paste to the clipboard
222  TQString text= m_part->selectedText();
223  text.replace( TQChar( 0xa0 ), ' ' );
224 
225 
226  TQClipboard *cb = TQApplication::clipboard();
227  disconnect( cb, TQT_SIGNAL( selectionChanged() ), m_part, TQT_SLOT( slotClearSelection() ) );
228 #ifndef QT_NO_MIMECLIPBOARD
229  TQString htmltext;
230  /*
231  * When selectionModeEnabled, that means the user has just selected
232  * the text, not ctrl+c to copy it. The selection clipboard
233  * doesn't seem to support mime type, so to save time, don't calculate
234  * the selected text as html.
235  * optomisation disabled for now until everything else works.
236  */
237  //if(!cb->selectionModeEnabled())
238  htmltext = m_part->selectedTextAsHTML();
239  TQTextDrag *textdrag = new TQTextDrag(text, 0L);
240  KMultipleDrag *drag = new KMultipleDrag( m_editableFormWidget );
241  drag->addDragObject( textdrag );
242  if(!htmltext.isEmpty()) {
243  htmltext.replace( TQChar( 0xa0 ), ' ' );
244  TQTextDrag *htmltextdrag = new TQTextDrag(htmltext, 0L);
245  htmltextdrag->setSubtype("html");
246  drag->addDragObject( htmltextdrag );
247  }
248  cb->setData(drag);
249 #else
250  cb->setText(text);
251 #endif
252 
253  connect( cb, TQT_SIGNAL( selectionChanged() ), m_part, TQT_SLOT( slotClearSelection() ) );
254  }
255  else
256  {
257  if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) )
258  static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->copy();
259  else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) )
260  static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->copy();
261  }
262 }
263 
264 void KHTMLPartBrowserExtension::searchProvider()
265 {
266  // action name is of form "previewProvider[<searchproviderprefix>:]"
267  const TQString searchProviderPrefix = TQString( TQT_TQOBJECT_CONST(sender())->name() ).mid( 14 );
268 
269  KURIFilterData data;
270  TQStringList list;
271  data.setData( searchProviderPrefix + m_part->selectedText() );
272  list << "kurisearchfilter" << "kuriikwsfilter";
273 
274  if( !KURIFilter::self()->filterURI(data, list) )
275  {
276  KDesktopFile file("searchproviders/google.desktop", true, "services");
277  TQString encodedSearchTerm = m_part->selectedText();
278  TQUrl::encode(encodedSearchTerm);
279  data.setData(file.readEntry("Query").replace("\\{@}", encodedSearchTerm));
280  }
281 
282  KParts::URLArgs args;
283  args.frameName = "_blank";
284 
285  emit m_part->browserExtension()->openURLRequest( data.uri(), args );
286 }
287 
288 void KHTMLPartBrowserExtension::openSelection()
289 {
290  KParts::URLArgs args;
291  args.frameName = "_blank";
292 
293  emit m_part->browserExtension()->openURLRequest( m_part->selectedText(), args );
294 }
295 
296 void KHTMLPartBrowserExtension::paste()
297 {
298  if ( m_extensionProxy )
299  {
300  callExtensionProxyMethod( "paste()" );
301  return;
302  }
303 
304  if ( !m_editableFormWidget )
305  return;
306 
307  if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) )
308  static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->paste();
309  else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) )
310  static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->paste();
311 }
312 
313 void KHTMLPartBrowserExtension::callExtensionProxyMethod( const char *method )
314 {
315  if ( !m_extensionProxy )
316  return;
317 
318  int slot = m_extensionProxy->metaObject()->findSlot( method );
319  if ( slot == -1 )
320  return;
321 
322  TQUObject o[ 1 ];
323  m_extensionProxy->qt_invoke( slot, o );
324 }
325 
326 void KHTMLPartBrowserExtension::updateEditActions()
327 {
328  if ( !m_editableFormWidget )
329  {
330  enableAction( "cut", false );
331  enableAction( "copy", false );
332  enableAction( "paste", false );
333  return;
334  }
335 
336  // ### duplicated from KonqMainWindow::slotClipboardDataChanged
337 #ifndef QT_NO_MIMECLIPBOARD // Handle minimalized versions of Qt Embedded
338  TQMimeSource *data = TQApplication::clipboard()->data();
339  enableAction( "paste", data->provides( "text/plain" ) );
340 #else
341  TQString data=TQApplication::clipboard()->text();
342  enableAction( "paste", data.contains("://"));
343 #endif
344  bool hasSelection = false;
345 
346  if( m_editableFormWidget) {
347  if ( ::tqqt_cast<TQLineEdit*>(m_editableFormWidget))
348  hasSelection = static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->hasSelectedText();
349  else if(::tqqt_cast<TQTextEdit*>(m_editableFormWidget))
350  hasSelection = static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->hasSelectedText();
351  }
352 
353  enableAction( "copy", hasSelection );
354  enableAction( "cut", hasSelection );
355 }
356 
357 void KHTMLPartBrowserExtension::extensionProxyEditableWidgetFocused() {
358  editableWidgetFocused();
359 }
360 
361 void KHTMLPartBrowserExtension::extensionProxyEditableWidgetBlurred() {
362  editableWidgetBlurred();
363 }
364 
365 void KHTMLPartBrowserExtension::extensionProxyActionEnabled( const char *action, bool enable )
366 {
367  // only forward enableAction calls for actions we actually do forward
368  if ( strcmp( action, "cut" ) == 0 ||
369  strcmp( action, "copy" ) == 0 ||
370  strcmp( action, "paste" ) == 0 ) {
371  enableAction( action, enable );
372  }
373 }
374 
375 void KHTMLPartBrowserExtension::reparseConfiguration()
376 {
377  m_part->reparseConfiguration();
378 }
379 
380 void KHTMLPartBrowserExtension::print()
381 {
382  m_part->view()->print();
383 }
384 
385 void KHTMLPartBrowserExtension::disableScrolling()
386 {
387  TQScrollView *scrollView = m_part->view();
388  if (scrollView) {
389  scrollView->setVScrollBarMode(TQScrollView::AlwaysOff);
390  scrollView->setHScrollBarMode(TQScrollView::AlwaysOff);
391  }
392 }
393 
394 class KHTMLPopupGUIClient::KHTMLPopupGUIClientPrivate
395 {
396 public:
397  KHTMLPart *m_khtml;
398  KURL m_url;
399  KURL m_imageURL;
400  TQPixmap m_pixmap;
401  TQString m_suggestedFilename;
402 };
403 
404 
405 KHTMLPopupGUIClient::KHTMLPopupGUIClient( KHTMLPart *khtml, const TQString &doc, const KURL &url )
406  : TQObject( khtml )
407 {
408  d = new KHTMLPopupGUIClientPrivate;
409  d->m_khtml = khtml;
410  d->m_url = url;
411  bool isImage = false;
412  bool hasSelection = khtml->hasSelection();
413  setInstance( khtml->instance() );
414 
415  DOM::Element e;
416  e = khtml->nodeUnderMouse();
417 
418  if ( !e.isNull() && (e.elementId() == ID_IMG ||
419  (e.elementId() == ID_INPUT && !static_cast<DOM::HTMLInputElement>(e).src().isEmpty())))
420  {
421  if (e.elementId() == ID_IMG) {
422  DOM::HTMLImageElementImpl *ie = static_cast<DOM::HTMLImageElementImpl*>(e.handle());
423  khtml::RenderImage *ri = dynamic_cast<khtml::RenderImage*>(ie->renderer());
424  if (ri && ri->contentObject()) {
425  d->m_suggestedFilename = static_cast<khtml::CachedImage*>(ri->contentObject())->suggestedFilename();
426  }
427  }
428  isImage=true;
429  }
430 
431  if (hasSelection)
432  {
433  KAction* copyAction = KStdAction::copy( d->m_khtml->browserExtension(), TQT_SLOT( copy() ), actionCollection(), "copy" );
434  copyAction->setText(i18n("&Copy Text"));
435  copyAction->setEnabled(d->m_khtml->browserExtension()->isActionEnabled( "copy" ));
436  actionCollection()->insert( khtml->actionCollection()->action( "selectAll" ) );
437 
438 
439  // Fill search provider entries
440  KConfig config("kuriikwsfilterrc");
441  config.setGroup("General");
442  const TQString defaultEngine = config.readEntry("DefaultSearchEngine", "google");
443  const char keywordDelimiter = config.readNumEntry("KeywordDelimiter", ':');
444 
445  // search text
446  TQString selectedText = khtml->selectedText();
447  selectedText.replace("&", "&&");
448  if ( selectedText.length()>18 ) {
449  selectedText.truncate(15);
450  selectedText+="...";
451  }
452 
453  // default search provider
454  KService::Ptr service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(defaultEngine));
455 
456  // search provider icon
457  TQPixmap icon;
458  KURIFilterData data;
459  TQStringList list;
460  data.setData( TQString("some keyword") );
461  list << "kurisearchfilter" << "kuriikwsfilter";
462 
463  TQString name;
464  if ( KURIFilter::self()->filterURI(data, list) )
465  {
466  TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png");
467  if ( iconPath.isEmpty() )
468  icon = SmallIcon("find");
469  else
470  icon = TQPixmap( iconPath );
471  name = service->name();
472  }
473  else
474  {
475  icon = SmallIcon("google");
476  name = "Google";
477  }
478 
479  // using .arg(foo, bar) instead of .arg(foo).arg(bar), as foo can contain %x
480  new KAction( i18n( "Search for '%1' with %2" ).arg( selectedText, name ), icon, 0, d->m_khtml->browserExtension(),
481  TQT_SLOT( searchProvider() ), actionCollection(), "searchProvider" );
482 
483  // favorite search providers
484  TQStringList favoriteEngines;
485  favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia";
486  favoriteEngines = config.readListEntry("FavoriteSearchEngines", favoriteEngines);
487 
488  if ( !favoriteEngines.isEmpty()) {
489  KActionMenu* providerList = new KActionMenu( i18n( "Search for '%1' with" ).arg( selectedText ), actionCollection(), "searchProviderList" );
490 
491  TQStringList::ConstIterator it = favoriteEngines.begin();
492  for ( ; it != favoriteEngines.end(); ++it ) {
493  if (*it==defaultEngine)
494  continue;
495  service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(*it));
496  if (!service)
497  continue;
498  const TQString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter;
499  data.setData( searchProviderPrefix + "some keyword" );
500 
501  if ( KURIFilter::self()->filterURI(data, list) )
502  {
503  TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png");
504  if ( iconPath.isEmpty() )
505  icon = SmallIcon("find");
506  else
507  icon = TQPixmap( iconPath );
508  name = service->name();
509 
510  providerList->insert( new KAction( name, icon, 0, d->m_khtml->browserExtension(),
511  TQT_SLOT( searchProvider() ), actionCollection(), TQString( "searchProvider" + searchProviderPrefix ).latin1() ) );
512  }
513  }
514  }
515 
516 
517  if ( selectedText.contains("://") && KURL(selectedText).isValid() )
518  new KAction( i18n( "Open '%1'" ).arg( selectedText ), "window_new", 0,
519  d->m_khtml->browserExtension(), TQT_SLOT( openSelection() ), actionCollection(), "openSelection" );
520  }
521  else if ( url.isEmpty() && !isImage )
522  {
523  actionCollection()->insert( khtml->actionCollection()->action( "security" ) );
524  actionCollection()->insert( khtml->actionCollection()->action( "setEncoding" ) );
525  new KAction( i18n( "Stop Animations" ), 0, this, TQT_SLOT( slotStopAnimations() ),
526  actionCollection(), "stopanimations" );
527  }
528 
529  if ( !url.isEmpty() )
530  {
531  if (url.protocol() == "mailto")
532  {
533  new KAction( i18n( "Copy Email Address" ), 0, this, TQT_SLOT( slotCopyLinkLocation() ),
534  actionCollection(), "copylinklocation" );
535  }
536  else
537  {
538  new KAction( i18n( "&Save Link As..." ), 0, this, TQT_SLOT( slotSaveLinkAs() ),
539  actionCollection(), "savelinkas" );
540  new KAction( i18n( "Copy &Link Address" ), 0, this, TQT_SLOT( slotCopyLinkLocation() ),
541  actionCollection(), "copylinklocation" );
542  }
543  }
544 
545  // frameset? -> add "Reload Frame" etc.
546  if (!hasSelection)
547  {
548  if ( khtml->parentPart() )
549  {
550  new KAction( i18n( "Open in New &Window" ), "window_new", 0, this, TQT_SLOT( slotFrameInWindow() ),
551  actionCollection(), "frameinwindow" );
552  new KAction( i18n( "Open in &This Window" ), 0, this, TQT_SLOT( slotFrameInTop() ),
553  actionCollection(), "frameintop" );
554  new KAction( i18n( "Open in &New Tab" ), "tab_new", 0, this, TQT_SLOT( slotFrameInTab() ),
555  actionCollection(), "frameintab" );
556  new KAction( i18n( "Reload Frame" ), 0, this, TQT_SLOT( slotReloadFrame() ),
557  actionCollection(), "reloadframe" );
558 
559  if ( KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled() ) {
560  if ( khtml->d->m_frame->m_type == khtml::ChildFrame::IFrame )
561  new KAction( i18n( "Block IFrame..." ), 0, this, TQT_SLOT( slotBlockIFrame() ), actionCollection(), "blockiframe" );
562  }
563 
564  new KAction( i18n( "View Frame Source" ), 0, d->m_khtml, TQT_SLOT( slotViewDocumentSource() ),
565  actionCollection(), "viewFrameSource" );
566  new KAction( i18n( "View Frame Information" ), 0, d->m_khtml, TQT_SLOT( slotViewPageInfo() ), actionCollection(), "viewFrameInfo" );
567  // This one isn't in khtml_popupmenu.rc anymore, because Print isn't either,
568  // and because print frame is already in the toolbar and the menu.
569  // But leave this here, so that it's easy to read it.
570  new KAction( i18n( "Print Frame..." ), "frameprint", 0, d->m_khtml->browserExtension(), TQT_SLOT( print() ), actionCollection(), "printFrame" );
571  new KAction( i18n( "Save &Frame As..." ), 0, d->m_khtml, TQT_SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
572 
573  actionCollection()->insert( khtml->parentPart()->actionCollection()->action( "viewDocumentSource" ) );
574  actionCollection()->insert( khtml->parentPart()->actionCollection()->action( "viewPageInfo" ) );
575  } else {
576  actionCollection()->insert( khtml->actionCollection()->action( "viewDocumentSource" ) );
577  actionCollection()->insert( khtml->actionCollection()->action( "viewPageInfo" ) );
578  }
579  } else if (isImage || !url.isEmpty()) {
580  actionCollection()->insert( khtml->actionCollection()->action( "viewDocumentSource" ) );
581  actionCollection()->insert( khtml->actionCollection()->action( "viewPageInfo" ) );
582  new KAction( i18n( "Stop Animations" ), 0, this, TQT_SLOT( slotStopAnimations() ),
583  actionCollection(), "stopanimations" );
584  }
585 
586  if (isImage)
587  {
588  if ( e.elementId() == ID_IMG ) {
589  d->m_imageURL = KURL( static_cast<DOM::HTMLImageElement>( e ).src().string() );
590  DOM::HTMLImageElementImpl *imageimpl = static_cast<DOM::HTMLImageElementImpl *>( e.handle() );
591  Q_ASSERT(imageimpl);
592  if(imageimpl) // should be true always. right?
593  {
594  if(imageimpl->complete()) {
595  d->m_pixmap = imageimpl->currentPixmap();
596  }
597  }
598  }
599  else
600  d->m_imageURL = KURL( static_cast<DOM::HTMLInputElement>( e ).src().string() );
601  new KAction( i18n( "Save Image As..." ), 0, this, TQT_SLOT( slotSaveImageAs() ),
602  actionCollection(), "saveimageas" );
603  new KAction( i18n( "Send Image..." ), 0, this, TQT_SLOT( slotSendImage() ),
604  actionCollection(), "sendimage" );
605 
606 
607 #ifndef QT_NO_MIMECLIPBOARD
608  (new KAction( i18n( "Copy Image" ), 0, this, TQT_SLOT( slotCopyImage() ),
609  actionCollection(), "copyimage" ))->setEnabled(!d->m_pixmap.isNull());
610 #endif
611 
612  if(d->m_pixmap.isNull()) { //fallback to image location if still loading the image. this will always be true if ifdef QT_NO_MIMECLIPBOARD
613  new KAction( i18n( "Copy Image Location" ), 0, this, TQT_SLOT( slotCopyImageLocation() ),
614  actionCollection(), "copyimagelocation" );
615  }
616 
617  TQString name = KStringHandler::csqueeze(d->m_imageURL.fileName()+d->m_imageURL.query(), 25);
618  new KAction( i18n( "View Image (%1)" ).arg(d->m_suggestedFilename.isEmpty() ? name.replace("&", "&&") : d->m_suggestedFilename.replace("&", "&&")), 0, this, TQT_SLOT( slotViewImage() ),
619  actionCollection(), "viewimage" );
620 
621  if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled())
622  {
623  new KAction( i18n( "Block Image..." ), 0, this, TQT_SLOT( slotBlockImage() ),
624  actionCollection(), "blockimage" );
625 
626  if (!d->m_imageURL.host().isEmpty() &&
627  !d->m_imageURL.protocol().isEmpty())
628  {
629  new KAction( i18n( "Block Images From %1" ).arg(d->m_imageURL.host()), 0, this, TQT_SLOT( slotBlockHost() ),
630  actionCollection(), "blockhost" );
631  }
632  }
633  }
634 
635  setXML( doc );
636  setDOMDocument( TQDomDocument(), true ); // ### HACK
637 
638  TQDomElement menu = domDocument().documentElement().namedItem( "Menu" ).toElement();
639 
640  if ( actionCollection()->count() > 0 )
641  menu.insertBefore( domDocument().createElement( "separator" ), menu.firstChild() );
642 }
643 
644 KHTMLPopupGUIClient::~KHTMLPopupGUIClient()
645 {
646  delete d;
647 }
648 
649 void KHTMLPopupGUIClient::slotSaveLinkAs()
650 {
651  KIO::MetaData metaData;
652  metaData["referrer"] = d->m_khtml->referrer();
653  saveURL( d->m_khtml->widget(), i18n( "Save Link As" ), d->m_url, metaData );
654 }
655 
656 void KHTMLPopupGUIClient::slotSendImage()
657 {
658  TQStringList urls;
659  urls.append( d->m_imageURL.url());
660  TQString subject = d->m_imageURL.url();
661  kapp->invokeMailer(TQString::null, TQString::null, TQString::null, subject,
662  TQString::null, //body
663  TQString::null,
664  urls); // attachments
665 
666 
667 }
668 
669 void KHTMLPopupGUIClient::slotSaveImageAs()
670 {
671  KIO::MetaData metaData;
672  metaData["referrer"] = d->m_khtml->referrer();
673  saveURL( d->m_khtml->widget(), i18n( "Save Image As" ), d->m_imageURL, metaData, TQString::null, 0, d->m_suggestedFilename );
674 }
675 
676 void KHTMLPopupGUIClient::slotBlockHost()
677 {
678  TQString name=d->m_imageURL.protocol()+"://"+d->m_imageURL.host()+"/*";
679  KHTMLFactory::defaultHTMLSettings()->addAdFilter( name );
680  d->m_khtml->reparseConfiguration();
681 }
682 
683 void KHTMLPopupGUIClient::slotBlockImage()
684 {
685  bool ok = false;
686 
687  TQString url = KInputDialog::getText( i18n("Add URL to Filter"),
688  i18n("Enter the URL:"),
689  d->m_imageURL.url(),
690  &ok);
691  if ( ok ) {
692  KHTMLFactory::defaultHTMLSettings()->addAdFilter( url );
693  d->m_khtml->reparseConfiguration();
694  }
695 }
696 
697 void KHTMLPopupGUIClient::slotBlockIFrame()
698 {
699  bool ok = false;
700  TQString url = KInputDialog::getText( i18n( "Add URL to Filter"),
701  i18n("Enter the URL:"),
702  d->m_khtml->url().url(),
703  &ok );
704  if ( ok ) {
705  KHTMLFactory::defaultHTMLSettings()->addAdFilter( url );
706  d->m_khtml->reparseConfiguration();
707  }
708 }
709 
710 void KHTMLPopupGUIClient::slotCopyLinkLocation()
711 {
712  KURL safeURL(d->m_url);
713  safeURL.setPass(TQString::null);
714 #ifndef QT_NO_MIMECLIPBOARD
715  // Set it in both the mouse selection and in the clipboard
716  KURL::List lst;
717  lst.append( safeURL );
718  TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Clipboard );
719  TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Selection );
720 #else
721  TQApplication::clipboard()->setText( safeURL.url() ); //FIXME(E): Handle multiple entries
722 #endif
723 }
724 
725 void KHTMLPopupGUIClient::slotStopAnimations()
726 {
727  d->m_khtml->stopAnimations();
728 }
729 
730 void KHTMLPopupGUIClient::slotCopyImage()
731 {
732 #ifndef QT_NO_MIMECLIPBOARD
733  KURL safeURL(d->m_imageURL);
734  safeURL.setPass(TQString::null);
735 
736  KURL::List lst;
737  lst.append( safeURL );
738  KMultipleDrag *drag = new KMultipleDrag(d->m_khtml->view(), "Image");
739 
740  drag->addDragObject( new TQImageDrag(d->m_pixmap.convertToImage()) );
741  drag->addDragObject( new KURLDrag(lst, d->m_khtml->view(), "Image URL") );
742 
743  // Set it in both the mouse selection and in the clipboard
744  TQApplication::clipboard()->setData( drag, TQClipboard::Clipboard );
745  TQApplication::clipboard()->setData( new KURLDrag(lst), TQClipboard::Selection );
746 #else
747  kdDebug() << "slotCopyImage called when the clipboard does not support this. This should not be possible." << endl;
748 #endif
749 }
750 
751 void KHTMLPopupGUIClient::slotCopyImageLocation()
752 {
753  KURL safeURL(d->m_imageURL);
754  safeURL.setPass(TQString::null);
755 #ifndef QT_NO_MIMECLIPBOARD
756  // Set it in both the mouse selection and in the clipboard
757  KURL::List lst;
758  lst.append( safeURL );
759  TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Clipboard );
760  TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Selection );
761 #else
762  TQApplication::clipboard()->setText( safeURL.url() ); //FIXME(E): Handle multiple entries
763 #endif
764 }
765 
766 void KHTMLPopupGUIClient::slotViewImage()
767 {
768  d->m_khtml->browserExtension()->createNewWindow(d->m_imageURL);
769 }
770 
771 void KHTMLPopupGUIClient::slotReloadFrame()
772 {
773  KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
774  args.reload = true;
775  args.metaData()["referrer"] = d->m_khtml->pageReferrer();
776  // reload document
777  d->m_khtml->closeURL();
778  d->m_khtml->browserExtension()->setURLArgs( args );
779  d->m_khtml->openURL( d->m_khtml->url() );
780 }
781 
782 void KHTMLPopupGUIClient::slotFrameInWindow()
783 {
784  KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
785  args.metaData()["referrer"] = d->m_khtml->pageReferrer();
786  args.metaData()["forcenewwindow"] = "true";
787  emit d->m_khtml->browserExtension()->createNewWindow( d->m_khtml->url(), args );
788 }
789 
790 void KHTMLPopupGUIClient::slotFrameInTop()
791 {
792  KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
793  args.metaData()["referrer"] = d->m_khtml->pageReferrer();
794  args.frameName = "_top";
795  emit d->m_khtml->browserExtension()->openURLRequest( d->m_khtml->url(), args );
796 }
797 
798 void KHTMLPopupGUIClient::slotFrameInTab()
799 {
800  KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
801  args.metaData()["referrer"] = d->m_khtml->pageReferrer();
802  args.setNewTab(true);
803  emit d->m_khtml->browserExtension()->createNewWindow( d->m_khtml->url(), args );
804 }
805 
806 void KHTMLPopupGUIClient::saveURL( TQWidget *parent, const TQString &caption,
807  const KURL &url,
808  const TQMap<TQString, TQString> &metadata,
809  const TQString &filter, long cacheId,
810  const TQString & suggestedFilename )
811 {
812  TQString name = TQString::fromLatin1( "index.html" );
813  if ( !suggestedFilename.isEmpty() )
814  name = suggestedFilename;
815  else if ( !url.fileName().isEmpty() )
816  name = url.fileName();
817 
818  KURL destURL;
819  int query;
820  do {
821  query = KMessageBox::Yes;
822  destURL = KFileDialog::getSaveURL( name, filter, parent, caption );
823  if( destURL.isLocalFile() )
824  {
825  TQFileInfo info( destURL.path() );
826  if( info.exists() ) {
827  // TODO: use KIO::RenameDlg (shows more information)
828  query = KMessageBox::warningContinueCancel( parent, i18n( "A file named \"%1\" already exists. " "Are you sure you want to overwrite it?" ).arg( info.fileName() ), i18n( "Overwrite File?" ), i18n( "Overwrite" ) );
829  }
830  }
831  } while ( query == KMessageBox::Cancel );
832 
833  if ( destURL.isValid() )
834  saveURL(url, destURL, metadata, cacheId);
835 }
836 
837 void KHTMLPopupGUIClient::saveURL( const KURL &url, const KURL &destURL,
838  const TQMap<TQString, TQString> &metadata,
839  long cacheId )
840 {
841  if ( destURL.isValid() )
842  {
843  bool saved = false;
844  if (KHTMLPageCache::self()->isComplete(cacheId))
845  {
846  if (destURL.isLocalFile())
847  {
848  KSaveFile destFile(destURL.path());
849  if (destFile.status() == 0)
850  {
851  KHTMLPageCache::self()->saveData(cacheId, destFile.dataStream());
852  saved = true;
853  }
854  }
855  else
856  {
857  // save to temp file, then move to final destination.
858  KTempFile destFile;
859  if (destFile.status() == 0)
860  {
861  KHTMLPageCache::self()->saveData(cacheId, destFile.dataStream());
862  destFile.close();
863  KURL url2 = KURL();
864  url2.setPath(destFile.name());
865  KIO::file_move(url2, destURL, -1, true /*overwrite*/);
866  saved = true;
867  }
868  }
869  }
870  if(!saved)
871  {
872  // DownloadManager <-> konqueror integration
873  // find if the integration is enabled
874  // the empty key means no integration
875  // only use download manager for non-local urls!
876  bool downloadViaKIO = true;
877  if ( !url.isLocalFile() )
878  {
879  KConfig cfg("konquerorrc", false, false);
880  cfg.setGroup("HTML Settings");
881  TQString downloadManger = cfg.readPathEntry("DownloadManager");
882  if (!downloadManger.isEmpty())
883  {
884  // then find the download manager location
885  kdDebug(1000) << "Using: "<<downloadManger <<" as Download Manager" <<endl;
886  TQString cmd = KStandardDirs::findExe(downloadManger);
887  if (cmd.isEmpty())
888  {
889  TQString errMsg=i18n("The Download Manager (%1) could not be found in your $PATH ").arg(downloadManger);
890  TQString errMsgEx= i18n("Try to reinstall it \n\nThe integration with Konqueror will be disabled!");
891  KMessageBox::detailedSorry(0,errMsg,errMsgEx);
892  cfg.writePathEntry("DownloadManager",TQString::null);
893  cfg.sync ();
894  }
895  else
896  {
897  downloadViaKIO = false;
898  KURL cleanDest = destURL;
899  cleanDest.setPass( TQString::null ); // don't put password into commandline
900  cmd += " " + KProcess::quote(url.url()) + " " +
901  KProcess::quote(cleanDest.url());
902  kdDebug(1000) << "Calling command "<<cmd<<endl;
903  KRun::runCommand(cmd);
904  }
905  }
906  }
907 
908  if ( downloadViaKIO )
909  {
910  KIO::Job *job = KIO::file_copy( url, destURL, -1, true /*overwrite*/ );
911  job->setMetaData(metadata);
912  job->addMetaData("MaxCacheSize", "0"); // Don't store in http cache.
913  job->addMetaData("cache", "cache"); // Use entry from cache if available.
914  job->setAutoErrorHandlingEnabled( true );
915  }
916  } //end if(!saved)
917  }
918 }
919 
920 KHTMLPartBrowserHostExtension::KHTMLPartBrowserHostExtension( KHTMLPart *part )
921 : KParts::BrowserHostExtension( part )
922 {
923  m_part = part;
924 }
925 
926 KHTMLPartBrowserHostExtension::~KHTMLPartBrowserHostExtension()
927 {
928 }
929 
930 TQStringList KHTMLPartBrowserHostExtension::frameNames() const
931 {
932  return m_part->frameNames();
933 }
934 
935 const TQPtrList<KParts::ReadOnlyPart> KHTMLPartBrowserHostExtension::frames() const
936 {
937  return m_part->frames();
938 }
939 
940 bool KHTMLPartBrowserHostExtension::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs )
941 {
942  return m_part->openURLInFrame( url, urlArgs );
943 }
944 
945 void KHTMLPartBrowserHostExtension::virtual_hook( int id, void *data )
946 {
947  if (id == VIRTUAL_FIND_FRAME_PARENT)
948  {
949  FindFrameParentParams *param = static_cast<FindFrameParentParams*>(data);
950  KHTMLPart *parentPart = m_part->findFrameParent(param->callingPart, param->frame);
951  if (parentPart)
952  param->parent = parentPart->browserHostExtension();
953  return;
954  }
955  BrowserHostExtension::virtual_hook( id, data );
956 }
957 
958 
959 // defined in khtml_part.cpp
960 extern const int KDE_NO_EXPORT fastZoomSizes[];
961 extern const int KDE_NO_EXPORT fastZoomSizeCount;
962 
963 // BCI: remove in KDE 4
964 KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const TQString &text, const TQString &icon, const TQObject *receiver, const char *slot, TQObject *parent, const char *name )
965  : KAction( text, icon, 0, receiver, slot, parent, name )
966 {
967  init(part, direction);
968 }
969 
970 KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const TQString &text, const TQString &icon, const KShortcut &cut, const TQObject *receiver, const char *slot, TQObject *parent, const char *name )
971  : KAction( text, icon, cut, receiver, slot, parent, name )
972 {
973  init(part, direction);
974 }
975 
976 void KHTMLZoomFactorAction::init(KHTMLPart *part, bool direction)
977 {
978  m_direction = direction;
979  m_part = part;
980 
981  m_popup = new TQPopupMenu;
982  // xgettext: no-c-format
983  m_popup->insertItem( i18n( "Default Font Size (100%)" ) );
984 
985  int m = m_direction ? 1 : -1;
986  int ofs = fastZoomSizeCount / 2; // take index of 100%
987 
988  // this only works if there is an odd number of elements in fastZoomSizes[]
989  for ( int i = m; i != m*(ofs+1); i += m )
990  {
991  int num = i * m;
992  TQString numStr = TQString::number( num );
993  if ( num > 0 ) numStr.prepend( '+' );
994 
995  // xgettext: no-c-format
996  m_popup->insertItem( i18n( "%1%" ).arg( fastZoomSizes[ofs + i] ) );
997  }
998 
999  connect( m_popup, TQT_SIGNAL( activated( int ) ), this, TQT_SLOT( slotActivated( int ) ) );
1000 }
1001 
1002 KHTMLZoomFactorAction::~KHTMLZoomFactorAction()
1003 {
1004  delete m_popup;
1005 }
1006 
1007 int KHTMLZoomFactorAction::plug( TQWidget *w, int index )
1008 {
1009  int containerId = KAction::plug( w, index );
1010  if ( containerId == -1 || !w->inherits( "KToolBar" ) )
1011  return containerId;
1012 
1013  KToolBarButton *button = static_cast<KToolBar *>( w )->getButton( itemId( containerId ) );
1014  if ( !button )
1015  return containerId;
1016 
1017  button->setDelayedPopup( m_popup );
1018  return containerId;
1019 }
1020 
1021 void KHTMLZoomFactorAction::slotActivated( int id )
1022 {
1023  int idx = m_popup->indexOf( id );
1024 
1025  if (idx == 0)
1026  m_part->setZoomFactor(100);
1027  else
1028  m_part->setZoomFactor(fastZoomSizes[fastZoomSizeCount/2 + (m_direction ? 1 : -1)*idx]);
1029 }
1030 
1031 #include "khtml_ext.moc"
1032 
KParts::BrowserExtension
KURL
locate
TQString locate(const char *type, const TQString &filename, const KInstance *instance=KGlobal::instance())
KParts::ReadOnlyPart::m_url
KURL m_url
KXMLGUIClient::actionCollection
virtual KActionCollection * actionCollection() const
KHTMLPageCache::self
static KHTMLPageCache * self()
static "constructor".
Definition: khtml_pagecache.cpp:121
KStdAccel::paste
const KShortcut & paste()
KStringHandler::csqueeze
static TQString csqueeze(const TQString &str, uint maxlen=40)
KTempFile::dataStream
TQDataStream * dataStream()
khtml
Definition: khtml_caret.cpp:26
KSaveFile
KURL::protocol
TQString protocol() const
KHTMLPart
This class is khtml&#39;s main class.
Definition: khtml_part.h:184
KStandardDirs::findExe
static TQString findExe(const TQString &appname, const TQString &pathstr=TQString::null, bool ignoreExecBit=false)
KURL::fileName
TQString fileName(bool _ignore_trailing_slash_in_path=true) const
kdDebug
kdbgstream kdDebug(int area=0)
DOM::HTMLInputElement
Form control.
Definition: html_form.h:349
klocale.h
KStdAccel::cut
const KShortcut & cut()
KParts::URLArgs::frameName
TQString frameName
KURL::isEmpty
bool isEmpty() const
KHTMLPart::nodeUnderMouse
DOM::Node nodeUnderMouse() const
Returns the Node currently under the mouse.
Definition: khtml_part.cpp:5645
KToolBarButton
KHTMLPageCache::isComplete
bool isComplete(long id)
Definition: khtml_pagecache.cpp:191
KHTMLPart::frameNames
TQStringList frameNames() const
Returns a list of names of all frame (including iframe) objects of the current document.
Definition: khtml_part.cpp:5892
KStdAction::copy
KAction * copy(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
KShortcut
KHTMLPart::findFrameParent
KHTMLPart * findFrameParent(KParts::ReadOnlyPart *callingPart, const TQString &f, khtml::ChildFrame **childFrame=0)
Recursively finds the part containing the frame with name f and checks if it is accessible by calling...
Definition: khtml_part.cpp:5216
DOM::Element
By far the vast majority of objects (apart from text) that authors encounter when traversing a docume...
Definition: dom_element.h:210
KURL::setPass
void setPass(const TQString &_txt)
KInputDialog::getText
static TQString getText(const TQString &caption, const TQString &label, const TQString &value=TQString::null, bool *ok=0, TQWidget *parent=0, const char *name=0, TQValidator *validator=0, const TQString &mask=TQString::null)
KURL::isLocalFile
bool isLocalFile() const
KURL::setPath
void setPath(const TQString &path)
KTempFile::name
TQString name() const
KMessageBox::detailedSorry
static void detailedSorry(TQWidget *parent, const TQString &text, const TQString &details, const TQString &caption=TQString::null, int options=Notify)
KParts::URLArgs::reload
bool reload
KAction::plug
virtual int plug(TQWidget *widget, int index=-1)
KMessageBox::warningContinueCancel
static int warningContinueCancel(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const KGuiItem &buttonContinue=KStdGuiItem::cont(), const TQString &dontAskAgainName=TQString::null, int options=Notify)
KHTMLPageCache::saveData
void saveData(long id, TQDataStream *str)
Save the data of cache entry id to the datastream str.
Definition: khtml_pagecache.cpp:272
KParts::URLArgs
KTempFile
KHTMLPart::selectedText
virtual TQString selectedText() const
Returns the text the user has marked.
Definition: khtml_part.cpp:3455
KDesktopFile
KParts::URLArgs::setNewTab
void setNewTab(bool newTab)
KStdAccel::name
TQString name(StdAccel id)
KConfig
KActionMenu
KProcess::quote
static TQString quote(const TQString &arg)
KMultipleDrag
KToolBar
KMultipleDrag::addDragObject
void addDragObject(TQDragObject *dragObject)
KTempFile::close
bool close()
KAction
KToolBarButton::setDelayedPopup
void setDelayedPopup(TQPopupMenu *p, bool unused=false)
KTempFile::status
int status() const
KParts::URLArgs::metaData
TQMap< TQString, TQString > & metaData()
KURL::url
TQString url(int _trailing=0, int encoding_hint=0) const
KURL::path
TQString path() const
endl
kndbgstream & endl(kndbgstream &s)
KActionCollection::action
virtual KAction * action(int index) const
KXMLGUIClient::instance
virtual KInstance * instance() const
KStdAccel::print
const KShortcut & print()
KParts
KURL::List
KAction::setEnabled
virtual void setEnabled(bool enable)
KURLDrag
KHTMLPart::hasSelection
bool hasSelection() const
Has the user selected anything?
Definition: khtml_part.cpp:3597
KURL::isValid
bool isValid() const
KAction::setText
virtual void setText(const TQString &text)
KStdAccel::copy
const KShortcut & copy()
KHTMLPart::parentPart
KHTMLPart * parentPart()
Returns a pointer to the parent KHTMLPart if the part is a frame in an HTML frameset.
Definition: khtml_part.cpp:5322

khtml

Skip menu "khtml"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

khtml

Skip menu "khtml"
  • arts
  • dcop
  • dnssd
  • interfaces
  •     interface
  •     library
  •   kspeech
  •   ktexteditor
  • kabc
  • kate
  • kcmshell
  • kdecore
  • kded
  • kdefx
  • kdeprint
  • kdesu
  • kdeui
  • kdoctools
  • khtml
  • kimgio
  • kinit
  • kio
  •   bookmarks
  •   httpfilter
  •   kfile
  •   kio
  •   kioexec
  •   kpasswdserver
  •   kssl
  • kioslave
  •   http
  • kjs
  • kmdi
  •   kmdi
  • knewstuff
  • kparts
  • krandr
  • kresources
  • kspell2
  • kunittest
  • kutils
  • kwallet
  • libkmid
  • libkscreensaver
Generated for khtml by doxygen 1.8.11
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |